
Воспроизводимые PoC-эксплойты для обхода пути (path traversal) в Apache Camel camel-google-storage (CVE-2026-66907), демонстрирующие произвольную запись файлов через downloadFileName, с указанием затронутых и исправленных версий.
downloadFileName в camel-google-storageРабочие proof-of-concept репродукторы одной и той же уязвимости Apache Camel, по одному на каждый рантайм:
| Среда выполнения | Каталог | Стек |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-google-storage 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (поставляется с Camel 4.20.0) |
Обе версии затронуты (проблема исправлена в 4.14.9 / 4.18.4 / 4.22.0), и обе демонстрируют один и тот же
дефект: потребитель camel-google-storage загружает объекты бакета в локальную файловую систему, когда downloadFileName
является каталогом, формируя локальный путь назначения путём добавления к нему имени удалённого объекта
(downloadFileName + "/${file:name}"). Токен ${file:name} возвращает имя объекта как есть (в отличие от
${file:onlyname}, который отбрасывает путь), и результат передавался в new File(result) /
blob.downloadTo(file.toPath()) без нормализации и без проверки того, что путь назначения остался внутри
сконфигурированного каталога. Имя объекта не контролируется маршрутом — потребитель получает список объектов бакета и загружает
каждый из них — поэтому объект, имя которого содержит сегменты ../, записывается за пределами downloadFileName (CWE-22, обход
пути → произвольная запись файла).
Каждый подкаталог самодостаточен (свой Dockerfile, docker-compose.yml, поднимающий
fake-gcs-server эмулятор, и README). Вкратце, для любого из них:
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Ожидаемый вывод на затронутой сборке (оба варианта):
Files inside the intended download directory /app/downloads:
- report.txt
File written OUTSIDE it, at /tmp/pwned-66907.txt: true
content: PWNED via path traversal — CVE-2026-66907
>>> PROVEN: the object name's ../ segments escaped the configured downloadFileName directory ... : true
| Свойство | Значение |
|---|---|
| Компонент | camel-google-storage (Spring Boot: camel-google-storage-starter; Quarkus: camel-quarkus-google-storage) |
| CWE | CWE-22 (Некорректное ограничение имени пути внутри ограниченного каталога — обход пути) |
| Вектор атаки | Объект бакета, имя которого содержит сегменты ../, загружается потребителем с downloadFileName, заданным как каталог |
| Воздействие | Произвольная запись файла за пределами сконфигурированного каталога загрузки |
| Затронутые версии | С 4.0.0 до 4.14.9, с 4.15.0 до 4.18.4, с 4.19.0 до 4.22.0 |
| Исправленные версии | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24279 |
| Автор | n0mi1k |
Консультация: https://camel.apache.org/security/CVE-2026-66907.html
Теперь потребитель нормализует разрешённый путь и проверяет, что он остаётся внутри сконфигурированного каталога downloadFileName
(через GoogleCloudStorageFileNameHelper.assertWithinDirectory), отклоняя имена объектов, которые могли бы выйти за его пределы.
docker-compose.yml запускает fake-gcs-server с параметром -backend memory. Тогда имена объектов сохраняются как непрозрачные ключи
карты, поэтому имя, содержащее ../, сохраняется; стандартный файловый бэкенд разрешил бы ../, и объект
не был бы доступен для перечисления.
Этот репозиторий опубликован в образовательных и защитных целях: помочь пользователям Apache Camel понять
уязвимость, проверить, затронуты ли они, и убедиться, что обновление устраняет проблему. Записываемый файл — это
безвредная метка в /tmp. Не используйте этот материал против систем, которыми вы не владеете или не управляете.