
Dompdf: Denial of Service (DoS) durch Ressourcenerschöpfung mittels übergroßer Bild-Bitmaps
Dieses Repository und seine Inhalte werden ausschließlich zu Bildungs- und Forschungszwecken bereitgestellt. Der Autor ist nicht verantwortlich für jeglichen Missbrauch, Schaden oder illegale Aktivitäten, die mit den hier bereitgestellten Informationen durchgeführt werden. Holen Sie stets eine Genehmigung ein, bevor Sie Zielumgebungen testen.
Dompdf v3.1.5 ist anfällig für einen Denial-of-Service-Angriff (DoS) durch Ressourcenerschöpfung. Ein Angreifer kann den PHP-Prozess zum Absturz bringen, indem er ein speziell präpariertes HTML-Dokument bereitstellt, das ein einzelnes Bild mit massiven Abmessungen enthält (z. B. 30.000 x 30.000 Pixel).
Obwohl Dompdf interne Prüfungen zur Validierung der Bildabmessungen implementiert, können diese umgangen werden, indem ein Bild mit hoher Entropie (wie etwa Zufallsrauschen) verwendet wird, das in Base64 kodiert und in spezifische CSS-Container eingebettet ist.
Standardbilder mit einfarbigen Flächen können häufig durch Komprimierungsalgorithmen oder Rendering-Engines optimiert werden. Ein Rauschbild mit hoher Entropie zwingt die PHP-Engine jedoch, jedes der 900 Millionen Pixel einzeln zu verarbeiten. Wenn render() aufgerufen wird, versucht die Engine, die unkomprimierte Bitmap im Speicher zu verarbeiten und das Layout für jeden Pixeldatenpunkt mit hoher Varianz zu berechnen. Dies führt zu:
Die Schwachstelle besteht, weil die Dimensionsvalidierung frühzeitig erfolgt, aber die Ressourcenzuweisung für die Berechnung der Bounding-Box des Objekts und der internen Puffer während der Rendering-Phase die kumulative CPU-Zeit oder den Speicherverbrauch für ein einzelnes Objekt, das die anfängliche Prüfung bestanden hat, nicht strikt begrenzt.
https://github.com/user-attachments/assets/d1f5a07b-a7c5-4b5e-84b5-1e47e73522d9
composer require dompdf/dompdf:3.1.5
exploit.py):monitor.py):render.php. Dieses Skript fungiert als der verwundbare Einstiegspunkt und bildet eine Standardimplementierung der Dompdf-Bibliothek nach:php -d memory_limit=2G render.php < payload.html
Die folgenden Logs demonstrieren die erfolgreiche Ausnutzung der Ressourcenerschöpfungs-Schwachstelle. Trotz eines großzügigen Speicherlimits von 2 GB, das dem PHP-Prozess zur Verfügung gestellt wird, verursacht ein einzelnes High-Entropy-Bild einen fatalen Absturz.
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
Während der Ausführung des render.php-Prozesses erfasste das Skript monitor.py die folgende Telemetrie, die die Auswirkungen auf die Systemressourcen zeigt:
python3 monitor.py
[*] Searching for PHP processes... (Press Ctrl+C to stop)
[MONITOR] PID: 210767 | RAM: 953.17 MB | CPU: 99.7%
Ein nicht authentifizierter Remote-Angreifer kann einen vollständigen Denial of Service auf dem Webserver verursachen, indem er eine manipulierte HTML-Zeichenkette übermittelt. Dies betrifft jede Anwendung, die es Benutzern ermöglicht, HTML-Inhalte oder URLs bereitzustellen, die anschließend mit Dompdf in PDF konvertiert werden.