
Prova de conceito executável em Spring Boot para a CVE-2026-83531, demonstrando injeção de expression language no endpoint dynamic-router-control do Apache Camel e verificando a correção.
Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que o endpoint dynamic-router-control
obtinha o predicado de assinatura e o nome da linguagem usada para compilá-lo a partir da mensagem
recebida (os campos predicate / expressionLanguage de uma DynamicRouterControlMessage, ou os
cabeçalhos CamelDynamicRouterPredicate / CamelDynamicRouterExpressionLanguage). O serviço então resolvia essa
linguagem a partir do CamelContext e compilava a expressão em um Predicate, sem allow-list e sem
opt-in. O predicado compilado era avaliado contra cada exchange roteado pelo canal — portanto, qualquer ator capaz
de enviar uma mensagem para um transporte cuja rota a encaminhe para um endpoint de controle poderia fornecer uma expressão de sua
escolha, avaliada com os privilégios do processo Camel. Qualquer linguagem no classpath poderia ser selecionada,
incluindo simple, que está sempre presente e era o padrão.
Apenas Camel Spring Boot. Não existe a extensão
camel-quarkus-dynamic-router, portanto este reprodutor não pode ser executado no Camel Quarkus.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-dynamic-router 4.22.0 (afetado; corrigido em 4.22.1) |
A aplicação configura um canal Dynamic Router test (direct:start → dynamic-router://test). O atacante envia uma
mensagem de controle subscribe carregando uma expressão de predicado e uma linguagem escolhidas pelo atacante:
CamelDynamicRouterPredicate = ${bean:detonator?method=detonate}
CamelDynamicRouterExpressionLanguage = simple
Em seguida, uma mensagem é encaminhada pelo canal, que avalia o predicado de assinatura. Na build afetada, a expressão é executada, invocando detonator.detonate() — um substituto benigno para qualquer método de registro sem argumentos que um atacante poderia alcançar (e qualquer linguagem, por exemplo Groovy, permite código arbitrário). Na build corrigida, o endpoint de controle recusa-se a aceitar o predicado/linguagem a partir da mensagem.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Saída esperada na build afetada:
Subscription accepted.
>>> PROVEN: the attacker-supplied predicate expression was compiled and evaluated, invoking
>>> detonator.detonate() with the privileges of the Camel process ...
Na build corrigida, a subscrição é rejeitada com IllegalArgumentException: The subscription predicate expression, and the language used to compile it, cannot be taken from a control message. ... set 'allowPredicateFromMessage=true' ....
| Propriedade | Valor |
|---|---|
| Componente | camel-dynamic-router (endpoint dynamic-router-control) |
| CWE | CWE-94 (Injeção de Código), CWE-917 (Injeção de Expression Language) |
| Severidade | ALTA |
| Vetor de ataque | Uma mensagem de controlo (subscribe/update) que fornece uma expressão de predicado e a linguagem, num transporte cuja rota a encaminha para um endpoint dynamic-router-control |
| Impacto | Avaliação de uma expressão escolhida pelo atacante (qualquer linguagem do classpath) com os privilégios do processo Camel — execução de código |
| Versões Afetadas | Da 4.4.0 anterior à 4.18.5, da 4.19.0 anterior à 4.22.1 |
| Versões Corrigidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24576 |
| Crédito | Leon Zlobecki |
Advisory: https://camel.apache.org/security/CVE-2026-83531.html
A expressão de predicado e a sua linguagem deixam de ser obtidas a partir da mensagem de controlo por predefinição: uma mensagem de controlo
que as forneça é rejeitada, a menos que o autor da rota opte explicitamente por isso com allowPredicateFromMessage=true no
endpoint dynamic-router-control. O caminho pretendido é configurar predicate e expressionLanguage no
URI do endpoint (controlado pelo autor da rota), como faziam as versões anteriores à 4.4.0.
Não encaminhe mensagens de origem externa para um endpoint dynamic-router-control; faça a gestão das subscrições apenas a partir de
endpoints controlados pelo autor da rota e restrinja os transportes que conseguem alcançar o canal de controlo.
Este repositório é publicado para fins educativos e defensivos: para ajudar os utilizadores do Apache Camel a compreender a vulnerabilidade, verificar se são afetados e confirmar que a atualização a resolve. O payload é um bean marcador benigno. Não utilize este material contra sistemas que não possui ou opera.