Apache Camel の脆弱性に対する実行可能な概念実証(PoC)再現ツールです。この脆弱性では、camel-platform-http がエンドポイントをプロキシモードで実行するかどうかを、設定されたパスが文字列 proxy で始まるかどうかで判定しており、完全一致では判定していませんでした。プロキシモードはエンドポイントをキャッチオール(getPath() が / になる)に変え、その転送先はリクエスト自身の Host ヘッダーから取得されます。そのため、パスが単にこれらの文字列で始まるだけのエンドポイント — proxyStats、proxy-health、proxying など — は、ルート作成者が意図していない転送プロキシへと暗黙的に変化していました。これはリクエスト偽造のプリミティブであり、転送パスが到達できるあらゆるものの露出につながります(CWE-1220)。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-platform-http 4.22.0(影響あり、修正版 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-platform-http(Camel 4.22.0、影響あり、修正対照 CQ 3.40.0 / Camel 4.22.1) |
両モジュールとも、実際の PlatformHttpEndpoint に対して影響を受ける動作および修正後の動作を実演します。
ドライバーは修正自体の回帰テスト(PlatformHttpEndpointProxyPathTest)を模倣しています。platform-http:proxyStats エンドポイント — 名前がたまたま proxy で始まる統計エンドポイント — を作成し、コンポーネントにプロキシかどうかを問い合わせます:
isHttpProxy() が true を返し、getPath() がキャッチオールの / に縮退します — エンドポイントが転送プロキシに変化しています。isHttpProxy() が false を返し、getPath() は proxyStats になります — 正確なパス proxy のみがプロキシモードを選択します。ドキュメント化された platform-http:proxy エンドポイントは両バージョンでプロキシのままです(対比のために表示)。これにより、修正が意図しない分類のみを除去していることが確認できます。
# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: proxyStats isHttpProxy=true, path "/"; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85316-platform-http-proxy-prefix-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: isHttpProxy=false, path "proxyStats"; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): proxyStats isHttpProxy=true, path "/"
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: isHttpProxy=false, path "proxyStats"
| プロパティ | 値 |
|---|---|
| コンポーネント | camel-platform-http (PlatformHttpEndpoint.isHttpProxy) |
| CWE | CWE-1220 (アクセス制御の粒度不足) |
| 重大度 | MEDIUM |
| 攻撃ベクトル | ルートが proxy で始まるパスを持つ platform-http エンドポイントを宣言している(ただしプロキシを意図していない)場合、呼び出し元の Host ヘッダーへのキャッチオール転送となる |
| 影響 | 意図しないプロキシ/リクエストフォージェリ、および転送パスが到達できる範囲の露出 |
| 影響を受けるバージョン | 4.0.0 から 4.18.5 未満、4.19.0 から 4.22.1 未満 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24455 |
| クレジット | Claude Security Scan Tool |
アドバイザリ: https://camel.apache.org/security/CVE-2026-85316.html
影響を受ける Quarkus モジュールは CQ 3.39.0 (Camel 4.22.0) でビルドされています。修正された制御は CQ 3.40.0 (Camel 4.22.1) です。 デモンストレーションはエンドポイントの作成と検査 (
isHttpProxy()/getPath()) のみを行うため、HTTP サーバーは 起動されません。Spring Boot モジュールはスターターではなく、プレーンなcamel-platform-httpコンポーネントを使用しています。
PlatformHttpEndpoint.isHttpProxy() は、startsWith を使用する代わりに、
パスが proxy と等しいかどうかを比較する (PROXY_PATH.equals(this.path)) ようになったため、ドキュメント化された
platform-http:proxy エンドポイントのみがプロキシモードで実行されます。
proxy で始まるがプロキシを意図していないエンドポイントパスは、名前を変更してください。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを検証できるようにするためです。デモンストレーションはプロセス内でエンドポイントの分類を検査するのみで、トラフィックの転送は行いません。この資料を、所有または運用していないシステムに対して使用しないでください。