downloadFileName パストラバーサル同じApache Camelの脆弱性に対する実行可能な概念実証(PoC)再現コードで、ランタイムごとに1つずつ用意しています:
どちらも影響を受けるバージョンです(この問題は4.14.9 / 4.18.4 / 4.22.0で修正済み)。また、両方とも同一の欠陥を実証します:camel-google-storageのコンシューマーは、downloadFileName がディレクトリの場合、バケットオブジェクトをローカルファイルシステムにダウンロードする際、リモートオブジェクト名をそれに追記してローカルターゲットを構築します(downloadFileName + "/${file:name}")。${file:name} トークンはオブジェクト名をそのまま返します(パスを除去する ${file:onlyname} とは異なります)。その結果は new File(result) / blob.downloadTo(file.toPath()) に正規化なしで渡され、宛先が設定されたディレクトリ内に留まるかどうかのチェックもありませんでした。オブジェクト名はルートで制御されません——コンシューマーはバケットを一覧表示してすべてのオブジェクトをダウンロードするため、名前に ../ セグメントを含むオブジェクトは downloadFileName の外側に書き込まれます(CWE-22、パストラバーサル→任意のファイル書き込み)。
各サブディレクトリは自己完結型です(独自の Dockerfile、fake-gcs-server エミュレーターを起動する docker-compose.yml、およびREADME)。要するに、どちらでも次のコマンドを実行します:
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
影響を受けるビルドでの期待される出力(両バリアントとも):
Files inside the intended download directory /app/downloads:
- report.txt
File written OUTSIDE it, at /tmp/pwned-66907.txt: true
content: PWNED via path traversal — CVE-2026-66907
>>> PROVEN: the object name's ../ segments escaped the configured downloadFileName directory ... : true
勧告: https://camel.apache.org/security/CVE-2026-66907.html
コンシューマーは現在、解決されたパスを正規化し、設定された downloadFileName ディレクトリ内に留まることを検証します(GoogleCloudStorageFileNameHelper.assertWithinDirectory 経由)。ディレクトリ外へ逸脱しようとするオブジェクト名は拒否されます。
docker-compose.yml は fake-gcs-server を -backend memory で実行します。これによりオブジェクト名は不透明なマップキーとして保持されるため、../ を含む名前もそのまま維持されます。デフォルトのファイルシステムバックエンドでは ../ が解決されるため、オブジェクトが一覧表示できなくなります。
このリポジトリは教育および防御目的で公開されています:Apache Camelユーザーが脆弱性を理解し、影響を受けるかどうかを確認し、アップグレードによって解決されることを確認できるようにするためです。書き込まれるファイルは /tmp 配下の無害なマーカーです。所有または運用していないシステムに対してこの資料を使用しないでください。
| ランタイム | ディレクトリ | スタック |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-google-storage 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0(Camel 4.20.0 を同梱) |
| プロパティ | 値 |
|---|
| コンポーネント | camel-google-storage(Spring Boot: camel-google-storage-starter、Quarkus: camel-quarkus-google-storage) |
| CWE | CWE-22(制限付きディレクトリへのパス名の制限が不適切—パストラバーサル) |
| 攻撃ベクトル | downloadFileName がディレクトリに設定されたコンシューマーによってダウンロードされる、名前に ../ セグメントを含むバケットオブジェクト |
| 影響 | 設定されたダウンロードディレクトリの外側への任意のファイル書き込み |
| 影響を受けるバージョン | 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-24279 |
| クレジット | n0mi1k |