
Dompdf : Déni de service (DoS) par épuisement des ressources à l'aide de bitmaps d'images surdimensionnés
Ce dépôt et son contenu sont fournis à des fins éducatives et de recherche uniquement. L'auteur n'est pas responsable de toute mauvaise utilisation, dommage ou activité illégale menée avec les informations fournies ici. Obtenez toujours une autorisation avant de tester des environnements cibles.
Dompdf v3.1.5 est vulnérable à une attaque par déni de service (DoS) via épuisement de ressources. Un attaquant peut faire planter le processus PHP en fournissant un document HTML spécialement conçu contenant une seule image aux dimensions massives (par exemple, 30 000 x 30 000 pixels).
Bien que Dompdf implémente des vérifications internes pour valider les dimensions des images, celles-ci peuvent être contournées en utilisant une image à haute entropie (telle qu'un bruit aléatoire) encodée en Base64 et enveloppée dans des conteneurs CSS spécifiques.
Les images standard de couleur unie peuvent souvent être optimisées par les algorithmes de compression ou les moteurs de rendu. Cependant, une image de bruit à haute entropie force le moteur PHP à traiter chacun des 900 millions de pixels individuellement. Lorsque render() est appelé, le moteur tente de gérer le bitmap non compressé en mémoire et de calculer la mise en page pour chaque point de données de pixel à forte variance. Cela entraîne :
La vulnérabilité existe parce que la validation des dimensions se produit tôt, mais l'allocation de ressources pour le calcul de la boîte englobante de l'objet et des tampons internes pendant la phase de rendu ne limite pas strictement le temps CPU cumulé ou l'utilisation mémoire pour un seul objet ayant passé la vérification initiale.
https://github.com/user-attachments/assets/d1f5a07b-a7c5-4b5e-84b5-1e47e73522d9
composer require dompdf/dompdf:3.1.5
exploit.py) :monitor.py) :render.php. Ce script sert de point d'entrée vulnérable, imitant une implémentation standard de la bibliothèque Dompdf :php -d memory_limit=2G render.php < payload.html
Les journaux suivants démontrent l'exploitation réussie de la vulnérabilité d'épuisement des ressources. Malgré une limite de mémoire généreuse de 2 Go accordée au processus PHP, une seule image à haute entropie provoque un plantage fatal.
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
Lors de l'exécution du processus render.php, le script monitor.py a capturé la télémétrie suivante, montrant l'impact sur les ressources système :
python3 monitor.py
[*] Searching for PHP processes... (Press Ctrl+C to stop)
[MONITOR] PID: 210767 | RAM: 953.17 MB | CPU: 99.7%
Un attaquant distant non authentifié peut provoquer un déni de service complet sur le serveur web en soumettant une chaîne HTML spécialement conçue. Cela affecte toute application qui permet aux utilisateurs de fournir du contenu HTML ou des URL ensuite convertis en PDF à l'aide de Dompdf.