oscerd/CVE-2026-48205
GitHub: oscerd/CVE-2026-48205
Apache Camel camel-dns 组件 dns.* header 注入漏洞(CVE-2026-48205)的 PoC 复现项目,演示了通过 HTTP 请求注入 DNS resolver header 实现 SSRF 攻击的完整流程。
Stars: 1 | Forks: 1
# camel-dns `dns.*` / `term` Header 注入复现项目 (CVE-2026-48205)
本项目演示了 Apache Camel 的 `camel-dns` 组件中的一个**消息头注入**漏洞,编号为
**CVE-2026-48205**。DNS producer 从 Exchange header 中读取其操作参数 —— 要查询的 resolver、要查找的
名称/域名、记录类型/类以及搜索词 —— 这些 header 的常量值
(`DnsConstants.DNS_SERVER`、`DNS_NAME`、`DNS_DOMAIN`、`DNS_TYPE`、`DNS_CLASS`、`TERM`)是纯字符串
`dns.server`、`dns.name`、`dns.domain`、`dns.type`、`dns.class` 和 `term`。由于这些名称不以
`Camel` / `camel` 前缀开头,`HttpHeaderFilterStrategy` —— 它仅在 HTTP 边界处拦截 Camel header 命名空间 ——
使得它们能够直接从入站 HTTP 请求进入 Exchange。
在将 HTTP consumer(例如 platform-http)桥接到 `dns:` producer 的路由中,任何 HTTP 客户端都可以
设置 **`dns.server`** header,使 `dig` producer 构建一个指向攻击者控制的 DNS 服务器的 `SimpleResolver` ——
这是一种**基于 DNS 的服务端请求伪造 (SSRF)**,通过这种方式,攻击者可以观察到被查询的名称并返回投毒的响应 ——
并且可以设置 `dns.name` / `dns.domain` 来解析任意的内部主机名(内部网络探测)。
安全公告: (URL 链接)
## 漏洞概述
| 属性 | 值 |
|----------|-------|
| **组件** | `camel-dns` |
| **受影响的类** | `org.apache.camel.component.dns.DnsDigProducer` — `new SimpleResolver(getHeader("dns.server"))` |
| **CWE** | CWE-20 (不当输入验证) / CWE-918 (服务端请求伪造) |
| **影响** | 将路由的 DNS 查询重定向到攻击者控制的服务器(观察名称、返回投毒的响应);枚举内部主机名 |
| **前置条件** | 路由将 HTTP consumer 桥接到 `dns:` producer;如果 consumer 未认证,则该漏洞可被未授权利用 |
| **受影响版本** | 从 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-23574 (PR [apache/camel#23411](https://github.com/apache/camel/pull/23411)) |
| **致谢** | Yu Bao (PayPal) |
## 技术细节
```
// DnsConstants (affected 4.18.2) — the control-header names are bare, non-Camel-prefixed strings:
public static final String DNS_SERVER = "dns.server";
public static final String DNS_NAME = "dns.name";
// DnsDigProducer.process (affected 4.18.2) — the resolver target comes straight from the header:
String server = exchange.getIn().getHeader(DnsConstants.DNS_SERVER, String.class);
SimpleResolver resolver = new SimpleResolver(server); // <-- attacker-controlled DNS server
int type = Type.value(exchange.getIn().getHeader(DnsConstants.DNS_TYPE, String.class));
Name name = Name.fromString(exchange.getIn().getHeader(DnsConstants.DNS_NAME, String.class), Name.root);
// ... resolver.send(query) — the query goes to the attacker's server
```
该修复(4.14.8 / 4.18.3 / 4.21.0,CAMEL-23574)将这些值重命名为 `CamelDns*` 约定。
## 受害者路由
```
from("platform-http:/lookup")
.setHeader("dns.name", constant("example.com"))
.setHeader("dns.type", constant("A"))
.setHeader("dns.class", constant("IN"))
.to("dns:dig"); // no dns.server -> default resolver (intended)
```
该路由针对默认 resolver 对固定名称执行 dig 查询。攻击者只需添加一个 `dns.server` header,查询
就会被重定向到他们的 DNS 服务器。(`dns.server` 是小写的,因此它能够避开 servlet 容器对 header 的
标准化处理 —— 仅使用 platform-http 即可触发。)
## 项目结构
所有组件都在一个独立的容器中运行:受害者路由、攻击者的虚假 DNS 服务器(UDP 53)以及
攻击者驱动程序。
```
CVE-2026-48205/
├── pom.xml # camel-platform-http + camel-dns 4.18.2
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── FakeDnsServer.java # attacker DNS server on UDP 53 (records the redirected query)
│ ├── VictimRoute.java # platform-http:/lookup -> dns:dig
│ └── ExploitController.java # attacker: injects dns.server=127.0.0.1
└── resources/
└── application.properties
```
## 前置条件
- Docker 和 Docker Compose(虚假 DNS 服务器需要绑定 UDP 端口 53,这需要 root 权限 —— 容器以 root 身份运行)
- Java 17+ 和 Maven 3.8+(用于构建 jar 包)
## 复现步骤
```
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
```
### 预期输出
```
=== 1) Legitimate request (no dns.server header) — default resolver ===
attacker's DNS server was queried: false
=== 2) Injected dns.server=127.0.0.1 (SSRF via DNS) ===
attacker's DNS server was queried: true
observed lookup name: example.com.
>>> Header-injection / SSRF proof — an unauthenticated HTTP client redirected the route's DNS
>>> query to an attacker-controlled server via the dns.server header: true
```
攻击者的 DNS 服务器现在能够看到受害者的查找名称(并且可以返回投毒的应答)。将
`dns.server` 指向真实的内部 DNS resolver,或者将 `dns.name` 设置为内部主机名,即可实现对
内部网络的探测。
## 推荐修复方案
升级到 **4.14.8 / 4.18.3 / 4.21.0**(CAMEL-23574)。升级后,通过 header 驱动 DNS 操作的路由
必须使用 `CamelDnsServer` / `CamelDnsName` 等新名称。
## 缓解措施
在升级之前,请在任何不受信任的入口流量到达 `dns:` producer 之前剥离 `dns.*` 和 `term` header,并且
在路由中从受信任的来源设置 DNS 服务器和查找参数。
## 免责声明
本复现项目仅用于**安全研究和授权测试**,针对的是一个**已公开披露且已修复**的漏洞。
未经明确许可,请勿将其用于任何系统。
标签:Apache Camel, CISA项目, DNS, JS文件枚举, PoC, SSRF, 域名枚举, 头部注入, 插件系统, 暴力破解, 漏洞复现, 版权保护, 请求拦截