
Proof-of-concept eseguibile in Spring Boot per CVE-2026-83531, che dimostra l'iniezione di espressioni nel endpoint dynamic-router-control di Apache Camel e verifica la correzione.
Reproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui l'endpoint dynamic-router-control
prendeva il predicato di sottoscrizione e il nome del linguaggio usato per compilarlo dal messaggio
in arrivo (i campi predicate / expressionLanguage di un DynamicRouterControlMessage, oppure gli header
CamelDynamicRouterPredicate / CamelDynamicRouterExpressionLanguage). Il servizio risolveva poi quel
linguaggio dal CamelContext e compilava l'espressione in un Predicate, senza alcuna allow-list e senza
opt-in. Il predicato compilato veniva valutato su ogni exchange instradato attraverso il canale — quindi qualsiasi attore in grado
di inviare un messaggio su un trasporto la cui route lo inoltra a un endpoint di controllo poteva fornire un'espressione di propria
scelta, valutata con i privilegi del processo Camel. Qualsiasi linguaggio presente nel classpath poteva essere selezionato,
incluso simple, che è sempre presente ed era il valore predefinito.
Solo Camel Spring Boot. Non esiste un'estensione
camel-quarkus-dynamic-router, quindi questo reproduttore non può essere eseguito su Camel Quarkus.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-dynamic-router 4.22.0 (affetto; corretto in 4.22.1) |
L'app configura un canale Dynamic Router test (direct:start → dynamic-router://test). L'attaccante invia un
messaggio di controllo subscribe contenente un'espressione di predicato e un linguaggio scelti dall'attaccante:
CamelDynamicRouterPredicate = ${bean:detonator?method=detonate}
CamelDynamicRouterExpressionLanguage = simple
Poi un messaggio viene instradato attraverso il canale, che valuta il predicato di sottoscrizione. Nella build affetta l'espressione viene eseguita, invocando detonator.detonate() — un sostituto innocuo per qualsiasi metodo del registro senza argomenti che un attaccante potrebbe raggiungere (e qualsiasi linguaggio, ad esempio Groovy, consente codice arbitrario). Nella build corretta l'endpoint di controllo rifiuta di prendere il predicato/linguaggio dal messaggio.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Output atteso sulla build interessata:
Subscription accepted.
>>> PROVEN: the attacker-supplied predicate expression was compiled and evaluated, invoking
>>> detonator.detonate() with the privileges of the Camel process ...
Con la build corretta la sottoscrizione viene rifiutata con IllegalArgumentException: The subscription predicate expression, and the language used to compile it, cannot be taken from a control message. ... set 'allowPredicateFromMessage=true' ....
| Proprietà | Valore |
|---|---|
| Componente | camel-dynamic-router (endpoint dynamic-router-control) |
| CWE | CWE-94 (Code Injection), CWE-917 (Expression Language Injection) |
| Gravità | ALTA |
| Vettore di attacco | Un messaggio di controllo (subscribe/update) che fornisce un'espressione predicato e un linguaggio, su un trasporto la cui route lo inoltra a un endpoint dynamic-router-control |
| Impatto | Valutazione di un'espressione scelta dall'attaccante (qualsiasi linguaggio nel classpath) con i privilegi del processo Camel — esecuzione di codice |
| Versioni interessate | Dalla 4.4.0 precedenti alla 4.18.5, dalla 4.19.0 precedenti alla 4.22.1 |
| Versioni corrette | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24576 |
| Credito | Leon Zlobecki |
Advisory: https://camel.apache.org/security/CVE-2026-83531.html
L'espressione predicato e il suo linguaggio non vengono più presi dal messaggio di controllo per impostazione predefinita: un messaggio di controllo
che li fornisce viene rifiutato a meno che l'autore della route non effettui esplicitamente l'opt-in con allowPredicateFromMessage=true sull'
endpoint dynamic-router-control. Il percorso previsto consiste nel configurare predicate e expressionLanguage sull'
URI dell'endpoint (controllato dall'autore della route), come facevano le release precedenti alla 4.4.0.
Non inoltrare messaggi di origine esterna a un endpoint dynamic-router-control; gestire le sottoscrizioni solo da
endpoint controllati dall'autore della route e limitare i trasporti che possono raggiungere il canale di controllo.
Questo repository è pubblicato per scopi educativi e difensivi: per aiutare gli utenti di Apache Camel a comprendere la vulnerabilità, verificare se ne sono affetti e confermare che l'aggiornamento la risolve. Il payload è un benigno marker bean. Non utilizzare questo materiale contro sistemi di cui non si è proprietari o gestori.