
Reproductor de prueba de concepto ejecutable para CVE-2026-79983, un path traversal en los consumidores camel-ftp de Apache Camel, con fixtures de servidor FTP malicioso y compilaciones afectadas frente a corregidas.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que los consumidores de archivos remotos sondean un
directorio en un servidor remoto y construyen la ruta remota absoluta de cada archivo concatenando el directorio configurado
con el nombre de archivo reportado en el listado del directorio del servidor, sin normalización léxica y sin
comprobar que el resultado permanezca dentro del directorio sondeado. 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.
Un nombre de listado no es un dato controlado por la ruta — lo proporciona el servidor remoto, y el canal de control FTP
no tiene protección de integridad, por lo que un atacante en la ruta puede reescribir una respuesta LIST, y un servidor comprometido o multiinquilino
puede emitir tal nombre directamente. La opción documentada y activada por defecto jailStartingDirectory no restringía
este operando remoto.
| Entorno de ejecución | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-ftp 4.22.0 (afectado; corregido en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-ftp 3.29.0 (Camel 4.15.0, afectado) |
La corrección se distribuye en Camel 4.18.5 / 4.22.1 / 4.23.0; el módulo Spring Boot ejecuta tanto la compilación afectada (4.22.0) como la compilación corregida (4.22.1). Ninguna versión publicada de Camel Quarkus incluye todavía un Camel corregido.
La aplicación incorpora un servidor FTP deliberadamente malicioso (Apache MINA FtpServer con un VFS en memoria) que lista, en
el directorio sondeado /upload:
normal.txt — un archivo legítimo dentro del directorio, yd/../../outside.txt — una entrada manipulada cuyo nombre no es un único segmento de ruta. No comienza con un punto
(por lo que la regla de archivos ocultos de Camel no la detecta), y /upload + d/../../outside.txt se resuelve en /outside.txt,
un nivel por encima del directorio sondeado.Un consumidor FTP simple de Camel sondea /upload. En la compilación afectada recupera ambas entradas — incluyendo
/outside.txt, un archivo al que nunca debería llegar. En la compilación corregida conserva 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:
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
| Propiedad | Valor |
|---|---|
| Componente | camel-ftp (esquemas ftp, ftps, sftp) |
| CWE | CWE-22 (Limitación incorrecta de un nombre de ruta a un directorio restringido) |
| Severidad | ALTA |
| Vector de ataque | Una entrada LIST (proporcionada por el servidor, reescribible en un canal de control FTP no autenticado) 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.0.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-79983.html
Una sobrecarga de GenericFileHelper.isWithinDirectory consciente de los separadores y una estrategia
GenericFileConsumer.isWithinStartingDirectory (consultada desde isValidFile cuando jailStartingDirectory está
habilitado) compactan la ruta resuelta y verifican, en los límites de los segmentos de ruta, que esta siga
resolviéndose dentro del directorio sondeado. Un archivo que se resuelve fuera se omite con una advertencia (de modo
que otras entradas legítimas del mismo listado se siguen procesando). RemoteFileConsumer y SmbConsumer
sobrescriben la comprobación; la implementación base local es una operación nula, ya que los nombres de los listados
locales siempre son segmentos únicos.
Prefiera sftp/ftps en lugar de ftp para que el listado no pueda reescribirse en tránsito, y verifique la clave
del host/certificado. Restrinja el consumidor con filter, antInclude o include para aceptar solo nombres de un
único segmento, y evite delete=true/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. No utilice este material contra sistemas que no sean de su propiedad o que no opere.