
Apache Camel camel-docling における CVE-2026-78163 の実行可能な概念実証(PoC)再現ツール。検証されていない String ボディ入力による SSRF とローカルファイル開示を実演し、修正済みビルドでの対照も含む。
Apache Camel の脆弱性を再現する実行可能な概念実証 (PoC) です。この脆弱性では、DoclingProducer が String メッセージボディの意味をそのプレフィックスを検査して判断していました:
http:// または https:// で始まるボディは、取得すべきリモート URL として Docling に渡され (SSRF)、/ で始まる (またはバックスラッシュを含む) ボディは、ローカルファイルシステムから読み取られました (ファイル開示)。モードは暗黙的に選択され、単一の解釈に固定するためのエンドポイントオプションは存在せず、さらに — Camel のヘッダー名前空間とは異なり — メッセージボディは HeaderFilterStrategy によって決してフィルタリングされません。そのため、「ボディに届いた任意のテキストを変換する」という意味のルートが、攻撃者が制御するテキストがこれらのプレフィックスのいずれかで始まるたびに、黙ってリモートリソースの取得元やローカルファイルの読み取り元になってしまいました。
| ランタイム | ディレクトリ | スタック | 示す内容 |
|---|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-docling 4.22.0 (影響あり; 修正版 4.22.1) | SSRF および ファイル開示、さらに修正ビルドでの制御 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-docling 3.29.0 (Camel 4.15.0、影響あり) | ファイル開示のみ (注記参照) |
バージョン範囲。 ローカルファイル開示のシンクは、camel-docling が 4.15.0 で導入されて以来存在しています; リモート URL のシンクは、docling-serve サポートとともに 4.16.0 で追加されました。最新の Camel Quarkus (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 はまだリリースされていません。
どちらの再現環境も実際の Docling インストールを必要としません: 小さな偽の docling CLI (fake-docling/docling) が
バイナリの代役を務め、本物のバイナリがプロデューサー提供の入力に対して何をするかを可視化します — URL を取得するか、
ファイルを読み取るかです。これは無害です: 処理するよう指示された内容をエコーし、自身の呼び出しをログに記録するだけです。
この CVE の要点は、攻撃者が提供したボディが、オプトインなしでその引数に到達してしまうことです。
Spring Boot アプリはまた、127.0.0.1:9099 で内部専用の HTTP エンドポイントを実行し (公開されるのはポート 8080 のみで、
外部クライアントは 9099 に直接到達できません)、ローカルのシークレットファイルも持ちます。攻撃者はテキストのみを送信します:
http://127.0.0.1:9099/internal-secret → サーバー側の docling 呼び出しが
内部エンドポイントを取得し、そのシークレットが呼び出し元に返されます。/tmp/cve-2026-78163-secret.txt → ローカルファイルが読み取られて返されます。影響を受けるビルドでは両方とも成功します; 修正されたビルドでは両方とも IllegalArgumentException で拒否され、
有効化に必要となるオプション (allowUrlSource / allowFilePathSource) が示され、docling は決して呼び出されません。
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
影響を受けた Spring Boot ビルドで期待される出力:
[1] SSRF — sending body = http://127.0.0.1:9099/internal-secret
>>> PROVEN SSRF: the server-side docling invocation fetched the attacker-controlled internal URL.
>>> internal victim saw: [GET /internal-secret]
>>> content returned to the caller:
| INTERNAL-SECRET-DATA (only reachable from inside the deployment)
[2] File disclosure — sending body = /tmp/cve-2026-78163-secret.txt
>>> PROVEN file disclosure: the attacker-named local file was read and returned.
| TOP-SECRET-FILE-CONTENT (local file an attacker should not be able to read)
| プロパティ | 値 |
|---|---|
| コンポーネント | camel-docling (camel-docling-starter / camel-quarkus-docling) |
| CWE | CWE-918 (SSRF)、CWE-22 (パストラバーサル)、CWE-200 (情報漏えい) |
| 深刻度 | MEDIUM |
| 攻撃ベクトル | docling エンドポイントに転送される String 型のメッセージボディ。そのプレフィックスによって URL 取得またはファイル読み取りのシンクが選択される。ボディは HeaderFilterStrategy の対象外 |
| 影響 | 攻撃者が選択した URL (内部サービス) のサーバーサイド取得、およびローカルファイルの漏えい |
| 影響を受けるバージョン | 4.15.0 から 4.18.5 未満、4.19.0 から 4.22.1 未満 (ファイル漏えいは 4.15.0 以降、URL シンクは 4.16.0 以降) |
| 修正バージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24422 |
| クレジット | Li Zhiyao (BUPT) |
アドバイザリ: https://camel.apache.org/security/CVE-2026-78163.html
String 型のボディは、デフォルトでドキュメントそのものとして扱われるようになりました。2 つのロケーション解釈は、新しいエンドポイントオプション allowUrlSource と allowFilePathSource (いずれもデフォルトは false) によってオプトイン方式になりました。URL やパスのように見えるボディは、そうでなければ、それを有効化するオプション名を示す IllegalArgumentException で拒否されます。さらに inputBaseDirectory オプションによって、ローカル入力パスを設定済みのディレクトリに制限できます。型付きボディ (File、byte[]、InputStream) と CamelDoclingInputFilePath ヘッダーは、すでにその意味が明示されているためゲートされません (ただし inputBaseDirectory の対象のままです)。
外部由来のメッセージボディを docling エンドポイントにルーティングしないでください。ドキュメントは型付きボディ (File、byte[]、InputStream) または CamelDoclingInputFilePath ヘッダーを介して渡すことで、ボディがプレフィックス解釈の対象にならないようにしてください。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを確証できるようにするためです。偽の docling CLI と「シークレット」は、無害なローカルフィクスチャです。所有または運用していないシステムに対してこの資料を使用しないでください。