Apache Camel の脆弱性を再現する実行可能な概念実証(PoC)リプロデューサーです。この脆弱性では、camel-atmosphere-websocket プロデューサーが websocket.* Exchange ヘッダー(Camel 名前空間の外側にある名前のもの)から WebSocket 受信先を選択します。そのため、HTTP HeaderFilterStrategy(Camel* / camel* のみを除去する)がこれらを許可してしまい、外部の送信者がプロデューサーのディスパッチ判断を乗っ取ることができます。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-atmosphere-websocket 4.18.2 |
Camel Quarkus:
camel-quarkus-atmosphere-websocket拡張機能は存在しないため、このコンポーネントは Camel Quarkus では実行できません。 リプロデューサーは Spring Boot のみ対応です。
このルートは、HTTP コンシューマーを atmosphere-websocket プロデューサーにブリッジし、各 HTTP メッセージを単一の固定 WebSocket 受信先("被害者")に配信します。これは websocket.connectionKey ヘッダー自体を設定することで行われます。しかし WebsocketProducer.process は、単一キーのヘッダーの前にリスト型ヘッダー websocket.connectionKey.list を検査します。このドット付き名前は Camel 名前空間にないため、HTTP ヘッダーフィルターはそれを除去しません。したがって、注入された websocket.connectionKey.list ヘッダーはリクエストから Exchange に通過し、固定された受信先を上書きします — 被害者宛てのメッセージが攻撃者が選択した接続に配信されます。
POST /notify ──► setHeader(websocket.connectionKey = victim) ──► atmosphere-websocket producer ──► victim peer
│ ▲
└─ injected header websocket.connectionKey.list: <attacker key> ───────┘ (tested first → wins)
テストハーネスについて。 atmosphere WebSocket ランタイムは、サーブレットコンテナの WebSocket アップグレードと フレームワーク自身の初期化を必要とし、これらは通常のスタンドアロン Spring Boot アプリからは駆動できません。この リプロデューサーは、実際の HTTP イングレス上で本物の
WebsocketProducerディスパッチロジックを実行します — 接続された 2 つのピアだけが、エンドポイントのWebSocketStoreに直接登録されたスタンドインです(atmosphere フレームワークが実際のブラウザ接続を登録するのと同様)。ヘッダーフィルターのバイパスとプロデューサーのディスパッチ 優先順位 — 実際の脆弱性 — は実際に実行されます。
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
影響を受けるビルドでの期待される出力:
1) Benign POST /notify (no injected header):
victim received: [hello for the victim]
attacker received: []
2) Injected POST /notify with header 'websocket.connectionKey.list: attacker-connection-key':
victim received: []
attacker received: [private data meant for the victim, ...]
>>> PROVEN: ... delivering a message meant for the victim to an attacker-chosen WebSocket connection instead: true
アドバイザリ: https://camel.apache.org/security/CVE-2026-71300.html
ディスパッチヘッダー定数は Camel 名前空間にリネームされました — CamelAtmosphereWebsocketConnectionKey、CamelAtmosphereWebsocketConnectionKeyList、CamelAtmosphereWebsocketSendToAll — これにより、HTTP HeaderFilterStrategy がトランスポート境界でこれらを除去し、外部の送信者が注入できなくなります。関連する camel-undertow websocket パスは CVE-2026-78329 で対応されています。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けるかどうかを検証し、アップグレードによって解決されることを確認できるようにするためです。所有または運用していないシステムに対してこの資料を使用しないでください。
| プロパティ | 値 |
|---|
| コンポーネント | camel-atmosphere-websocket (camel-atmosphere-websocket-starter) |
| CWE | CWE-20 (不適切な入力検証) → CWE-74 (インジェクション) |
| 攻撃ベクトル | atmosphere-websocket プロデューサーにブリッジされたリクエストに注入された websocket.connectionKey.list(または websocket.connectionKey / websocket.sendToAll)ヘッダー |
| 影響 | プロデューサーのディスパッチ判断を乗っ取り、任意の WebSocket ピアへの配信・配信抑止を行う |
| 影響を受けるバージョン | 4.0.0 以上 4.14.9 未満、4.15.0 以上 4.18.4 未満、4.19.0 以上 4.22.0 未満 |
| 修正済みバージョン | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24359 |
| 報告者 | Barak Srour (Apiiro) |