
Рабочий воспроизводитель на Spring Boot и Quarkus для CVE-2026-91858 — XXE в Apache Camel camel-fop через сторонний TransformerFactory, с проверкой уязвимой и исправленной версий.
Запускаемый proof-of-concept, воспроизводящий уязвимость Apache Camel, при которой FopProducer из camel-fop создавал свой
javax.xml.transform.TransformerFactory только с FEATURE_SECURE_PROCESSING перед выполнением identity-преобразования
над телом сообщения XSL-FO. Во встроенном трансформере JDK этот флаг сам по себе уже обнуляет
ограничения accessExternalDTD/accessExternalStylesheet, поэтому внешние ресурсы отклоняются. Но когда сторонний
JAXP TransformerFactory, такой как Saxon-HE, находится в classpath — например, потому что приложение также использует
camel-xslt-saxon или camel-saxon — TransformerFactory.newInstance() возвращает эту реализацию, и
FEATURE_SECURE_PROCESSING сам по себе не ограничивает доступ к внешним ресурсам в ней. DOCTYPE с внешним
подмножеством, объявленным в теле XSL-FO, тогда разрешается во время преобразования тела, поэтому документ внешнего отправителя может
прочитать файлы, доступные процессу Camel, или заставить его отправлять запросы на указанные им хосты (CWE-611).
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-fop 4.22.0 (уязвим; исправлено в 4.22.1) + Saxon-HE 13.0 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-fop (Camel 4.22.0, уязвим; исправленный контроль CQ 3.40.0 / Camel 4.22.1) + Saxon-HE 13.0 |
Оба модуля демонстрируют уязвимое и исправленное поведение на реальном FopProducer. Saxon-HE находится в
classpath в обоих — это предварительное условие для уязвимости; развёртывание по умолчанию с использованием трансформера JDK не
подвержено уязвимости ни до, ни после исправления.
Эндпоинт верификатора /exploit/attack запускает внутрипроцессный HTTP-callback и отправляет документ XSL-FO в fop:pdf,
чей DOCTYPE объявляет внешний DTD, указывающий на этот callback:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "http://localhost:<port>/external.dtd">
<fo:root …>…Hello…</fo:root>
Оракул — это просто был ли запрошен обратный вызов — неопровержимое доказательство того, что внешний ресурс был загружен:
TransformerFactory.newInstance() возвращает Saxon, который при одной лишь безопасной обработке всё равно загружает
внешний DTD — обратный вызов срабатывает (тот же механизм читает URL-адреса file://).ACCESS_EXTERNAL_DTD установлен в "", поэтому Saxon отказывается от внешнего DTD; обратный вызов никогда не срабатывает.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: callback hit = true; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -Djava.awt.headless=true -jar target/cve-2026-91858-fop-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: callback hit = false; >>> 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.22.0): callback hit = true
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 -Djava.awt.headless=true -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: callback hit = false
| Свойство | Значение |
|---|---|
| Компонент | camel-fop (FopProducer) |
| CWE | CWE-611 (Ненадлежащее ограничение ссылки на внешнюю сущность XML) |
| Критичность | MEDIUM |
| Вектор атаки | XSL-FO от внешнего отправителя достигает продюсера fop: в развёртывании, где в classpath также присутствует сторонний JAXP TransformerFactory (например, Saxon-HE) |
| Воздействие | Чтение локальных файлов, доступных процессу Camel; SSRF к внутренним хостам, указанным в документе |
| Затронутые версии | С 4.0.0 до 4.18.5, с 4.19.0 до 4.22.1 (только при наличии не-JDK TransformerFactory) |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24605 |
| Благодарность | Claude Security Scan Tool |
Рекомендация: https://camel.apache.org/security/CVE-2026-91858.html
Затронутый модуль Quarkus собран на CQ 3.39.0 (Camel 4.22.0). Исправленный контроль — CQ 3.40.0 (Camel 4.22.1). Saxon-HE 13.0 добавлен в оба модуля как замена приложения, которое также использует camel-xslt-saxon/camel-saxon; без не-JDK TransformerFactory уязвимость недостижима.
FopProducer теперь также устанавливает XMLConstants.ACCESS_EXTERNAL_DTD и
XMLConstants.ACCESS_EXTERNAL_STYLESHEET в пустую строку на создаваемом им TransformerFactory (в дополнение к
FEATURE_SECURE_PROCESSING), что соответствует конфигурации безопасной обработки XML, используемой в XmlConverter. Таким образом, доступ к внешним DTD и
таблицам стилей отклоняется в любой реализации JAXP, которая соблюдает эти атрибуты, включая Saxon-HE.
Не отправляйте недоверенный XSL-FO продюсеру fop: или удалите альтернативный JAXP TransformerFactory (например,
Saxon-HE) из classpath, чтобы использовался трансформер JDK — который уже отклоняет внешние DTD при безопасной обработке.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. Внешний DTD указывает на внутрипроцессный обратный вызов на localhost; ничего за пределами воспроизведения не затрагивается и никакие конфиденциальные файлы не читаются. Не используйте этот материал против систем, которыми вы не владеете и не управляете.