
Proof-of-concept per la riproduzione del path traversal di Apache Camel camel-google-storage (CVE-2026-66907), che dimostrano la scrittura arbitraria di file tramite downloadFileName, con dettagli sulle versioni interessate e corrette.
downloadFileName path traversalProof-of-concept eseguibili per la stessa vulnerabilità Apache Camel, uno per runtime:
| Runtime | Directory | 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 (include Camel 4.20.0) |
Entrambe sono versioni affette (il problema è risolto in 4.14.9 / 4.18.4 / 4.22.0) e dimostrano lo stesso
difetto: il consumer camel-google-storage scarica gli oggetti del bucket sul filesystem locale quando
downloadFileName è una directory, costruendo la destinazione locale aggiungendovi il nome dell'oggetto remoto
(downloadFileName + "/${file:name}"). Il token ${file:name} restituisce il nome dell'oggetto così com'è (a differenza di
${file:onlyname}, che rimuove il percorso), e il risultato veniva passato a new File(result) /
blob.downloadTo(file.toPath()) senza normalizzazione e senza verifica che la destinazione rimanesse all'interno della
directory configurata. Il nome dell'oggetto non è controllato dalla route — il consumer elenca il bucket e scarica ogni
oggetto — quindi un oggetto il cui nome contiene segmenti ../ viene scritto fuori da downloadFileName (CWE-22, path
traversal → scrittura arbitraria di file).
Ogni sottodirectory è autonoma (con il proprio Dockerfile, docker-compose.yml che avvia un
emulatore fake-gcs-server, e README). In breve, per entrambe:
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 affetta (entrambe le varianti):
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
| Proprietà | Valore |
|---|---|
| Componente | camel-google-storage (Spring Boot: camel-google-storage-starter; Quarkus: camel-quarkus-google-storage) |
| CWE | CWE-22 (Improper Limitation of a Pathname to a Restricted Directory — Path Traversal) |
| Vettore d'attacco | Un oggetto del bucket il cui nome contiene segmenti ../, scaricato dal consumer con downloadFileName impostato su una directory |
| Impatto | Scrittura arbitraria di file al di fuori della directory di download configurata |
| Versioni affette | Dalla 4.0.0 fino a prima della 4.14.9, dalla 4.15.0 fino a prima della 4.18.4, dalla 4.19.0 fino a prima della 4.22.0 |
| Versioni corrette | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24279 |
| Crediti | n0mi1k |
Il consumer ora normalizza il percorso risolto e verifica che rimanga all'interno della directory downloadFileName
configurata (tramite GoogleCloudStorageFileNameHelper.assertWithinDirectory), rifiutando i nomi degli oggetti che
tenterebbero di uscirne.
Il docker-compose.yml esegue fake-gcs-server con -backend memory. I nomi degli oggetti vengono quindi mantenuti
come chiavi opache di mappa, quindi un nome contenente ../ viene preservato; il backend filesystem predefinito
risolverebbe ../ e l'oggetto non sarebbe elencabile.
Questo repository è pubblicato per scopi educativi e difensivi: 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
marker innocuo in /tmp. Non utilizzare questo materiale contro sistemi che non possiedi o che non gestisci.