
CVE-2026-79983(Apache Camel の camel-ftp コンシューマーにおけるパストラバーサル)の実行可能な概念実証(PoC)再現ツール。悪意ある FTP サーバーのフィクスチャと、影響を受けるビルド/修正済みビルドを備えています。
Apache Camel の脆弱性に対する実行可能な概念実証(PoC)再現環境です。この脆弱性では、リモートファイルコンシューマがリモートサーバー上のディレクトリをポーリングし、各ファイルの絶対リモートパスを設定されたディレクトリとサーバーのディレクトリリスティングで報告されたファイル名を連結して構築します。字句的正規化もなく、結果がポーリング対象ディレクトリ内に留まるかどうかのチェックもありません。このパスはその後、(常に)取得のオペランドとなり、delete=true、move、preMove、moveFailed、または readLock=rename が設定されている場合は削除やリネームのオペランドともなります。
リスティングの名前はルートで制御されるデータではありません — リモートサーバーから供給されるものであり、FTP 制御チャネルには完全性保護がないため、経路上の攻撃者が LIST レスポンスを書き換えることができ、侵害されたサーバーやマルチテナントサーバーはそのような名前を直接出力できます。文書化されたデフォルト有効の jailStartingDirectory オプションは、このリモートオペランドを制約しませんでした。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-ftp 4.22.0(影響あり、修正版 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-ftp 3.29.0(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 はまだリリースされていません。
このアプリには、意図的に悪意のある FTP サーバー(Apache MINA FtpServer とインメモリ VFS)が組み込まれており、ポーリング対象ディレクトリ /upload に以下をリスティングします:
normal.txt — ディレクトリ内の正当なファイル、およびd/../../outside.txt — 名前が単一のパスセグメントではない細工されたエントリ。ドットで始まらないため(Camel の隠しファイルルールに引っかからない)、/upload + d/../../outside.txt は /outside.txt に解決され、ポーリング対象ディレクトリの1 つ上のレベルになります。プレーンな Camel FTP コンシューマが /upload をポーリングします。影響を受けるビルドでは両方のエントリを取得します — 到達すべきでない /outside.txt を含みます。修正済みビルドでは normal.txt を保持し、脱出するエントリをスキップして Skipping file as it resolves outside the starting directory: upload/d/../../outside.txt をログ出力します。
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
影響を受けたビルドで期待される出力:
What the Camel consumer retrieved:
name=[normal.txt] (inside)
name=[d/../../outside.txt] <<< FILE FROM OUTSIDE THE POLLED DIRECTORY
content: OUTSIDE-SECRET (/outside.txt, a file the consumer should never reach)
Paths the server was asked to read:
upload/normal.txt -> /upload/normal.txt
upload/d/../../outside.txt -> /outside.txt
| プロパティ | 値 |
|---|---|
| コンポーネント | camel-ftp(ftp、ftps、sftp スキーム) |
| CWE | CWE-22(パス名の制限ディレクトリへの不適切な制限) |
| 重大度 | HIGH |
| 攻撃ベクトル | 単一のパスセグメントではない LIST エントリ(サーバーが提供し、認証されていない FTP 制御チャネル上で書き換え可能) |
| 影響 | 読み取り — さらに delete/move/readLock=rename を併用すると、エンドポイントの認証情報を用いて、ポーリング対象ディレクトリ外のファイルを削除またはリネーム |
| 影響を受けるバージョン | 4.0.0 から 4.18.5 より前、4.19.0 から 4.22.1 より前 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24487 |
| クレジット | Dilrevx from NSSL, SJTU |
アドバイザリ: https://camel.apache.org/security/CVE-2026-79983.html
セパレータを考慮した GenericFileHelper.isWithinDirectory のオーバーロードと、GenericFileConsumer.isWithinStartingDirectory
戦略(jailStartingDirectory が有効な場合に isValidFile から参照される)により、解決済みのパスを圧縮し、
パスセグメントの境界において、そのパスが依然としてポーリング対象ディレクトリ内に解決されることを検証します。外部に解決される
ファイルは警告とともにスキップされます(そのため同じリスティング内の他の正当なエントリは引き続き処理されます)。RemoteFileConsumer と
SmbConsumer はこのチェックをオーバーライドします。ローカルのリスティング名は常に単一セグメントであるため、ローカルの
基底実装は何もしません(no-op)。
転送中にリスティングが書き換えられないよう、ftp よりも sftp/ftps を優先し、ホスト鍵/証明書を検証してください。
filter、antInclude、include を用いてコンシューマーを制約し、単一セグメントの名前のみを受け入れるようにし、
リスティングが完全には信頼できないサーバーに対しては delete=true/move/preMove/moveFailed/readLock=rename の使用を避けてください。
可能であれば、サーバーアカウントをポーリング対象ディレクトリに限定してください。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、 アップグレードによって解決されることを確証できるようにするためです。悪意のあるサーバーと「secret」は、無害なローカルフィクスチャです。 所有または運用していないシステムに対してこの資料を使用しないでください。