
Reproductor ejecutable de Spring Boot y Quarkus para CVE-2026-85249, que demuestra la inyección de encabezados de metadatos de camel-tika en CamelFileName con controles afectados y corregidos.
CamelFileName)Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que el productor Tika mapeaba cada
clave de metadatos extraída del documento enviado sobre el Exchange como una cabecera, sin aplicar ningún filtro. Los metadatos
del documento son contenido controlado por el atacante: la parte que suministra el archivo elige las claves de metadatos que este porta. Un
documento manipulado podía, por tanto, establecer cabeceras del Exchange de las que depende el resto de la ruta, incluidas las cabeceras
del espacio de nombres de Camel como CamelFileName, que los componentes posteriores usan para decidir dónde se escribe el contenido. Es la misma
clase de inyección de cabeceras que la de los avisos de consumidores, alcanzada aquí a través del contenido de archivo analizado en lugar de una cabecera
de protocolo.
| Entorno de ejecución | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-tika 4.22.0 (afectado; corregido en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-tika (Camel 4.22.0, afectado; control corregido CQ 3.40.0 / Camel 4.22.1) |
Ambos módulos demuestran el comportamiento afectado y el corregido.
El atacante envía un documento HTML — un atributo HTML <meta name="..."> llega a los metadatos de Tika de forma literal, por lo que el
documento elige los nombres de las cabeceras:
<meta name="CamelFileName" content="ATTACKER-SET-../../pwned.txt"/>
<meta name="author" content="legitimate-metadata"/>
La ruta es simplemente from(...).to("tika:parse"). Tras el análisis, se inspeccionan las cabeceras del Exchange.
CamelFileName (Exchange.FILE_NAME) se establece con el valor del atacante proveniente del documento. Un productor de archivos posterior usaría ese valor elegido por el atacante para decidir dónde se escribe el contenido.CamelFileName se filtra (no se establece desde el documento), mientras que los metadatos ordinarios como author siguen asignándose — el filtro bloquea únicamente el espacio de nombres interno de Camel.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: document sets CamelFileName; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85249-tika-header-injection-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelFileName filtered; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): document sets CamelFileName
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelFileName filtered
| Propiedad | Valor |
|---|---|
| Componente | camel-tika (TikaProducer.convertMetadataToHeaders) |
| CWE | CWE-20 (Validación de entrada incorrecta) |
| Gravedad | MEDIA |
| Vector de ataque | Un documento enviado cuyos metadatos analizados declaran nombres de cabeceras internas de Camel (p. ej., mediante HTML <meta name="CamelFileName">) |
| Impacto | Inyección de cabeceras: un documento establece cabeceras del Exchange de las que depende la ruta, como CamelFileName, que determina dónde escriben contenido los componentes posteriores |
| 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-24423 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85249.html
TikaProducer.convertMetadataToHeaders ahora filtra cada nombre de metadato analizado
a través de un HeaderFilterStrategy (configurado con inFilterStartsWith("Camel", "camel", "org.apache.camel."),
sin distinguir mayúsculas y minúsculas) antes de mapearlo al Exchange — de la misma forma en que un consumidor filtra los nombres proporcionados por un
remitente externo — de modo que un documento no puede declarar un nombre de metadato que acabe en el espacio de nombres interno de Camel. Los metadatos fuera de ese
espacio de nombres se siguen mapeando.
Elimine el espacio de nombres de Camel después del productor de Tika con removeHeaders("Camel*") antes de cualquier componente que actúe sobre
esas cabeceras.
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 documento elaborado y el nombre de archivo inyectado son elementos locales inertes. No utilice este material contra sistemas que no sean de su propiedad o que no opere.