Live › vulnerability › CVE-2026-96638
Go to dashboardPillow's BMP RLE decoder can be made to allocate gigabytes of memory from a kilobyte-sized crafted BMP file, because delta escape and absolute mode branches append attacker-controlled amounts without bounding growth by the image size. An attacker who can get a process to open a malicious BMP can cause a memory-exhaustion denial of service.
Summary written from the sources below. Check the originals before acting.
First seen by InfraStack 2026-10-23 19:11 UTC, 3h before NVD. All times on this page are UTC.
| Product | Ecosystem | Affected | Fixed in |
|---|---|---|---|
| pillow | pypi | >= 9.1.0, < 13.0.0 | 13.0.0 |
Run python -c "import PIL; print(PIL.__version__)" and check whether the version is >= 9.1.0 and < 13.0.0.
Search the codebase for Image.open or PIL usage on untrusted BMP uploads.
13.0.0 or laterEach row is the first time that source carried this signal. The analyst’s rows are its own findings.
BmpRleDecoder can be forced to allocate gigabytes of memory from a kilobyte-sized crafted BMP file via unbounded growth in the delta escape and absolute mode branches.
All versions up to and including current HEAD (v13.0.0.dev0, commit e7a7ea84)
BmpRleDecoder.decode() (BmpImagePlugin.py:327-395) builds a Python bytearray data with dest_length = xsize*ysize, looping while len(data) < dest_length. The loop condition is only checked at the TOP; individual branches append attacker-controlled amounts UNBOUNDED by dest_length:
Because a single delta can push len(data) to ~256 * (row size), a tiny RLE stream combined with a large-but-legal xsize (xsize*ysize just under MAX_IMAGE_PIXELS, ~89M) yields a multi-GB data bytearray (then copied again by bytes(data) and set_as_raw). No heap OOB (bytearray/set_as_raw are bounds-safe), but a severe memory-amplification DoS: the attacker file stays tiny.
Python 3.13, Pillow HEAD e7a7ea84
Attached: pillow_poc_bmp_rle_dos.py
A 1084-byte BMP (BI_RLE8, width=3,000,000, height=1 -> 3M px, passes bomb check) with one delta escape (00 02 00 150) produces ~429 MB data; measured peak RSS 911 MB. Scaling width toward the bomb limit and up=255 produces tens of GB from a ~1 KB file.
Cap growth at dest_length in the delta and absolute branches, e.g. clamp the delta fill to (dest_length - len(data)) and stop appending once len(data) >= dest_length; reject deltas that would move the cursor beyond the image, matching the existing per-row clamp at line 341-343.
Credit: Yazan Balawneh - CyStack Security Team (GitHub: sonicnew)
This page as .md · .json · in your agent: get_signal("CVE-2026-96638")
GitHub Advisory Database, CC-BY 4.0 · NVD data is provided by NIST and is public domain. Posts quoted belong to their authors.