CVE-2026-112397: Pillow: Out-of-bounds access in _imagingmorph on a zero-width image
Summary A PPM or PGM file can declare a width of 0, which Pillow accepts, producing an image of size (0, N). Passing that image to ImageMorph.MorphOp.apply() makes the native morphology code index a row buffer at outrow[width - 1], which is outrow[-1] when the width is 0. The process crashes.
Details The PPM parser reads width and height with no lower-bound check:
- src/PIL/PpmImagePlugin.py:119
The native apply() writes the row edges with no guard that the width is positive:
- src/imagingmorph.c:81 sets outrow[0] = outrow[width - 1] = 0;
match() and getonpixels() use the same edge-indexing pattern.
PoC python from PIL import Image, ImageMorph
A width-0 image (also producible from a crafted PPM header). apply() indexes outrow[width - 1] == outrow[-1] in native code. im = Image.new("L", (0, 5)) ImageMorph.MorphOp(opname="dilation4").apply(im)
Run it: $ python 03poc.py Segmentation fault (core dumped)
Observed on a source build of commit 3e2ab96.
Under AddressSanitizer: ==ERROR: AddressSanitizer: SEGV on unknown address (pc ... in apply) #0 apply src/imagingmorph.c:81 SUMMARY: AddressSanitizer: SEGV src/imagingmorph.c:81 in apply With width 0 the outrow[width - 1] write lands on an unmapped page, so it surfaces as a SEGV pinned to the edge-write line rather than a redzone overflow.
Impact Out-of-bounds write in a C extension. Affects any application that runs a morphology operation on an image opened from untrusted input. Result is a crash and possible memory corruption.
Other sources
Pillow is a Python imaging library. Prior to 13.0.0, Pillow's ImageMorph.MorphOp.apply() can access memory before a row buffer for a zero-width image. PPM and PGM input can create an image with width zero, and the native morphology routine indexes outrow[width - 1] without rejecting that geometry. An attacker can supply such an image to an application that applies a morphology operation. This can crash the process. This issue is fixed in version 13.0.0.
— Ubuntu
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
pip/Pillowto a version that resolves this vulnerability.Fixed in 13.0.0 - Upgrade
Upgrade
bitnami/pillowto a version that resolves this vulnerability.Fixed in 13.0.0 - Upgrade
Upgrade
debian/pillowto a version that resolves this vulnerability.Fixed in 13.0.0-1 - Upgrade
Upgrade
Pillowto a version that resolves this vulnerability.Fixed in 13.0.0
Event History
Frequently Asked Questions
Which applications are exposed to this issue?
Applications using Pillow before 13.0.0 are exposed if they process attacker-supplied PPM or PGM images and apply ImageMorph.MorphOp.apply() to them. The triggering image must have zero width.
What does an attacker need to do to trigger the vulnerability?
An attacker needs to provide a crafted PPM or PGM image that creates a zero-width image and cause the application to apply a morphology operation. No authentication or user interaction is required according to the supplied CVSS vector.
What is the expected impact of successful exploitation?
The documented impact is a process crash caused by access before a row buffer in the native morphology routine. The supplied CVSS vector indicates impact to availability, with no stated confidentiality or integrity impact.
What should teams do to remediate the issue?
Upgrade Pillow to version 13.0.0, which fixes the issue. If upgrading is not immediately possible, avoid applying morphology operations to untrusted PPM or PGM inputs and reject zero-width images before calling ImageMorph.MorphOp.apply().