
Dompdf: Отказ в обслуживании (DoS) через истощение ресурсов с помощью чрезмерно больших растровых изображений
Этот репозиторий и его содержимое предоставлены исключительно в образовательных и исследовательских целях. Автор не несёт ответственности за любое неправомерное использование, ущерб или незаконную деятельность, совершённую с использованием предоставленной здесь информации. Всегда получайте разрешение перед тестированием целевых сред.
Dompdf v3.1.5 уязвим к атаке типа «отказ в обслуживании» (DoS) через исчерпание ресурсов. Злоумышленник может вызвать аварийное завершение PHP-процесса, предоставив специально сформированный HTML-документ, содержащий одно изображение огромных размеров (например, 30 000x30 000 пикселей).
Хотя Dompdf реализует внутренние проверки для валидации размеров изображения, их можно обойти, используя изображение с высокой энтропией (например, случайный шум), закодированное в Base64 и обёрнутое в определённые CSS-контейнеры.
Стандартные однотонные изображения часто могут быть оптимизированы алгоритмами сжатия или движками рендеринга. Однако изображение с шумом высокой энтропии заставляет PHP-движок обрабатывать каждый из 900 миллионов пикселей по отдельности. При вызове 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
Следующие логи демонстрируют успешную эксплуатацию уязвимости исчерпания ресурсов. Несмотря на щедрый лимит памяти в 2 ГБ, предоставленный PHP-процессу, одно изображение с высокой энтропией вызывает фатальный сбой.
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%
Неаутентифицированный удалённый злоумышленник может вызвать полный отказ в обслуживании (Denial of Service) веб-сервера, отправив специально сформированную HTML-строку. Это затрагивает любое приложение, которое позволяет пользователям предоставлять HTML-контент или URL-адреса, впоследствии преобразуемые в PDF с помощью Dompdf.