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, 域名枚举, 数字签名, 消息队列, 漏洞复现, 请求拦截