Skip to main content

urllib3 EUVDEUVD-2026-89007

| CVE-2026-97688 MEDIUM
Loop with Unreachable Exit Condition (Infinite Loop) (CWE-835)
2026-09-29 GitHub_M GHSA-gh4c-6fx4-qh6g
6.9
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Lure client to attacker-controlled/compromised server
  2. Delivery
    Server returns chunked deflate body with trailing bytes
  3. Exploit
    Decoder re-decodes unconsumed_tail after EOF
  4. Execution
    Infinite loop pins CPU, request never completes
  5. Impact
    Client worker hangs, denial of service

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Loop termination conditions
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 ALL of the following on the victim client: (1) the application uses vulnerable urllib3 2.6.2 through 2.7.x; (2) it consumes the response via HTTPResponse.stream() or read_chunked() with content decoding enabled (decode_content=True) and a positive finite streaming chunk size (amt=N), not preloaded content; (3) the client connects to a server the attacker controls or has compromised, since this is a client-side flaw triggered by the SERVER's response - not a listener an attacker can reach directly. The malicious response must carry Transfer-Encoding: chunked AND Content-Encoding: deflate, a decoded body larger than the chunk size, and trailing bytes appended after the deflate stream. LIMITING FACTORS: the attacker must be able to steer the client to a hostile endpoint (malicious URL, SSRF target, MITM, or compromised upstream); default preload_content=True usage or brotli/zstd encodings are not affected in the same way; no impact to confidentiality or integrity.

Impact

This is a genuine but moderate-severity availability-only issue. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L) correctly captures a network-reachable, unauthenticated, no-interaction denial-of-service with no confidentiality or integrity impact, scoring 6.9. The critical nuance is the direction of the attack: this is a CLIENT-side vulnerability where a MALICIOUS or COMPROMISED SERVER victimizes a urllib3-using client - not a server-side flaw an attacker sprays against exposed services. That inversion, combined with the specific trigger conditions (chunked + deflate + trailing bytes + finite streaming amt), meaningfully limits real-world exploitability despite PR:N/UI:N. No EPSS score, KEV listing, or public POC was provided in the intelligence, and the reporter is a GitHub advisory (GHSA-gh4c-6fx4-qh6g) rather than an in-the-wild disclosure - consistent with a responsibly-disclosed library bug, not an actively exploited threat. Signals are mutually consistent: high theoretical reachability (VA:L, AC:L) but no evidence of exploitation and a narrow trigger surface. The VA:L (low availability) rating is arguably conservative given the loop is infinite and read timeouts do not interrupt it, so a single request can pin a worker thread indefinitely (I would lean A:H at CVSS 3.1). Net: real and worth patching, especially for services that fetch from untrusted URLs, but not an emergency for typical clients calling trusted endpoints.

Exploit ScenarioDerived

An attacker who controls a server (or can MITM/redirect an application into fetching an attacker-controlled URL) returns an HTTP response with Transfer-Encoding: chunked and Content-Encoding: deflate, where the deflate stream is followed by extra trailing bytes and the decoded body exceeds the client's finite streaming chunk size. When the vulnerable urllib3 client (2.6.2-2.7.x) calls HTTPResponse.stream() or read_chunked() with content decoding enabled, the Deflate decoder repeatedly re-processes the unconsumed trailing bytes after EOF without progress, spinning CPU forever with the request never completing and read timeouts unable to break the loop. No public POC was provided, though the fix commit includes a regression test that constructs the malicious payload.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.3% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Sep 29, 2026

A malicious or compromised HTTP server can pin the CPU and hang a Python client indefinitely by returning a chunked, deflate-encoded response that carries trailing bytes after the compressed stream, causing urllib3 2.6.2 through 2.7.x to loop without progress. The hang is reachable only on the client streaming path - HTTPResponse.stream() or HTTPResponse.read_chunked() with content decoding enabled (decode_content=True) and a positive finite chunk size (amt=N) - where the Deflate decoder retains the trailing bytes as unconsumed input after end-of-stream and re-decodes them forever; because no further socket read occurs, network read timeouts never interrupt the loop. Impact is availability-only (no confidentiality or integrity effect), unauthenticated from the network per the reported vector (PR:N), and no public exploit identified at time of analysis; exploitation additionally requires the attacker to control or compromise the endpoint the client connects to.

RemediationAI

Upgrade to urllib3 2.8.0, the vendor-released patch that resolves GHSA-gh4c-6fx4-qh6g (see the advisory at https://github.com/urllib3/urllib3/security/advisories/GHSA-gh4c-6fx4-qh6g, the fix commit at https://github.com/urllib3/urllib3/commit/ea2ad7b21a80da3632f80016526a18864586077f, and the release at https://github.com/urllib3/urllib3/releases/tag/2.8.0); if you vendor or pin the library, refresh lockfiles and transitive dependency constraints so no environment is left on 2.6.2 through 2.7.x. If an immediate upgrade is not possible, avoid the vulnerable code path for responses from endpoints you do not fully trust: call stream()/read_chunked() with decode_content=False and perform deflate decoding yourself with a bounded decompressor (zlib.decompressobj plus an explicit max_length and a hard iteration/CPU budget that aborts on eof), trading away urllib3's transparent content-decoding convenience; alternatively consume responses with the default preload_content=True path where the assessed conditions do not apply in the same way. Note that socket/network read timeouts are explicitly NOT an effective mitigation here, because the loop performs no further socket reads once it is spinning - only CPU-bound guards, such as running the fetch in a separate process with a hard wall-clock/CPU kill, will recover the worker, and that adds process-isolation overhead. Reducing attacker ability to steer requests (egress allowlisting, blocking user-supplied URLs, hardening SSRF-prone endpoints, and enforcing TLS validation to blunt MITM/compromised-upstream delivery) lowers the chance of receiving the crafted chunked-deflate response in the first place.

Affected VersionsENISA

urllib3 2.6.2, < 2.8.0

Affected Packages

pypi urllib3 fix: 2.8.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

The root cause is CWE-835 (Loop with Unreachable Exit Condition, i.e. an infinite loop) inside urllib3's response decompression layer. When a response is framed with Transfer-Encoding: chunked and Content-Encoding: deflate, urllib3 wraps the chunked stream with a DeflateDecoder built on zlib. zlib's decompressobj exposes an unconsumed_tail buffer of input bytes that were not consumed by a bounded decompress(data, max_length) call, and urllib3 re-feeds that buffer in a loop so that a bounded read (amt=N) can be satisfied when the decoded body exceeds the requested chunk size. The bug: once the deflate stream reaches end-of-stream (the decompressor's eof flag is set), trailing bytes sent after the compressed stream can no longer produce output, yet the decoder still saw a non-empty unconsumed_tail and was not in its first-try mode, so it re-entered the decode loop on data that could never advance - spinning indefinitely while the HTTPResponse.stream()/read_chunked() caller waits for more output. The upstream fix (commit ea2ad7b21a80da3632f80016526a18864586077f) short-circuits decompression to return b"" when self._obj.eof is already true and adds "and not self._obj.eof" to the unconsumed_tail re-loop condition, so trailing data after EOF is discarded instead of retried. The affected component is the Python urllib3 HTTP client library itself (CPE cpe:2.3:a:urllib3:urllib3:*:*:*:*:*:*:*:*); the flaw is client-side and is triggered by the server's response, not by attacker-reachable request parsing. Note that brotli and zstd decoders raise DecodeError on the same malformed input rather than hanging, which is why the loop is specific to the Deflate path.

Know when Urllib3 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

Vendor (GitHub_M) PRIMARY 6.9 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
vuln.today AI 7.5 HIGH

Network-reachable via a malicious server response, no auth or interaction, and the infinite loop with non-interruptible timeouts pins a worker indefinitely, so A:H; no confidentiality or integrity impact.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
SUSE 5.3 MEDIUM
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
Red Hat 5.3 MEDIUM

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
Low
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Sep 29, 2026 - 17:17 EUVD
CVE Published
Sep 29, 2026 - 15:32 cve.org
MEDIUM 6.9

DescriptionCVE.org

urllib3 is an HTTP client library for Python. From 2.6.2 until 2.8.0, HTTPResponse.stream and HTTPResponse.read_chunked can enter an infinite loop because the Deflate decoder retains trailing bytes as unconsumed input after reaching end-of-stream and repeatedly decodes them without progress. The issue occurs when an untrusted server sends a chunked Deflate response whose decoded body exceeds a positive finite chunk size and whose encoded body has trailing bytes, specifically a response with Transfer-Encoding: chunked and Content-Encoding: deflate, content decoding enabled, and the positive finite amt=N streaming chunk size. The attack mechanism is that a malicious server returns a compressed chunked response with trailing bytes after the Deflate stream. The impact is excessive CPU usage and a request that does not complete, and network read timeouts do not interrupt the loop because no further socket read occurs. This issue is fixed in version 2.8.0.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 38 pypi packages depend on urllib3 (36 direct, 2 indirect)

Ecosystem-wide dependent count for version 2.6.2.

Threat Intelligence Overview

EPSS Score
0.3%
Top 80% exploitable
Prevalence
Ubiquitous
urllib3 is the foundational Python HTTP client behind requests, pip, boto and more
Threat Intel
1
1 source
Data Quality
7 sources
Confidence: High
EUVD 🇯🇵JVN NVD CVE.org EPSS Vulnrichment GHSA Vendor 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 0.3%
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.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact· derived
High
Technical Impact
Partial

Priority Score

34
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +34
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

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

CVE-2024-37891 MEDIUM POC
6.5 Jun 17

urllib3 is a user-friendly HTTP client library for Python. Rated medium severity (CVSS 6.5), this vulnerability is remot

CVE-2019-11236 MEDIUM POC
6.1 Apr 15

In the urllib3 library through 1.24.1 for Python, CRLF injection is possible if the attacker controls the request parame

CVE-2018-20060 CRITICAL
9.8 Dec 11

urllib3 before version 1.23 does not remove the Authorization HTTP header when following a cross-origin redirect (i.e.,

CVE-2025-50181 MEDIUM POC
5.3 Jun 19

urllib3 is a user-friendly HTTP client library for Python. Prior to 2.5.0, it is possible to disable redirects for all r

CVE-2026-97689 HIGH
8.9 Sep 29

Unbounded memory allocation in urllib3 (1.10.3 through 2.7.x) lets a malicious or machine-in-the-middle HTTP server exha

CVE-2025-66418 HIGH
8.9 Dec 05

Resource-exhaustion denial of service in urllib3 1.24 through 2.5.x allows a malicious or attacker-controlled HTTP serve

CVE-2025-66471 HIGH
8.9 Dec 05

A decompression-bomb denial-of-service flaw in the urllib3 Python HTTP client library (versions 1.0 through 2.5.x, fixed

CVE-2026-21441 HIGH
8.9 Jan 07

Uncontrolled resource consumption in the Python urllib3 HTTP client library (versions 1.22 through 2.6.2) lets a malicio

CVE-2023-43804 HIGH
8.1 Oct 04

urllib3 is a user-friendly HTTP client library for Python. Rated high severity (CVSS 8.1), this vulnerability is remotel

CVE-2026-97687 HIGH
7.6 Sep 29

Certificate validation bypass in urllib3 1.26.0 through 2.7.x allows a man-in-the-middle attacker who can impersonate th

CVE-2021-33503 HIGH
7.5 Jun 29

An issue was discovered in urllib3 before 1.26.5. Rated high severity (CVSS 7.5), this vulnerability is remotely exploit

CVE-2020-7212 HIGH
7.5 Mar 06

The _encode_invalid_chars function in util/url.py in the urllib3 library 1.25.2 through 1.25.7 for Python allows a denia

Vendor StatusVendor

SUSE

Severity: Moderate
Product Status
openSUSE Tumbleweed Fixed
SUSE Linux Enterprise High Performance Computing 15 SP4-ESPOS Affected
SUSE Linux Enterprise High Performance Computing 15 SP4-LTSS Affected
SUSE Linux Enterprise High Performance Computing 15 SP5-ESPOS Affected
SUSE Linux Enterprise High Performance Computing 15 SP5-LTSS Affected

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