
Lauffähiger Spring-Boot-Proof-of-Concept für CVE-2026-83531, der Expression-Language-Injection im dynamic-router-control-Endpunkt von Apache Camel demonstriert und den Fix verifiziert.
Lauffähiger Proof-of-Concept-Reproduzierer für die Apache-Camel-Schwachstelle, bei der der dynamic-router-control-Endpunkt das Subscription-Prädikat und den Namen der Sprache, mit der es kompiliert wird, aus der eingehenden Nachricht übernahm (die Felder predicate / expressionLanguage einer DynamicRouterControlMessage oder die Header CamelDynamicRouterPredicate / CamelDynamicRouterExpressionLanguage). Der Dienst löste diese Sprache dann aus dem CamelContext auf und kompilierte den Ausdruck zu einem Predicate, ohne Allow-List und ohne Opt-in. Das kompilierte Prädikat wurde gegen jeden über den Kanal geleiteten Exchange ausgewertet — jeder Akteur, der eine Nachricht auf einen Transport senden konnte, dessen Route sie an einen Control-Endpunkt weiterleitet, konnte somit einen Ausdruck seiner Wahl einspeisen, der mit den Rechten des Camel-Prozesses ausgewertet wurde. Jede im Classpath vorhandene Sprache konnte ausgewählt werden, einschließlich simple, die immer vorhanden ist und die Standardeinstellung war.
Nur Camel Spring Boot. Es gibt keine
camel-quarkus-dynamic-router-Erweiterung, daher kann dieser Reproduzierer nicht auf Camel Quarkus ausgeführt werden.
| Laufzeitumgebung | Verzeichnis | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-dynamic-router 4.22.0 (betroffen; behoben in 4.22.1) |
Die Anwendung richtet einen Dynamic-Router-Kanal test ein (direct:start → dynamic-router://test). Der Angreifer sendet eine Subscribe-Control-Nachricht mit einem vom Angreifer gewählten Prädikatsausdruck und einer gewählten Sprache:
CamelDynamicRouterPredicate = ${bean:detonator?method=detonate}
CamelDynamicRouterExpressionLanguage = simple
Dann wird eine Nachricht durch den Kanal geleitet, der das Subscription-Prädikat auswertet. Im betroffenen Build wird der Ausdruck ausgeführt und ruft detonator.detonate() auf — ein harmloser Platzhalter für jede Registry-Methode ohne Argumente, die ein Angreifer erreichen könnte (und jede Sprache, z. B. Groovy, ermöglicht beliebigen Code). Im korrigierten Build weigert sich der Control-Endpunkt, das Prädikat/die Sprache aus der Nachricht zu übernehmen.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Erwartete Ausgabe beim betroffenen Build:
Subscription accepted.
>>> PROVEN: the attacker-supplied predicate expression was compiled and evaluated, invoking
>>> detonator.detonate() with the privileges of the Camel process ...
Beim korrigierten Build wird das Subscribe mit IllegalArgumentException: The subscription predicate expression, and the language used to compile it, cannot be taken from a control message. ... set 'allowPredicateFromMessage=true' ... abgelehnt.
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-dynamic-router (dynamic-router-control-Endpoint) |
| CWE | CWE-94 (Code Injection), CWE-917 (Expression Language Injection) |
| Schweregrad | HOCH |
| Angriffsvektor | Eine Steuernachricht (subscribe/update), die einen Prädikatsausdruck und eine Sprache liefert, über einen Transport, dessen Route sie an einen dynamic-router-control-Endpoint weiterleitet |
| Auswirkung | Auswertung eines vom Angreifer gewählten Ausdrucks (jede Classpath-Sprache) mit den Rechten des Camel-Prozesses — Codeausführung |
| Betroffene Versionen | Ab 4.4.0 vor 4.18.5, ab 4.19.0 vor 4.22.1 |
| Korrigierte Versionen | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24576 |
| Danksagung | Leon Zlobecki |
Advisory: https://camel.apache.org/security/CVE-2026-83531.html
Der Prädikatsausdruck und seine Sprache werden standardmäßig nicht mehr aus der Steuernachricht übernommen: Eine Steuernachricht,
die sie liefert, wird abgelehnt, sofern der Routenautor nicht ausdrücklich mit allowPredicateFromMessage=true am
dynamic-router-control-Endpoint zustimmt. Der vorgesehene Weg besteht darin, predicate und expressionLanguage auf
der Endpoint-URI zu konfigurieren (vom Routenautor kontrolliert), wie es Releases vor 4.4.0 taten.
Leiten Sie keine von außen stammenden Nachrichten an einen dynamic-router-control-Endpoint weiter; verwalten Sie Abonnements nur über
vom Routenautor kontrollierte Endpoints und beschränken Sie die Transporte, die den Steuerkanal erreichen können.
Dieses Repository wird zu Bildungs- und Verteidigungszwecken veröffentlicht: um Apache-Camel-Nutzern zu helfen, die Schwachstelle zu verstehen, zu prüfen, ob sie betroffen sind, und zu bestätigen, dass ein Upgrade sie behebt. Die Payload ist eine harmlose Marker-Bean. Verwenden Sie dieses Material nicht gegen Systeme, die Ihnen nicht gehören oder die Sie nicht betreiben.