Dicom scp scu что это
I have concluded that the SCU has limited ability compared to its
cousin, the SCP.
If so, what are the limitations?
David Clunie
No no . they are peers .. any association needs one at one end and the
other at the other end.
You can think of an SCU as a client and an SCP as a provider or a service,
though this is not strictly correct as the roles can change.
For example a CT Image Storage SOP Class SCU would run on a modality and
have the job of pushing images out. The corresponding SCP on a workstation
or archive passively receives these images.
For Query/Retrieve, a workstation acting as a Q/R SCU would issue a C-FIND
to a Q/R SCP running on a modality or archive. The SCP would respond with
a list of images (instance UIDs), and the Q/R SCU would issue a C-MOVE to
the SCP. This same device, the Q/R SCP, would then adopt the role of Storage
SCU, open another association back to the workstation, which would act as
a Storage SCP, and then the images would be transferred. The two different
SCUs and SCPs in each case are different Application Entities (AEs), and
are often in fact implemented as separate processes.
Обработка медицинских изображений DICOM: передача по сети DICOM
PDU vs PDV:
К чему приводят уязвимости протокола DICOM
Вы наверняка видели в медицинском сериале, как интерны бьются над рентгеновским снимком пациента, а потом приходит их наставник и ставит диагноз по едва заметному пятнышку. В реальности такими остроглазыми диагностами становятся модели машинного обучения, применяемые в технологии medical imaging. Благодаря таким штукам можно гораздо быстрее выявить болезнь, например, определить, являются ли клетки на снимках опухолевыми или неопухолевыми.
Но есть одна проблема — в медицинских технологиях используются DICOM-протоколы, безопасность которых оставляет желать лучшего. О них и пойдет речь в этой статье.
DCMTK:
Вdimse.h/dimse.ccПриведена структура, соответствующая различным службам, указанным в протоколе DICOM, с префиксом T_DIMSE_, например T_DIMSE_C_StoreRQ / T_DIMSE_C_StoreRSP, T_DIMSE_FindRQ / T_DIMSE_FindRSP, T_DIMSE_CEchoRQ_DIMSE_DIMSE_CEchoRQ / T_DIME_ в качестве префикса, как / DIMSE_storeUser / DIMSE_storeProvider / DIMSE_sendStoreResponse и т. Д. Определенные соответствующие определения функций помещены в отдельные файлы, в основном dimecho.cc, dimfind.cc, dimget.cc, dimfind.cc .cc, dimstore.cc.
Вassoc.h/assoc.ccИнкапсуляция соответствующей структуры прикладного уровня ACSE дается в инкапсуляции с T_ASC_ в качестве префикса, например T_ASC_Parameters, T_ASC_Association, T_ASC_PresentationContext и т. Д .; кроме того, соответствующие операционные функции для установления соединения или прерывания даны с ASC_ в качестве префикса, например ASC_initializeNetwork, ASC_dropNetwork, ASC_requestAssociation, ASC_receiveAssociation, ASC_acknowledgeAssociation, ASC_rejectAssociation, ASC_releaseAssociation и т. д.
Вdul.h/dul.ccСоответствующая структура данных уровня верхнего уровня Dicom указана в префиксе DUL_, например, DUL_ASSOCIATESERVICEPARAMETERS, DUL_PRESENTATIONCONTEXT, DUL_TRANSFERSYNTAX, DUL_PDV, DUL_PDVLIST; кроме того, функции работы уровня DUL, такие как DULIn, такие как DULIn, также указываются с помощью DULIn, в качестве DULIn DUL_RequestAssociation, DUL_ReleaseAssociation, DUL_ReadPDVs, DUL_WritePDVs, DUL_NextPDV и т. Д.
Русские Блоги
Transfer Syntax is the language used in DICOM to describe the DICOM file format and the network transfer methods. 3 main variables are contained in the Transfer Syntax:
- VR: Implicit/Explicit
- Endianism: Little-Endian/BigEndian
- Pixel Data Compression
For DICOM Files, the Transfer Syntax is stored in the File Meta Header, and for networking it is negotiated between the SCU & SCP. For more information about how the negotiation happens and how to control the network transfer using Transfer Syntax can be found here.
Here is a summary of the most common DICOM Transfer syntaxes:
Что такое семантика передачи? На самом деле он в основном состоит из двух частей:
Один из них - это порядок байтов, который в основном представляет собой небольшой порядок байтов. Например, десятичное число 35280 в шестнадцатеричном формате - это 0xff00, но оно сохраняется в файле, и вы открываете его с помощью шестнадцатеричного редактора. Вы видите 00ff. Это маленький порядок байтов.
Второй - определить, отображается ли VR элемента dataElement после метаданных 0002 или неявно.
Среди них есть только несколько наиболее часто используемых семантик передачи, а другие подходят, когда вы их используете. Семантика передачи без сжатия следующая:
Освободить (разорвать) соединение:
После того, как соединение установлено, две соединенные стороны начинают обмениваться данными. Если одна из сторон хочет прервать соединение (сервер SCP также может), есть два способа:
Uncompressed
fo-dicom:
ВPDU.csСервисные объекты, соответствующие уровню приложения ACSE, приведены в ACSE, в основном RawPDU, PDU, A-Associate-RQ, A-Associate-AC, A-Associate-RJ, A-Release-RQ, A-Release-RP, A- Прервать, PDataTF.
КIDicomServiceUser/IDicomServiceProvider、IDicomCStoreProvider、IDicomCEchoProviderЭта часть предоставляет серию интерфейсов функций обратного вызова для серии операций в DicomService, а конкретная реализация выполняется пользователем.
КDicomClient/DicomServerЭто базовый класс сущностей. Этот класс необходим пользователям для самостоятельной сборки SCP и SCU. Можно сказать, что DicomClient и DicomServer представляют собой пару SCU и SCP для служб DICOM, которые просто реализуются. Например, в собственном экземпляре fo-dicom var server = new DicomServer <DicomCEchoProvider> (12345); открывает сервер SCP с номером порта 12345 для приема службы C-ECHO; var client = new DicomClient (); client. NegotiateAsyncOps () ; client.AddRequest (new DicomCEchoRequest ()); реализует простой клиент SCU, который инициирует запрос C-ECHO.
Lossless Compressed
Lossless methods are truly lossless, and the output is guaranteed to match the input exactly, and therefore there is no concept of quality…..the degree of compression depends only on the method used, and the nature of the image (noise compresses badly!)
Explicit VR Little-endian
- Value : 1.2.840.10008.1.2.1
- Description : Explicit Value Representation must be included for each single DICOM tag. This transfer syntax is more often used since each data element has it’s own explicit value type declaration.
JPEG Lossless First Order
- Значение: 1.2.840.10008.1.2.4.70 (сжатие без потерь)
- Description : Identical to the main JPEG lossless above, but with a constrained value for the predictor, giving a slightly simplified algorithm, with slightly greater speed, but slightly less compression on most images (2-5% typically)
Хорошо! Говоря о том, что здесь есть семантика передачи, каждый должен понимать! Итак, теперь перейдем к делу!
Наша цель также очень проста: преобразовать семантику передачи в файле dicom из формата без сжатия в формат JPEG без потерь со сжатием без потерь, а размер файла уменьшится вдвое;
Прикрепите код ниже, код прикреплен к DCM4CHEE;
Требуемый maven выглядит следующим образом:
Конечно, этого недостаточно, иначе проект сообщит об ошибке Исключение в потоке "main" java.lang.UnsatisfiedLinkError: no opencv_java в java.library.path, нам также необходимо импортировать opencv_java.dll в проект;
А opencv_java.dll поступает из пакета исходного кода dcm4che. Подробности см. В другом моем блоге (от dicom до jpg);
Прикрепите финальный рендеринг ниже!
Интеллектуальная рекомендация
Начало работы с jdbc
Что такое jdbc? (понимание) использоватьjavaОтправка кода (программы)sqlТехника предложенияjdbcтехнологии! нота: Без jdbcРаньше javaРазработчикам необходимо поддерживать драйверы для разных баз .
Windows устанавливает nodejs с помощью nvm
Пример унарной линейной регрессии (нативная реализация, реализация sklearn)
Справочник статей 0. Подготовка необработанных данных 0,1 данные 0.2 Графический дисплей 1. Нативная реализация Python 1.1 Путеводитель 1.2 Рассчитать среднеквадратичную ошибку 1.3 Градиентный спуск 1.
Рассчитайте геометрию простого многоугольного ядра (будь то звездный многоугольник)
Что такое звездный полигон? На самом деле, есть точка A внутри многоугольника, и соединение между любой точки многоугольника находится внутри полигона, который называется звездоолигон, который называе.
[Коллекционное издание] Длинная статья, объясняющая регулярные выражения Python
оглавление Во-первых, обычная функция Два, повторный вызов модуля Три, жадный режим В-четвертых, группировка V. Модификаторы регулярных выражений Шесть, режим регулярного выражения VII. Общие регулярн.
Русские Блоги
Заключение
То, как просто найти уязвимости в medical imaging и как забавно вендоры реагируют на баг-репорты, показывает слабый уровень защищенности таких технологий. Чтобы они стали безопасными, над ними еще работать и работать.
Передача по сети DICOM:
Протокол DICOM и его слабые места
Коротко о самом протоколе
DICOM (Digital Imaging and Communication in Medicine) — протокол представления медицинских обследований и передачи их между различными компонентами. Этими компонентами могут быть:
- медицинское оборудование, которое непосредственно делает сканирование;
- DICOM-сервер — база данных для DICOM-файлов;
- DICOM-клиент — обычно это приложение для просмотра результатов медицинских обследований.
Протокол DICOM имеет две части:
- описание формата файла;
- описание сетевого взаимодействия.
Теперь к делу
Каждый DICOM-файл содержит информацию о пациентах и состоянии их здоровья — данные, которые требуют особой защиты. Именно поэтому я решила проверить реализации DICOM-протокола на уязвимости вместе с группой исследователей-энтузиастов AISec, которая занимается безопасностью в сфере машинного обучения.
Мы также изучили безопасность PACS (Picture Archiving and Communication System). Это такие системы, в которых результаты обследований хранятся в электронном виде. Они позволяют передавать снимки между врачами по сети. Да-да, благодаря PACS больше не нужно таскать с собой рентгеновские снимки в конверте, как мы привыкли.
DICOM-файл
DICOM-файл — изображение медицинского характера, сохраненное в формате DICOM. Этот формат — отраслевой стандарт для хранения и распространения медицинских снимков.
Помимо графических данных, DICOM-файлы могут содержать персональную информацию в виде атрибутов, позволяющих сопоставить изображение с конкретным человеком и идентифицировать пациента. К ним относятся пол, имя пациента, дата рождения и пр. Список возможных атрибутов и их описание можно найти в документации.
На рисунке показана структура DICOM-файла:
DICOM Network
Стандарт протокола довольно сложно и нудно описывает сетевое взаимодействие — мне до сих пор не удалось изучить его целиком. Но если говорить в общем, вот какие команды сетевого взаимодействия есть у DICOM-протокола:
Действие | Описание |
---|---|
C-ECHO | Тест соединения между двумя устройствами |
C-FIND | Поиск исследований на удаленном сервере |
C-GET, C-MOVE | Скачивание исследований с удаленного сервера |
C-STORE | Сохранение исследования на удаленном сервере |
Вот как выглядит процесс передачи результатов медицинских обследований по DICOM-протоколу
Немного статистики по DICOM-серверам в интернете.
Такие картинки-отчеты о сканировании генерирует Grinder Framework
Интересный факт: когда мои коллеги из AISec проводили сканирование в 2019 году, то доступных серверов было меньше тысячи. В 2020 году же их оказалось около 2700.
Большинство хостов в сети настроены таким образом, что любой может установить с ними соединение. Давайте разберем пример, как просто получить исследование с удаленного сервера из сети. Для этого воспользуемся утилитами findscu и getscu из DCMTK — набора библиотек и приложений, реализующих большую часть стандарта DICOM.
Первой командой получаем список всех доступных исследований на сервере.
С ключом -aet в запросе передаем название Application Entity Title . Обычно этот тайтл требуется, когда нужно разграничить доступ к изображениям при использовании одного DICOM-сервера разными PACS. Это, своего рода, идентификация клиента. Но проблема в том, что тайтлы на многих серверах настроены по умолчанию. Это значит, подобрать его можно, перебирая дефолтные значения от разных разработчиков PACS и DICOM-серверов.
С ключом -k передаем фильтр "PatientName=*" , который позволит показать любое доступное исследование на сервере.
Пример вывода команды findscu
Следующей командой скачиваем нужное нам исследование или все исследования сразу.
Значения ключей в команде аналогичны предыдущей.
Пример исследования, скачанного с удаленного сервера DICOM
Вот так с помощью двух команд можно скачать данные с удаленного DICOM-сервера при наличии одного из условий:
- Application Entity Title не задан,
- Application Entity Title установлен по умолчанию, поэтому его удалось подобрать.
Далее рассмотрим популярные инструменты и реализации протокола и найденные в них недостатки.
Реализации протокола DICOM
SimpleITK
SimpleITK — реализация протокола, которая используется в одном из крупных проектов в области medical imaging NVIDIA CLARA.
Для поиска уязвимостей в ней использовался фаззинг AFL со словарем. В результате мы наткнулись на переполнение кучи. Попытки эксплуатации привели к обнаружению более простой уязвимости — переполнению буфера через поле PatientName . Причем для переполнения буфера было достаточно создать файл с длиной имени пациента свыше 512 байт.
В ответ на репорт о переполнении кучи разработчик просто поправил файл, демонстрирующий уязвимость, чтобы он корректно обрабатывался библиотекой :)
Чем кончилось: в конце концов мы друг друга поняли, и вендор быстро исправил обе уязвимости.
DCMTK
DCMTK (DICOM Toolkit) — самая старая реализация DICOM-протокола. Она включает набор инструментов для работы с протоколом: парсеры DICOM-файлов в разных форматах и из разных форматов, а также утилиты для взаимодействия с DICOM-сервером по сети.
XXE в xml2dcm
Парсер xml2dcm конвертирует результаты медицинского обследования из формата XML в DICOM.
В xml2dcm мы нашли уязвимость к самой простой XXE-атаке: создаем XML-файл с внешней сущностью в имени пациента и на выходе получаем DICOM-файл с содержимым /etc/passwd .
Чем кончилось: данную уязвимость вендор устранил.
Небезопасные функции xml2dcm
По аналогии с external entities в XML, cама по себе утилита xml2dcm позволяет создавать DICOM-файлы c содержимым других файлов внутри. Это удобно, потому что не нужно писать данные в XML-файл — достаточно указать в теге PixelData путь к файлу, из которого нужно подгрузить данные при конвертировании.
Если в теге PixelDatа указать путь к любому файлу в системе, то после обработки утилитой xml2dcm мы получим DICOM-файл с его содержимым.
Чем кончилось: эту функцию невозможно отключить никаким флагом, а на доработку парсера xml2dcm вендор не согласился :(
DoS в парсерах DICOM-файлов
Мы тестировали парсеры из DCMTK при помощи фаззинга AFL и libFuzzer. Результат — DoS-утилиты xml2dcm и dcm2xml.
Чем кончилось: вендор исправил найденные ошибки.
DoS в dcmqrscp-сервере
DCMTK также предоставляет реализацию DICOM-сервера dcmqrscp. Тестирование безопасности DICOM-сервера dcmqrscp было проведено с помощью фаззинга, в результате которого был обнаружен DoS.
Фаззинг проводился при помощи AFLNet. Поддержку протокола DICOM я добавила в официальный репозиторий AFLNet, если кому-то захочется пофаззить другие DICOM-серверы.
Чем кончилось: вендор исправил ошибку реализации.
Соответствующая реализация в библиотеке с открытым исходным кодом:
Explicit VR Big-endian
- Value : 1.2.840.10008.1.2.2
- Description : This is identical to Explicit VR little endian, apart from the fact that big-endian byte ordering is used. It is very little used nowadays, and no other transfer syntaxes use big-endian form.
NOTE: All the compressed syntaxes below use explicit VR little endian.
Семантика сжатой передачи следующая:
Обмен данными (Обмен датами) DIMSE:
PDU-Protocol Data Units:
DIMSE Message Data:
Принять (отклонить) соединение:
- принимать
- Отклонить (временный)
- Отклонить (навсегда)
Если код состояния результата - «Отклонено (постоянно)», это означает, что SCP сервера сообщает SCU клиента, что его запрос был отклонен, и он будет отклонен позже. Обычно существует две причины для этой ситуации: первая - запрошенный заголовок AE не существует, что означает, что объект не существует в сети; вторая - то, что SCP сервера не поддерживает никаких услуг, запрошенных клиентским SCU ( Это класс SOP). В случае отклонения SCP может выборочно возвращать диагностический код состояния, чтобы уведомить клиента о причине отклонения; в худшем случае сервер SCP возвращает только «Заголовок вызывающего AE не распознан». В состоянии отклонения соединение DICOM разрывается, и SCP и SCU не могут передавать данные; в то же время базовое TCP-соединение будет закрыто до тех пор, пока клиентский SCU не отправит запрос на соединение снова.
Приложения medical imaging
ORTHANC
В ходе исследования мы затронули приложение ORTHANC. Этот продукт очень прост в настройке и использовании: он предоставляет веб-обертку для просмотра DICOM-файлов, и для работы с DICOM-протоколом требуется только браузер.
ORTHANC используют в здравоохранении, в различных университетах и госпиталях, с его помощью проводятся исследования в области машинного обучения medical imaging (раз и два).
Открытые серверы ORTHANC в сети
Небезопасное API
Сервер ORTHANC открыт к сообществу разработчиков и предоставляет REST API для написания различных плагинов. Если взглянуть на список доступных методов, можно заметить интересные методы для перезагрузки и выключения сервера, а также метод с названием execute-script .
Он принимает на вход скрипты на lua и без какой-либо валидации выполняет их на сервере. Чтобы убедиться в этом самостоятельно, посмотрите исходный код ORTHANC.
Чем кончилось: раньше этот метод был включен по умолчанию в конфиге Orthanc, но, к счастью, недавно вендор догадался его отключить. Однако в сети до сих пор можно наткнуться на Orthanc-серверы с работающим методом execute-script .
Уязвимость аутентификации к CSRF-атаке
Когда пользователь открывает страницу, на сервер отправляется команда, запускающая выполнение произвольного кода.
Ответ вендора на запрос исправления данной уязвимости меня удивил: оказывается, ORTHANC — это микросервис, поэтому и о безопасности среды, где вы его разворачиваете, извольте позаботиться сами. То есть и механизм аутентификации мы сами должны написать? И догадаться о том, что поставляемый вендором механизм аутентификации лишь создает иллюзию безопасности и надежности, но на самом деле бесполезен?
Ответ вендора
BTW: кеш гугла показал, что приписку в документации о CSRF вендор сделал после моего репорта об уязвимости. И, конечно же, вряд ли он известил тех клиентов, которые уже пользуются их «микросервисом» и верят в его надежность.
Чем кончилось: вендор так ничего и не предпринял для устранения данной уязвимости, только дополнил документацию.
Запросить подключение:
- Вызов заголовка AE: в службе DICOM - символ, используемый для обозначения клиента (SCU), как и наше имя;
- Называется AE Title: в службе DICOM - символ, используемый для обозначения сервера (SCP), как и наше имя;
- Описание Контекст (контексты представления): это список услуг (Список услуг). Емкость списка не превышает 128. Он используется для описания различных служб, которые клиент хочет получить от сервера. Каждая служба в основном включает класс SOP и список синтаксисов передачи.
Ниже приводится более подробное введение к трем вышеупомянутым сведениям:
Название AE: каждой системе DICOM в сети DICOM будет присвоено имя, а именно название объекта приложения или AETitle для краткости. Название AE используется для идентификации уникальной системы DICOM в сети DICOM (что-то вроде IP-адреса в Интернете). Следовательно, в сетевой среде DICOM убедитесь, что каждая система DICOM имеет уникальное имя - эта работа обычно выполняется Администратор сети DICOM для завершения. Заголовок AE не превышает 16 символов в длину и в реальных приложениях обычно выражается прописными буквами.Конечно, также могут использоваться строчные буквы и другие коды ASCII. В процессе установления соединения клиентский SCU отправляет свой собственный заголовок AE (вызывающий заголовок AE) и заголовок AE сервера (называемый заголовком AE, конечно, это только то, что ожидает клиент, и реальная ситуация может не так).
Клиентский SCU отправляет на сервер три типа контекстной информации (максимум 128). Каждый тип контекстной информации (контекст представления) включает услугу, ожидаемую клиентом, и несколько связанных методов передачи, таких как идентификатор контекста представления 1 описывает хранилище цифровой маммографии. service и предоставляет два метода кодирования: Implicit VR Little Endian и JPEG 2000 (сжатие без потерь). На стороне клиента нечетное число используется для обозначения каждого типа контекстной информации (минимальное число - 1, а максимальное - 255), которое обычно монотонно увеличивается с числа 1, 1, 3, 5, . Что касается порядка между контекстной информацией и порядком его внутреннего формата кодирования, его можно установить произвольно. Как видно из приведенного выше рисунка, каждая служба должна предоставлять формат кодирования Implicit VR Little Endian, потому что это метод кодирования передачи по умолчанию в протоколе DICOM.
Стандартный анализ DICOM3.0:
ACSE vs DIMSE:
Сервер (Сервер, SCP) / Клиент (Клиент, SCU):
Implicit VR Little-endian
- Value : 1.2.840.10008.1.2(Default Transfer Syntax for DICOM)
- Description: This is the only mandatory DICOM transfer syntax, but as the VR is implicit (requiring all applications to have an up to date dictionary to make sense of the data) it is also the worst, and others should be used wherever possible. No other transfer syntaxes use implicit VR.
Читайте также: