
Инструмент для воспроизведения CVE-2026-40047: Apache Camel camel-docling — инъекция аргументов CLI / обход пути
Этот проект демонстрирует уязвимость инъекции аргументов CLI и обхода пути в компоненте Apache Camel camel-docling, отслеживаемую как CVE-2026-40047. DoclingProducer формирует вызов внешнего инструмента командной строки docling из заголовков сообщений; пользовательские аргументы, переданные через заголовок CamelDoclingCustomArguments, добавлялись с недостаточной проверкой (черный список плюс буквальная проверка ../), поэтому злоумышленник, влияющий на эти заголовки, может внедрить произвольные флаги CLI docling и значения путей с обходом в дочерний процесс.
Уведомление: https://camel.apache.org/security/CVE-2026-40047.html
DoclingProducer собирает вызов docling и запускает его через java.lang.ProcessBuilder (list-форма — без shell). Пользовательские аргументы CLI из заголовка CamelDoclingCustomArguments добавляются к команде:
// DoclingProducer.addCustomArguments(...) - affected version
List<String> customArgs = exchange.getIn().getHeader(DoclingHeaders.CUSTOM_ARGUMENTS, List.class);
if (customArgs != null && !customArgs.isEmpty()) {
validateCustomArguments(customArgs); // denylist + literal "../" check (weak)
command.addAll(customArgs);
}
В затронутых версиях validateCustomArguments полагался на черный список запрещенных флагов и отклонял только те значения путей, которые содержали буквальный ../. В результате:
docling.../ (абсолютные пути или нормализованные последовательности), не перехватываются.Поскольку Camel формирует вызов docling, компонент отвечает за ограничение этих значений. Исправление (CAMEL-23212) заменяет черный список строгим белым списком распознаваемых флагов, отклоняет управляемые производителем флаги (--output/-o) и метасимволы оболочки (эшелонированная защита) и нормализует значения, похожие на пути, с помощью Path.normalize() перед проверкой.
При вызове используется list-форма
ProcessBuilder, поэтому оболочка не интерпретирует значения — инъекция команд ОС через метасимволы оболочки невозможна; отклонение метасимволов в исправлении является эшелонированной защитой.
from("direct:convert")
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&contentInBody=true");
docling — это внешний инструмент. Данный репродуктор поставляется с заглушкой docling (на PATH внутри контейнера), которая записывает полученные argv и возвращает markdown-файл, поэтому внедренные аргументы видны в HTTP-ответе и в /tmp/docling-invocations.log. Все выполняется внутри Docker-образа (приложение + заглушка) — установка настоящего docling не требуется.
docling)mvn clean package -DskipTests
docker compose up -d --build
curl http://localhost:8080/exploit/normal
# stub docling receives: docling --to md --ocr-lang en --output <tmp> /tmp/input.txt
curl "http://localhost:8080/exploit/attack"
# injects CamelDoclingCustomArguments = [--injected-by-attacker, arbitrary-value]
# -> stub docling receives:
# docling --injected-by-attacker arbitrary-value --to md --ocr-lang en --output <tmp> /tmp/input.txt
# a path value with no literal "../" (absolute path) also passes:
curl "http://localhost:8080/exploit/attack?flag=--artifacts-path&value=/etc/attacker-controlled"
В затронутой версии (в этом репродукторе зафиксирована 4.18.2) маршрут успешно выполняется, и внедренные аргументы достигают дочернего процесса. В исправленной версии (4.18.3 / 4.19.0) белый список отклоняет --injected-by-attacker с IllegalArgumentException, и маршрут завершается ошибкой.
docker compose down
CamelDoclingCustomArguments (или в заголовки, содержащие пути) производителя docling:.Обновитесь до 4.18.3 / 4.19.0. Исправление использует строгий белый список распознаваемых флагов docling, отклоняет управляемые производителем флаги и метасимволы оболочки, а также нормализует значения путей с помощью Path.normalize() перед их проверкой.
До обновления:
CamelDoclingCustomArguments или в заголовки, содержащие пути.removeHeaders("Camel*")) из сообщений, поступающих от ненадежных производителей, до передачи производителю docling:.CVE-2026-40047/
├── pom.xml
├── Dockerfile # app + stub 'docling' on PATH
├── docker-compose.yml
├── docling-stub.sh # stub 'docling' (logs argv, writes markdown)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── DoclingRoute.java # from(direct:convert).to(docling:convert)
│ └── ExploitController.java # injects CamelDoclingCustomArguments
└── resources/
└── application.properties
Данный репродуктор предоставляется только для исследований в области безопасности и авторизованного тестирования, для публично раскрытой и исправленной уязвимости. Не используйте его против систем без явного разрешения.
| Свойство | Значение |
|---|
| Компонент | camel-docling |
| Затронутый класс | org.apache.camel.component.docling.DoclingProducer (addCustomArguments / validateCustomArguments) |
| Корневая причина | CamelDoclingCustomArguments (список List<String>) добавляется к аргументам CLI docling со слабой проверкой по черному списку и буквальной проверкой ../ |
| CWE | CWE-88 (Инъекция аргументов) / CWE-22 (Обход пути) |
| Воздействие | Внедрение произвольных/непредусмотренных флагов CLI docling и значений путей за пределами каталога во внешний инструмент. НЕ является инъекцией команд ОС (list-форма ProcessBuilder, без shell). |
| Затронутые версии | С 4.15.0 до 4.18.3 (не включая 4.18.3) |
| Исправленные версии | 4.18.3, 4.19.0 |
| JIRA | CAMEL-23212 |
| Репортер | Andrea Cosentino (Apache Software Foundation) |