
Рабочие PoC для трёх уязвимостей NextGen Connect 4.5.2.
Рабочие proof-of-concept эксплойты для трёх сетевых уязвимостей в NextGen Connect (Mirth Connect) 4.5.2. Стенды запускают официальный контейнерный образ, создают только ту конфигурацию канала, которая нужна для находки, выполняют атаку из отдельного контейнера и завершаются неудачей, если заявленный эффект безопасности не наблюдается.
В этом обзоре использовалась публичная методология Refute-or-Promote и её open-source оркестрационный плейбук. Метод разделяет генерацию кандидатов и состязательный обзор в свежем контексте и требует эмпирического доказательства перед продвижением. Уязвимый исходный код 4.5.2 и метод обзора оба публичны: любой, у кого есть обычный доступ к модели, исходники и возможность безопасно проверить в лаборатории, может применить тот же процесс и мог бы найти эти классы ошибок независимо. Конфиденциальность вокруг одного отчёта не делает лежащую в основе способность к обзору приватной.
Это реальные эксплойты, а не модульные тесты парсера. Они извлекают живой хеш пароля через SQL-инъекцию, эксфильтруют содержимое локальных файлов цели через два различных неаутентифицированных XML-пути и блокируют операции на базе встроенного Derby до перезапуска.
| CVE | Находка | Атакующий | Продемонстрированное воздействие | CVSS 3.1 / 4.0 | PoC |
|---|
| CVE-2026-82583 | Инъекция в _getTables selectLimit | Аутентифицированный пользователь API | Экспорт таблицы паролей в публичный веб-корень; зависание встроенного Derby до перезапуска | 8.3 / 7.2 | sql-selectlimit-injection/ |
| CVE-2026-78224 | XXE в XSLT Step | Неаутентифицированный клиент канала | OOB-чтение локального файла цели; DoS через медленную сущность в канале | 8.2 / 8.8 | xslt-step-xxe/ |
| CVE-2026-82578 | XXE в XML Batch Adaptor | Неаутентифицированный клиент канала | OOB-чтение локального файла цели | 7.5 / 8.7 | xml-batch-xxe/ |
CVSS 3.1 и 4.0 — это разные стандарты; парные оценки не являются сравнением «до и после».
Все три были воспроизведены на:
nextgenhealthcare/connect:4.5.2
sha256:4afa295cfe7c5ffd596efee69594157fea87202e33d66bb4a98a52db4598f836
NextGen приватно сообщила, что проблема XSLT была исправлена в 4.7.1, а проблемы SQL-инъекции и XML Batch — в 4.7.2. Рекомендация CISA ICSMA-26-253-01 считает 4.7.1 и более ранние версии уязвимыми и рекомендует 4.7.2 или более позднюю. Релизы после 4.5 являются проприетарными, поэтому нет публичного исправленного образа, из которого этот репозиторий мог бы предоставить такой же воспроизводимый негативный контроль, как для патч-релиза с открытым исходным кодом.
Аутентифицированное закрепление в административном API превращается в доступ к данным, которые
учётная запись не должна была экспортировать. Упакованный эксплойт записывает живую
строку PERSON_PASSWORD под public_html и доказывает, что полученный файл
можно скачать без аутентификации. Важен шаг перехода от ограниченного действия API к файлу на диске, который
больше вообще не требует сессии атакующего.
В реальной среде интеграции база данных может описывать каналы, конечные точки и учётные данные, используемые для доступа к базам данных, SFTP-серверам, почтовым реле, API и другим клиническим системам. Отдельный контролируемый тест восстановил намеренно внедрённый пароль коннектора из экспортированного XML канала. Это делает примитив полезным для картирования среды и кражи секретов; использование любого восстановленного учётного данных против нижестоящей системы не тестировалось и не заявляется.
Опциональная ветвь отказа в обслуживании замораживает встроенную базу данных Derby. API-вызовы на базе БД затем истекают по таймауту, та же инъекция не может разморозить собственную точку входа, и требуется перезапуск процесса. Это практическая нагрузка на восстановление для установок на базе Derby, а не доказательство того, что внешние производственные базы данных ведут себя так же.
После развёртывания уязвимого XSLT-канала атакующему не нужна учётная запись Mirth. Входящий XML заставляет сервис прочитать локальный файл цели и отправить его содержимое на контролируемый атакующим callback. Это полезно даже когда обычный ответ канала не содержит преобразованных данных и атакующий не может прочитать историю сообщений.
Автономный клиент принимает выбранный вызывающим однострочный file: URI. Файлы, такие
как идентификаторы хоста, токены, фрагменты конфигурации или учётные данные, практически
ценны, если учётная запись службы Mirth может их прочитать и сервер может достичь
callback. Упакованное доказательство использует только сгенерированный канарейку и не заявляет универсальное
восстановление произвольных файлов, многострочную передачу или доступ за пределами учётной записи службы.
Медленная внешняя сущность также занимает стандартный однопоточный канал-жертву. Это может задержать или остановить конкретный клинический интерфейс, привязанный к этому каналу, пока сущность не будет освобождена. Контрольный канал и административный API остаются работоспособными, так что это локальное для канала нарушение, а не отказ всего сервера.
Когда включён уязвимый режим XML batch, неаутентифицированный отправитель может использовать сырое тело пакета, чтобы вызвать такой же тип исходящего раскрытия файлов. Сервер возвращает HTTP 500, но атакующий уже получил содержимое файла, доступного только цели, через OOB callback. Это делает уязвимость практически полезной как слепой путь эксфильтрации даже когда тестирование только по коду ответа отбросило бы запрос как сбой парсера.
Пакетная обработка отключена по умолчанию, режим разделения должен достичь парсера на базе XPath, и требуется исходящий трафик сервера. Этот репозиторий не заявляет продемонстрированный отказ в обслуживании для CVE-2026-82578.
Требования: Bash, Docker, x86-64 Linux и сетевой доступ для первоначального скачивания образа. Оба образа закреплены по дайджесту. Порт хоста не публикуется; цель и атакующий взаимодействуют только через внутренний Docker-мост, специфичный для задачи.
./run-all.sh
Или запустите одну находку:
./sql-selectlimit-injection/poc/run.sh
./xslt-step-xxe/poc/run.sh
./xml-batch-xxe/poc/run.sh
Каждый вызов создаёт контейнеры с уникальными именами и мостовую сеть, записывает
evidence/current-run.log и удаляет свои лабораторные ресурсы при выходе. Закоммиченные
файлы evidence/vulnerable-4.5.2.log — это транскрипты воспроизведения на x86-64 Linux.
PERSON_PASSWORD и извлекает файл
без аутентификации. Его опциональная лабораторная ветвь вызывает SYSCS_FREEZE_DATABASE,
после чего API-вызовы на базе БД перестают отвечать до перезапуска цели.file: URI; лабораторная обёртка использует случайную канарейку и точную проверку.
Тот же запуск доказывает недоступность канала локально при работоспособном втором канале
и admin API, затем проверяет восстановление.Element Name продукта.
Атакующий контролирует только неаутентифицированное тело пакета. Его автономный клиент
имеет тот же режим --file-uri и то же ограничение однострочного OOB.Запускайте только в одноразовой лаборатории, которой вы владеете. SQL PoC намеренно замораживает целевую базу данных; восстановление требует перезапуска цели. XXE PoC по умолчанию читают смонтированную канарейку, но их автономные клиенты принимают произвольные URL слушателей и однострочные локальные для цели file URI. Никогда не направляйте их на системы без авторизации.
Согласно CISA, обновитесь до Connect 4.7.2 или более поздней версии. Там, где немедленное обновление невозможно, ограничьте административный API доверенными сетями управления, удалите ненужные шаги XSLT, отключите пакетную обработку XML там, где она не требуется, и заблокируйте ненужный исходящий трафик сервера. Эти меры снижают экспозицию, но не исправляют уязвимый код.
Находки 1 и 3 следует приписать Abhinav Agarwal. Находка 2 была независимо обнаружена Abhinav Agarwal и впервые сообщена NextGen компанией Youngdu. NextGen координировала исправления и присвоение CVE.
Этот репозиторий предназначен для того, чтобы помочь защитникам превратить текст рекомендаций в наблюдаемое, тестируемое поведение. В изолированной копии среды защитники могут использовать его, чтобы:
_getTables, неожиданного экспорта Derby или
процедур заморозки, новых файлов под public_html, входящего XML, содержащего
DOCTYPE, и callback, исходящих от Mirth, после ошибок слушателя;Каждый PoC работает в контейнере, закрепляет свои образы по дайджесту и отказывает закрыто, если случайная канарейка не возвращается. Защитник может воспроизвести фактическую границу безопасности, а не принимать скриншот или число серьёзности на веру. Он существует, чтобы помочь людям узнать, что они запускают, протестировать это и подтвердить, что патч сработал. Он не для того, чтобы его направляли на больницу.