
Dompdf: Denegación de Servicio (DoS) mediante Agotamiento de Recursos utilizando Mapas de Bits de Imágenes Sobredimensionados
Este repositorio y su contenido se proporcionan únicamente con fines educativos y de investigación. El autor no se hace responsable de ningún uso indebido, daño o actividad ilegal realizada con la información aquí proporcionada. Obtenga siempre autorización antes de probar entornos objetivo.
Dompdf v3.1.5 es vulnerable a un ataque de denegación de servicio (DoS) por agotamiento de recursos. Un atacante puede provocar la caída del proceso PHP proporcionando un documento HTML especialmente diseñado que contenga una sola imagen con dimensiones masivas (por ejemplo, 30.000x30.000 píxeles).
Aunque Dompdf implementa comprobaciones internas para validar las dimensiones de las imágenes, estas pueden eludirse utilizando una imagen de alta entropía (como ruido aleatorio) codificada en Base64 y envuelta en contenedores CSS específicos.
Las imágenes estándar de color sólido a menudo pueden optimizarse mediante algoritmos de compresión o motores de renderizado. Sin embargo, una imagen de ruido de alta entropía obliga al motor PHP a procesar cada uno de los 900 millones de píxeles individualmente. Cuando se llama a render(), el motor intenta manejar el mapa de bits sin comprimir en memoria y calcular el diseño para cada punto de datos de píxel de alta varianza. Esto provoca:
La vulnerabilidad existe porque la validación de dimensiones ocurre de forma temprana, pero la asignación de recursos para calcular el cuadro delimitador del objeto y los búferes internos durante la fase de renderizado no limita estrictamente el tiempo de CPU acumulado ni el uso de memoria para un solo objeto que ha superado la comprobación inicial.
https://github.com/user-attachments/assets/d1f5a07b-a7c5-4b5e-84b5-1e47e73522d9
composer require dompdf/dompdf:3.1.5
exploit.py):monitor.py):render.php. Este script actúa como el punto de entrada vulnerable, imitando una implementación estándar de la biblioteca Dompdf:php -d memory_limit=2G render.php < payload.html
Los siguientes registros demuestran la explotación exitosa de la vulnerabilidad de agotamiento de recursos. A pesar de un generoso límite de memoria de 2 GB proporcionado al proceso PHP, una sola imagen de alta entropía provoca un fallo 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
Mientras se ejecutaba el proceso render.php, el script monitor.py capturó la siguiente telemetría, mostrando el impacto en los recursos del sistema:
python3 monitor.py
[*] Searching for PHP processes... (Press Ctrl+C to stop)
[MONITOR] PID: 210767 | RAM: 953.17 MB | CPU: 99.7%
Un atacante remoto no autenticado puede causar una denegación de servicio completa en el servidor web enviando una cadena HTML manipulada. Esto afecta a cualquier aplicación que permita a los usuarios proporcionar contenido HTML o URL que posteriormente se conviertan a PDF usando Dompdf.