
Запускаемый proof-of-concept на Spring Boot, воспроизводящий CVE-2026-88901 — уязвимость XXE (CWE-611) в Apache Camel camel-smooks, с контрольными запусками уязвимой и исправленной версий.
Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой формат данных Smooks
(.unmarshal().smooks(...)) и компонент Smooks (smooks:) разбирали входящее XML-тело с помощью ридера,
который Smooks выбирает по умолчанию (SAX-парсер Woodstox), а он разрешает внешние общие и параметрические сущности и
загружает внешние DTD — и camel-smooks не применял ни одного из мер по усилению безопасности парсера, которые применяют другие XML-компоненты Camel.
Поэтому DOCTYPE с внешним подмножеством или внешняя общая сущность, объявленные в XML-документе, разрешаются
и раскрываются при демаршалинге тела, а разрешённое содержимое привязывается к результату. Внешний отправитель,
чей XML достигает формата данных или эндпоинта camel-smooks, мог бы прочитать файлы, доступные процессу Camel, или заставить
процесс отправлять запросы на внутренние хосты (CWE-611). Никакая нестандартная опция не требуется — разрешение внешних сущностей было
поведением по умолчанию.
Только Spring Boot. Этот воспроизводитель содержит единственный модуль Camel Spring Boot. У
camel-smooksнет расширенияcamel-quarkus-smooks, поэтому аналога для Quarkus для воспроизведения нет. Модуль Spring Boot демонстрирует как уязвимое, так и исправленное поведение.
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-smooks 4.22.0 (уязвимая; исправлено в 4.22.1) |
Драйвер повторяет собственный регрессионный тест исправления (SmooksDataFormatXmlSecurityTest). Безвредный файл-маркер
записывается во временный каталог, и XML-документ <customer> демаршалится через настоящий SmooksDataFormat со
стандартным smooks-config.xml (привязывающим документ к бину Customer). Поле firstName документа является внешней
сущностью, указывающей на файл-маркер:
<!DOCTYPE customer [<!ENTITY xxe SYSTEM "file:///…/secret.txt">]>
<customer><firstName>&xxe;</firstName>…</customer>
Customer.firstName — файл
утекает в десериализованный бин.DocumentBuilder (загрузка внешних сущностей и внешних DTD
отключена), поэтому сущность не разрешается и маркер никогда не появляется.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: firstName = the marker file content; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-88901-smooks-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: firstName null, marker not leaked; >>> Not exploited
| Свойство | Значение |
|---|---|
| Компонент | camel-smooks (формат данных и компонент Smooks) |
| CWE | CWE-611 (Ненадлежащее ограничение ссылки на внешнюю сущность XML) |
| Критичность | ВЫСОКАЯ |
| Вектор атаки | Внешний отправитель передаёт тело XML-сообщения, демаршализуемое форматом данных или эндпоинтом camel-smooks с использованием XML-ридера по умолчанию |
| Воздействие | Чтение локальных файлов, доступных процессу Camel; SSRF на внутренние хосты, указанные в документе |
| Затронутые версии | С 4.7.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24677 |
| Сообщил | h1ei1 |
Уведомление: https://camel.apache.org/security/CVE-2026-88901.html
camel-smooks теперь предварительно разбирает недоверенный XML с помощью
javax.xml.parsers.DocumentBuilder, настроенного с FEATURE_SECURE_PROCESSING и с отключённой загрузкой внешних
общих сущностей, внешних параметрических сущностей и внешних DTD, и передаёт Smooks полученный DOM — в соответствии с
безопасной конфигурацией, используемой XmlConverter и другими XML-компонентами Camel. Усиление защиты применяется
только когда конфигурация Smooks разбирает XML с помощью своего ридера по умолчанию (таким образом, конфигурации EDI,
CSV, JSON и с пользовательским ридером, а также направление маршалинга остаются без изменений). Новая опция
allowExternalEntities, отключённая по умолчанию, восстанавливает прежнее поведение для доверенных устаревших
конфигураций.
Не применяйте camel-smooks к XML, полученному от недоверенных отправителей.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. Файл «secret» создаётся самим воспроизведением во временном каталоге и содержит только безвредную строку-маркер; он удаляется после проверки. Не используйте этот материал против систем, которыми вы не владеете и не управляете.