
Работающий репродуктор на Spring Boot и Quarkus для CVE-2026-85249, демонстрирующий внедрение заголовка метаданных camel-tika в CamelFileName с уязвимым и исправленным вариантами.
CamelFileName)Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой Tika producer отображал каждый
ключ метаданных, извлечённый из отправленного документа, в Exchange как заголовок, без применения фильтрации. Метаданные
документа — это контролируемое злоумышленником содержимое: сторона, предоставляющая файл, выбирает ключи метаданных, которые он несёт. Таким
образом, специально сформированный документ мог задавать заголовки Exchange, от которых зависит остальная часть маршрута, включая заголовки
пространства имён Camel, такие как CamelFileName, которые нижестоящие компоненты используют для определения места записи содержимого. Это тот же
класс инъекции заголовков, что и в рекомендациях по потребителям, но здесь он достигается через разобранное содержимое файла, а не через заголовок
протокола.
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-tika 4.22.0 (уязвим; исправлено в 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-tika (Camel 4.22.0, уязвим; исправленный контроль CQ 3.40.0 / Camel 4.22.1) |
Оба модуля демонстрируют как уязвимое, так и исправленное поведение.
Злоумышленник отправляет HTML-документ — атрибут HTML <meta name="..."> попадает в метаданные Tika дословно, поэтому
документ выбирает имена заголовков:
<meta name="CamelFileName" content="ATTACKER-SET-../../pwned.txt"/>
<meta name="author" content="legitimate-metadata"/>
Маршрут просто from(...).to("tika:parse"). После разбора проверяются заголовки Exchange.
CamelFileName (Exchange.FILE_NAME) устанавливается в значение атакующего из документа. Нижестоящий
файловый producer использовал бы это выбранное атакующим значение для определения места записи содержимого.CamelFileName отфильтровывается (не устанавливается из документа), при этом обычные метаданные, такие как author,
по-прежнему отображаются — фильтр блокирует только внутреннее пространство имён Camel.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: document sets CamelFileName; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85249-tika-header-injection-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelFileName filtered; >>> 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): document sets CamelFileName
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: CamelFileName filtered
| Свойство | Значение |
|---|---|
| Компонент | camel-tika (TikaProducer.convertMetadataToHeaders) |
| CWE | CWE-20 (Некорректная проверка входных данных) |
| Уровень серьёзности | MEDIUM |
| Вектор атаки | Отправленный документ, метаданные которого при разборе объявляют имена заголовков, внутренних для Camel (например, через HTML <meta name="CamelFileName">) |
| Воздействие | Внедрение заголовков: документ задаёт заголовки Exchange, на которые полагается маршрут, например CamelFileName, определяющий, куда нижестоящие компоненты записывают содержимое |
| Затронутые версии | С 4.0.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24423 |
| Благодарность | Claude Security Scan Tool |
Рекомендация: https://camel.apache.org/security/CVE-2026-85249.html
TikaProducer.convertMetadataToHeaders теперь фильтрует каждое имя метаданных,
полученное при разборе, через HeaderFilterStrategy (настроенную с помощью inFilterStartsWith("Camel", "camel", "org.apache.camel."),
без учёта регистра), прежде чем сопоставить его с Exchange — так же, как consumer фильтрует имена, предоставленные внешним
отправителем, — поэтому документ не может объявить имя метаданных, попадающее во внутреннее пространство имён Camel. Метаданные вне этого
пространства имён по-прежнему сопоставляются.
Удалите пространство имён Camel после producer Tika с помощью removeHeaders("Camel*") перед любым компонентом, который действует на
эти заголовки.
Этот репозиторий опубликован в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. Специально созданный документ и внедрённое имя файла являются безвредными локальными тестовыми образцами. Не используйте этот материал против систем, которыми вы не владеете и не управляете.