
Apache Camel の脆弱性に対する実行可能な概念実証 (PoC) 再現プログラムです。この脆弱性では、camel-fop の FopProducer が XSL-FO メッセージ本文に対して identity transform を実行する前に、javax.xml.transform.TransformerFactory を FEATURE_SECURE_PROCESSING のみで作成していました。JDK 組み込みのトランスフォーマーでは、この機能だけで accessExternalDTD/accessExternalStylesheet の制限が既に空になるため、外部リソースは拒否されます。しかし、Saxon-HE などのサードパーティ製 JAXP TransformerFactory がクラスパス上にある場合 — 例えばアプリケーションが camel-xslt-saxon や camel-saxon も使用している場合 — TransformerFactory.newInstance() はその実装を返し、FEATURE_SECURE_PROCESSING だけではその実装の外部リソースアクセスを制限しません。そのため、XSL-FO 本文で宣言された外部サブセットを持つ DOCTYPE が本文の変換時に解決され、外部送信者のドキュメントが Camel プロセスから読み取り可能なファイルを読み取ったり、指定したホストへのリクエストを発行させたりすることが可能になります (CWE-611)。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-fop 4.22.0 (影響あり、修正版 4.22.1) + Saxon-HE 13.0 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-fop (Camel 4.22.0、影響あり、修正済みコントロール CQ 3.40.0 / Camel 4.22.1) + Saxon-HE 13.0 |
両モジュールとも、実際の FopProducer に対して影響を受ける動作および修正済みの動作を実証します。両方とも Saxon-HE がクラスパス上にあります — これがこの欠陥の前提条件です。JDK のトランスフォーマーを使用するデフォルトのデプロイは、修正前も修正後も影響を受けません。
検証エンドポイント /exploit/attack は、インプロセスの HTTP コールバックを起動し、そのコールバックを指す外部 DTD を DOCTYPE で宣言した XSL-FO ドキュメントを fop:pdf に送信します:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "http://localhost:<port>/external.dtd">
<fo:root …>…Hello…</fo:root>
オラクルは単純にコールバックが要求されたかどうかであり、外部リソースが取得されたことの決定的な証明です:
TransformerFactory.newInstance() は Saxon を返し、セキュア処理のみの下でも依然として外部 DTD を取得します — コールバックが発火します(同じメカニズムで file:// URL も読み取られます)。ACCESS_EXTERNAL_DTD が "" に設定されているため、Saxon は外部 DTD を拒否します。コールバックは決して発火しません。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: callback hit = true; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -Djava.awt.headless=true -jar target/cve-2026-91858-fop-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: callback hit = false; >>> 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.22.0): callback hit = true
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 -Djava.awt.headless=true -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: callback hit = false
| プロパティ | 値 |
|---|---|
| コンポーネント | camel-fop (FopProducer) |
| CWE | CWE-611 (XML外部エンティティ参照の不適切な制限) |
| 深刻度 | MEDIUM |
| 攻撃ベクトル | 外部送信者のXSL-FOがfop:プロデューサーに到達する。ただし、サードパーティ製のJAXP TransformerFactory(例: Saxon-HE)がクラスパス上に存在するデプロイメントに限る |
| 影響 | Camelプロセスが読み取り可能なローカルファイルの読み取り、ドキュメントが指定する内部ホストへのSSRF |
| 影響を受けるバージョン | 4.0.0から4.18.5未満、4.19.0から4.22.1未満(非JDKのTransformerFactoryが存在する場合のみ) |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24605 |
| クレジット | Claude Security Scan Tool |
アドバイザリ: https://camel.apache.org/security/CVE-2026-91858.html
Quarkusの影響を受けるモジュールはCQ 3.39.0(Camel 4.22.0)でビルドされています。修正済みのコントロールはCQ 3.40.0(Camel 4.22.1)です。 Saxon-HE 13.0は、camel-xslt-saxon/camel-saxonも使用するアプリケーションの代替として両方のモジュールに追加されています。 非JDKのTransformerFactoryが存在しない場合、この脆弱性には到達できません。
FopProducerは、生成するTransformerFactoryに対して(FEATURE_SECURE_PROCESSINGに加えて)XMLConstants.ACCESS_EXTERNAL_DTDと
XMLConstants.ACCESS_EXTERNAL_STYLESHEETも空文字列に設定するようになりました。これはXmlConverterで使用されている安全なXML処理設定と一致します。したがって、Saxon-HEを含む、これらの属性を尊重するあらゆるJAXP実装において、外部DTDおよびスタイルシートへのアクセスは拒否されます。
信頼できないXSL-FOをfop:プロデューサーに送信しないか、代替のJAXP TransformerFactory(Saxon-HEなど)をクラスパスから削除して、JDKのトランスフォーマー(安全な処理の下ではすでに外部DTDを拒否します)が使用されるようにしてください。
このリポジトリは教育および防御目的で公開されています。Apache Camelユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを検証できるようにするためです。外部DTDはlocalhost上のインプロセスコールバックを指しており、再現ツールの外部とは一切通信せず、機密ファイルも読み取りません。所有または運用していないシステムに対してこの資料を使用しないでください。