
Riproduttore proof-of-concept eseguibile per CVE-2026-79984, un path traversal in Apache Camel camel-mina-sftp, con fixture di server SFTP malevoli e build vulnerabili e corrette.
Reproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui il consumer mina-sftp — che
deriva dalla stessa classe base RemoteFileConsumer degli altri consumer di file remoti — costruisce il percorso
remoto assoluto di ciascun file sottoposto a polling concatenando la directory configurata con il nome riportato nel
listing della directory del server, senza alcuna normalizzazione lessicale e senza alcun controllo di contenimento. Tale percorso diventa poi l'operando per il recupero (sempre), e per la cancellazione o la rinomina quando sono configurati delete=true, move, preMove, moveFailed o readLock=rename.
Il nome di una voce di directory SFTP è una stringa di protocollo grezza fornita dal server, quindi un server compromesso, malevolo o multi-tenant può riportare un nome che non è un singolo segmento di percorso.
Questo è il fratello
mina-sftpdi CVE-2026-79983 (camel-ftp); entrambi condividono la stessa causa radice e la stessa correzione.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina-sftp 4.22.0 (affetto; corretto in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-mina-sftp 3.39.0 (Camel 4.22.0, affetto; controllo corretto 3.40.0 / Camel 4.22.1) |
camel-mina-sftpè stato introdotto in Camel 4.18.0, quindi il componente non esiste nel Camel 4.15.0 incluso nell'ultima versione numerata di Camel Quarkus; questo reproduttore usa Camel Quarkus 3.39.0 (Camel 4.22.0, affetto), con 3.40.0 (Camel 4.22.1) come controllo corretto. Entrambi i moduli dimostrano quindi il comportamento affetto e quello corretto.
L'app incorpora un server SFTP deliberatamente malevolo (Apache MINA SSHD). Serve un albero di directory temporanee reale
ma riscrive, nella sua risposta SSH_FXP_READDIR, il nome di un file nella directory sottoposta a polling /upload con la
stringa di traversal d/../../outside.txt (tramite un override di getShortName). Il nome non inizia con un punto, quindi
la regola di Camel sui file nascosti non lo intercetta, e /upload + d/../../outside.txt si risolve in /outside.txt, un
livello sopra la directory sottoposta a polling. Un semplice consumer mina-sftp esegue il polling di /upload.
normal.txt sia il file in fuga /outside.txt.normal.txt e salta la voce in fuga, registrando nel log
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
Output previsto sulla build interessata:
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)
| Proprietà | Valore |
|---|---|
| Componente | camel-mina-sftp (schema mina-sftp) |
| CWE | CWE-22 (Limitazione impropria di un percorso a una directory ristretta) |
| Gravità | ALTA |
| Vettore di attacco | Un nome di voce READDIR (fornito dal server) che non è un singolo segmento di percorso |
| Impatto | Lettura — e, con delete/move/readLock=rename, cancellazione o ridenominazione — di file al di fuori della directory sottoposta a polling, utilizzando le credenziali dell'endpoint |
| Versioni interessate | Dalla 4.18.0 precedente alla 4.18.5, dalla 4.19.0 precedente alla 4.22.1 |
| Versioni corrette | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24487 |
| Riconoscimento | Dilrevx di NSSL, SJTU |
Avviso: https://camel.apache.org/security/CVE-2026-79984.html
GenericFileConsumer.isWithinStartingDirectory (sovrascritto da RemoteFileConsumer, da cui deriva il consumer
mina-sftp) compatta il percorso risolto e verifica, sui confini dei segmenti di percorso, che rimanga all'interno
della directory sottoposta a polling; una voce che si risolve all'esterno viene saltata con un avviso mentre le voci legittime vengono comunque elaborate.
Verificare la chiave host del server, limitare il consumer con filter/antInclude/include per accettare solo nomi
a singolo segmento, ed evitare delete/move/preMove/moveFailed/readLock=rename verso server i cui elenchi non sono
pienamente attendibili. Ove possibile, confinare l'account del server alla directory sottoposta a polling.
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 server malevolo e il "secret" sono fixture locali inerti. Non utilizzare questo materiale contro sistemi di cui non si è proprietari o gestori.