
Prueba de concepto ejecutable en Spring Boot para CVE-2026-83531, que demuestra la inyección de lenguaje de expresiones en el endpoint dynamic-router-control de Apache Camel y verifica la corrección.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que el endpoint dynamic-router-control tomaba el predicado de suscripción y el nombre del lenguaje usado para compilarlo del mensaje entrante (los campos predicate / expressionLanguage de un DynamicRouterControlMessage, o las cabeceras CamelDynamicRouterPredicate / CamelDynamicRouterExpressionLanguage). El servicio entonces resolvía ese lenguaje desde el CamelContext y compilaba la expresión en un Predicate, sin lista de permitidos y sin opt-in. El predicado compilado se evaluaba contra cada exchange enrutado a través del canal — por lo que cualquier actor capaz de enviar un mensaje a un transporte cuya ruta lo reenvíe a un endpoint de control podía suministrar una expresión de su elección, evaluada con los privilegios del proceso de Camel. Podía seleccionarse cualquier lenguaje presente en el classpath, incluido simple, que siempre está presente y era el predeterminado.
Solo Camel Spring Boot. No existe una extensión
camel-quarkus-dynamic-router, por lo que este reproductor no puede ejecutarse en Camel Quarkus.
| Runtime | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-dynamic-router 4.22.0 (afectado; corregido en 4.22.1) |
La aplicación configura un canal de Dynamic Router test (direct:start → dynamic-router://test). El atacante envía un mensaje de control subscribe que lleva una expresión de predicado y un lenguaje elegidos por el atacante:
CamelDynamicRouterPredicate = ${bean:detonator?method=detonate}
CamelDynamicRouterExpressionLanguage = simple
A continuación, un mensaje se enruta a través del canal, que evalúa el predicado de suscripción. En la compilación afectada, la expresión se ejecuta, invocando detonator.detonate() — un sustituto benigno de cualquier método de registro sin argumentos al que un atacante podría llegar (y cualquier lenguaje, p. ej. Groovy, habilita código arbitrario). En la compilación corregida, el endpoint de control se niega a tomar el predicado/lenguaje del mensaje.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Salida esperada en la compilación afectada:
Subscription accepted.
>>> PROVEN: the attacker-supplied predicate expression was compiled and evaluated, invoking
>>> detonator.detonate() with the privileges of the Camel process ...
En la compilación corregida, la suscripción se rechaza con IllegalArgumentException: The subscription predicate expression, and the language used to compile it, cannot be taken from a control message. ... set 'allowPredicateFromMessage=true' ....
| Propiedad | Valor |
|---|---|
| Componente | camel-dynamic-router (endpoint dynamic-router-control) |
| CWE | CWE-94 (Inyección de código), CWE-917 (Inyección de lenguaje de expresiones) |
| Severidad | ALTA |
| Vector de ataque | Un mensaje de control (subscribe/update) que proporciona una expresión de predicado y un lenguaje, en un transporte cuya ruta lo reenvía a un endpoint dynamic-router-control |
| Impacto | Evaluación de una expresión elegida por el atacante (cualquier lenguaje del classpath) con los privilegios del proceso de Camel — ejecución de código |
| Versiones afectadas | Desde 4.4.0 anterior a 4.18.5, desde 4.19.0 anterior a 4.22.1 |
| Versiones corregidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24576 |
| Crédito | Leon Zlobecki |
Aviso: https://camel.apache.org/security/CVE-2026-83531.html
La expresión de predicado y su lenguaje ya no se toman del mensaje de control de forma predeterminada: un mensaje de control
que los proporcione se rechaza a menos que el autor de la ruta opte explícitamente por ello con allowPredicateFromMessage=true en
el endpoint dynamic-router-control. La vía prevista es configurar predicate y expressionLanguage en la
URI del endpoint (controlado por el autor de la ruta), como hacían las versiones anteriores a 4.4.0.
No reenvíe mensajes de origen externo a un endpoint dynamic-router-control; gestione las suscripciones únicamente desde
endpoints controlados por el autor de la ruta, y restrinja los transportes que pueden alcanzar el canal de control.
Este repositorio se publica con fines educativos y defensivos: para ayudar a los usuarios de Apache Camel a comprender la vulnerabilidad, verificar si se ven afectados y confirmar que la actualización la resuelve. El payload es un bean marcador inocuo. No utilice este material contra sistemas que no sean de su propiedad o que no opere.