
CVE-2025-66516 Apache Tika 脆弱性の教育目的のみの POC
教育/許可されたテストのみ | ライセンス | セキュリティポリシー
このリポジトリは、CVE-2025-66516(Apache Tika 3.2.2より前のバージョンにおけるXML External Entity(XXE)注入脆弱性)の概念実証(POC)エクスプロイトを含んでいます。この脆弱性は、tika-parser-pdf-moduleコンポーネントのXFA(XML Forms Architecture)パーサーに影響を与え、攻撃者が悪意を持って細工されたPDFドキュメントを通じてローカルファイルを読み取り、機密データを外部に流出させることを可能にします。
CVE-2025-66516は、Apache TikaのPDF解析機能における重大なセキュリティ脆弱性です。埋め込まれたXFAフォームを含むPDFファイルを処理する際、Tika 3.2.2より前のバージョンでは、XMLパーサーにおける外部エンティティ処理を適切に制限できません。これにより、攻撃者は以下を実行できます:
このリポジトリには以下が含まれます:
Apache Tika XXE, CVE-2025-66516 エクスプロイト, Tika セキュリティ脆弱性, XML External Entity 攻撃, PDF XXE 注入, Tika 3.2.1 脆弱性, アウトオブバンド XXE, OOB XXE, セキュリティ研究, ペネトレーションテスト, POC エクスプロイト, 脆弱性開示, XFA パーサー脆弱性, tika-parser-pdf-module, ファイル開示脆弱性, データ流出, SSRF 攻撃, セキュアコーディング, 脆弱性分析, セキュリティテスト, 倫理的ハッキング, 情報セキュリティ, サイバーセキュリティ研究, Apache Tika エクスプロイトコード, XXE ペイロード, PDF セキュリティ, ドキュメントパーサー脆弱性
注: このPOCは以下の環境でテストおよび検証されています:
まず、POC用の専用ディレクトリを作成し、すべてのファイルを整理します。
mkdir apache_tika_poc
cd apache_tika_poc
POCを進める前に、必要な依存関係が環境に存在することを確認します。以下のコマンドでJavaコンパイラ/ランタイムのバージョンとOSの詳細が表示され、脆弱性の再現に重要です。
# Javaバージョンの確認
java -version
javac -version
# OSバージョンの確認
lsb_release -a
期待される出力: Javaバージョン情報(例: OpenJDK 17.x.x)とUbuntuのバージョン詳細(24.04.3 LTS)が表示されます。
脆弱なバージョン(3.2.1)と修正済みバージョン(3.2.2)の両方をダウンロードします。XXE脆弱性が3.2.1に存在し、3.2.2で修正されていることを実証するために両方のバージョンが必要です。tika-app JARは、すべてのTikaパーサーと依存関係を含むオールインワンの実行可能ファイルです。
# 脆弱なTikaバージョンのダウンロード
wget https://repo1.maven.org/maven2/org/apache/tika/tika-app/3.2.1/tika-app-3.2.1.jar
# 修正済みTikaバージョンのダウンロード
wget https://repo1.maven.org/maven2/org/apache/tika/tika-app/3.2.2/tika-app-3.2.2.jar
期待される出力: 2つのJARファイル(tika-app-3.2.1.jar(約75MB)とtika-app-3.2.2.jar(約75MB))がダウンロードされます。
JARマニフェストファイルを調べて正確なバージョンを確認します。これにより、テスト前に正しい脆弱バージョンと修正済みバージョンを入手できたことが確認できます。
# 脆弱なバージョンのマニフェストを確認
unzip -p tika-app-3.2.1.jar META-INF/MANIFEST.MF
# 修正済みバージョンのマニフェストを確認
unzip -p tika-app-3.2.2.jar META-INF/MANIFEST.MF
期待される出力: Implementation-Version: 3.2.1 および 3.2.2 をそれぞれ示すマニフェストファイル。ビルドタイムスタンプやその他のメタデータも表示されます。
プロジェクトオブジェクトモデル(MavenのPOMプロパティはプロジェクトの依存関係、ビルド構成、メタデータを定義します)を見ると、セキュリティアドバイザリで言及されているような独立したtika-parsersは存在しないことがわかります。これはバージョンに関連するものであり、POCの一部であるバージョン3.2.1および3.2.2では、tika-parsersモジュールが個別のパーサーモジュールに置き換えられたものと推測されます。
# 両方のバージョンのすべてのコンポーネント pom.properties ファイルを一覧表示
unzip -l tika-app-3.2.1.jar | grep pom.properties | grep tika
unzip -l tika-app-3.2.2.jar | grep pom.properties | grep tika
期待される出力: tika-core、tika-parser-pdf-module、tika-xmp など、すべてのTikaコンポーネントモジュールの一覧。単一の tika-parsers モジュールではなく、個別のパーサーモジュールが表示されます。
コアTikaコンポーネントのバージョン情報を抽出して表示します。これにより内部モジュール構造を理解し、コアライブラリとPDFパーサーモジュールの両方が期待されるバージョンであることを確認できます。
# tika-core, tika-parser-pdf-module, tika-app のバージョンを 3.2.1 で確認
unzip -p tika-app-3.2.1.jar META-INF/maven/org.apache.tika/tika-core/pom.properties && echo "---" && unzip -p tika-app-3.2.1.jar META-INF/maven/org.apache.tika/tika-parser-pdf-module/pom.properties && echo "---" && unzip -p tika-app-3.2.1.jar META-INF/maven/org.apache.tika/tika-app/pom.properties
# tika-core, tika-parser-pdf-module, tika-app のバージョンを 3.2.2 で確認
unzip -p tika-app-3.2.2.jar META-INF/maven/org.apache.tika/tika-core/pom.properties && echo "---" && unzip -p tika-app-3.2.2.jar META-INF/maven/org.apache.tika/tika-parser-pdf-module/pom.properties && echo "---" && unzip -p tika-app-3.2.2.jar META-INF/maven/org.apache.tika/tika-app/pom.properties
期待される出力: 各コンポーネントの version=3.2.1 または version=3.2.2 を示すPOMプロパティが --- で区切られて表示されます。3つのコンポーネント(tika-core、tika-parser-pdf-module、tika-app)すべてが全体のバージョンと一致する必要があります。
XXE攻撃のターゲットとなる偽のシークレットファイルを作成します。このファイルは、攻撃者がXXE脆弱性を利用して流出させようとする機密データ(APIキーや認証情報など)をシミュレートします。
# ターゲットシークレットファイルの作成
echo "INTERNAL_SERVER_KEY=EXPOSED" > fake-secrets.txt
期待される出力: INTERNAL_SERVER_KEY=EXPOSED という文字列を含む fake-secrets.txt ファイルが作成されます。これはXXEエクスプロイトによって読み取られます。
修正内容を理解するために、両方のバージョンの XMLReaderUtils クラスを逆コンパイルして比較する必要があります。このクラスはXMLパーサーの作成を担当し、脆弱性はXMLエンティティ処理の設定方法に起因します。
# 分析用に脆弱なJARを展開
mkdir tika-3.2.1-extract && cd tika-3.2.1-extract && unzip -q ../tika-app-3.2.1.jar && cd ..
# 分析用に修正済みJARを展開
mkdir tika-3.2.2-extract && cd tika-3.2.2-extract && unzip -q ../tika-app-3.2.2.jar && cd ..
# 脆弱なクラスを逆コンパイル
cd tika-3.2.1-extract && javap -c org/apache/tika/utils/XMLReaderUtils.class > ../XMLReaderUtils-3.2.1.txt && cd ..
# 修正済みクラスを逆コンパイル
cd tika-3.2.2-extract && javap -c org/apache/tika/utils/XMLReaderUtils.class > ../XMLReaderUtils-3.2.2.txt && cd ..
# バージョンを比較
diff -u XMLReaderUtils-3.2.1.txt XMLReaderUtils-3.2.2.txt
期待される出力: 展開により、逆コンパイルされたクラスファイルを含む2つのディレクトリが作成されます。javap コマンドは XMLReaderUtils クラスのバイトコード逆アセンブリを生成します。diff コマンドは、バージョン間でXMLパーサーの設定方法がどのように異なるかを表示します。
注意深く比較すると、3.2.2ではDoctype定義(DTD)と外部エンティティのサポートが無効になっていることがわかります。これが修正の核心です。
diff -u XMLReaderUtils-3.2.1.txt XMLReaderUtils-3.2.2.txt | grep -A2 -B2 "accessExternalDTD\|supportDTD\|isSupportingExternalEntities"
期待される出力: バージョン3.2.2でDTD処理と外部エンティティ解決を無効にする呼び出しが追加されたことを示すdiff出力が表示されます。accessExternalDTD を空文字列に設定し、supportDTD を false に設定する行を探してください。
これは、悪意のあるPDFがサーバーのファイルシステムからローカルファイルを読み取る、古典的なXXE攻撃を示します。Pythonスクリプトは、file:///fake-secrets.txt を参照するXXEペイロードを含むXFAフォームが埋め込まれたPDFを生成します。
# 悪意のあるPDFを生成
python3 ./gen_poc.py
# 脆弱なTika 3.2.1でテスト
java -jar tika-app-3.2.1.jar -t cve_2025_66516_poc.pdf
# 修正済みTika 3.2.2でテスト
java -jar tika-app-3.2.2.jar -t cve_2025_66516_poc.pdf
期待される出力:
gen_poc.py がXXEペイロードを含む cve_2025_66516_poc.pdf を作成INTERNAL_SERVER_KEY=EXPOSED が含まれます(シークレットファイルの内容!)これは、アウトオブバンド(OOB)データ流出を使用した、より高度なXXE攻撃を示します。応答にファイル内容を反映させる代わりに、悪意のあるPDFはTikaにデータを攻撃者が制御する外部サーバーに送信させます。この手法は、アプリケーションが解析されたコンテンツを返さない場合でも機能します。
# アウトオブバンドXXE PDFを生成
python3 ./gen_oob_poc.py
# HTTPリスナーを起動(別のターミナルで)
python3 ./http_listener.py
# 脆弱なTika 3.2.1でOOB XXEをテスト
java -jar tika-app-3.2.1.jar -t cve-2025-66516_OOB_XXE.pdf