
Reproductor de prueba de concepto ejecutable para CVE-2026-78163 en Apache Camel camel-docling, que demuestra SSRF y divulgación de archivos locales mediante una entrada de cuerpo String no validada, con un control de compilación corregida.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que DoclingProducer decidía qué
significaba el cuerpo de un mensaje String inspeccionando su prefijo:
http:// o https:// se entregaba a Docling como una URL remota que obtener (SSRF), y/ (o contenía una barra invertida) se leía del sistema de archivos local (divulgación de archivos).El modo se elegía de forma implícita, sin ninguna opción de endpoint para fijar una única interpretación y —a diferencia del
espacio de nombres de cabeceras de Camel— el cuerpo del mensaje nunca se filtra mediante un HeaderFilterStrategy. Así, una ruta que significa
"convierte cualquier texto que llegue en el cuerpo" se convertía silenciosamente en un obtenedor de recursos remotos o un lector de archivos
locales siempre que el texto controlado por el atacante comenzara con uno de esos prefijos.
| Runtime | Directorio | Stack | Muestra |
|---|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-docling 4.22.0 (afectado; corregido en 4.22.1) | SSRF y divulgación de archivos, además del control con la compilación corregida |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-docling 3.29.0 (Camel 4.15.0, afectado) | solo divulgación de archivos (ver nota) |
Cobertura de versiones. El sumidero de divulgación de archivos locales existe desde que se introdujo camel-docling en 4.15.0; el sumidero de URL remota se añadió en 4.16.0 con soporte de docling-serve. La última versión de Camel Quarkus (3.29.0) incluye Camel 4.15.0, por lo que su módulo demuestra únicamente la divulgación de archivos. La corrección se distribuye en Camel 4.18.5 / 4.22.1 / 4.23.0; el módulo de Spring Boot ejecuta tanto la compilación afectada (4.22.0) como la compilación corregida (4.22.1), por lo que también demuestra el comportamiento parcheado. Ninguna versión publicada de Camel Quarkus incluye todavía un Camel corregido.
Ninguno de los reproductores necesita una instalación real de Docling: un pequeño CLI falso de docling (fake-docling/docling) sustituye
al binario y hace visible lo que haría el real con la entrada proporcionada por el productor: obtener una URL o leer un
archivo. Es benigno: solo repite lo que se le indicó procesar y registra su propia invocación. El punto del CVE es
que un cuerpo proporcionado por el atacante llega a ese argumento, sin necesidad de habilitarlo explícitamente.
La aplicación Spring Boot también ejecuta un endpoint HTTP solo interno en 127.0.0.1:9099 (solo se publica el puerto 8080,
por lo que un cliente externo no puede alcanzar 9099 directamente) y un archivo secreto local. El atacante solo envía texto:
http://127.0.0.1:9099/internal-secret → la invocación de docling del lado del servidor obtiene el
endpoint interno y su secreto se devuelve al llamador./tmp/cve-2026-78163-secret.txt → el archivo local se lee y se devuelve.En la compilación afectada ambas tienen éxito; en la compilación corregida ambas se rechazan con una IllegalArgumentException
que nombra la opción (allowUrlSource / allowFilePathSource) que sería necesaria para habilitarlas, y docling
nunca se invoca.
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 de Spring Boot afectada:
[1] SSRF — sending body = http://127.0.0.1:9099/internal-secret
>>> PROVEN SSRF: the server-side docling invocation fetched the attacker-controlled internal URL.
>>> internal victim saw: [GET /internal-secret]
>>> content returned to the caller:
| INTERNAL-SECRET-DATA (only reachable from inside the deployment)
[2] File disclosure — sending body = /tmp/cve-2026-78163-secret.txt
>>> PROVEN file disclosure: the attacker-named local file was read and returned.
| TOP-SECRET-FILE-CONTENT (local file an attacker should not be able to read)
| Propiedad | Valor |
|---|---|
| Componente | camel-docling (camel-docling-starter / camel-quarkus-docling) |
| CWE | CWE-918 (SSRF), CWE-22 (Path Traversal), CWE-200 (Exposición de información) |
| Gravedad | MEDIA |
| Vector de ataque | Un cuerpo de mensaje String reenviado a un endpoint de docling, cuyo prefijo selecciona un sink de obtención de URL o de lectura de archivos; el cuerpo no está sujeto a HeaderFilterStrategy |
| Impacto | Obtención del lado del servidor de URL elegidas por el atacante (servicios internos) y divulgación de archivos locales |
| Versiones afectadas | Desde 4.15.0 anterior a 4.18.5, desde 4.19.0 anterior a 4.22.1 (divulgación de archivos desde 4.15.0; sink de URL desde 4.16.0) |
| Versiones corregidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24422 |
| Crédito | Li Zhiyao (BUPT) |
Aviso: https://camel.apache.org/security/CVE-2026-78163.html
Un cuerpo String ahora se trata como el propio documento de forma predeterminada. Las dos interpretaciones de ubicación pasaron a ser opcionales mediante
nuevas opciones de endpoint allowUrlSource y allowFilePathSource (ambas con valor predeterminado false); un cuerpo que parezca una URL
o una ruta se rechaza en caso contrario con una IllegalArgumentException que nombra la opción que lo habilitaría. Una opción adicional
inputBaseDirectory confina las rutas de entrada locales a un directorio configurado. Los cuerpos tipados (File, byte[],
InputStream) y la cabecera CamelDoclingInputFilePath ya declaran su significado y no están restringidos (pero siguen
sujetos a inputBaseDirectory).
No enrute cuerpos de mensajes de origen externo a un endpoint de docling; pase el documento mediante un cuerpo tipado
(File, byte[], InputStream) o la cabecera CamelDoclingInputFilePath para que el cuerpo nunca esté sujeto a la interpretación
de prefijos.
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. La CLI docling falsa y
los "secretos" son fixtures locales inertes. No utilice este material contra sistemas que no sean de su propiedad o que no opere.