
Pruebas de concepto que reproducen la vulnerabilidad de inyección de cabeceras MimeMultipart en Apache Camel camel-mail (CVE-2026-59230), demostrando SSRF mediante inyección de CamelHttpUri en los entornos de ejecución Spring Boot y Quarkus.
MimeMultipart de camel-mail (headersInline)Reproductores de prueba de concepto ejecutables para la misma vulnerabilidad de Apache Camel, uno por runtime:
| Runtime | Directorio | Stack |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-boot 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (incluye Camel 4.20.0) |
Ambas son versiones afectadas (el problema está corregido en 4.14.9 / 4.18.4 / 4.22.0), y ambas demuestran el mismo defecto: el formato de datos MimeMultipart de camel-mail, al deserializar con headersInline=true, copia cada cabecera MIME no estándar del mensaje entrante al Exchange de Camel mediante setHeader sin aplicar ningún HeaderFilterStrategy. Los nombres de las cabeceras MIME provienen del cuerpo no confiable, por lo que un remitente puede colocar una cabecera en el espacio de nombres interno de Camel (por ejemplo, CamelHttpUri) y hacer que se establezca en el Exchange — incluso después de que la ruta haya eliminado las cabeceras Camel* en el límite HTTP. Un componente posterior lee entonces la cabecera de control inyectada (inyección de cabeceras → CWE-74).
En estos reproductores, la CamelHttpUri inyectada redirige al productor HTTP posterior desde el endpoint previsto /legit-backend a un endpoint interno /internal/secret (SSRF), devolviendo de forma visible datos internos.
Cada subdirectorio es un proyecto autocontenido con su propio Dockerfile, docker-compose.yml y README con todos los detalles y pasos de reproducción. En resumen, para cualquiera de los dos:
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Salida esperada en una compilación afectada:
1) Benign MIME (no injected header):
/ingest responded: LEGIT: your message was accepted
2) Malicious MIME (injected MIME header 'CamelHttpUri: http://localhost:8080/internal/secret'):
/ingest responded: SECRET: internal_db_password=S3cr3t-INTERNAL-9f2a
>>> PROVEN: ... redirecting the HTTP producer to an internal service (SSRF): true
| Propiedad | Valor |
|---|---|
| Componente | camel-mail — formato de datos MimeMultipart (Spring Boot: camel-mail-starter; Quarkus: camel-quarkus-mail) |
| CWE | CWE-20 (Validación de entrada incorrecta) → CWE-74 (Inyección) |
| Vector de ataque | Un cuerpo MIME multipart manipulado deserializado con headersInline=true |
| Impacto | Inyección de cabeceras de control internas de Camel en el Exchange (aquí: CamelHttpUri → SSRF) |
| Versiones afectadas | Desde 2.17.0 hasta antes de 4.14.9, desde 4.15.0 hasta antes de 4.18.4, desde 4.19.0 hasta antes de 4.22.0 |
| Versiones corregidas | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-23891 |
| Crédito | Atuin — Motor de descubrimiento automatizado de vulnerabilidades, anciety de Tencent Xuanwu Lab |
MimeMultipartDataFormat.copyNonStandardHeaders ahora procesa cada cabecera MIME entrante mediante un MailHeaderFilterStrategy antes de establecerla en el Exchange, de forma consistente con el filtrado de entrada que el consumidor de correo ya aplica — por lo que las cabeceras Camel* del cuerpo no confiable se descartan en lugar de copiarse literalmente:
// fixed
if (headerFilterStrategy.applyFilterToExternalHeaders(header.getName(), header.getValue(),
camelMessage.getExchange())) {
continue; // filtered
}
camelMessage.setHeader(header.getName(), header.getValue());
Este repositorio se publica con fines educativos y defensivos: para ayudar a los usuarios de Apache Camel a comprender la vulnerabilidad, verificar si están afectados y confirmar que la actualización la resuelve. Los payloads son benignos (una redirección a un endpoint local). No utilice este material contra sistemas que no posea ni opere.