
Reproducteur de preuve de concept exécutable pour CVE-2026-79984, une traversée de chemin dans Apache Camel camel-mina-sftp, avec des fixtures de serveur SFTP malveillant et des builds affectés vs. corrigés.
Reproducteur de proof-of-concept exécutable pour la vulnérabilité Apache Camel où le consumer mina-sftp — qui
dérive de la même classe de base RemoteFileConsumer que les autres consumers de fichiers distants — construit le chemin
distant absolu de chaque fichier interrogé en concaténant le répertoire configuré avec le nom rapporté dans le
listing du répertoire du serveur, sans normalisation lexicale ni vérification de confinement. Ce chemin devient ensuite l'opérande
de la récupération (toujours), et de la suppression ou du renommage lorsque delete=true, move, preMove, moveFailed ou
readLock=rename est configuré.
Un nom d'entrée de répertoire SFTP est une chaîne de protocole brute fournie par le serveur, de sorte qu'un serveur compromis, malveillant ou multi-tenant peut rapporter un nom qui n'est pas un segment de chemin unique.
Ceci est le frère
mina-sftpde CVE-2026-79983 (camel-ftp) ; les deux partagent la même cause racine et le même correctif.
| Runtime | Répertoire | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina-sftp 4.22.0 (affecté ; corrigé en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-mina-sftp 3.39.0 (Camel 4.22.0, affecté ; contrôle corrigé 3.40.0 / Camel 4.22.1) |
camel-mina-sftpa été introduit dans Camel 4.18.0, le composant n'existe donc pas dans le Camel 4.15.0 fourni par la dernière version numérotée de Camel Quarkus ; ce reproducteur utilise Camel Quarkus 3.39.0 (Camel 4.22.0, affecté), avec 3.40.0 (Camel 4.22.1) comme contrôle corrigé. Les deux modules démontrent donc le comportement affecté et le comportement corrigé.
L'application embarque un serveur SFTP délibérément malveillant (Apache MINA SSHD). Il sert une véritable arborescence de répertoires
temporaire mais réécrit, dans sa réponse SSH_FXP_READDIR, le nom d'un fichier du répertoire interrogé /upload en la
chaîne de traversée d/../../outside.txt (via une surcharge de getShortName). Le nom 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 mina-sftp simple interroge /upload.
normal.txt et le fichier échappant /outside.txt.normal.txt et ignore l'entrée échappante, 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é :
name=[d/../../outside.txt] <<< FILE FROM OUTSIDE THE POLLED DIRECTORY
content: OUTSIDE-SECRET (/outside.txt, a file the consumer should never reach)
name=[normal.txt] (inside)
| Propriété | Valeur |
|---|---|
| Composant | camel-mina-sftp (schéma mina-sftp) |
| CWE | CWE-22 (Limitation incorrecte d'un nom de chemin à un répertoire restreint) |
| Gravité | ÉLEVÉE |
| Vecteur d'attaque | Un nom d'entrée READDIR (fourni par le serveur) 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.18.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 de sécurité : https://camel.apache.org/security/CVE-2026-79984.html
GenericFileConsumer.isWithinStartingDirectory (surchargée par RemoteFileConsumer, dont dérive le consommateur mina-sftp) compacte le chemin résolu et vérifie, sur les limites de segments de chemin, qu'il reste à l'intérieur du répertoire interrogé ; une entrée se résolvant à l'extérieur est ignorée avec un avertissement tandis que les entrées légitimes continuent d'être traitées.
Vérifiez la clé d'hôte du serveur, restreignez le consommateur avec filter/antInclude/include pour n'accepter que des noms à segment unique, et évitez delete/move/preMove/moveFailed/readLock=rename contre des serveurs dont les listages ne sont pas entièrement fiables. Lorsque cela 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.