GHSA-p8hx-v2p6-rp84
Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessUpload crafted MPO/DCX/MIC file
-
ExploitApplication calls seek() to additional frames
-
ExecutionDecompression-bomb size check bypassed
-
ImpactOversized buffer allocation exhausts memory
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Resource consumption limits
MITRE ATT&CK
1 technique across 1 tactic: Impact The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The target application must open an attacker-supplied MPO, DCX, or MIC image with Pillow AND invoke seek() to navigate to frames/pages beyond the first - that frame-seeking code path is where the MAX_IMAGE_PIXELS decompression-bomb check is bypassed. Limiting factors: single-frame opens that never call seek() are not affected; the application must process these specific multi-frame container formats; and the effect is memory/CPU exhaustion (availability) with no confidentiality or integrity impact. Exploitation requires no special non-default Pillow configuration beyond handling multi-frame images, which is common in galleries, converters, and thumbnail pipelines. |
| Impact | CVE-2026-96636 is a MEDIUM-severity denial-of-service issue in Pillow, where the decompression-bomb protection (the MAX_IMAGE_PIXELS guard) can be bypassed for MPO, DCX, and MIC multi-frame formats when an application calls seek() to move to additional frames/pages. No CVSS vector, CWE, EPSS score, KEV listing, or POC is present in the supplied data, so quantitative exploitation-probability signals are entirely absent and cannot be compared. The vendor (Pillow 13.0.0 release notes) classifies it as Medium, consistent with a resource-exhaustion impact rather than code execution: there is no confidentiality or integrity consequence, only availability loss via memory amplification. Real-world risk is bounded but non-trivial because Pillow is embedded in a huge number of Python web services that accept user-uploaded images and iterate frames; however, this is a DoS-only, availability-impacting bug, not a high-urgency RCE. Exploitation status is 'no public exploit identified at time of analysis' - this is NOT actively exploited and no POC is referenced. Key missing data: NVD has not yet published a CVSS vector or CWE (input shows N/A), so the authentication/attack-vector profile below is my independent assessment, not vendor-confirmed. |
| Exploit ScenarioDerived | An attacker uploads a specially crafted MPO, DCX, or MIC image to a service that uses Pillow to process multi-frame images (e.g., thumbnailing or frame iteration). When the application calls seek() to access later frames, the normal decompression-bomb size check is skipped, so the declared frame dimensions force Pillow to allocate an enormous pixel buffer, exhausting memory and causing a denial of service. No public exploit code is identified at the time of analysis. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 21, 2026
Denial-of-service in Pillow's multi-frame image handling: the MAX_IMAGE_PIXELS decompression-bomb guard can be bypassed for MPO, DCX, and MIC containers when an application calls seek() to navigate to frames or pages beyond the first, allowing a small attacker-supplied file to trigger unbounded memory and CPU consumption. Only applications that open these specific multi-frame formats and seek past the first frame are affected; single-frame opens and first-frame-only pipelines are not. The flaw is rated CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L (availability-only, no confidentiality or integrity impact), affects Pillow releases prior to 13.0.0, and no public exploit code was identified at time of analysis.
RemediationAI
Upgrade to Pillow 13.0.0 or later (pip install --upgrade 'Pillow>=13.0.0'), which contains the fix for CVE-2026-96636 / GHSA-p8hx-v2p6-rp84 together with the rest of the 13.0.0 security batch - verify with python -c "import PIL; print(PIL.__version__)" and rebuild any wheels or container images that vendor Pillow; see https://pillow.readthedocs.io/en/stable/releasenotes/13.0.0.html and https://seclists.org/oss-sec/2026/q4/295. Where an immediate upgrade is not possible, mitigate in application code rather than globally: avoid calling seek() on untrusted MPO/DCX/MIC inputs, or restrict accepted formats with Image.init() plus an explicit allowlist (register only the plugins you need, e.g. JPEG/PNG) so the MPO, DCX and MIC plugins are never loaded - trade-off is loss of legitimate multi-frame support and possible breakage of user workflows that rely on those formats. Lowering PIL.Image.MAX_IMAGE_PIXELS does not close the hole because frame sizes in the seek() path are not compared against it, but running decode work in a memory- and CPU-capped worker (cgroup/ulimit, subprocess with timeout) limits the blast radius at the cost of added latency and complexity. Also enforce upload size limits and per-request timeouts at the edge as compensating controls.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Pillow enforces a decompression-bomb defense by comparing declared or computed image pixel counts against the MAX_IMAGE_PIXELS threshold and raising DecompressionBombError/Warning when exceeded. In the MPO (multi-picture object, a JPEG-derived container), DCX (multi-page PCX) and MIC (multi-frame Windows imaging) plugins, the guard is evaluated against the size of the initially decoded frame, while subsequent frames reached through ImageFile.seek() are sized and allocated independently - so frame 2..N escape the pixel-count check. Because these formats are compact by design (MPO/MIC can describe large frames with small payloads, and DCX sequences pages), a tiny file can expand into large per-frame allocations, producing memory exhaustion and repeated decode work (CPU) in the process that hosts Pillow. The underlying weakness class is an improper/incomplete resource-limit enforcement (CWE-770-style uncontrolled resource consumption) in the frame-seeking path rather than a memory-corruption bug, which is consistent with the assessed availability-only impact (C:N/I:N/A:L) and the unauthenticated, network-reachable attack vector (AV:N/PR:N/UI:N) where image bytes are attacker-controlled. Related issues fixed in the same release include similar seek()-based bypasses in SPIDER (CVE-2026-96637), APNG, and GIF.
Know when Pillow gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H
Remote attacker-supplied image processed without authentication or user interaction (AV:N/PR:N/UI:N); availability-only resource exhaustion, so C:N/I:N and A:L reflecting a recoverable DoS.
Primary rating from Vendor (CNA).
CVSS VectorVendor
Lifecycle Timeline
3Description PRE-NVD
Blast Radius
ecosystem impact- 93,931 pypi packages depend on pillow (20,820 direct, 74,698 indirect)
Ecosystem-wide dependent count for version 13.0.0.
Executive ViewAI
Pillow, a widely deployed Python imaging library, has a high-severity availability flaw that can let a small malicious multi-frame image exhaust memory and CPU in applications that seek beyond the first frame of MPO, DCX, or MIC files. The issue is unauthenticated and has no public exploit identified at time of analysis, but affected image-processing services could face slowdowns or outages if they accept these formats. Leadership should prioritize identifying exposed pipelines and applying interim format restrictions while a vendor fix is tracked.
No vendor-released patch identified at time of analysis; restrict or disable MPO, DCX, and MIC processing, enforce image-format allowlists, avoid seek() beyond the first frame, apply memory/CPU/time quotas, and isolate image-processing workloads.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
libImaging/TgaRleDecode.c in Pillow 9.1.0 has a heap buffer overflow in the processing of invalid TGA image files. Rated
Denial of service in Python Pillow (versions 8.2.0 through 12.2.0) allows remote attackers to exhaust memory during JPEG
Out-of-bounds memory disclosure in Python Pillow before 12.3.0 lets an attacker who supplies a crafted McIdas AREA image
Heap out-of-bounds write in Python Pillow prior to 12.3.0 lets an attacker who controls the rank-filter size parameter c
Denial-of-service and controlled heap corruption in Python's Pillow imaging library (all versions prior to 12.3.0) occur
Denial of service in Python Pillow 12.0.0 through 12.2.0 lets a remote attacker hang an application by supplying a craft
Denial of service (and potential memory corruption) in Python Pillow before 12.3.0 arises when public image coordinate A
Uncontrolled memory allocation in Python Pillow before 12.3.0 lets a crafted BDF font file exhaust available memory and
Uncontrolled memory consumption in Python Pillow (PIL) versions 5.1.0 through 12.2.x allows a remote attacker to cause d
Denial-of-service via memory exhaustion in Python Pillow before 12.3.0 allows a crafted GD-format (.gd) image to trigger
Uncontrolled memory allocation in Python Pillow before 12.3.0 allows a maliciously crafted font file to trigger excessiv
Uncontrolled memory allocation in the Python Pillow imaging library (all versions prior to 12.3.0) allows a crafted PCF
EUVD-2026-107572
NVD
CVE.org
EPSS
Exploit-DB