
Dompdf: 과도한 크기의 이미지 비트맵을 이용한 리소스 고갈로 인한 서비스 거부(DoS)
이 저장소와 그 내용은 교육 및 연구 목적으로만 제공됩니다. 작성자는 여기에 제공된 정보를 사용하여 발생하는 오용, 손해 또는 불법 행위에 대해 책임지지 않습니다. 대상 환경을 테스트하기 전에 항상 승인을 받으십시오.
Dompdf v3.1.5는 리소스 고갈을 통한 서비스 거부(DoS) 공격에 취약합니다. 공격자는 거대한 크기(예: 30,000x30,000 픽셀)의 단일 이미지를 포함하는 특수 제작된 HTML 문서를 제공하여 PHP 프로세스를 충돌시킬 수 있습니다.
Dompdf는 이미지 크기를 검증하기 위한 내부 검사를 구현하고 있지만, 이는 Base64로 인코딩되고 특정 CSS 컨테이너로 감싸진 고엔트로피 이미지(예: 랜덤 노이즈)를 사용하여 우회할 수 있습니다.
일반적인 단색 이미지는 압축 알고리즘이나 렌더링 엔진에 의해 최적화되는 경우가 많습니다. 그러나 고엔트로피 노이즈 이미지는 PHP 엔진이 9억 개의 픽셀 각각을 개별적으로 처리하도록 강제합니다. 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
다음 로그는 리소스 고갈 취약점의 성공적인 악용을 보여줍니다. PHP 프로세스에 2GB라는 넉넉한 메모리 제한이 제공되었음에도 불구하고, 단일 고엔트로피 이미지가 치명적인 크래시를 유발합니다.
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%
인증되지 않은 원격 공격자가 조작된 HTML 문자열을 제출하여 웹 서버에 완전한 서비스 거부(DoS)를 일으킬 수 있습니다. 이는 사용자가 HTML 콘텐츠나 URL을 제공하고, 이후 해당 콘텐츠가 Dompdf를 사용하여 PDF로 변환되는 모든 애플리케이션에 영향을 미칩니다.