Skip to main content

Pillow CVE-2026-112899

MEDIUM
Allocation of Resources Without Limits or Throttling (CWE-770)
2026-10-20 https://github.com/python-pillow/Pillow GHSA-vx6w-vv9f-6gvg
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Upload ~110-byte crafted EPS under pixel limit
  2. Delivery
    App calls load(scale=N>1) on untrusted file
  3. Exploit
    Scaled size skips decompression-bomb check
  4. Execution
    Ghostscript renders N²-oversized raster
  5. Impact
    CPU and temp disk exhausted

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Resource allocation limits
MITRE ATT&CK

1 technique across 1 tactic: Impact

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires a specific application configuration: the app must (1) open untrusted EPS/PS input, (2) have Ghostscript installed so has_ghostscript() succeeds, and (3) call EpsImageFile.load(scale=N) with a fixed integer N greater than 1 (the handbook-recommended way to get non-blurry high-resolution output). The attacker supplies an EPS whose %%BoundingBox (or %ImageData) declares a pixel count just under MAX_IMAGE_PIXELS so Image.open() accepts it; load(scale=N) then renders N² times that budget before any check. LIMITING FACTORS that reduce real-world risk: the amplification factor N is chosen by the application and not attacker-controllable (bounded at N²×MAX_IMAGE_PIXELS, or N²×2×MAX_IMAGE_PIXELS if DecompressionBombWarning is not promoted to an error); apps that only ever call load() at the default scale=1 are unaffected; Ghostscript must be installed; and any app already passing untrusted EPS to gs is independently exposed to an equivalent no-timeout DoS, so this adds a multiplier rather than a new attack surface.

Impact

No CVSS vector, EPSS score, or KEV entry is provided in the input, so several standard prioritization signals are MISSING and cannot be cited as confirmed. On the signals that do exist: this is a CWE-770 resource-exhaustion (DoS) issue, and the advisory itself is explicit that the effect is a bounded, constant-factor (N²) overshoot of the configured MAX_IMAGE_PIXELS budget, not an unbounded primitive and not memory corruption. A working reproducer is published in the GHSA advisory, so publicly available exploit code exists, but there is no indication of active exploitation (not in CISA KEV). Critically, the advisory notes that any application already feeding untrusted EPS to Ghostscript is exposed to an equivalent tiny-file DoS (gs runs with no timeout), so this bug adds a multiplier rather than a new capability, and the multiplier N is chosen by the application, not the attacker. Net: despite being a real, vendor-confirmed and patched flaw, this is a LOW-to-MODERATE real-world priority - a hardening fix for a niche code path - rather than an urgent high-risk vulnerability. My independently assessed severity is Medium (~5.3).

Exploit ScenarioDerived

An image-processing web service accepts user-uploaded EPS/PostScript files, has Ghostscript installed, and rasterizes them with Pillow's im.load(scale=2) for sharper output. An attacker uploads a ~110-byte EPS declaring a 9000×9000 bounding box (just under the pixel limit); Pillow accepts it, then asks Ghostscript to render 18000×18000 (~3.6× MAX_IMAGE_PIXELS), burning CPU and writing a ~972 MB temporary PNM before the belated size check fires, exhausting worker CPU and temp disk per request. A reproducer demonstrating the oversized -g geometry reaching gs is published in the advisory.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 20, 2026

Denial of service in Pillow's EPS decoder: when an application opens an untrusted Encapsulated PostScript file and rasterizes it through Ghostscript with load(scale=N) for N greater than 1, Pillow multiplies the file-declared pixel count by N and passes that geometry to gs as -g width x height without ever calling Image._decompression_bomb_check() on the scaled size, so Ghostscript renders N² times the operator's MAX_IMAGE_PIXELS budget and writes the full raw PNM to a temp file before the limit is enforced. A roughly 100-byte EPS declaring 9000x9000 (81 Mpx, just under the 89,478,485-pixel default) is accepted by Image.open() and, at scale 2, makes each request render 18000x18000 = 324 Mpx and produce a 972 MB temporary file, with 2.2 GB at scale 3 and 8.6 GB at scale 4. Affected packages are pip/Pillow from 2.3.0 through 12.3.0 (fixed in 13.0.0); exploitation requires Ghostscript to be installed and the application to call EpsImageFile.load() with a fixed integer scale above 1 on untrusted input, and severity is bounded because the multiplier is chosen by the application rather than the file, so this adds a constant factor to a no-timeout Ghostscript DoS that such applications already permit. No public exploit code was identified at time of analysis, and no CVSS vector, EPSS score, or CISA KEV entry is available in the supplied data, so standard prioritization signals are missing and cannot be cited as confirmed.

RemediationAI

Upgrade to Pillow 13.0.0, which is the vendor-released fixed version; the upstream fix in commit 3e8cc105588d1dfe062fcada0b6058c1b5f14b65 adds Image._decompression_bomb_check((width, height)) inside Ghostscript() immediately after the scaled width/height are computed, so load(scale=N) raises DecompressionBombError (or emits DecompressionBombWarning) before the gs subprocess is spawned. If upgrading immediately is not possible, the actionable compensating controls are: refuse to pass scale > 1 for untrusted input and always call load() with the default scale=1 (this restores the checked extent, but note that with the default warning filter Image.open() still permits up to 2x MAX_IMAGE_PIXELS, and callers should promote DecompressionBombWarning to an error via warnings.simplefilter('error', Image.DecompressionBombWarning)); lower Image.MAX_IMAGE_PIXELS to a small value sized for the deployment so that even an N² overshoot stays within available temp-disk and CPU budget, at the cost of rejecting legitimate large EPS artwork; wrap the Ghostscript invocation with an external timeout and a bounded TMPDIR/tmpfs quota (or run EPS rendering in a worker with disk and CPU rlimits), which contains both this amplification and the pre-existing no-timeout gs hang but adds latency and can abort legitimate long renders; and re-encode or reject EPS input at the upload boundary, or render only via a sandboxed converter, trading compatibility for removal of the attack surface. Note that the proposed in-tree check re-emits a duplicate DecompressionBombWarning at scale=1 unless guarded with 'if scale > 1:'; that is cosmetic only. Vendor advisory: https://github.com/python-pillow/Pillow/security/advisories/GHSA-vx6w-vv9f-6gvg.

Affected Packages

pypi pillow fix: 13.0.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in pypi

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Pillow delegates EPS/PostScript rasterization to an external Ghostscript binary. EpsImageFile._open() derives the image extent from the file's %%BoundingBox (or %ImageData) header, and Image.open() runs Image._decompression_bomb_check() once against that unscaled size, raising DecompressionBombError above 2x MAX_IMAGE_PIXELS (default 89,478,485 pixels) and only warning between 1x and 2x. The module-level Ghostscript() helper in src/PIL/EpsImagePlugin.py then computes width = size[0] * scale and height = size[1] * scale from the application-supplied integer scale, converts those to -r resolution, and builds a subprocess command with '-g{width}x{height}' plus -sDEVICE=pnmraw and -sOutputFile pointing at a tempfile.mkstemp() path. No bomb check is applied to the scaled product before subprocess.check_call() runs, so the only re-validation happens afterwards when Pillow reopens the emitted PNM with Image.open() at line ~166 - meaning the CPU cost and the width*height*3 byte temp-file write are already incurred. This is CWE-770 (Allocation of Resources Without Limits or Throttling) expressed as a constant-factor amplification rather than unbounded growth: N is set by the calling application, and the worst case is N² x MAX_IMAGE_PIXELS (or N² x 2 x MAX_IMAGE_PIXELS if DecompressionBombWarning is not promoted to an error). Pillow's in-process memory allocation stays bounded and there is no memory corruption. The gap is the EPS analogue of the WMF load(dpi) issue fixed in commit af70b075a, where WmfStubImageFile.load() now calls Image._decompression_bomb_check(self.size) on the recomputed extent before rendering; the EPS path never received the equivalent line and has been exposed since the decompression-bomb limit was introduced in ce2955ec7 (Pillow 2.5.0). Unlike the WMF case, the file cannot influence the ratio. Separately, any deployment that feeds untrusted PostScript to gs is already exposed to a trivial infinite-loop DoS because Pillow invokes Ghostscript without a timeout.

Know when Python gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

vuln.today AI 5.3 MEDIUM

A tiny untrusted uploaded file is processed remotely with no auth or interaction (AV:N/AC:L/PR:N/UI:N); impact is availability-only and bounded to a constant N² factor, hence A:L and C:N/I:N.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N

Estimated by vuln.today — no official severity rating has been published for this CVE yet.

DescriptionCVE.org

============================================================================
EPS load(scale) lets Ghostscript render past the decompression bomb limit
Location: src/PIL/EpsImagePlugin.py:92  in Ghostscript()
Commit:   a707c6b21c313880d0771e54965d142dd42358b6
============================================================================

When an application opens an untrusted Encapsulated PostScript file and asks Pillow to render it at a larger scale, Pillow has Ghostscript produce an image several times bigger than Pillow's configured size limit allows. The size check runs only after Ghostscript has finished rendering and written the full raw image to a temporary file. An attacker who can upload a file of about 100 bytes makes each such request spend scale² times the Ghostscript rendering work and temporary disk space that the limit is meant to permit. For example, at scale 2 that is a 972 MB temporary file.

The cause is in Ghostscript() in src/PIL/EpsImagePlugin.py. It multiplies the file-declared size by the caller's scale (lines 93-94) and passes the product to gs as the -g output geometry. It never calls Image._decompression_bomb_check() on the scaled size. The only check is the one Image.open() ran on the unscaled size, so a file declaring 9000×9000 passes, and load(scale=2) then asks Ghostscript for 18000×18000 (3.6× MAX_IMAGE_PIXELS). A file declaring 18000×18000 directly would be refused before Ghostscript ever ran. DecompressionBombError fires only when Pillow reopens the output file, so Pillow's own in-process allocation stays bounded and there is no memory corruption.

The effect is a constant-factor overshoot rather than an unbounded one, for three reasons:

  • The multiplier is an integer chosen by the application, not by the file.
  • With the default warning filter, Image.open() already lets files up to 2× the limit reach Ghostscript at scale=1.
  • Any application feeding untrusted files to Ghostscript is already exposed to a tiny file that keeps Ghostscript busy indefinitely, since gs runs with no timeout.

This is the EPS counterpart of the WMF load(dpi) gap closed in af70b075a. It has been present since the decompression-bomb limit was introduced in ce2955ec7 (2.5.0). The attached reproducer stubs out Ghostscript and shows a 76-byte file passing Image.open() and reaching gs with -g18000x18000. A one-line patch mirroring the WMF check is included.

Details

EpsImageFile.load(scale=N) (the documented way to rasterise an EPS at higher resolution) renders width*N × height*N pixels through Ghostscript, but the only decompression-bomb check on the way is the one Image.open() ran on the *unscaled*, file-declared width × height. The scaled product is never passed to Image._decompression_bomb_check() before gs is started.

This 111-byte EPS declares 9000×9000 = 81,000,000 pixels, below the default MAX_IMAGE_PIXELS (89,478,485), so Image.open() accepts it without even a warning:

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 9000 9000
%%EndComments
0 0 moveto 9000 9000 lineto stroke
showpage

im.load(scale=2) on it then executes

gs -q -g18000x18000 -r144.000000x144.000000 -dBATCH -dNOPAUSE -dSAFER -sDEVICE=pnmraw -sOutputFile=/tmp/tmpXXXX -c 0 0 translate -f attack.eps -c showpage

i.e. asks Ghostscript for an 18000×18000 = 324,000,000-pixel raster (3.6× MAX_IMAGE_PIXELS), whose pnmraw output is a 972,000,019-byte file in the temp directory. An EPS that declares 18000×18000 directly is rejected by Image.open() with DecompressionBombError before Ghostscript is ever run; via scale=2 the same raster is rendered first and the DecompressionBombError only appears afterwards, when Pillow opens the file Ghostscript produced. (Between 1× and 2× MAX_IMAGE_PIXELS, Image.open() only emits DecompressionBombWarning, so with the default warning filter an EPS declaring e.g. 13377×13377 is already rendered at scale=1 - a 537 MB PNM. Against that baseline, scale=2 is 4× an already-permitted render.)

The arithmetic is in Ghostscript():

python
# src/PIL/EpsImagePlugin.py:91-97
# Hack to support hi-res rendering
    scale = int(scale) or 1
    width = size[0] * scale
    height = size[1] * scale
# resolution is dependent on bbox and size
    res_x = 72.0 * width / (bbox[2] - bbox[0])
    …
# src/PIL/EpsImagePlugin.py:139-142
    command = [
        gs_binary,
        "-q",
# quiet mode
        f"-g{width:d}x{height:d}",
# set output geometry (pixels)
    …
# src/PIL/EpsImagePlugin.py:165-168
        subprocess.check_call(command, startupinfo=startupinfo)
        with Image.open(outfile) as out_im:
            out_im.load()
            return out_im.im.copy()

and its caller does nothing between taking scale from the application and invoking it:

python
# src/PIL/EpsImagePlugin.py:411-417
    def load(self, scale: int = 1, transparency: bool = False) -> …:
# Load EPS via Ghostscript
        if self.tile:
            assert self.fp is not None
            self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency)

size here is self._size, computed in _open() from the file's %%BoundingBox (or %ImageData) and checked once by Image.open() at src/PIL/Image.py:3700. For the benign path (scale=1) that check covers exactly what Ghostscript is asked to render. For scale=N the rendered pixel count is N² times what was checked, so a file can sit just under the limit at open time and have Ghostscript render 4× (scale 2), 9× (scale 3), 16× (scale 4) the configured budget. The first point at which Pillow looks at the real size again is Image.open(outfile) at line 166 - after subprocess.check_call has returned, i.e. after Ghostscript has spent the CPU and written width*height*3 bytes to tempfile.mkstemp()'s directory.

WmfStubImageFile.load(dpi) has the same shape (file-derived extent × caller-supplied factor → new raster) and, since af70b075a, calls Image._decompression_bomb_check(self.size) on the recomputed size before rendering (src/PIL/WmfImagePlugin.py:127-131). The EPS path lacks the equivalent line. The gap dates from ce2955ec7128 ("Throw an exception when an opened image is larger than an arbitrary limit", 2014-05-14, first released in 2.5.0), which added the check to Image.open() without covering the scale path.

Impact

Affected are applications that open untrusted EPS/PS with Ghostscript installed and call load(scale=N) with a fixed N > 1, as the handbook suggests for non-blurry output. Handing untrusted EPS to Ghostscript at all already lets the same attacker tie up a worker with an equally tiny file (e.g. a PostScript {} loop; Pillow runs gs with no timeout), so this bug adds a constant factor rather than a new denial-of-service capability. Within that setting, a ~110-byte upload makes each request run Ghostscript over N² × MAX_IMAGE_PIXELS pixels (N² × 2·MAX_IMAGE_PIXELS if the application does not turn DecompressionBombWarning into an error) and write a W·H·3-byte PNM into the temp directory - 972 MB for the example above at scale 2, 2.2 GB at scale 3, 8.6 GB for a 178-Mpixel declaration at scale 4 - before any limit is applied. The operator's MAX_IMAGE_PIXELS setting is exceeded by a factor of N²; N is an integer chosen by the application, not by the file, so the work stays bounded at N² × 2·MAX_IMAGE_PIXELS. The consequence is N² more Ghostscript CPU and temp-disk use per request than the configured limit intends; Pillow's own in-process pixel allocation remains bounded because Image.open(outfile) re-checks the PNM's size, and there is no memory corruption.

This is a sibling of the WMF load(dpi) issue fixed in af70b075a ("Add decompression bomb check when loading at a different DPI"); the EPS scale path was not covered by that change. Unlike the WMF case, where the file-controlled _inch makes the ratio unbounded, the EPS multiplier is fixed by the application.

Reproducing

Run repro against the installed Pillow. Ghostscript does not need to be installed: the script sets EpsImagePlugin.gs_binary = "gs" so that has_ghostscript() skips its gs --version probe, and replaces subprocess.check_call with a function that records the command line Pillow builds and then raises OSError, so nothing is actually rendered.

It writes a 76-byte EPS declaring %%BoundingBox: 0 0 9000 9000 (the example above without the drawing line; 81 Mpixel, below the default MAX_IMAGE_PIXELS of 89,478,485) and turns DecompressionBombWarning into an error, so any bomb check - warning or hard error - counts. It then calls Image.open() and im.load(scale=2). Image.open() accepts the file and load(scale=2) reaches the intercepted Ghostscript call with -g18000x18000 (324,000,000 pixels, 3.6× MAX_IMAGE_PIXELS, a 972 MB pnmraw output with real Ghostscript). The script prints the geometry it captured.

It prints BUG when Ghostscript was invoked with a -g geometry above 2*MAX_IMAGE_PIXELS (178,956,970) and no decompression-bomb check fired before that call; otherwise it prints OK. With the attached patch applied, load(scale=2) raises DecompressionBombError before Ghostscript is called and the script prints OK.

Suggested fix

The attached patch checks the scaled size in Ghostscript() right after the scaled width/height are computed (src/PIL/EpsImagePlugin.py:93-94) and before the gs command is built, mirroring WmfStubImageFile.load:

diff
--- a/src/PIL/EpsImagePlugin.py
+++ b/src/PIL/EpsImagePlugin.py
@@ -92,6 +92,7 @@ def Ghostscript(
     scale = int(scale) or 1
     width = size[0] * scale
     height = size[1] * scale
+    Image._decompression_bomb_check((width, height))
# resolution is dependent on bbox and size
     res_x = 72.0 * width / (bbox[2] - bbox[0])
     res_y = 72.0 * height / (bbox[3] - bbox[1])

load(scale=N) now raises DecompressionBombError / emits DecompressionBombWarning under the same MAX_IMAGE_PIXELS thresholds Image.open() applies, before Ghostscript runs instead of after. Placing the check in Ghostscript() rather than in EpsImageFile.load() is the single point where the rendered extent is decided, so it also covers direct callers of the module-level function. With the patch applied to a clean checkout the reproducer prints OK and Tests/test_file_eps.py passes. One cosmetic side effect: at scale=1 the check re-emits the DecompressionBombWarning that Image.open() already issued for sizes between 1× and 2× the limit; guarding the call with if scale > 1: would avoid the duplicate.

The patch also adds test_load_scale_decompression_bomb to Tests/test_file_eps.py, in the style of the WMF test: it sets MAX_IMAGE_PIXELS to im.width * im.height and expects im.load(scale=2) to raise DecompressionBombError. Like the rest of that file it is skipped without Ghostscript, because has_ghostscript() is consulted at the top of Ghostscript(); moving the check above that call would let the test run without it.

The patch

Add decompression bomb check on the scaled size in EpsImagePlugin.Ghostscript() before Ghostscript is invoked

Applies to src/PIL/EpsImagePlugin.py at the commit above.

diff
diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py
index 70eced62a..de331d97f 100644
--- a/Tests/test_file_eps.py
+++ b/Tests/test_file_eps.py
@@ -98,6 +98,14 @@ def test_sanity(filename: str, size: tuple[int, int], scale: int) -> None:
         assert image.format == "EPS"


+@pytest.mark.skipif(not HAS_GHOSTSCRIPT, reason="Ghostscript not available")
+def test_load_scale_decompression_bomb(monkeypatch: pytest.MonkeyPatch) -> None:
+    with Image.open(FILE1) as im:
+        monkeypatch.setattr(Image, "MAX_IMAGE_PIXELS", im.width * im.height)
+        with pytest.raises(Image.DecompressionBombError):
+            im.load(scale=2)
+
+
 @pytest.mark.skipif(not HAS_GHOSTSCRIPT, reason="Ghostscript not available")
 def test_load() -> None:
     with Image.open(FILE1) as im:
diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py
index 5eaefe339..ccc6f1d85 100644
--- a/src/PIL/EpsImagePlugin.py
+++ b/src/PIL/EpsImagePlugin.py
@@ -92,6 +92,7 @@ def Ghostscript(
     scale = int(scale) or 1
     width = size[0] * scale
     height = size[1] * scale
+    Image._decompression_bomb_check((width, height))
# resolution is dependent on bbox and size
     res_x = 72.0 * width / (bbox[2] - bbox[0])
     res_y = 72.0 * height / (bbox[3] - bbox[1])

The reproducer

<details> <summary>Reproducer - <code>repro</code>, 1,845 bytes (click to open)</summary>

Its last line is BUG when the issue triggers and OK when it does not. Re-run on a clean build of that commit it printed BUG.

python
#!/usr/bin/env python3
# EpsImagePlugin.Ghostscript(): load(scale=N) hands gs a -g geometry of
# (W*N)x(H*N) with no _decompression_bomb_check on the scaled size; only the
# unscaled WxH was checked by Image.open(). gs is not installed here, so we
# set gs_binary and intercept subprocess.check_call to read the argv Pillow builds.
import os, subprocess, tempfile, warnings
from PIL import Image, EpsImagePlugin

EpsImagePlugin.gs_binary = "gs"
# skip the `gs --version` probe
path = os.path.join(tempfile.mkdtemp(), "a.eps")
with open(path, "w") as f:
# 9000x9000 = 81 Mpx < MAX_IMAGE_PIXELS (89.5 Mpx)
    f.write("%!PS-Adobe-3.0 EPSF-3.0\n%%BoundingBox: 0 0 9000 9000\n%%EndComments\nshowpage\n")

calls = []
def fake_check_call(cmd, **kw):
    calls.append(cmd)
    raise OSError("gs intercepted")
# stop here; we only need the argv
subprocess.check_call = fake_check_call

hard = 2 * Image.MAX_IMAGE_PIXELS
bomb_before_gs = False
with warnings.catch_warnings():
    warnings.simplefilter("error", Image.DecompressionBombWarning)
    try:
        with Image.open(path) as im:
            print("Image.open accepted", os.path.getsize(path), "byte EPS, size", im.size)
            im.load(scale=2)
    except (Image.DecompressionBombError, Image.DecompressionBombWarning) as e:
        bomb_before_gs = not calls
        print("bomb check fired", "before" if bomb_before_gs else "after", "gs:", e)
    except OSError as e:
        print("load() reached gs:", e)

over = False
for c in calls:
    g = next(a for a in c if a.startswith("-g"))[2:]
    w, h = map(int, g.split("x"))
    over |= w * h > hard
    print(f"gs argv geometry -g{g} = {w*h} px ({w*h/Image.MAX_IMAGE_PIXELS:.1f}x MAX_IMAGE_PIXELS, "
          f"hard limit {hard}); pnmraw output would be {w*h*3} bytes")
print("BUG" if calls and over and not bomb_before_gs else "OK")

</details>

---

Threat Intelligence Overview

Prevalence
High
Pillow is a very widely deployed Python imaging library
Threat Intel
1
1 source
Data Quality
2 sources
Confidence: Low
CVE.org GHSA GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

Affected Products (CPE)CVE.org

pkg:pip/pillow

More in Python

View all
CVE-2025-24016 CRITICAL POC
9.9 Feb 10

Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t

CVE-2025-27520 CRITICAL POC
9.8 Apr 04

BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser

CVE-2025-2945 CRITICAL POC
9.9 Apr 03

pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi

CVE-2013-5093 MEDIUM POC
6.8 Sep 27

The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python

CVE-2025-32375 CRITICAL POC
9.8 Apr 09

BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica

CVE-2014-0224 HIGH POC
7.4 Jun 05

OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph

CVE-2024-21644 HIGH POC
7.5 Jan 08

pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.

CVE-2026-33017 CRITICAL POC
9.3 Mar 17

Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301

CVE-2017-9462 HIGH POC
8.8 Jun 06

In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse

CVE-2026-49869 CRITICAL POC
10.0 Jun 26

Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to

CVE-2026-39987 CRITICAL POC
9.3 Apr 08

Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/

CVE-2024-21645 MEDIUM POC
5.3 Jan 08

pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy