
Preuve de concept Spring Boot exécutable pour CVE-2026-83531, démontrant l'injection d'expression-language dans le point de terminaison dynamic-router-control d'Apache Camel et vérifiant le correctif.
Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où le point de terminaison dynamic-router-control
prenait le prédicat d'abonnement et le nom du langage utilisé pour le compiler depuis le message
entrant (les champs predicate / expressionLanguage d'un DynamicRouterControlMessage, ou les
en-têtes CamelDynamicRouterPredicate / CamelDynamicRouterExpressionLanguage). Le service résolvait ensuite ce
langage depuis le CamelContext et compilait l'expression en un Predicate, sans liste d'autorisation et sans
opt-in. Le prédicat compilé était évalué sur chaque exchange routé à travers le canal — ainsi tout acteur capable
d'envoyer un message sur un transport dont la route le transmet à un point de terminaison de contrôle pouvait fournir une expression de son
choix, évaluée avec les privilèges du processus Camel. N'importe quel langage présent sur le classpath pouvait être sélectionné,
y compris simple, qui est toujours présent et était celui par défaut.
Camel Spring Boot uniquement. Il n'existe pas d'extension
camel-quarkus-dynamic-router, ce reproducteur ne peut donc pas être exécuté sur Camel Quarkus.
| Runtime | Répertoire | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-dynamic-router 4.22.0 (affecté ; corrigé en 4.22.1) |
L'application met en place un canal Dynamic Router test (direct:start → dynamic-router://test). L'attaquant envoie un
message de contrôle subscribe portant une expression de prédicat et un langage choisis par l'attaquant :
CamelDynamicRouterPredicate = ${bean:detonator?method=detonate}
CamelDynamicRouterExpressionLanguage = simple
Puis un message est acheminé via le canal, qui évalue le prédicat d'abonnement. Sur la version affectée, l'expression s'exécute, invoquant detonator.detonate() — un substitut bénin pour n'importe quelle méthode de registre sans argument qu'un attaquant pourrait atteindre (et n'importe quel langage, par exemple Groovy, permet l'exécution de code arbitraire). Sur la version corrigée, le point de terminaison de contrôle refuse de prendre le prédicat/le langage depuis le message.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Sortie attendue sur le build affecté :
Subscription accepted.
>>> PROVEN: the attacker-supplied predicate expression was compiled and evaluated, invoking
>>> detonator.detonate() with the privileges of the Camel process ...
Sur la version corrigée, l'abonnement est rejeté avec IllegalArgumentException: The subscription predicate expression, and the language used to compile it, cannot be taken from a control message. ... set 'allowPredicateFromMessage=true' ....
| Propriété | Valeur |
|---|---|
| Composant | camel-dynamic-router (endpoint dynamic-router-control) |
| CWE | CWE-94 (Injection de code), CWE-917 (Injection d'expression language) |
| Gravité | ÉLEVÉE |
| Vecteur d'attaque | Un message de contrôle (subscribe/update) fournissant une expression de prédicat et un langage, sur un transport dont la route le transmet à un endpoint dynamic-router-control |
| Impact | Évaluation d'une expression choisie par l'attaquant (n'importe quel langage du classpath) avec les privilèges du processus Camel — exécution de code |
| Versions affectées | À partir de 4.4.0 avant 4.18.5, à partir de 4.19.0 avant 4.22.1 |
| Versions corrigées | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24576 |
| Crédit | Leon Zlobecki |
Avis de sécurité : https://camel.apache.org/security/CVE-2026-83531.html
L'expression de prédicat et son langage ne sont plus extraits du message de contrôle par défaut : un message de contrôle
qui les fournit est rejeté, sauf si l'auteur de la route active explicitement l'option allowPredicateFromMessage=true sur
l'endpoint dynamic-router-control. La voie prévue consiste à configurer predicate et expressionLanguage sur
l'URI de l'endpoint (contrôlés par l'auteur de la route), comme le faisaient les versions antérieures à 4.4.0.
Ne transmettez pas de messages d'origine externe à un endpoint dynamic-router-control ; gérez les abonnements uniquement depuis
des endpoints contrôlés par l'auteur de la route, et restreignez les transports pouvant atteindre le canal de contrôle.
Ce dépôt est publié à des fins éducatives et défensives : pour aider les utilisateurs d'Apache Camel à comprendre la vulnérabilité, vérifier s'ils sont affectés et confirmer que la mise à jour la résout. La charge utile est un bean marqueur inoffensif. N'utilisez pas ce contenu contre des systèmes que vous ne possédez pas ou n'exploitez pas.