このリポジトリには、CVE-2026-24688を発動させるための概念実証コードが含まれています。
pypdfのアウトライン(ブックマーク)解析ロジックにおける重大なサービス拒否(DoS)脆弱性です。循環するアウトライン参照を含むPDFを処理すると、パーサーが無限ループに入り、メモリを継続的に割り当て続け、私のマシン(TM)では毎秒数百MBのメモリを消費し、最終的にシステム全体がクラッシュします。
これはアプリケーションのハングアップではなく、システムレベルのDoSです。
malicious_circular_outline.pdf - 循環アウトラインを含む悪意のあるPDF(754バイト)create_malicious_pdf.py - 悪意のあるPDFを生成するスクリプトsimple_read_pdf.py - 脆弱性を再現するための簡単なテストスクリプトtest_pypdf.sh - 自動テストスクリプト(pypdfをインストールしてテストを実行)README.md - このファイル警告: メモリ消費量を監視して時間内にキャンセルしないと、これらのテストによってシステムがクラッシュする可能性があります。
# 自動テストスクリプトを実行(タイムアウト保護付き)
chmod +x test_pypdf.sh
./test_pypdf.sh
# これにより以下が実行されます:
# 1. 脆弱性のあるバージョンのpypdfをインストール
# 2. 15秒のタイムアウトでテストを実行
# 3. メモリ消費の挙動を表示
# pypdfをインストール(脆弱性のあるバージョン6.6.0)
pip install "pypdf==6.6.0"
# タイムアウト付きで実行
timeout 10s python3 simple_read_pdf.py malicious_circular_outline.pdf
# pypdfをインストール(脆弱性のあるバージョン6.6.0)
pip install "pypdf==6.6.0"
# タイムアウトなしで実行
python3 simple_read_pdf.py malicious_circular_outline.pdf
場所: pypdf/_doc_common.py - _get_outline() メソッド(858〜873行目)
def _get_outline(self, node, outline=None):
while True: # ❌ 循環検出なし!
outline_obj = self._build_outline_item(node)
if outline_obj:
outline.append(outline_obj) # ❌ ループ内でヒープ割り当て!
if "/Next" not in node:
break
node = node["/Next"] # ❌ 循環参照を追跡
根本原因: 訪問済みセットなし、反復制限なし、継続的なメモリ割り当て
実環境テスト:
攻撃の特徴:
バージョン6.6.2で修正済み
https://github.com/py-pdf/pypdf/security/advisories/GHSA-2q4j-m29v-hq73