
Reproductor de prueba de concepto ejecutable para CVE-2026-79984, un path traversal en Apache Camel camel-mina-sftp, con fixtures de servidor SFTP malicioso y compilaciones afectadas frente a corregidas.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que el consumidor mina-sftp —que
deriva de la misma clase base RemoteFileConsumer que los demás consumidores de archivos remotos— construye la ruta
remota absoluta de cada archivo sondeado concatenando el directorio configurado con el nombre reportado en el listado
de directorio del servidor, sin normalización léxica ni comprobación de contención. Esa ruta se convierte entonces en el
operando para la recuperación (siempre), y para el borrado o renombrado cuando se configura delete=true, move,
preMove, moveFailed o readLock=rename.
El nombre de una entrada de directorio SFTP es una cadena de protocolo en bruto proporcionada por el servidor, por lo que un servidor comprometido, malicioso o multiinquilino puede reportar un nombre que no sea un único segmento de ruta.
Este es el hermano
mina-sftpde CVE-2026-79983 (camel-ftp); ambos comparten la misma causa raíz y la misma corrección.
| Runtime | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina-sftp 4.22.0 (afectado; corregido en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-mina-sftp 3.39.0 (Camel 4.22.0, afectado; control corregido 3.40.0 / Camel 4.22.1) |
camel-mina-sftpse introdujo en Camel 4.18.0, por lo que el componente no existe en Camel 4.15.0 incluido en la versión más alta de Camel Quarkus; este reproductor usa Camel Quarkus 3.39.0 (Camel 4.22.0, afectado), con 3.40.0 (Camel 4.22.1) como control parcheado. Por lo tanto, ambos módulos demuestran el comportamiento afectado y el corregido.
La aplicación incorpora un servidor SFTP deliberadamente malicioso (Apache MINA SSHD). Sirve un árbol de directorios
temporales real, pero reescribe, en su respuesta SSH_FXP_READDIR, el nombre de un archivo del directorio sondeado /upload por la
cadena de traversal d/../../outside.txt (mediante una sobrescritura de getShortName). El nombre no empieza por punto, por lo que
la regla de archivos ocultos de Camel no lo detecta, y /upload + d/../../outside.txt se resuelve como /outside.txt, un
nivel por encima del directorio sondeado. Un consumidor mina-sftp simple sondea /upload.
normal.txt como el /outside.txt que escapa.normal.txt y omite la entrada que escapa, registrando
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
Salida esperada en la compilación afectada:
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)
| Propiedad | Valor |
|---|---|
| Componente | camel-mina-sftp (esquema mina-sftp) |
| CWE | CWE-22 (Limitación incorrecta de un nombre de ruta a un directorio restringido) |
| Severidad | ALTA |
| Vector de ataque | Un nombre de entrada READDIR (proporcionado por el servidor) que no es un único segmento de ruta |
| Impacto | Lectura —y, con delete/move/readLock=rename, borrado o renombrado— de archivos fuera del directorio sondeado, usando las credenciales del endpoint |
| Versiones afectadas | Desde 4.18.0 anterior a 4.18.5, desde 4.19.0 anterior a 4.22.1 |
| Versiones corregidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24487 |
| Crédito | Dilrevx de NSSL, SJTU |
Aviso: https://camel.apache.org/security/CVE-2026-79984.html
GenericFileConsumer.isWithinStartingDirectory (sobrescrito por RemoteFileConsumer, del cual deriva el consumidor
mina-sftp) compacta la ruta resuelta y verifica, en los límites de segmento de ruta, que permanezca dentro del
directorio sondeado; una entrada que se resuelve fuera se omite con una advertencia mientras las entradas legítimas
siguen procesándose.
Verifique la clave de host del servidor, restrinja el consumidor con filter/antInclude/include para aceptar solo
nombres de un único segmento, y evite delete/move/preMove/moveFailed/readLock=rename contra servidores cuyos
listados no sean plenamente confiables. Cuando sea posible, confine la cuenta del servidor al directorio sondeado.
Este repositorio se publica con fines educativos y defensivos: para ayudar a los usuarios de Apache Camel a comprender la vulnerabilidad, verificar si se ven afectados y confirmar que la actualización la resuelve. El servidor malicioso y el "secreto" son elementos locales inertes de prueba. No utilice este material contra sistemas que no sean de su propiedad o que no opere.