downloadToFile パストラバーサル同じ Apache Camel の脆弱性に対する実行可能な概念実証(PoC)再現コードで、ランタイムごとに 1 つずつ用意されています。
どちらも影響を受けるバージョンです(この問題は 4.14.9 / 4.18.4 / 4.22.0 で修正されています)。両方ともまったく同じ欠陥を実証します:camel-azure-storage-datalake コンポーネントは、downloadToFile オペレーションを通じて ADLS Gen2 ファイルをローカルファイルシステムにダウンロードでき、fileDir オプションで指定されたディレクトリに書き込みます。DataLakeFileOperations.downloadToFile は、Azure SDK が報告したリモートパス名をそのまま fileDir に連結してローカルの書き込み先を構築していました(new File(fileDir, fileClientWrapper.getFileName()))。そこには語彙的な正規化は一切なく、解決された場所が fileDir 内に留まるかどうかのチェックもありません。リモート名はルートによって制御されません。コンシューマーはファイルシステムを列挙し(DataLakeConsumer.createBatchExchangesFromPath)、すべてのエントリーをダウンロードします。したがって、../ セグメントを含むパス名は fileDir の外に解決されます(CWE-22、パストラバーサル → 任意のファイル書き込み)。
テストハーネスに関する注意。 Azure Data Lake Gen2 API は、利用可能なローカルエミュレーターでは実装されていません。 Azurite は Gen2 の
listPathsおよびファイル操作に対して HTTP 400 を返します。そのため、これらの再現コードは、脆弱なコードそのもの(DataLakeFileOperations.downloadToFile→new File(fileDir, fileClientWrapper.getFileName()))を 直接駆動し、getFileName()がリモート名を返す Data Lake ファイルクライアントラッパーを供給します。これは、 コンシューマーがPathItem.getName()から読み取った名前を渡すのとまったく同じ方法です。兄弟コンポーネントであるcamel-azure-storage-blobも同じ修正を共有しています(CVE-2026-66906)。 そこでは同一の欠陥が、稼働中の Azurite エミュレーターに対してエンドツーエンドで再現されています。
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
影響を受けるビルドでの想定出力(両方のバリアントとも):
2) Download of a file named '../../../../../../tmp/pwned-60093.txt':
resolved local target: /app/downloads/../../../../../../tmp/pwned-60093.txt
File written OUTSIDE it, at /tmp/pwned-60093.txt: true
content: PWNED via path traversal — CVE-2026-60093
>>> PROVEN: DataLakeFileOperations.downloadToFile built the local target as new File(fileDir, fileName) ... : true
アドバイザリ:https://camel.apache.org/security/CVE-2026-60093.html
コンシューマーは現在、ダウンロード先を設定された fileDir ディレクトリ内に解決して制限します(AzureFileNameHelper.resolveWithinDirectory を使用)。そこから外れようとするパス名は拒否されます。これは camel-azure-storage-blob にも適用されている修正と同じものです(CVE-2026-66906)。
このリポジトリは、教育および防御目的で公開されています。Apache Camel ユーザーがこの脆弱性を理解し、自分自身が影響を受けるかどうかを確認し、アップグレードによって解決されることを確かめるためのものです。書き込まれるファイルは /tmp 配下の無害なマーカーです。この資料を、自分が所有または運用していないシステムに対して使用しないでください。
| ランタイム | ディレクトリ | スタック |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-azure-storage-datalake 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0(Camel 4.20.0 をバンドル) |
| 項目 | 値 |
|---|
| コンポーネント | camel-azure-storage-datalake(Spring Boot:camel-azure-storage-datalake-starter、Quarkus:camel-quarkus-azure-storage-datalake) |
| CWE | CWE-22(制限付きディレクトリへのパス名の不適切な制限 — パストラバーサル) |
| 攻撃ベクトル | ../ セグメントを含むパス名を持つ Gen2 ファイルが、fileDir が設定されたコンシューマーによってダウンロードされる |
| 影響 | 設定された fileDir ディレクトリの外部への任意のファイル書き込み |
| 影響を受けるバージョン | 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-23942 |
| クレジット | n0mi1k; Hiep Nguyen |