
Reproductores de prueba de concepto para la vulnerabilidad de path traversal en Apache Camel camel-google-storage (CVE-2026-66907), que demuestran la escritura arbitraria de archivos mediante downloadFileName, con detalles de las versiones afectadas y corregidas.
downloadFileName path traversalReproductores ejecutables de prueba de concepto para la misma vulnerabilidad de Apache Camel, uno por entorno de ejecución:
| Entorno de ejecución | Directorio | Stack |
|---|
| 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 (incluye Camel 4.20.0) |
Ambas son versiones afectadas (el problema está corregido en 4.14.9 / 4.18.4 / 4.22.0) y ambas demuestran el mismo defecto: el consumidor de camel-google-storage descarga los objetos del bucket al sistema de archivos local cuando downloadFileName es un directorio, construyendo el destino local añadiendo el nombre del objeto remoto a dicho directorio (downloadFileName + "/${file:name}"). El token ${file:name} devuelve el nombre del objeto tal cual (a diferencia de ${file:onlyname}, que elimina la ruta), y el resultado se pasaba a new File(result) / blob.downloadTo(file.toPath()) sin normalización y sin comprobar que el destino permaneciera dentro del directorio configurado. El nombre del objeto no está controlado por la ruta — el consumidor enumera el bucket y descarga todos los objetos — por lo que un objeto cuyo nombre contenga segmentos ../ se escribe fuera de downloadFileName (CWE-22, path traversal → escritura arbitraria de archivos).
Cada subdirectorio es autónomo (con su propio Dockerfile, un docker-compose.yml que levanta un emulador fake-gcs-server y un README). En resumen, para cualquiera de los dos:
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
Salida esperada en una compilación afectada (ambas variantes):
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
| Propiedad | Valor |
|---|---|
| Componente | camel-google-storage (Spring Boot: camel-google-storage-starter; Quarkus: camel-quarkus-google-storage) |
| CWE | CWE-22 (Limitación incorrecta de un nombre de ruta a un directorio restringido — Path Traversal) |
| Vector de ataque | Un objeto del bucket cuyo nombre contiene segmentos ../, descargado por el consumidor con downloadFileName establecido como directorio |
| Impacto | Escritura arbitraria de archivos fuera del directorio de descarga configurado |
| Versiones afectadas | Desde 4.0.0 hasta antes de 4.14.9, desde 4.15.0 hasta antes de 4.18.4, desde 4.19.0 hasta antes de 4.22.0 |
| Versiones corregidas | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24279 |
| Crédito | n0mi1k |
El consumidor ahora normaliza la ruta resuelta y comprueba que permanezca dentro del directorio downloadFileName configurado (mediante GoogleCloudStorageFileNameHelper.assertWithinDirectory), rechazando los nombres de objeto que escaparían de él.
El docker-compose.yml ejecuta fake-gcs-server con -backend memory. Los nombres de los objetos se mantienen entonces como claves opacas de un mapa, por lo que un nombre que contenga ../ se conserva; el backend de sistema de archivos por defecto resolvería el ../ y el objeto no sería listable.
Este repositorio se publica con fines educativos y defensivos: para ayudar a los usuarios de Apache Camel a comprender la vulnerabilidad, verificar si están afectados y confirmar que la actualización la resuelve. El archivo escrito es un marcador benigno en /tmp. No utilice este material contra sistemas que no posea u opere.