
Reproducteur de preuve de concept exécutable pour CVE-2026-79983, une traversée de chemin dans les consommateurs camel-ftp d'Apache Camel, avec des fixtures de serveur FTP malveillant et des builds affectés vs corrigés.
Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où les consumers de fichiers distants interrogent un
répertoire sur un serveur distant et construisent le chemin distant absolu de chaque fichier en concaténant le répertoire
configuré avec le nom de fichier rapporté dans le listing du répertoire du serveur, sans normalisation lexicale et sans
vérifier que le résultat reste à l'intérieur du répertoire interrogé. Ce chemin devient ensuite l'opérande pour la récupération (toujours),
et pour la suppression ou le renommage lorsque delete=true, move, preMove, moveFailed ou readLock=rename est configuré.
Un nom de listing n'est pas une donnée contrôlée par la route — il est fourni par le serveur distant, et le canal de contrôle FTP
n'a aucune protection d'intégrité, de sorte qu'un attaquant sur le chemin peut réécrire une réponse LIST, et un serveur compromis ou multi-tenant
peut émettre un tel nom directement. L'option documentée et activée par défaut jailStartingDirectory n'a pas contraint
cet opérande distant.
| Runtime | Répertoire | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-ftp 4.22.0 (affecté ; corrigé en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-ftp 3.29.0 (Camel 4.15.0, affecté) |
Le correctif est livré dans Camel 4.18.5 / 4.22.1 / 4.23.0 ; le module Spring Boot exécute à la fois la version affectée (4.22.0) et la version corrigée (4.22.1). Aucune version publiée de Camel Quarkus n'embarque encore un Camel corrigé.
L'application embarque un serveur FTP délibérément malveillant (Apache MINA FtpServer avec un VFS en mémoire) qui liste, dans
le répertoire interrogé /upload :
normal.txt — un fichier légitime à l'intérieur du répertoire, etd/../../outside.txt — une entrée forgée dont le nom n'est pas un segment de chemin unique. Il ne commence pas par un point
(donc la règle de Camel sur les fichiers cachés ne l'intercepte pas), et /upload + d/../../outside.txt se résout en /outside.txt,
un niveau au-dessus du répertoire interrogé.Un consumer FTP Camel standard interroge /upload. Sur la version affectée, il récupère les deux entrées — y compris
/outside.txt, un fichier qu'il ne devrait jamais atteindre. Sur la version corrigée, il conserve normal.txt et ignore l'entrée
qui s'échappe, en journalisant Skipping file as it resolves outside the starting directory: upload/d/../../outside.txt.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Sortie attendue sur le build affecté :
What the Camel consumer retrieved:
name=[normal.txt] (inside)
name=[d/../../outside.txt] <<< FILE FROM OUTSIDE THE POLLED DIRECTORY
content: OUTSIDE-SECRET (/outside.txt, a file the consumer should never reach)
Paths the server was asked to read:
upload/normal.txt -> /upload/normal.txt
upload/d/../../outside.txt -> /outside.txt
| Propriété | Valeur |
|---|---|
| Composant | camel-ftp (schémas ftp, ftps, sftp) |
| CWE | CWE-22 (Limitation incorrecte d'un nom de chemin à un répertoire restreint) |
| Gravité | ÉLEVÉE |
| Vecteur d'attaque | Une entrée LIST (fournie par le serveur, réinscriptible sur un canal de contrôle FTP non authentifié) qui n'est pas un segment de chemin unique |
| Impact | Lecture — et, avec delete/move/readLock=rename, suppression ou renommage — de fichiers en dehors du répertoire interrogé, en utilisant les identifiants du point de terminaison |
| Versions affectées | À partir de 4.0.0 avant 4.18.5, à partir de 4.19.0 avant 4.22.1 |
| Versions corrigées | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24487 |
| Crédit | Dilrevx de NSSL, SJTU |
Avis : https://camel.apache.org/security/CVE-2026-79983.html
Une surcharge de GenericFileHelper.isWithinDirectory tenant compte des séparateurs et une stratégie GenericFileConsumer.isWithinStartingDirectory
(consultée depuis isValidFile lorsque jailStartingDirectory est activé) compactent le chemin résolu et vérifient,
sur les frontières de segments de chemin, qu'il se résout toujours à l'intérieur du répertoire interrogé. Un fichier se résolvant à l'extérieur est ignoré
avec un avertissement (afin que les autres entrées légitimes du même listing soient tout de même traitées). RemoteFileConsumer et
SmbConsumer redéfinissent la vérification ; l'implémentation de base locale est sans effet, car les noms de listing locaux sont toujours
des segments uniques.
Préférez sftp/ftps à ftp afin que le listing ne puisse pas être réinscrit en transit, et vérifiez la clé d'hôte/le certificat.
Restreignez le consommateur avec filter, antInclude ou include pour n'accepter que des noms à segment unique, et évitez
delete=true/move/preMove/moveFailed/readLock=rename contre des serveurs dont les listings ne sont pas entièrement fiables.
Lorsque c'est possible, limitez le compte serveur au répertoire interrogé.
Ce dépôt est publié à des fins éducatives et défensives : pour aider les utilisateurs d'Apache Camel à comprendre la vulnérabilité, vérifier s'ils sont affectés et confirmer que la mise à jour la résout. Le serveur malveillant et le « secret » sont des fixtures locales inertes. N'utilisez pas ce matériel contre des systèmes que vous ne possédez pas ou n'exploitez pas.