
Preuves de concept (PoC) pour la vulnérabilité de traversée de chemin Apache Camel (CVE-2026-60093) dans camel-azure-storage-datalake, démontrant une écriture arbitraire de fichiers via downloadToFile.
downloadToFilePreuves de concept exécutables de la même vulnérabilité Apache Camel, une par runtime :
| Runtime | Répertoire | 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 (embarque Camel 4.20.0) |
Les deux sont des versions affectées (le problème est corrigé dans 4.14.9 / 4.18.4 / 4.22.0), et les deux démontrent le même défaut : le composant camel-azure-storage-datalake peut télécharger un fichier ADLS Gen2 vers le système de fichiers local via son opération downloadToFile, en écrivant dans le répertoire désigné par l'option fileDir.
DataLakeFileOperations.downloadToFile construisait la cible locale en concaténant fileDir avec le nom de chemin distant exactement tel que le SDK Azure le rapportait (new File(fileDir, fileClientWrapper.getFileName())) — sans aucune normalisation lexicale ni aucun contrôle que l'emplacement résolu restait dans fileDir. Le nom distant n'est pas contrôlé par la route : le consommateur énumère le système de fichiers (DataLakeConsumer.createBatchExchangesFromPath) et télécharge chaque entrée. Un nom de chemin contenant des segments ../ se résout donc en dehors de fileDir (CWE-22, traversée de chemin → écriture de fichier arbitraire).
Note sur le harnais de test. L'API Azure Data Lake Gen2 n'est implémentée par aucun émulateur local disponible — Azurite renvoie une erreur HTTP 400 pour
listPathsGen2 et les opérations sur les fichiers. Ces reproducteurs pilotent donc directement le code vulnérable exact (DataLakeFileOperations.downloadToFile→new File(fileDir, fileClientWrapper.getFileName())), en fournissant un wrapper de client de fichier Data Lake dontgetFileName()renvoie le nom distant — exactement comme le consommateur fournit le nom qu'il a lu depuisPathItem.getName(). Le composant frèrecamel-azure-storage-blobpartage le même correctif (CVE-2026-66906) et là, le défaut identique est reproduit de bout en bout contre un émulateur Azurite réel.
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
Sortie attendue sur une version affectée (les deux 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
| Propriété | Valeur |
|---|---|
| Composant | camel-azure-storage-datalake (Spring Boot : camel-azure-storage-datalake-starter ; Quarkus : camel-quarkus-azure-storage-datalake) |
| CWE | CWE-22 (Limitation incorrecte d'un nom de chemin à un répertoire restreint — traversée de chemin) |
| Vecteur d'attaque | Un fichier Gen2 dont le nom de chemin contient des segments ../, téléchargé par le consommateur avec fileDir défini |
| Impact | Écriture de fichier arbitraire en dehors du répertoire fileDir configuré |
| Versions affectées | De 4.0.0 à 4.14.9 (exclu), de 4.15.0 à 4.18.4 (exclu), de 4.19.0 à 4.22.0 (exclu) |
| Versions corrigées | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-23942 |
| Crédit | n0mi1k ; Hiep Nguyen |
Avis de sécurité : https://camel.apache.org/security/CVE-2026-60093.html
Le consommateur résout désormais la cible de téléchargement et la contraint au répertoire fileDir configuré (via AzureFileNameHelper.resolveWithinDirectory), en rejetant les noms de chemin qui s'en échapperaient — le même correctif qui couvre camel-azure-storage-blob (CVE-2026-66906).
Ce dépôt est publié à des fins éducatives et défensives : aider les utilisateurs d'Apache Camel à comprendre la vulnérabilité, vérifier s'ils sont affectés et confirmer que la mise à niveau la corrige. Le fichier écrit est un marqueur bénin dans /tmp. N'utilisez pas ce contenu contre des systèmes que vous ne possédez pas ou n'exploitez pas.