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报告查看器, 域名枚举, 安全漏洞复现, 暴力破解, 消息伪造, 版权保护, 请求拦截