
Dompdf: Negação de Serviço (DoS) via Exaustão de Recursos usando Bitmaps de Imagens Superdimensionados
Este repositório e seu conteúdo são fornecidos apenas para fins educacionais e de pesquisa. O autor não se responsabiliza por qualquer uso indevido, dano ou atividade ilegal realizada com as informações aqui fornecidas. Sempre obtenha autorização antes de testar ambientes-alvo.
O Dompdf v3.1.5 é vulnerável a um ataque de Negação de Serviço (DoS) por esgotamento de recursos. Um atacante pode derrubar o processo PHP fornecendo um documento HTML especialmente criado contendo uma única imagem com dimensões massivas (por exemplo, 30.000x30.000 pixels).
Embora o Dompdf implemente verificações internas para validar as dimensões da imagem, estas podem ser contornadas usando uma imagem de alta entropia (como ruído aleatório) codificada em Base64 e envolvida em contêineres CSS específicos.
Imagens de cor sólida padrão geralmente podem ser otimizadas por algoritmos de compressão ou mecanismos de renderização. No entanto, uma imagem de ruído de alta entropia força o motor PHP a processar cada um dos 900 milhões de pixels individualmente. Quando render() é chamado, o motor tenta lidar com o bitmap descompactado na memória e calcular o layout para cada ponto de dados de pixel de alta variância. Isso leva a:
A vulnerabilidade existe porque a validação de dimensões ocorre precocemente, mas a alocação de recursos para calcular a caixa delimitadora do objeto e os buffers internos durante a fase de renderização não limita estritamente o tempo cumulativo de CPU ou o uso de memória para um único objeto que passou na verificação 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 atua como o ponto de entrada vulnerável, imitando uma implementação padrão da biblioteca Dompdf:php -d memory_limit=2G render.php < payload.html
Os logs a seguir demonstram a exploração bem-sucedida da vulnerabilidade de esgotamento de recursos. Apesar de um limite de memória generoso de 2GB fornecido ao processo PHP, uma única imagem de alta entropia causa um crash 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
Durante a execução do processo render.php, o script monitor.py capturou a seguinte telemetria, mostrando o impacto nos recursos do sistema:
python3 monitor.py
[*] Searching for PHP processes... (Press Ctrl+C to stop)
[MONITOR] PID: 210767 | RAM: 953.17 MB | CPU: 99.7%
Um atacante remoto não autenticado pode causar uma negação de serviço completa no servidor web ao enviar uma string HTML especialmente criada. Isso afeta qualquer aplicação que permita aos usuários fornecer conteúdo HTML ou URLs que sejam subsequentemente convertidos em PDF usando o Dompdf.