
Reproductores de prueba de concepto para la vulnerabilidad de path traversal en Apache Camel (CVE-2026-60093) en camel-azure-storage-datalake, que demuestran la escritura arbitraria de archivos mediante downloadToFile.
downloadToFileReproductores de prueba de concepto ejecutables para la misma vulnerabilidad de Apache Camel, uno por runtime:
| Runtime | Directorio | Stack |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-azure-storage-datalake 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 se corrige en 4.14.9 / 4.18.4 / 4.22.0) y ambas demuestran el mismo defecto: el componente camel-azure-storage-datalake puede descargar un archivo ADLS Gen2 al sistema de archivos local mediante su operación downloadToFile, escribiendo en el directorio indicado por la opción fileDir. DataLakeFileOperations.downloadToFile construía el destino local combinando fileDir con el nombre de ruta remoto exactamente como lo informaba el SDK de Azure (new File(fileDir, fileClientWrapper.getFileName())) — sin ninguna normalización léxica y sin ninguna comprobación de que la ubicación resultante permaneciera dentro de fileDir. El nombre remoto no está controlado por la ruta de Camel: el consumidor enumera el sistema de archivos (DataLakeConsumer.createBatchExchangesFromPath) y descarga cada entrada. Por consiguiente, un nombre de ruta que contenga segmentos ../ se resuelve fuera de fileDir (CWE-22, path traversal → escritura arbitraria de archivos).
Nota sobre el banco de pruebas. La API Data Lake Gen2 de Azure no está implementada por ningún emulador local disponible — Azurite devuelve HTTP 400 para
listPathsde Gen2 y las operaciones de archivos. Estos reproductores ejecutan por tanto el código vulnerable exacto (DataLakeFileOperations.downloadToFile→new File(fileDir, fileClientWrapper.getFileName())) directamente, suministrando un envoltorio de cliente de archivos de Data Lake cuyogetFileName()devuelve el nombre remoto — exactamente como el consumidor suministra el nombre que leyó dePathItem.getName(). El componente hermanocamel-azure-storage-blobcomparte la misma corrección (CVE-2026-66906) y allí el mismo defecto se reproduce de extremo a extremo contra un emulador Azurite en ejecución.
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):
2) Download of a file named '../../../../../../tmp/pwned-60093.txt':
resolved local target: /app/downloads/../../../../../../tmp/pwned-60093.txt
File written OUTSIDE it, at /tmp/pwned-60093.txt: true
content: PWNED via path traversal — CVE-2026-60093
>>> PROVEN: DataLakeFileOperations.downloadToFile built the local target as new File(fileDir, fileName) ... : true
| Propiedad | Valor |
|---|---|
| Componente | camel-azure-storage-datalake (Spring Boot: camel-azure-storage-datalake-starter; Quarkus: camel-quarkus-azure-storage-datalake) |
| CWE | CWE-22 (Improper Limitation of a Pathname to a Restricted Directory — Path Traversal) |
| Vector de ataque | Un archivo Gen2 cuyo nombre de ruta contiene segmentos ../, descargado por el consumidor con fileDir configurado |
| Impacto | Escritura arbitraria de archivos fuera del directorio fileDir 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-23942 |
| Crédito | n0mi1k; Hiep Nguyen |
El consumidor ahora resuelve y restringe el destino de la descarga al directorio fileDir configurado (mediante AzureFileNameHelper.resolveWithinDirectory), rechazando los nombres de ruta que escaparían de él — la misma corrección que cubre camel-azure-storage-blob (CVE-2026-66906).
Este repositorio se publica con fines educativos y defensivos: 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 que se escribe es un marcador benigno en /tmp. No utilice este material contra sistemas que no posea u opere.