
Dompdf: Denial of Service (DoS) tramite esaurimento delle risorse utilizzando bitmap di immagini sovradimensionate
Questo repository e il suo contenuto sono forniti esclusivamente a scopo didattico e di ricerca. L'autore non è responsabile per qualsiasi uso improprio, danno o attività illegale condotta con le informazioni qui fornite. Ottenere sempre l'autorizzazione prima di testare ambienti di destinazione.
Dompdf v3.1.5 è vulnerabile a un attacco Denial of Service (DoS) tramite esaurimento delle risorse. Un attaccante può mandare in crash il processo PHP fornendo un documento HTML appositamente costruito contenente una singola immagine con dimensioni enormi (ad esempio, 30.000x30.000 pixel).
Sebbene Dompdf implementi controlli interni per validare le dimensioni delle immagini, questi possono essere aggirati utilizzando un'immagine ad alta entropia (come rumore casuale) codificata in Base64 e racchiusa in specifici contenitori CSS.
Le immagini standard a tinta unita possono spesso essere ottimizzate dagli algoritmi di compressione o dai motori di rendering. Tuttavia, un'immagine di rumore ad alta entropia costringe il motore PHP a elaborare individualmente ciascuno dei 900 milioni di pixel. Quando viene chiamato render(), il motore tenta di gestire in memoria la bitmap non compressa e di calcolare il layout per ogni punto dati ad alta varianza. Ciò comporta:
La vulnerabilità esiste perché la validazione delle dimensioni avviene in una fase iniziale, ma l'allocazione delle risorse per il calcolo del bounding box dell'oggetto e dei buffer interni durante la fase di rendering non limita rigorosamente il tempo CPU cumulativo o l'utilizzo di memoria per un singolo oggetto che ha superato il controllo iniziale.
https://github.com/user-attachments/assets/d1f5a07b-a7c5-4b5e-84b5-1e47e73522d9
composer require dompdf/dompdf:3.1.5
exploit.py):monitor.py):render.php. Questo script funge da punto di ingresso vulnerabile, simulando un'implementazione standard della libreria Dompdf:php -d memory_limit=2G render.php < payload.html
I log seguenti dimostrano lo sfruttamento riuscito della vulnerabilità di esaurimento delle risorse. Nonostante un limite di memoria generoso di 2GB fornito al processo PHP, una singola immagine ad alta entropia provoca un crash fatale.
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 l'esecuzione del processo render.php, lo script monitor.py ha catturato la seguente telemetria, mostrando l'impatto sulle risorse di sistema:
python3 monitor.py
[*] Searching for PHP processes... (Press Ctrl+C to stop)
[MONITOR] PID: 210767 | RAM: 953.17 MB | CPU: 99.7%
Un attaccante remoto non autenticato può causare un Denial of Service completo sul server web inviando una stringa HTML appositamente costruita. Ciò riguarda qualsiasi applicazione che consenta agli utenti di fornire contenuti HTML o URL successivamente convertiti in PDF tramite Dompdf.