Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSubmit malformed font to text-drawing endpoint
-
ExploitTrigger FT_Load_Glyph failure with active stroker
-
ExecutionCleanup frees invalid glyph pointer
-
ImpactMemory corruption or process crash (DoS)
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Variable initialization checks
|
| Exploitation Conditions | Exploitation requires an application that calls Pillow's FreeType text rendering (ImageFont/ImageDraw) with a nonzero stroke_width AND loads an attacker-controlled font from untrusted bytes; the attacker must supply a malformed font that forces the FT_Load_Glyph failure path with an active stroker. Limiting factors: the vulnerable code path is only reached when stroking is enabled (stroke_width > 0) - applications that render text without stroking, or that only use trusted/bundled fonts, are not exposed. This corresponds to the AT:P (Attack Requirements: Present) bit in the CVSS 4.0 vector. Affected Pillow versions are 10.0.0 up to (not including) 13.0.0; no authentication or user interaction is required on the application side per PR:N/UI:N. |
| Impact | This is a memory-safety flaw (CWE-457, use of uninitialized/stale variable) in Pillow's FreeType text rendering path, triggered when FT_Load_Glyph fails and cleanup calls FT_Done_Glyph on an invalid FT_Glyph pointer. The provided CVSS 4.0 vector (AV:N/AC:L/AT:P/PR:N/UI:N) scores 8.2 with VA:H but VC:N/VI:N - i.e. the vendor rates impact as availability-only (crash/DoS), not confidentiality or integrity, despite the description's mention that it 'can corrupt memory.' This is a notable signal to weigh: although freeing an invalid pointer is theoretically exploitable for code execution, the CVSS vector claims no integrity/confidentiality impact, so treat RCE as unconfirmed and DoS as the realistic outcome. The AT:P (Attack Requirements: Present) bit is critical - exploitation is NOT universal: the target application must actually draw text with a nonzero stroke width using attacker-controlled (untrusted) font bytes. No EPSS score, CISA KEV listing, or POC was provided in the input, so there is no evidence of active exploitation or public exploit code. Net: this is a genuine but conditional defect - high CVSS driven by network reach and no-auth, but the AT:P precondition and availability-only impact place it below the tier of a wormable, default-config RCE. Prioritize for applications that render user-supplied fonts with stroking (e.g. image/text-generation services); deprioritize where fonts are trusted or stroking is unused. |
| Exploit ScenarioDerived | An application (e.g. a web service generating images or captchas) uses Pillow to draw text with a nonzero stroke width and loads a font from untrusted input. An attacker uploads a malformed/corrupt font file that forces FT_Load_Glyph to fail, driving the cleanup path to call FT_Done_Glyph on an uninitialized or stale glyph pointer, crashing the worker or potentially corrupting heap memory. No public exploit code was identified in the provided data. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 19, 2026
Pillow versions 10.0.0 through 12.x can free an invalid glyph pointer during FreeType text rendering when an active stroker is used, allowing malformed font bytes supplied by an attacker to corrupt memory or crash the process. Exploitation requires the application to render text with a nonzero stroke width and load an attacker-controlled font from untrusted bytes; no authentication or user interaction is required on the application side, but the attack requirements are present because the stroking path must be enabled. There is no CISA KEV confirmation and no public exploit identified at time of analysis; the issue is fixed in Pillow 13.0.0.
RemediationAI
Vendor-released patch: upgrade to Pillow 13.0.0, which contains the fix from commit a7416de7f3a43128179d2cf68df3240ea8dafe13; see the advisory at https://github.com/python-pillow/Pillow/security/advisories/GHSA-j4m9-6w36-pw47 and the release at https://github.com/python-pillow/Pillow/releases/tag/13.0.0. If upgrading cannot be done immediately, disable text stroking by ensuring stroke_width is zero wherever untrusted fonts may be rendered, or restrict font loading to trusted, prevalidated font files; the trade-off is that disabling stroking changes text appearance and restricting fonts may break legitimate use cases that require user-supplied fonts. Applications that must accept untrusted fonts should validate or reject malformed font data before passing it to Pillow rendering with stroking enabled.
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's FreeType binding in src/_imagingft.c renders glyphs through functions such as FT_Load_Glyph and, when stroking is requested, uses an FT_Stroker. In the vulnerable code, an FT_Glyph variable was not initialized before the glyph-loading logic. If FT_Load_Glyph fails for a malformed font, cleanup could call FT_Done_Glyph on an uninitialized or stale FT_Glyph pointer. This is CWE-457 (use of uninitialized variable) and can lead to memory corruption or a process crash. The upstream fix in commit a7416de7f3a43128179d2cf68df3240ea8dafe13 initializes the glyph to NULL and later guards the stroker cleanup with a glyph != NULL check, preventing cleanup from operating on an invalid pointer. The CPE cpe:2.3:a:python-pillow:pillow:*:*:*:*:*:*:*:* covers Pillow releases from 10.0.0 up to, but not including, 13.0.0.
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
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Network-reachable untrusted font input (AV:N, PR:N, UI:N), but the nonzero-stroke-width rendering precondition raises AC:H; impact is crash/DoS only, so C:N/I:N/A:H.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Pillow is a Python imaging library. From 10.0.0 until 13.0.0, Pillow can free an invalid glyph pointer during FreeType rendering with an active stroker. If FT_Load_Glyph fails, cleanup may call FT_Done_Glyph on an uninitialized or stale glyph variable. An attacker can supply a malformed font as untrusted bytes to an application that draws text with a nonzero stroke width, forcing the glyph-load failure path. This can corrupt memory or crash the process. This issue is fixed in version 13.0.0.
Blast Radius
ecosystem impact- 122 pypi packages depend on pillow (116 direct, 7 indirect)
Ecosystem-wide dependent count for version 10.0.0.
Technical POC Analysis
The flaw is an invalid/double free of a FreeType glyph object, rooted in an uninitialized pointer.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Pillow versions 10.0.0 through 12.x can corrupt memory or crash applications when they render attacker-supplied fonts with a nonzero stroke width, affecting services that process untrusted images or fonts. The issue is high severity, no public exploit identified at time of analysis, and the attack path is constrained to applications that enable stroker-based text rendering and accept untrusted font bytes. Leadership should care because Pillow is a common embedded dependency, so vulnerable copies may be spread across application code, containers, and image-processing pipelines.
Apply vendor patch.
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
Uncontrolled memory consumption in Python Pillow (PIL) versions 5.1.0 through 12.2.x allows a remote attacker to cause d
The package pillow 5.2.0 and before 8.3.2 are vulnerable to Regular Expression Denial of Service (ReDoS) via the getrgb
Pillow is a Python imaging library. In versions 11.2.0 to before 11.3.0, there is a heap buffer overflow when writing a
Integer overflow in the ImagingResampleHorizontal function in libImaging/Resample.c in Pillow before 3.1.1 allows remote
Python Image Library (PIL) 1.1.7 and earlier and Pillow 2.3 might allow remote attackers to execute arbitrary commands v
Pillow versions 11.0.0 through 12.x (fixed in 13.0.0) can reuse a stale native ImagingCore buffer when a multi-frame ima
Pillow through 8.2.0 and PIL (aka Python Imaging Library) through 1.1.7 allow an attacker to pass controlled parameters
An issue was discovered in Pillow before 8.1.1. Rated critical severity (CVSS 9.8), this vulnerability is remotely explo
EUVD-2026-104655
GHSA-j4m9-6w36-pw47
NVD
CVE.org
EPSS
VulDB
Exploit-DB