oscerd/CVE-2026-46457
GitHub: oscerd/CVE-2026-46457
该复现项目演示了 Apache Camel camel-nats 组件中因默认缺少入站 header 过滤规则而导致的控制头注入漏洞,并通过 SSRF 场景直观展示了其危害。
Stars: 0 | Forks: 0
# camel-nats 入站 Header 注入复现项目 (CVE-2026-46457)
本项目演示了 Apache Camel 的 `camel-nats` 组件中的一个**消息头注入**漏洞,追踪编号为
**CVE-2026-46457**。该组件将入站 NATS 消息头映射到 Camel Exchange 中,但 `NatsConfiguration`
将其 `headerFilterStrategy` 默认设为纯粹的 `new DefaultHeaderFilterStrategy()`,且**没有入站规则**。
由于没有设置 `inFilter` / `inFilterPattern` / `inFilterStartsWith`,`DefaultHeaderFilterStrategy.applyFilterToExternalHeaders`
对每个 header 名称都返回*未被过滤*,因此 `NatsConsumer` 会将每个 NATS 消息头——包括
Camel 控制 header,如 `CamelHttpUri`、`CamelFileName` 或 `CamelSqlQuery`——原封不动地复制到 Camel
消息中。因此,任何能够向被消费的 NATS subject 发布消息的客户端都可以注入任意的 Camel 控制
header,从而操纵下游的 producer。
此 PoC 将其影响演示为**服务端请求伪造** (SSRF):通过注入 `CamelHttpUri`,将下游的
`http:` producer 重定向到攻击者选择的目标。
安全通告:
## 漏洞概述
| 属性 | 值 |
|----------|-------|
| **组件** | `camel-nats` |
| **受影响类** | `org.apache.camel.component.nats.NatsConfiguration` (默认 `DefaultHeaderFilterStrategy`) / `NatsConsumer` |
| **CWE** | CWE-20: 不当输入验证 |
| **影响** | Subject 发布者注入 Camel 控制 header → 操纵下游 producer(此处演示了 SSRF) |
| **前置条件** | NATS 2.2+(消息头);在无身份验证的 NATS 服务器(默认设置)上可无需凭证直接访问 |
| **受影响版本** | 4.0.0 起至 4.14.8 之前,4.15.0 起至 4.18.3 之前,4.19.0 起至 4.21.0 之前 |
| **修复版本** | 4.14.8, 4.18.3, 4.21.0 |
| **JIRA** | CAMEL-23515 |
| **报告者** | Yu Bao (PayPal) |
## 技术细节
```
// NatsConfiguration - affected 4.18.2
private HeaderFilterStrategy headerFilterStrategy = new DefaultHeaderFilterStrategy(); // no inbound rules
// NatsConsumer - maps every inbound NATS header; nothing filters the Camel namespace inbound
msg.getHeaders().entrySet().forEach(entry -> {
if (!strategy.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), exchange)) {
exchange.getIn().setHeader(entry.getKey(), /* value */); // <-- Camel control headers pass through
}
});
```
修复方案 (4.14.8 / 4.18.3 / 4.21.0) 将默认设置替换为 `new NatsHeaderFilterStrategy()`,该策略安装了
入站 `Camel*` 过滤器。
## 受害者路由
```
from("nats:cve?servers=")
.to("http://localhost:8080/legit-backend?throwExceptionOnFailure=false"); // author's only intended target
```
camel-http producer 会将入站的 `CamelHttpUri` header 用作请求 URI(这是它的默认
非 `bridgeEndpoint` 行为)。攻击者发布一条带有 NATS header
`CamelHttpUri: http://localhost:8080/internal/secret?leak=...` 的消息;consumer 将其映射到 Exchange 上,
producer 随后将请求发送到该地址,而不是原本的地址——这就是**服务端请求伪造**。
## 仓库结构
**受害者**是 Camel 路由;**攻击者**是任何能够向该 subject 发布消息的客户端。
复现项目在 Docker 中运行了一个真实的 NATS 服务器;`/legit-backend` 和 `/internal/secret` endpoint(以及
攻击者驱动程序)位于应用程序内。
```
CVE-2026-46457/
├── pom.xml # camel-nats + camel-http 4.18.2
├── Dockerfile
├── docker-compose.yml # NATS 2.10 + the reproducer app
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── VictimRoute.java # from("nats:cve").to("http://.../legit-backend")
│ ├── SinkController.java # /legit-backend and the sensitive /internal/secret
│ └── ExploitController.java # attacker: publishes with an injected CamelHttpUri header
└── resources/
└── application.properties
```
## 前置条件
- Java 17+ 和 Maven 3.8+
- Docker(用于运行 NATS)
## 复现步骤
### 第 1 步:构建并启动所有组件
```
mvn clean package -DskipTests
docker compose up -d --build
```
### 第 2 步:触发 Header 注入 (SSRF)
```
curl -s http://localhost:8080/exploit/attack
# 合法消息(无注入 header)
# 到达 /legit-backend:true
# 攻击消息(CamelHttpUri=http://localhost:8080/internal/secret?leak=...)
# 重定向到 /internal/secret:true(看到标记:...)
# # >>> Header-injection / SSRF 证明 — 攻击者将 producer 重定向到了内部 endpoint:true
```
### 清理
```
docker compose down
```
## 攻击向量
任何包含 camel-nats consumer 且向下游 producer 输送数据的路由,只要该 producer 的行为受 Camel
header 控制 —— HTTP (`CamelHttpUri`)、file (`CamelFileName`,限制在其目录下)、SQL (`CamelSqlQuery`) 等。任何
能够向被消费的 subject 发布消息的客户端都可以注入这些 header(在默认的 NATS 服务器上无需凭证)。
## 利用条件
1. 运行受影响版本的 camel-nats consumer,且路由指向一个行为受 header 控制的 producer。
2. 攻击者能够向被消费的 subject 发布消息(NATS 2.2+;默认无身份验证)。
## 建议修复方案
升级到 **4.14.8 / 4.18.3 / 4.21.0** (CAMEL-23515),这些版本默认使用 `NatsHeaderFilterStrategy`(入站
`Camel*` 过滤器)。
## 缓解措施
在升级之前:
1. 在路由开始处剥离 Camel 控制 header:`.removeHeaders("Camel*")` 和
`.removeHeaders("camel*")`。
2. 在 NATS 服务器上启用身份验证,确保只有受信任的客户端才能向被消费的 subject 发布消息。
## 免责声明
本复现项目仅供**安全研究和授权测试使用**,针对的是一个**已公开披露且已修复**的
漏洞。未经明确许可,请勿将其用于任何系统。
标签:Apache Camel, CISA项目, CVE, JS文件枚举, SSRF, 域名枚举, 数字签名, 消息队列, 漏洞复现, 请求拦截