
Riproduttori proof-of-concept per la vulnerabilità di path traversal di Apache Camel (CVE-2026-60093) in camel-azure-storage-datalake, che dimostrano la scrittura arbitraria di file tramite downloadToFile.
downloadToFile attraversamento del percorsoRiproduzioni proof-of-concept eseguibili per la stessa vulnerabilità Apache Camel, una per runtime:
| Runtime | Directory | 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 (include Camel 4.20.0) |
Entrambe sono versioni interessate (il problema è risolto in 4.14.9 / 4.18.4 / 4.22.0) e dimostrano il medesimo difetto: il componente camel-azure-storage-datalake può scaricare un file ADLS Gen2 nel filesystem locale tramite la sua operazione downloadToFile, scrivendo nella directory indicata dall'opzione fileDir.
DataLakeFileOperations.downloadToFile costruiva la destinazione locale unendo fileDir con il nome del percorso remoto esattamente come riportato dall'SDK di Azure (new File(fileDir, fileClientWrapper.getFileName())) — senza alcuna normalizzazione lessicale e nessun controllo che la posizione risolta rimanesse all'interno di fileDir. Il nome remoto non è controllato dalla route: il consumer elenca il filesystem (DataLakeConsumer.createBatchExchangesFromPath) e scarica ogni voce. Un nome di percorso contenente segmenti ../ quindi risolve fuori da fileDir (CWE-22, attraversamento del percorso → scrittura arbitraria di file).
Nota sull'infrastruttura di test. L'API Azure Data Lake Gen2 non è implementata da nessun emulatore locale disponibile — Azurite restituisce HTTP 400 per le operazioni
listPathse le operazioni sui file Gen2. Queste riproduzioni quindi eseguono direttamente l'esatto codice vulnerabile (DataLakeFileOperations.downloadToFile→new File(fileDir, fileClientWrapper.getFileName())), fornendo un wrapper del client file di Data Lake il cuigetFileName()restituisce il nome remoto — esattamente come il consumer fornisce il nome letto daPathItem.getName(). Il componente gemellocamel-azure-storage-blobcondivide la stessa correzione (CVE-2026-66906) e lì il difetto identico viene riprodotto end-to-end contro un emulatore Azurite reale.
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
Output atteso su una build interessata (entrambe le varianti):
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
| Proprietà | Valore |
|---|---|
| Componente | camel-azure-storage-datalake (Spring Boot: camel-azure-storage-datalake-starter; Quarkus: camel-quarkus-azure-storage-datalake) |
| CWE | CWE-22 (Limitazione impropria di un nome di percorso a una directory ristretta — Path Traversal) |
| Vettore d'attacco | Un file Gen2 il cui nome di percorso contiene segmenti ../, scaricato dal consumer con fileDir impostato |
| Impatto | Scrittura arbitraria di file al di fuori della directory fileDir configurata |
| Versioni interessate | Dalla 4.0.0 alla 4.14.9 (esclusa), dalla 4.15.0 alla 4.18.4 (esclusa), dalla 4.19.0 alla 4.22.0 (esclusa) |
| Versioni corrette | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-23942 |
| Crediti | n0mi1k; Hiep Nguyen |
Il consumer ora risolve e limita la destinazione del download alla directory fileDir configurata (tramite AzureFileNameHelper.resolveWithinDirectory), rifiutando i nomi di percorso che proverebbero a uscirne — la stessa correzione che copre camel-azure-storage-blob (CVE-2026-66906).
Questo repository è pubblicato a scopo educativo e difensivo: per aiutare gli utenti di Apache Camel a comprendere la vulnerabilità, verificare se sono interessati e confermare che l'aggiornamento la risolve. Il file scritto è un marcatore innocuo in /tmp. Non utilizzare questo materiale contro sistemi che non possiedi o che non gestisci.