Every CVE Search/ Get API key

CVE-2026-54058

Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)

8.3 HighFix available

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
None
User interaction
None

What an attacker can affect

Confidentiality
High
Integrity
None
Availability
High

Exploit likelihood

0.52%Up 0.1 points since Jul 15, 2026
90%50%10%1%

What each source reports

CVE List Score used 8.3

Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.

Record
CVE-2026-54058
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-125
Updated
2026-11-02
EUVDEUVD-2026-43735 8.3

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.

Record
EUVD-2026-43735
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-62p4-gmf7-7g93 8.3

Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)

Summary

When Pillow loads an uncompressed image whose tile uses the raw codec and a mode in Image._MAPMODES, and the image was opened from a filename, it memory-maps the file and builds the image's row pointers directly into the mapping via PyImaging_MapBuffer (src/map.c). The per-row spacing (stride) is taken from the tile arguments. map.c validates offset + ysize*stride <= buffer_len but never checks that stride is at least the natural row width xsize * pixelsize.

The McIdas AREA plugin (McIdasImagePlugin.py) derives stride, offset, xsize, and ysize directly from attacker-controlled 32-bit header words with no validation. By supplying a stride far smaller than the row width, an attacker makes each row pointer read xsize*pixelsize bytes that run past the mapped region. Accessing the pixels (e.g. Image.tobytes(), getpixel, convert, save) then reads adjacent process memory (information disclosure) or faults (SIGBUS, denial of service).

Complete Code Trace

Step 1: McIdasImageFile._open - turns attacker header words into image size, file offset, and row stride with no validation.

# src/PIL/McIdasImagePlugin.py:41-70
s = self.fp.read(256)
if not _accept(s) or len(s) != 256:        # _accept: prefix == b"\x00\x00\x00\x00\x00\x00\x00\x04"
    raise SyntaxError(...)
self.area_descriptor = w = [0, *struct.unpack("!64i", s)]   # w[1..64] = signed BE int32, ALL attacker-controlled

if w[11] == 1:
    mode = rawmode = "L"                    # pixelsize 1, in _MAPMODES
elif w[11] == 2:
    mode = rawmode = "I;16B"                # pixelsize 2, in _MAPMODES
...
self._mode = mode
self._size = w[10], w[9]                    # (xsize, ysize)  <-- attacker
offset = w[34] + w[15]                       # <-- attacker
stride = w[15] + w[10] * w[11] * w[14]       # <-- attacker (set w[14]=0, w[15]=1 => stride=1)
self.tile = [
    ImageFile._Tile("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))
]

Step 2: ImageFile.load (mmap branch) - selects mmap and delegates to map_buffer.

# src/PIL/ImageFile.py:322-348
if use_mmap:                                 # use_mmap = self.filename and len(self.tile) == 1
    decoder_name, extents, offset, args = self.tile[0]
    if (decoder_name == "raw" and isinstance(args, tuple) and len(args) >= 3
            and args[0] == self.mode and args[0] in Image._MAPMODES):
        if offset < 0:                       # only lower-bound guard on offset
            raise ValueError("Tile offset cannot be negative")
        with open(self.filename) as fp:
            self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ)
        if offset + self.size[1] * args[1] > self.map.size():   # == offset + ysize*stride; NO stride>=linesize check
            raise OSError("buffer is not large enough")
        self.im = Image.core.map_buffer(
            self.map, self.size, decoder_name, offset, args      # args = ("L", stride, 1)
        )

Step 3: PyImaging_MapBuffer - builds row pointers at stride spacing into the mmap; validates everything except stride >= row width.

/* src/map.c:65-140 */
if (!PyArg_ParseTuple(args, "O(ii)sn(sii)",
        &target, &xsize, &ysize, &codec, &offset, &mode_name, &stride, &ystep))
    return NULL;
...
const ModeID mode = findModeID(mode_name);          /* "L" */

if (stride <= 0) {                                  /* attacker sets stride=1 (>0) -> NOT recomputed */
    if (mode == IMAGING_MODE_L || mode == IMAGING_MODE_P) stride = xsize;
    else if (isModeI16(mode)) stride = xsize * 2;
    else stride = xsize * 4;
}

if (stride > 0 && ysize > PY_SSIZE_T_MAX / stride) {/* overflow guard only */
    PyErr_SetString(PyExc_MemoryError, "Integer overflow in ysize"); return NULL;
}
size = (Py_ssize_t)ysize * stride;                  /* = 1*1 = 1 */

if (offset > PY_SSIZE_T_MAX - size) { ... }
...
if (offset + size > view.len) {                     /* 1 + 1 = 2 <= 256…
Record
GHSA-62p4-gmf7-7g93
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-125
Updated
2026-11-02
NVD 8.3

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.

Record
CVE-2026-54058
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
Weakness
CWE-125
Updated
2026-11-02
OSV 8.3

Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.

Record
CVE-2026-54058
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-125
Updated
2026-11-02
OSVDEBIAN-CVE-2026-54058 9.1

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.

Record
DEBIAN-CVE-2026-54058
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
Updated
2026-11-02
Show 32 moreShow less
OSVGHSA-62p4-gmf7-7g93 8.3

Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)

Summary

When Pillow loads an uncompressed image whose tile uses the raw codec and a mode in Image._MAPMODES, and the image was opened from a filename, it memory-maps the file and builds the image's row pointers directly into the mapping via PyImaging_MapBuffer (src/map.c). The per-row spacing (stride) is taken from the tile arguments. map.c validates offset + ysize*stride <= buffer_len but never checks that stride is at least the natural row width xsize * pixelsize.

The McIdas AREA plugin (McIdasImagePlugin.py) derives stride, offset, xsize, and ysize directly from attacker-controlled 32-bit header words with no validation. By supplying a stride far smaller than the row width, an attacker makes each row pointer read xsize*pixelsize bytes that run past the mapped region. Accessing the pixels (e.g. Image.tobytes(), getpixel, convert, save) then reads adjacent process memory (information disclosure) or faults (SIGBUS, denial of service).

Complete Code Trace

Step 1: McIdasImageFile._open - turns attacker header words into image size, file offset, and row stride with no validation.

# src/PIL/McIdasImagePlugin.py:41-70
s = self.fp.read(256)
if not _accept(s) or len(s) != 256:        # _accept: prefix == b"\x00\x00\x00\x00\x00\x00\x00\x04"
    raise SyntaxError(...)
self.area_descriptor = w = [0, *struct.unpack("!64i", s)]   # w[1..64] = signed BE int32, ALL attacker-controlled

if w[11] == 1:
    mode = rawmode = "L"                    # pixelsize 1, in _MAPMODES
elif w[11] == 2:
    mode = rawmode = "I;16B"                # pixelsize 2, in _MAPMODES
...
self._mode = mode
self._size = w[10], w[9]                    # (xsize, ysize)  <-- attacker
offset = w[34] + w[15]                       # <-- attacker
stride = w[15] + w[10] * w[11] * w[14]       # <-- attacker (set w[14]=0, w[15]=1 => stride=1)
self.tile = [
    ImageFile._Tile("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))
]

Step 2: ImageFile.load (mmap branch) - selects mmap and delegates to map_buffer.

# src/PIL/ImageFile.py:322-348
if use_mmap:                                 # use_mmap = self.filename and len(self.tile) == 1
    decoder_name, extents, offset, args = self.tile[0]
    if (decoder_name == "raw" and isinstance(args, tuple) and len(args) >= 3
            and args[0] == self.mode and args[0] in Image._MAPMODES):
        if offset < 0:                       # only lower-bound guard on offset
            raise ValueError("Tile offset cannot be negative")
        with open(self.filename) as fp:
            self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ)
        if offset + self.size[1] * args[1] > self.map.size():   # == offset + ysize*stride; NO stride>=linesize check
            raise OSError("buffer is not large enough")
        self.im = Image.core.map_buffer(
            self.map, self.size, decoder_name, offset, args      # args = ("L", stride, 1)
        )

Step 3: PyImaging_MapBuffer - builds row pointers at stride spacing into the mmap; validates everything except stride >= row width.

/* src/map.c:65-140 */
if (!PyArg_ParseTuple(args, "O(ii)sn(sii)",
        &target, &xsize, &ysize, &codec, &offset, &mode_name, &stride, &ystep))
    return NULL;
...
const ModeID mode = findModeID(mode_name);          /* "L" */

if (stride <= 0) {                                  /* attacker sets stride=1 (>0) -> NOT recomputed */
    if (mode == IMAGING_MODE_L || mode == IMAGING_MODE_P) stride = xsize;
    else if (isModeI16(mode)) stride = xsize * 2;
    else stride = xsize * 4;
}

if (stride > 0 && ysize > PY_SSIZE_T_MAX / stride) {/* overflow guard only */
    PyErr_SetString(PyExc_MemoryError, "Integer overflow in ysize"); return NULL;
}
size = (Py_ssize_t)ysize * stride;                  /* = 1*1 = 1 */

if (offset > PY_SSIZE_T_MAX - size) { ... }
...
if (offset + size > view.len) {                     /* 1 + 1 = 2 <= 256…
Record
GHSA-62p4-gmf7-7g93
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-125
Updated
2026-11-02
OSVOESA-2026-3185 8.3

python-pillow security update

Pillow is the friendly PIL fork by Alex Clark and Contributors. PIL is the Python Imaging \ Library by Fredrik Lundh and Contributors. As of 2019, Pillow development is supported by Tidelift. of CVE-2022-22815,CVE-2022-22816)

Security Fix(es):

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.(CVE-2026-54058)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow's public rank-filter API can trigger a native heap out-of-bounds write when given a very large odd filter size because ImageFilter.RankFilter.filter() calls image.expand(size // 2, size // 2) before rank-filter size validation and ImagingExpand() computes output dimensions with unchecked signed int arithmetic. This issue is fixed in version 12.3.0.(CVE-2026-59197)

Pillow is a Python imaging library. From 5.2.0 until 12.3.0, Pillow's TGA RLE encoder reads past its packed row buffer when saving a mode 1 image with TGA RLE compression, allowing adjacent process heap bytes to be copied into the generated TGA file. This issue is fixed in version 12.3.0.(CVE-2026-59198)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow public image coordinate APIs can trigger a native heap out-of-bounds write when given coordinates near the signed 32-bit integer limits in Image.paste(), Image.crop(), or Image.alpha_composite(). This issue is fixed in version 12.3.0.(CVE-2026-59199)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow's ImageCms.ImageCmsTransform.apply(im, imOut) API can trigger controlled native heap corruption when the caller supplies an output image whose mode does not match the transform's declared output mode. This issue is fixed in version 12.3.0.(CVE-2026-59205)

Record
OESA-2026-3185
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Updated
2026-11-02
OSVOESA-2026-3186 8.3

python-pillow security update

Pillow is the friendly PIL fork by Alex Clark and Contributors. PIL is the Python Imaging \ Library by Fredrik Lundh and Contributors. As of 2019, Pillow development is supported by Tidelift. of CVE-2022-22815,CVE-2022-22816)

Security Fix(es):

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.(CVE-2026-54058)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow's public rank-filter API can trigger a native heap out-of-bounds write when given a very large odd filter size because ImageFilter.RankFilter.filter() calls image.expand(size // 2, size // 2) before rank-filter size validation and ImagingExpand() computes output dimensions with unchecked signed int arithmetic. This issue is fixed in version 12.3.0.(CVE-2026-59197)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow public image coordinate APIs can trigger a native heap out-of-bounds write when given coordinates near the signed 32-bit integer limits in Image.paste(), Image.crop(), or Image.alpha_composite(). This issue is fixed in version 12.3.0.(CVE-2026-59199)

Pillow is a Python imaging library. From 5.1.0 until 12.3.0, PdfParser.PdfStream.decode() in PIL/PdfParser.py calls zlib.decompress() with bufsize set to the PDF stream Length field without bounding the decompressed output size, allowing a crafted FlateDecode PDF stream to exhaust memory from a small file. This issue is fixed in version 12.3.0.(CVE-2026-59200)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow's ImageCms.ImageCmsTransform.apply(im, imOut) API can trigger controlled native heap corruption when the caller supplies an output image whose mode does not match the transform's declared output mode. This issue is fixed in version 12.3.0.(CVE-2026-59205)

Record
OESA-2026-3186
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Updated
2026-11-02
OSVOESA-2026-3187 8.3

python-pillow security update

Pillow is the friendly PIL fork by Alex Clark and Contributors. PIL is the Python Imaging \ Library by Fredrik Lundh and Contributors. As of 2019, Pillow development is supported by Tidelift. of CVE-2022-22815,CVE-2022-22816)

Security Fix(es):

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.(CVE-2026-54058)

Pillow is a Python imaging library. From 5.2.0 until 12.3.0, Pillow's TGA RLE encoder reads past its packed row buffer when saving a mode 1 image with TGA RLE compression, allowing adjacent process heap bytes to be copied into the generated TGA file. This issue is fixed in version 12.3.0.(CVE-2026-59198)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow public image coordinate APIs can trigger a native heap out-of-bounds write when given coordinates near the signed 32-bit integer limits in Image.paste(), Image.crop(), or Image.alpha_composite(). This issue is fixed in version 12.3.0.(CVE-2026-59199)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow's ImageCms.ImageCmsTransform.apply(im, imOut) API can trigger controlled native heap corruption when the caller supplies an output image whose mode does not match the transform's declared output mode. This issue is fixed in version 12.3.0.(CVE-2026-59205)

Record
OESA-2026-3187
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Updated
2026-11-02
OSVOESA-2026-3188 8.3

python-pillow security update

Pillow is the friendly PIL fork by Alex Clark and Contributors. PIL is the Python Imaging \ Library by Fredrik Lundh and Contributors. As of 2019, Pillow development is supported by Tidelift. of CVE-2022-22815,CVE-2022-22816)

Security Fix(es):

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.(CVE-2026-54058)

Pillow is a Python imaging library. From 5.2.0 until 12.3.0, Pillow's TGA RLE encoder reads past its packed row buffer when saving a mode 1 image with TGA RLE compression, allowing adjacent process heap bytes to be copied into the generated TGA file. This issue is fixed in version 12.3.0.(CVE-2026-59198)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow public image coordinate APIs can trigger a native heap out-of-bounds write when given coordinates near the signed 32-bit integer limits in Image.paste(), Image.crop(), or Image.alpha_composite(). This issue is fixed in version 12.3.0.(CVE-2026-59199)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow's ImageCms.ImageCmsTransform.apply(im, imOut) API can trigger controlled native heap corruption when the caller supplies an output image whose mode does not match the transform's declared output mode. This issue is fixed in version 12.3.0.(CVE-2026-59205)

Record
OESA-2026-3188
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Updated
2026-11-02
OSVOESA-2026-3189 8.3

python-pillow security update

Pillow is the friendly PIL fork by Alex Clark and Contributors. PIL is the Python Imaging \ Library by Fredrik Lundh and Contributors. As of 2019, Pillow development is supported by Tidelift. of CVE-2022-22815,CVE-2022-22816)

Security Fix(es):

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.(CVE-2026-54058)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow's public rank-filter API can trigger a native heap out-of-bounds write when given a very large odd filter size because ImageFilter.RankFilter.filter() calls image.expand(size // 2, size // 2) before rank-filter size validation and ImagingExpand() computes output dimensions with unchecked signed int arithmetic. This issue is fixed in version 12.3.0.(CVE-2026-59197)

Pillow is a Python imaging library. From 5.2.0 until 12.3.0, Pillow's TGA RLE encoder reads past its packed row buffer when saving a mode 1 image with TGA RLE compression, allowing adjacent process heap bytes to be copied into the generated TGA file. This issue is fixed in version 12.3.0.(CVE-2026-59198)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow public image coordinate APIs can trigger a native heap out-of-bounds write when given coordinates near the signed 32-bit integer limits in Image.paste(), Image.crop(), or Image.alpha_composite(). This issue is fixed in version 12.3.0.(CVE-2026-59199)

Pillow is a Python imaging library. Prior to 12.3.0, Pillow's ImageCms.ImageCmsTransform.apply(im, imOut) API can trigger controlled native heap corruption when the caller supplies an output image whose mode does not match the transform's declared output mode. This issue is fixed in version 12.3.0.(CVE-2026-59205)

Record
OESA-2026-3189
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Updated
2026-11-02
OSVPYSEC-2026-3493 8.3

Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)

Summary

When Pillow loads an uncompressed image whose tile uses the raw codec and a mode in Image._MAPMODES, and the image was opened from a filename, it memory-maps the file and builds the image's row pointers directly into the mapping via PyImaging_MapBuffer (src/map.c). The per-row spacing (stride) is taken from the tile arguments. map.c validates offset + ysize*stride <= buffer_len but never checks that stride is at least the natural row width xsize * pixelsize.

The McIdas AREA plugin (McIdasImagePlugin.py) derives stride, offset, xsize, and ysize directly from attacker-controlled 32-bit header words with no validation. By supplying a stride far smaller than the row width, an attacker makes each row pointer read xsize*pixelsize bytes that run past the mapped region. Accessing the pixels (e.g. Image.tobytes(), getpixel, convert, save) then reads adjacent process memory (information disclosure) or faults (SIGBUS, denial of service).

Complete Code Trace

Step 1: McIdasImageFile._open - turns attacker header words into image size, file offset, and row stride with no validation.

# src/PIL/McIdasImagePlugin.py:41-70
s = self.fp.read(256)
if not _accept(s) or len(s) != 256:        # _accept: prefix == b"\x00\x00\x00\x00\x00\x00\x00\x04"
    raise SyntaxError(...)
self.area_descriptor = w = [0, *struct.unpack("!64i", s)]   # w[1..64] = signed BE int32, ALL attacker-controlled

if w[11] == 1:
    mode = rawmode = "L"                    # pixelsize 1, in _MAPMODES
elif w[11] == 2:
    mode = rawmode = "I;16B"                # pixelsize 2, in _MAPMODES
...
self._mode = mode
self._size = w[10], w[9]                    # (xsize, ysize)  <-- attacker
offset = w[34] + w[15]                       # <-- attacker
stride = w[15] + w[10] * w[11] * w[14]       # <-- attacker (set w[14]=0, w[15]=1 => stride=1)
self.tile = [
    ImageFile._Tile("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))
]

Step 2: ImageFile.load (mmap branch) - selects mmap and delegates to map_buffer.

# src/PIL/ImageFile.py:322-348
if use_mmap:                                 # use_mmap = self.filename and len(self.tile) == 1
    decoder_name, extents, offset, args = self.tile[0]
    if (decoder_name == "raw" and isinstance(args, tuple) and len(args) >= 3
            and args[0] == self.mode and args[0] in Image._MAPMODES):
        if offset < 0:                       # only lower-bound guard on offset
            raise ValueError("Tile offset cannot be negative")
        with open(self.filename) as fp:
            self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ)
        if offset + self.size[1] * args[1] > self.map.size():   # == offset + ysize*stride; NO stride>=linesize check
            raise OSError("buffer is not large enough")
        self.im = Image.core.map_buffer(
            self.map, self.size, decoder_name, offset, args      # args = ("L", stride, 1)
        )

Step 3: PyImaging_MapBuffer - builds row pointers at stride spacing into the mmap; validates everything except stride >= row width.

/* src/map.c:65-140 */
if (!PyArg_ParseTuple(args, "O(ii)sn(sii)",
        &target, &xsize, &ysize, &codec, &offset, &mode_name, &stride, &ystep))
    return NULL;
...
const ModeID mode = findModeID(mode_name);          /* "L" */

if (stride <= 0) {                                  /* attacker sets stride=1 (>0) -> NOT recomputed */
    if (mode == IMAGING_MODE_L || mode == IMAGING_MODE_P) stride = xsize;
    else if (isModeI16(mode)) stride = xsize * 2;
    else stride = xsize * 4;
}

if (stride > 0 && ysize > PY_SSIZE_T_MAX / stride) {/* overflow guard only */
    PyErr_SetString(PyExc_MemoryError, "Integer overflow in ysize"); return NULL;
}
size = (Py_ssize_t)ysize * stride;                  /* = 1*1 = 1 */

if (offset > PY_SSIZE_T_MAX - size) { ... }
...
if (offset + size > view.len) {                     /* 1 + 1 = 2 <= 256…
Record
PYSEC-2026-3493
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N
Updated
2026-11-02
OSVRHSA-2026:48021 9.1

Red Hat Security Advisory: python-pillow security update

Record
RHSA-2026:48021
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
Updated
2026-11-02
OSVRHSA-2026:52551 9.1

Red Hat Security Advisory: python-pillow security update

Record
RHSA-2026:52551
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
Updated
2026-11-02
OSVRHSA-2026:54417 9.1

Red Hat Security Advisory: python-pillow security update

Record
RHSA-2026:54417
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
Updated
2026-11-02
OSVRHSA-2026:54528 9.1

Red Hat Security Advisory: python-pillow security update

Record
RHSA-2026:54528
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
Updated
2026-11-02
OSVRLSA-2026:48021 9.1

Important: python-pillow security update

Python is an interpreted, interactive, object-oriented programming language, which includes modules, classes, exceptions, very high level dynamic data types and dynamic typing. Python supports interfaces to many system calls and libraries, as well as to various windowing systems.

Security Fix(es):

  • Pillow: Pillow: Native heap out-of-bounds write (CVE-2026-59197)

  • Pillow: Pillow: Memory disclosure or denial of service via crafted McIdas AREA image (CVE-2026-54058)

For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.

Record
RLSA-2026:48021
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
Updated
2026-11-02
OSVUBUNTU-CVE-2026-54058 8.3

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.

Record
UBUNTU-CVE-2026-54058
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
Updated
2026-11-05
OSVALSA-2026:48021 No score

Important: python-pillow security update

Python is an interpreted, interactive, object-oriented programming language, which includes modules, classes, exceptions, very high level dynamic data types and dynamic typing. Python supports interfaces to many system calls and libraries, as well as to various windowing systems.

Security Fix(es):

  • Pillow: Pillow: Native heap out-of-bounds write (CVE-2026-59197)
  • Pillow: Pillow: Memory disclosure or denial of service via crafted McIdas AREA image (CVE-2026-54058)

For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.

Record
ALSA-2026:48021
Updated
2026-11-02
OSVBIT-pillow-2026-54058 No score

Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)

Pillow is a Python imaging library. Prior to 12.3.0, when Pillow loads an uncompressed McIdas AREA image from a filename through the mmap raw codec path, attacker-controlled header words can set a row stride smaller than the natural row width, causing pixel access such as Image.tobytes(), getpixel, convert, or save to read beyond the mapped region and disclose adjacent process memory or fault. This issue is fixed in version 12.3.0.

Record
BIT-pillow-2026-54058
Updated
2026-11-02
OSVCLSA-2026-1786515922 No score

TuxCare security update for pillow (9 CVEs)

TuxCare rebuilt pillow to address 9 CVEs. Fixed in 11.2.1.post4+tuxcare.

Record
CLSA-2026-1786515922
Updated
2026-11-02
OSVCLSA-2026-1787220453 No score

TuxCare security update for pillow (2 CVEs)

TuxCare rebuilt pillow to address 2 CVEs. Fixed in 10.4.0.post5+tuxcare.

Record
CLSA-2026-1787220453
Updated
2026-11-02
OSVCLSA-2026-1787298843 No score

TuxCare security update for pillow (5 CVEs)

TuxCare rebuilt pillow to address 5 CVEs. Fixed in 9.5.0.post3+tuxcare.

Record
CLSA-2026-1787298843
Updated
2026-11-02
OSVCLSA-2026-1787306626 No score

TuxCare security update for pillow (4 CVEs)

TuxCare rebuilt pillow to address 4 CVEs. Fixed in 9.4.0.post5+tuxcare.

Record
CLSA-2026-1787306626
Updated
2026-11-02
OSVCLSA-2026-1790674233 No score

TuxCare security update for pillow (14 CVEs)

TuxCare rebuilt pillow to address 14 CVEs. Fixed in 11.3.0.post5+tuxcare.

Record
CLSA-2026-1790674233
Updated
2026-11-02
OSVCLSA-2026-1792160910 No score

TuxCare security update for pillow (3 CVEs)

TuxCare rebuilt pillow to address 3 CVEs. Fixed in 8.4.0.post2+tuxcare.

Record
CLSA-2026-1792160910
Updated
2026-11-02
OSVCLSA-2026-1792164435 No score

Fix CVE(s): CVE-2026-54058, CVE-2026-59199

  • SECURITY UPDATE: heap out-of-bounds write via paste box coordinates near the signed 32-bit integer limits (ELSCVE-233283)
    • debian/patches/CVE-2026-59199.patch: compute the paste box dimensions as int64_t in ImagingPaste() and ImagingFill2() in src/libImaging/Paste.c. Adds a regression test in Tests/test_image_paste.py.
    • CVE-2026-59199
  • SECURITY UPDATE: out-of-bounds read when memory-mapping McIdas AREA images with an undersized row stride (ELSCVE-233312)
    • debian/patches/CVE-2026-54058.patch: raise the row stride to at least one full row of pixels in PyImaging_MapBuffer() in src/map.c. Adds a regression test in Tests/test_file_mcidas.py.
    • CVE-2026-54058
Record
CLSA-2026-1792164435
Updated
2026-11-02
OSVMGASA-2026-0463 No score

Updated python-pillow packages fix security vulnerabilities

Prevent decompression bomb when parsing PDF WindowsViewer.get_command injection EPS image infinite loop JPEG2000 image memory usage McIdas out-of-bounds (OOB) read Out-of-bounds (OOB) read when saving 1 mode TGA images Out-of-bounds (OOB) write from large RankFilter sizes Out-of-bounds (OOB) write from Image.paste() Out-of-bounds (OOB) write in ImageCmsTransform Prevent FontFile decompression bomb Prevent GD decompression bomb

Record
MGASA-2026-0463
Updated
2026-11-02
OSVopenSUSE-SU-2026:11283-1 No score

python313-Pillow-12.3.0-2.1 on GA media

These are all security issues fixed in the python313-Pillow-12.3.0-2.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:11283-1
Updated
2026-11-02
OSVopenSUSE-SU-2026:11839-1 No score

python313-graphifyy-0.9.65-1.1 on GA media

These are all security issues fixed in the python313-graphifyy-0.9.65-1.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:11839-1
Updated
2026-11-02
OSVopenSUSE-SU-2026:21544-1 No score

Security update for python-Pillow

This update for python-Pillow fixes the following issues

  • CVE-2026-54058: out-of-bounds read via attacker-controlled row stride on mmap path (bsc#1271419).
  • CVE-2026-59197: heap out-of-bounds write in ImageFilter.RankFilter via integer overflow in ImagingExpand (bsc#1271418).
  • CVE-2026-59198: out-of-bounds heap data copied into file generated by TGA RLE encoder (bsc#1271420).
  • CVE-2026-59199: heap out-of-bounds write in Image.paste() and Image.crop() via signed coordinate overflow (bsc#1271421).
  • CVE-2026-59200: decompression bomb DoS via PdfParser.PdfStream.decode() (bsc#1271422).
  • CVE-2026-59204: denial of service through memory exhaustion via JPEG2000 tiled decoder (bsc#1271424).
  • CVE-2026-59205: controlled heap out-of-bounds write in ImageCmsTransform.apply() via output mode mismatch (bsc#1271425).
Record
openSUSE-SU-2026:21544-1
Updated
2026-11-02
OSVROOT-APP-PYPI-CVE-2026-54058 No score

CVE-2026-54058 in pillow - Patched by Root

Root has patched CVE-2026-54058 in the pillow package for Root:PyPI. Multiple fixed versions available.

Record
ROOT-APP-PYPI-CVE-2026-54058
Updated
2026-11-06
OSVSUSE-SU-2026:23217-1 No score

Security update for python-Pillow

This update for python-Pillow fixes the following issues

  • CVE-2026-54058: out-of-bounds read via attacker-controlled row stride on mmap path (bsc#1271419).
  • CVE-2026-59197: heap out-of-bounds write in ImageFilter.RankFilter via integer overflow in ImagingExpand (bsc#1271418).
  • CVE-2026-59198: out-of-bounds heap data copied into file generated by TGA RLE encoder (bsc#1271420).
  • CVE-2026-59199: heap out-of-bounds write in Image.paste() and Image.crop() via signed coordinate overflow (bsc#1271421).
  • CVE-2026-59200: decompression bomb DoS via PdfParser.PdfStream.decode() (bsc#1271422).
  • CVE-2026-59204: denial of service through memory exhaustion via JPEG2000 tiled decoder (bsc#1271424).
  • CVE-2026-59205: controlled heap out-of-bounds write in ImageCmsTransform.apply() via output mode mismatch (bsc#1271425).
Record
SUSE-SU-2026:23217-1
Updated
2026-11-02
OSVSUSE-SU-2026:23228-1 No score

Security update for python-Pillow

This update for python-Pillow fixes the following issues

  • CVE-2026-54058: out-of-bounds read via attacker-controlled row stride on mmap path (bsc#1271419).
  • CVE-2026-59197: heap out-of-bounds write in ImageFilter.RankFilter via integer overflow in ImagingExpand (bsc#1271418).
  • CVE-2026-59198: out-of-bounds heap data copied into file generated by TGA RLE encoder (bsc#1271420).
  • CVE-2026-59199: heap out-of-bounds write in Image.paste() and Image.crop() via signed coordinate overflow (bsc#1271421).
  • CVE-2026-59200: decompression bomb DoS via PdfParser.PdfStream.decode() (bsc#1271422).
  • CVE-2026-59204: denial of service through memory exhaustion via JPEG2000 tiled decoder (bsc#1271424).
  • CVE-2026-59205: controlled heap out-of-bounds write in ImageCmsTransform.apply() via output mode mismatch (bsc#1271425).
Record
SUSE-SU-2026:23228-1
Updated
2026-11-02
OSVSUSE-SU-2026:3084-1 No score

Security update for python-Pillow

This update for python-Pillow fixes the following issues

  • CVE-2026-54058: out-of-bounds read via attacker-controlled row stride on mmap path (bsc#1271419).
  • CVE-2026-59197: heap out-of-bounds write in ImageFilter.RankFilter via integer overflow in ImagingExpand (bsc#1271418).
  • CVE-2026-59198: out-of-bounds heap data copied into file generated by TGA RLE encoder (bsc#1271420).
  • CVE-2026-59199: heap out-of-bounds write in Image.paste() and Image.crop() via signed coordinate overflow (bsc#1271421).
  • CVE-2026-59200: decompression bomb DoS via PdfParser.PdfStream.decode() (bsc#1271422).
  • CVE-2026-59204: denial of service through memory exhaustion via JPEG2000 tiled decoder (bsc#1271424).
  • CVE-2026-59205: controlled heap out-of-bounds write in ImageCmsTransform.apply() via output mode mismatch
Record
SUSE-SU-2026:3084-1
Updated
2026-11-02
OSVSUSE-SU-2026:3268-1 No score

Security update for python-Pillow

This update for python-Pillow fixes the following issues:

  • CVE-2026-54058: out-of-bounds read via attacker-controlled row stride on mmap path (bsc#1271419).
  • CVE-2026-54059: bomb protection bypass via PCF font loading due to Image.frombytes() being called without _decompression_bomb_check() (bsc#1270409).
  • CVE-2026-54060: excessive allocation due to FontFile.compile(): Image.new() being called without _decompression_bomb_check() (bsc#1270410).
  • CVE-2026-55379: bomb protection bypass via font loading due to Image.new() being called without _decompression_bomb_check() (bsc#1270411).
  • CVE-2026-55380: unchecked 4.3 GB C-heap allocation due to image dimensions being accepted without _decompression_bomb_check() in GdImageFile._open() (bsc#1270412).
  • CVE-2026-59197: heap out-of-bounds write in ImageFilter.RankFilter via integer overflow in ImagingExpand (bsc#1271418).
  • CVE-2026-59198: out-of-bounds heap data copied into file generated by TGA RLE encoder (bsc#1271420).
  • CVE-2026-59199: heap out-of-bounds write in Image.paste() and Image.crop() via signed coordinate overflow (bsc#1271421).
  • CVE-2026-59200: decompression bomb DoS via PdfParser.PdfStream.decode() (bsc#1271422).
  • CVE-2026-59204: denial of service through memory exhaustion via JPEG2000 tiled decoder (bsc#1271424).
  • CVE-2026-59205: controlled heap out-of-bounds write in ImageCmsTransform.apply() via output mode mismatch (bsc#1271425).
Record
SUSE-SU-2026:3268-1
Updated
2026-11-02
OSVUSN-8999-1 No score

pillow vulnerabilities

It was discovered that Pillow incorrectly handled map stride values when loading certain McIdas AREA images. An attacker could possibly use this issue to obtain sensitive information or cause a denial of service. (CVE-2026-54058)

It was discovered that Pillow did not properly check for decompression bombs when processing font files. An attacker could possibly use this issue to cause Pillow to consume excessive memory, resulting in a denial of service. (CVE-2026-54059, CVE-2026-54060, CVE-2026-55379)

It was discovered that Pillow did not properly check for decompression bombs when loading GD image files. An attacker could possibly use this issue to cause Pillow to consume excessive memory, resulting in a denial of service. (CVE-2026-55380)

It was discovered that Pillow incorrectly validated filter sizes in the rank filter implementation. An attacker could possibly use this issue to cause Pillow to crash or execute arbitrary code. (CVE-2026-59197)

It was discovered that Pillow incorrectly handled image coordinate calculations. An attacker could possibly use this issue to cause Pillow to crash. (CVE-2026-59199)

It was discovered that Pillow did not properly limit the size of decompressed PDF stream data. An attacker could possibly use this issue to cause Pillow to consume excessive memory, resulting in a denial of service. (CVE-2026-59200)

It was discovered that Pillow incorrectly parsed EPS files containing a negative byte count in the BeginBinary directive. An attacker could possibly use this issue to cause Pillow to hang, resulting in a denial of service. This issue only affected Ubuntu 26.04 LTS. (CVE-2026-59203)

It was discovered that Pillow incorrectly accumulated JPEG2000 tile component widths. An attacker could possibly use this issue to cause Pillow to consume excessive memory, resulting in a denial of service. (CVE-2026-59204)

It was discovered that Pillow incorrectly validated image mode compatibility in color management transforms. An attacker could possibly use this issue to cause Pillow to crash or execute arbitrary code. (CVE-2026-59205)

Record
USN-8999-1
Updated
2026-11-05

Affected products

Affected packages

Affected packages
PackageAffectedFixed
pillow
PyPI
before 12.3.0
12.3.0
python3-pillow
AlmaLinux:8
From an advisory covering 2 CVEs
before 5.1.1-23.el8_10
5.1.1-23.el8_10
python3-pillow-devel
AlmaLinux:8
From an advisory covering 2 CVEs
before 5.1.1-23.el8_10
5.1.1-23.el8_10
python3-pillow-doc
AlmaLinux:8
From an advisory covering 2 CVEs
before 5.1.1-23.el8_10
5.1.1-23.el8_10
python3-pillow-tk
AlmaLinux:8
From an advisory covering 2 CVEs
before 5.1.1-23.el8_10
5.1.1-23.el8_10
pillow
Bitnami
before 12.3.0
12.3.0
pillow
TuxCare:PyPI
From an advisory covering 9 CVEs
11.2.1 up to 11.2.1.post4+tuxcare, plus listed versions
11.2.1.post1+tuxcare11.2.1.post2+tuxcare11.2.1.post3+tuxcare
11.2.1.post4+tuxcare
pillow
TuxCare:PyPI
From an advisory covering 2 CVEs
10.4.0 up to 10.4.0.post5+tuxcare, plus listed versions
10.4.0.post1+tuxcare10.4.0.post2+tuxcare10.4.0.post3+tuxcare10.4.0.post4+tuxcare
10.4.0.post5+tuxcare
pillow
TuxCare:PyPI
From an advisory covering 5 CVEs
9.5.0 up to 9.5.0.post3+tuxcare, plus listed versions
9.5.0.post1+tuxcare9.5.0.post2+tuxcare
9.5.0.post3+tuxcare
pillow
TuxCare:PyPI
From an advisory covering 4 CVEs
9.4.0 up to 9.4.0.post5+tuxcare, plus listed versions
9.4.0.post1+tuxcare9.4.0.post2+tuxcare9.4.0.post3+tuxcare9.4.0.post4+tuxcare
9.4.0.post5+tuxcare
Show 97 moreShow less
Affected packages
PackageAffectedFixed
pillow
TuxCare:PyPI
From an advisory covering 14 CVEs
11.3.0 up to 11.3.0.post5+tuxcare, plus listed versions
11.3.0.post1+tuxcare11.3.0.post2+tuxcare11.3.0.post3+tuxcare11.3.0.post4+tuxcare
11.3.0.post5+tuxcare
pillow
TuxCare:PyPI
From an advisory covering 3 CVEs
8.4.0 up to 8.4.0.post2+tuxcare, plus listed versions
8.4.0.post1+tuxcare
8.4.0.post2+tuxcare
python-pil
TuxCare:Ubuntu:18.04
From an advisory covering 2 CVEs
before 5.1.0-1ubuntu0.8+tuxcare.els2
5.1.0-1ubuntu0.8+tuxcare.els2
python-pil-doc
TuxCare:Ubuntu:18.04
From an advisory covering 2 CVEs
before 5.1.0-1ubuntu0.8+tuxcare.els2
5.1.0-1ubuntu0.8+tuxcare.els2
python-pil.imagetk
TuxCare:Ubuntu:18.04
From an advisory covering 2 CVEs
before 5.1.0-1ubuntu0.8+tuxcare.els2
5.1.0-1ubuntu0.8+tuxcare.els2
python3-pil
TuxCare:Ubuntu:18.04
From an advisory covering 2 CVEs
before 5.1.0-1ubuntu0.8+tuxcare.els2
5.1.0-1ubuntu0.8+tuxcare.els2
python3-pil.imagetk
TuxCare:Ubuntu:18.04
From an advisory covering 2 CVEs
before 5.1.0-1ubuntu0.8+tuxcare.els2
5.1.0-1ubuntu0.8+tuxcare.els2
pillow
Debian:12
All versions, plus listed versions
10.0.0-110.1.0-110.2.0-110.3.0-110.3.0-2
Show 19 moreShow less
10.4.0-110.4.0-1.111.1.0-111.1.0-211.1.0-311.1.0-411.1.0-511.2.1-111.3.0-112.0.0-112.1.0-112.1.1-112.1.1-212.2.0-112.3.0-113.0.0-19.4.0-1.19.4.0-1.1+deb12u19.5.0-1
None known
pillow
Debian:13
All versions, plus listed versions
11.1.0-511.1.0-5+deb13u111.1.0-5+deb13u211.1.0-5+deb13u311.1.0-5+deb13u4
Show 9 moreShow less
11.2.1-111.3.0-112.0.0-112.1.0-112.1.1-112.1.1-212.2.0-112.3.0-113.0.0-1
None known
pillow
Debian:14
before 12.3.0-1, plus listed versions
11.1.0-511.2.1-111.3.0-112.0.0-112.1.0-112.1.1-112.1.1-212.2.0-1
12.3.0-1
pillow
PyPI
before 12.3.0, plus listed versions
1.01.11.21.31.4
Show 45 moreShow less
1.51.61.7.01.7.11.7.21.7.31.7.41.7.51.7.61.7.71.7.810.0.010.0.110.1.010.2.010.3.010.4.011.0.011.1.011.2.111.3.012.0.012.1.012.1.112.2.02.0.02.1.02.2.02.2.12.2.22.3.02.3.12.3.22.4.02.5.02.5.12.5.22.5.32.6.02.6.12.6.22.7.02.8.02.8.12.8.2
12.3.0
python-pillow
Mageia:10
From an advisory covering 11 CVEs
before 12.3.0-1.mga10
12.3.0-1.mga10
python-pillow
openEuler:24.03-LTS-SP3
From an advisory covering 5 CVEs
before 10.3.0-13.oe2403sp3
10.3.0-13.oe2403sp3
python-pillow
openEuler:24.03-LTS-SP4
From an advisory covering 5 CVEs
before 10.3.0-13.oe2403sp4
10.3.0-13.oe2403sp4
python-pillow
openEuler:20.03-LTS-SP4
From an advisory covering 4 CVEs
before 9.0.1-16.oe2003sp4
9.0.1-16.oe2003sp4
python-pillow
openEuler:22.03-LTS-SP4
From an advisory covering 4 CVEs
before 9.0.1-16.oe2203sp4
9.0.1-16.oe2203sp4
python-pillow
openEuler:24.03-LTS-SP1
From an advisory covering 5 CVEs
before 10.3.0-13.oe2403sp1
10.3.0-13.oe2403sp1
python-pillow
Red Hat:enterprise_linux:8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python-pillow-debuginfo
Red Hat:enterprise_linux:8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python-pillow-debugsource
Red Hat:enterprise_linux:8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python3-pillow
Red Hat:enterprise_linux:8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python3-pillow-debuginfo
Red Hat:enterprise_linux:8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python3-pillow-tk-debuginfo
Red Hat:enterprise_linux:8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python-pillow-debuginfo
Red Hat:enterprise_linux:8::crb
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python-pillow-debugsource
Red Hat:enterprise_linux:8::crb
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python3-pillow
Red Hat:enterprise_linux:8::crb
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python3-pillow-debuginfo
Red Hat:enterprise_linux:8::crb
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python3-pillow-devel
Red Hat:enterprise_linux:8::crb
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python3-pillow-doc
Red Hat:enterprise_linux:8::crb
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python3-pillow-tk
Red Hat:enterprise_linux:8::crb
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python3-pillow-tk-debuginfo
Red Hat:enterprise_linux:8::crb
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
python-pillow
Red Hat:rhel_aus:8.4::appstream
From an advisory covering 6 CVEs
before 0:5.1.1-15.el8_4.2
0:5.1.1-15.el8_4.2
python-pillow-debuginfo
Red Hat:rhel_aus:8.4::appstream
From an advisory covering 6 CVEs
before 0:5.1.1-15.el8_4.2
0:5.1.1-15.el8_4.2
python-pillow-debugsource
Red Hat:rhel_aus:8.4::appstream
From an advisory covering 6 CVEs
before 0:5.1.1-15.el8_4.2
0:5.1.1-15.el8_4.2
python3-pillow
Red Hat:rhel_aus:8.4::appstream
From an advisory covering 6 CVEs
before 0:5.1.1-15.el8_4.2
0:5.1.1-15.el8_4.2
python3-pillow-debuginfo
Red Hat:rhel_aus:8.4::appstream
From an advisory covering 6 CVEs
before 0:5.1.1-15.el8_4.2
0:5.1.1-15.el8_4.2
python3-pillow-tk-debuginfo
Red Hat:rhel_aus:8.4::appstream
From an advisory covering 6 CVEs
before 0:5.1.1-15.el8_4.2
0:5.1.1-15.el8_4.2
python-pillow
Red Hat:rhel_eus_long_life:8.4::appstream
From an advisory covering 6 CVEs
before 0:5.1.1-15.el8_4.2
0:5.1.1-15.el8_4.2
python-pillow-debuginfo
Red Hat:rhel_eus_long_life:8.4::appstream
From an advisory covering 6 CVEs
before 0:5.1.1-15.el8_4.2
0:5.1.1-15.el8_4.2
python-pillow-debugsource
Red Hat:rhel_eus_long_life:8.4::appstream
From an advisory covering 6 CVEs
before 0:5.1.1-15.el8_4.2
0:5.1.1-15.el8_4.2
python3-pillow
Red Hat:rhel_eus_long_life:8.4::appstream
From an advisory covering 6 CVEs
before 0:5.1.1-15.el8_4.2
0:5.1.1-15.el8_4.2
python3-pillow-debuginfo
Red Hat:rhel_eus_long_life:8.4::appstream
From an advisory covering 6 CVEs
before 0:5.1.1-15.el8_4.2
0:5.1.1-15.el8_4.2
python3-pillow-tk-debuginfo
Red Hat:rhel_eus_long_life:8.4::appstream
From an advisory covering 6 CVEs
before 0:5.1.1-15.el8_4.2
0:5.1.1-15.el8_4.2
python-pillow
Red Hat:rhel_e4s:8.8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_8.1
0:5.1.1-20.el8_8.1
python-pillow-debuginfo
Red Hat:rhel_e4s:8.8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_8.1
0:5.1.1-20.el8_8.1
python-pillow-debugsource
Red Hat:rhel_e4s:8.8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_8.1
0:5.1.1-20.el8_8.1
python3-pillow
Red Hat:rhel_e4s:8.8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_8.1
0:5.1.1-20.el8_8.1
python3-pillow-debuginfo
Red Hat:rhel_e4s:8.8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_8.1
0:5.1.1-20.el8_8.1
python3-pillow-tk-debuginfo
Red Hat:rhel_e4s:8.8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_8.1
0:5.1.1-20.el8_8.1
python-pillow
Red Hat:rhel_tus:8.8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_8.1
0:5.1.1-20.el8_8.1
python-pillow-debuginfo
Red Hat:rhel_tus:8.8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_8.1
0:5.1.1-20.el8_8.1
python-pillow-debugsource
Red Hat:rhel_tus:8.8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_8.1
0:5.1.1-20.el8_8.1
python3-pillow
Red Hat:rhel_tus:8.8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_8.1
0:5.1.1-20.el8_8.1
python3-pillow-debuginfo
Red Hat:rhel_tus:8.8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_8.1
0:5.1.1-20.el8_8.1
python3-pillow-tk-debuginfo
Red Hat:rhel_tus:8.8::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_8.1
0:5.1.1-20.el8_8.1
python-pillow
Red Hat:rhel_aus:8.6::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_6.1
0:5.1.1-20.el8_6.1
python-pillow-debuginfo
Red Hat:rhel_aus:8.6::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_6.1
0:5.1.1-20.el8_6.1
python-pillow-debugsource
Red Hat:rhel_aus:8.6::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_6.1
0:5.1.1-20.el8_6.1
python3-pillow
Red Hat:rhel_aus:8.6::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_6.1
0:5.1.1-20.el8_6.1
python3-pillow-debuginfo
Red Hat:rhel_aus:8.6::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_6.1
0:5.1.1-20.el8_6.1
python3-pillow-tk-debuginfo
Red Hat:rhel_aus:8.6::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_6.1
0:5.1.1-20.el8_6.1
python-pillow
Red Hat:rhel_eus_long_life:8.6::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_6.1
0:5.1.1-20.el8_6.1
python-pillow-debuginfo
Red Hat:rhel_eus_long_life:8.6::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_6.1
0:5.1.1-20.el8_6.1
python-pillow-debugsource
Red Hat:rhel_eus_long_life:8.6::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_6.1
0:5.1.1-20.el8_6.1
python3-pillow
Red Hat:rhel_eus_long_life:8.6::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_6.1
0:5.1.1-20.el8_6.1
python3-pillow-debuginfo
Red Hat:rhel_eus_long_life:8.6::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_6.1
0:5.1.1-20.el8_6.1
python3-pillow-tk-debuginfo
Red Hat:rhel_eus_long_life:8.6::appstream
From an advisory covering 2 CVEs
before 0:5.1.1-20.el8_6.1
0:5.1.1-20.el8_6.1
python-pillow
Rocky Linux:8
From an advisory covering 2 CVEs
before 0:5.1.1-23.el8_10
0:5.1.1-23.el8_10
pillow
Root:PyPI
before 9.3.0+aikido.9
9.3.0+aikido.911.1.0+aikido.812.1.0+aikido.912.1.0+aikido.109.3.0+aikido.109.3.0+aikido.1111.1.0+aikido.99.5.0+aikido.912.1.0+aikido.119.5.0+aikido.1011.1.0+aikido.1011.0.0+aikido.911.2.1+aikido.59.3.0+aikido.129.5.0+aikido.1112.2.0+aikido.59.3.0+aikido.1310.4.0+aikido.1112.1.0+aikido.1211.2.1+aikido.611.1.0+aikido.1110.3.0+aikido.1311.0.0+aikido.1011.2.1+aikido.79.3.0+aikido.1411.1.0+aikido.129.5.0+aikido.1212.2.0+aikido.610.4.0+aikido.129.3.0+aikido.1511.1.0+aikido.1312.1.0+aikido.1310.3.0+aikido.1411.0.0+aikido.119.3.0+aikido.1610.3.0+aikido.1510.4.0+aikido.139.3.0+aikido.179.5.0+aikido.1311.2.1+aikido.811.0.0+aikido.1211.1.0+aikido.1412.1.0+aikido.1412.2.0+aikido.710.3.0+aikido.1610.4.0+aikido.1411.1.0+aikido.1511.2.1+aikido.910.2.0+aikido.112.2.0+aikido.89.0.1+aikido.110.4.0+aikido.1512.1.0+aikido.159.0.1+aikido.210.3.0+aikido.178.0.1+aikido.111.0.0+aikido.139.5.0+aikido.148.1.2+aikido.18.0.1+aikido.210.4.0+aikido.1610.1.0+aikido.110.0.0+aikido.110.3.0+aikido.1810.2.0+aikido.210.3.0+aikido.1910.4.0+aikido.1710.3.0+aikido.208.2.0+aikido.19.4.0+aikido.19.0.0+aikido.211.0.0+aikido.147.0.0+aikido.27.0.0+aikido.312.2.0+aikido.99.5.0+aikido.159.5.0+aikido.169.5.0+aikido.179.5.0+aikido.189.5.0+aikido.1910.4.0+aikido.18
python-Pillow
SUSE:Linux Enterprise Server 16.0
From an advisory covering 7 CVEs
before 11.3.0-160000.8.1
11.3.0-160000.8.1
python-Pillow
SUSE:Linux Enterprise Server for SAP applications 16.0
From an advisory covering 7 CVEs
before 11.3.0-160000.8.1
11.3.0-160000.8.1
python-Pillow
SUSE:Linux Enterprise Module for Package Hub 15 SP7
From an advisory covering 7 CVEs
before 7.2.0-150300.3.30.1
7.2.0-150300.3.30.1
python-Pillow
SUSE:Linux Enterprise Module for Python 3 15 SP7
From an advisory covering 11 CVEs
before 9.5.0-150400.5.25.1
9.5.0-150400.5.25.1
python-Pillow
SUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS
From an advisory covering 11 CVEs
before 9.5.0-150400.5.25.1
9.5.0-150400.5.25.1
python-Pillow
SUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS
From an advisory covering 11 CVEs
before 9.5.0-150400.5.25.1
9.5.0-150400.5.25.1
python-Pillow
SUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS
From an advisory covering 11 CVEs
before 9.5.0-150400.5.25.1
9.5.0-150400.5.25.1
python-Pillow
SUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS
From an advisory covering 11 CVEs
before 9.5.0-150400.5.25.1
9.5.0-150400.5.25.1
python-Pillow
SUSE:Linux Enterprise Server 15 SP4-LTSS
From an advisory covering 11 CVEs
before 9.5.0-150400.5.25.1
9.5.0-150400.5.25.1
python-Pillow
SUSE:Linux Enterprise Server 15 SP5-LTSS
From an advisory covering 11 CVEs
before 9.5.0-150400.5.25.1
9.5.0-150400.5.25.1
python-Pillow
SUSE:Linux Enterprise Server 15 SP6-LTSS
From an advisory covering 11 CVEs
before 9.5.0-150400.5.25.1
9.5.0-150400.5.25.1
python-Pillow
SUSE:Linux Enterprise Server for SAP Applications 15 SP4
From an advisory covering 11 CVEs
before 9.5.0-150400.5.25.1
9.5.0-150400.5.25.1
python-Pillow
SUSE:Linux Enterprise Server for SAP Applications 15 SP5
From an advisory covering 11 CVEs
before 9.5.0-150400.5.25.1
9.5.0-150400.5.25.1
python-Pillow
SUSE:Linux Enterprise Server for SAP Applications 15 SP6
From an advisory covering 11 CVEs
before 9.5.0-150400.5.25.1
9.5.0-150400.5.25.1
pillow
Ubuntu:Pro:14.04:LTS
All versions, plus listed versions
2.2.1-1ubuntu22.2.1-2ubuntu12.2.1-3ubuntu22.2.1-3ubuntu32.2.1-3ubuntu4
Show 12 moreShow less
2.2.1-3ubuntu62.3.0-1ubuntu12.3.0-1ubuntu22.3.0-1ubuntu32.3.0-1ubuntu3.22.3.0-1ubuntu3.32.3.0-1ubuntu3.42.3.0-1ubuntu3.4+esm12.3.0-1ubuntu3.4+esm22.3.0-1ubuntu3.4+esm32.3.0-1ubuntu3.4+esm42.3.0-1ubuntu3.4+esm5
None known
pillow
Ubuntu:Pro:16.04:LTS
All versions, plus listed versions
2.9.0-13.0.0-13.0.0-1build13.1.0-13.1.1-1
Show 9 moreShow less
3.1.2-0ubuntu13.1.2-0ubuntu1.13.1.2-0ubuntu1.33.1.2-0ubuntu1.43.1.2-0ubuntu1.53.1.2-0ubuntu1.63.1.2-0ubuntu1.6+esm13.1.2-0ubuntu1.6+esm23.1.2-0ubuntu1.6+esm3
None known
pillow
Ubuntu:Pro:18.04:LTS
All versions, plus listed versions
4.1.1-3build24.3.0-2ubuntu15.0.0-15.1.0-15.1.0-1ubuntu0.2
Show 8 moreShow less
5.1.0-1ubuntu0.35.1.0-1ubuntu0.45.1.0-1ubuntu0.55.1.0-1ubuntu0.65.1.0-1ubuntu0.75.1.0-1ubuntu0.85.1.0-1ubuntu0.8+esm15.1.0-1ubuntu0.8+esm2
None known
pillow
Ubuntu:Pro:20.04:LTS
All versions, plus listed versions
6.1.0-16.1.0-1build16.2.1-27.0.0-47.0.0-4build1
Show 10 moreShow less
7.0.0-4ubuntu0.17.0.0-4ubuntu0.27.0.0-4ubuntu0.37.0.0-4ubuntu0.47.0.0-4ubuntu0.57.0.0-4ubuntu0.67.0.0-4ubuntu0.77.0.0-4ubuntu0.87.0.0-4ubuntu0.97.0.0-4ubuntu0.9+esm1
None known
pillow-python2
Ubuntu:Pro:20.04:LTS
All versions, plus listed versions
6.2.1-3~build16.2.1-36.2.1-3ubuntu0.1~esm16.2.1-3ubuntu0.1~esm2
None known
pillow
Ubuntu:22.04:LTS
before 9.0.1-1ubuntu0.6, plus listed versions
8.1.2+dfsg-0.39.0.0-19.0.1-19.0.1-1build19.0.1-1ubuntu0.1
Show 4 moreShow less
9.0.1-1ubuntu0.29.0.1-1ubuntu0.39.0.1-1ubuntu0.49.0.1-1ubuntu0.5
9.0.1-1ubuntu0.6
pillow
Ubuntu:24.04:LTS
before 10.2.0-1ubuntu1.4, plus listed versions
10.0.0-110.1.0-110.2.0-110.2.0-1build110.2.0-1ubuntu110.2.0-1ubuntu1.210.2.0-1ubuntu1.3
10.2.0-1ubuntu1.4
pillow
Ubuntu:26.04:LTS
before 12.1.1-2ubuntu1.4, plus listed versions
11.3.0-1ubuntu111.3.0-1ubuntu212.0.0-1ubuntu112.1.1-1ubuntu112.1.1-2ubuntu112.1.1-2ubuntu1.112.1.1-2ubuntu1.212.1.1-2ubuntu1.3
12.1.1-2ubuntu1.4
pillow
Ubuntu:22.04:LTS
From an advisory covering 11 CVEs
before 9.0.1-1ubuntu0.6, plus listed versions
8.1.2+dfsg-0.39.0.0-19.0.1-19.0.1-1build19.0.1-1ubuntu0.1
Show 4 moreShow less
9.0.1-1ubuntu0.29.0.1-1ubuntu0.39.0.1-1ubuntu0.49.0.1-1ubuntu0.5
9.0.1-1ubuntu0.6
pillow
Ubuntu:24.04:LTS
From an advisory covering 11 CVEs
before 10.2.0-1ubuntu1.4, plus listed versions
10.0.0-110.1.0-110.2.0-110.2.0-1build110.2.0-1ubuntu110.2.0-1ubuntu1.210.2.0-1ubuntu1.3
10.2.0-1ubuntu1.4
pillow
Ubuntu:26.04:LTS
From an advisory covering 11 CVEs
before 12.1.1-2ubuntu1.4, plus listed versions
11.3.0-1ubuntu111.3.0-1ubuntu212.0.0-1ubuntu112.1.1-1ubuntu112.1.1-2ubuntu112.1.1-2ubuntu1.112.1.1-2ubuntu1.212.1.1-2ubuntu1.3
12.1.1-2ubuntu1.4
python-Pillow
openSUSE:Tumbleweed
From an advisory covering 6 CVEs
before 12.3.0-2.1
12.3.0-2.1
python-graphifyy
openSUSE:Tumbleweed
before 0.9.65-1.1
0.9.65-1.1
python-Pillow
openSUSE:Leap 16.0
From an advisory covering 7 CVEs
before 11.3.0-160000.8.1
11.3.0-160000.8.1

History

History
RecordedChangedSources
affectedOSV
affected
affected, aliases, referencesOSV
affectedOSV
affectedOSV
affectedOSV
affectedOSV
affected, factsOSV
affectedOSV
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-54058 is a high vulnerability (CVSS 8.3) in Python Pillow, published July 14, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.52%, the 44th percentile. Fixed in pillow 12.3.0.

References

Show 100 moreShow less
This page doesn't list everything

Left out here: 56 versions and the rest of 3 source descriptions. The JSON record has them.

MoveEnter Open