
Dompdf: 過大な画像ビットマップを使用したリソース枯渇によるサービス拒否 (DoS)
このリポジトリおよびその内容は、教育および研究目的のみで提供されています。作者は、ここで提供される情報を用いて行われた不正利用、損害、または違法行為について一切の責任を負いません。対象環境をテストする前に、必ず許可を取得してください。
Dompdf v3.1.5 は、リソース枯渇によるサービス拒否(DoS)攻撃に対して脆弱です。攻撃者は、巨大な寸法(例: 30,000x30,000 ピクセル)の単一画像を含む、特別に細工された HTML ドキュメントを提供することで、PHP プロセスをクラッシュさせることができます。
Dompdf は画像の寸法を検証する内部チェックを実装していますが、これらは Base64 でエンコードされ、特定の CSS コンテナでラップされた高エントロピー画像(ランダムノイズなど)を使用することでバイパスできます。
標準的な単色画像は、圧縮アルゴリズムやレンダリングエンジンによって最適化できることがよくあります。しかし、高エントロピーのノイズ画像は、PHP エンジンに 9 億ピクセルを個別に処理させます。render() が呼び出されると、エンジンは非圧縮ビットマップをメモリ内で処理し、分散の大きい各ピクセルデータポイントのレイアウトを計算しようとします。これにより、以下が発生します:
この脆弱性は、寸法の検証が早期に行われる一方で、レンダリングフェーズ中にオブジェクトのバウンディングボックスと内部バッファを計算するためのリソース割り当てが、初期チェックを通過した単一オブジェクトの累積 CPU 時間やメモリ使用量を厳密に制限していないために存在します。
https://github.com/user-attachments/assets/d1f5a07b-a7c5-4b5e-84b5-1e47e73522d9
composer require dompdf/dompdf:3.1.5
exploit.py):monitor.py):render.php という名前のファイルを作成します。このスクリプトは、Dompdf ライブラリの標準的な実装を模倣した、脆弱なエントリポイントとして機能します:php -d memory_limit=2G render.php < payload.html
以下のログは、リソース枯渇脆弱性の悪用が成功したことを示しています。PHP プロセスに 2GB という十分なメモリ制限が与えられているにもかかわらず、単一の高エントロピー画像が致命的なクラッシュを引き起こします。
python3 exploit.py
[*] Generating 30000x30000 High-Entropy Noise Bomb...
[+] High-entropy payload saved to: payload.html
php -d memory_limit=2G render.php < payload.html
Output
[*] Starting Dompdf rendering process...
PHP Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 1200355712 bytes) in /home/far00t/dompdf_exploit/vendor/dompdf/dompdf/src/Dompdf.php on line 490
render.php プロセスの実行中に、monitor.py スクリプトはシステムリソースへの影響を示す以下のテレメトリをキャプチャしました:
python3 monitor.py
[*] Searching for PHP processes... (Press Ctrl+C to stop)
[MONITOR] PID: 210767 | RAM: 953.17 MB | CPU: 99.7%
未認証のリモート攻撃者は、細工された HTML 文字列を送信することで、Web サーバー上で完全なサービス拒否 (DoS) を引き起こすことができます。これは、ユーザーが HTML コンテンツや URL を提供でき、それが後に Dompdf を使用して PDF に変換されるあらゆるアプリケーションに影響します。