Skip to main content

urllib3 EUVDEUVD-2026-89000

| CVE-2026-97687 HIGH
Improper Certificate Validation (CWE-295)
2026-09-29 GitHub_M GHSA-8988-9cw3-xx77
7.6
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Gain MITM position on proxy network path
  2. Delivery
    App applies target TLS settings to proxy handshake
  3. Exploit
    proxy_ssl_context.verify_mode overwritten to CERT_NONE
  4. Execution
    Present forged proxy certificate, accepted without verification
  5. Impact
    Intercept/modify forwarded traffic or capture target client certificate

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V12 - Secure Communication Certificate validation
Exploitation Conditions

Requires ALL of the following, which sharply narrow the exposed population: (1) the application must use an HTTPS proxy (not a plain HTTP proxy), specifically HTTPS forwarding (use_forwarding_for_https=True) or a proxy connection that mixes target and proxy TLS policy; (2) the application must configure target-server TLS settings that are supposed to stay separate from the proxy handshake - one of proxy_ssl_context, proxy_assert_hostname, proxy_assert_fingerprint, ssl_context, cert_reqs, verify_mode, or CERT_NONE - where cert_reqs=CERT_NONE can overwrite proxy_ssl_context.verify_mode in place and persist across reused connections; and (3) the attacker must hold a man-in-the-middle position to intercept and impersonate the HTTPS proxy with their own certificate. Limiting factors: end-to-end target TLS via CONNECT tunneling is NOT affected (the separate target TLS connection is preserved); a default urllib3 deployment without an HTTPS proxy, or one that does not override target TLS policy, is not exploitable. urllib3 versions before 1.26.0 or 2.8.0 and later are unaffected.

Impact

This is a genuine but conditional certificate-validation flaw (CWE-295) in urllib3, one of the most widely deployed Python libraries. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N) scores 7.6 and correctly captures high confidentiality AND integrity impact with no availability impact, plus an attack requirement (AT:P) and passive user interaction (UI:P) that reflect the real preconditions. No EPSS score, KEV listing, or public exploit code is present in the input - the referenced GitHub PR (#5093) and two commits are the FIX, not exploit code, so this is 'no public exploit identified at time of analysis,' not active exploitation. The practical risk is gated by two non-trivial prerequisites that raise real-world attack complexity above the vendor's AC:L: the application must (1) use an HTTPS proxy and (2) configure target-server TLS settings (e.g. cert_reqs=CERT_NONE, custom ssl_context, use_forwarding_for_https=True) that bleed into and weaken the proxy handshake, AND the attacker must occupy a man-in-the-middle position on the proxy path. It is therefore a real priority for the specific population running HTTPS-forwarding proxies with mixed target/proxy TLS policy, but not a broadly wormable/mass-exploitable issue for the typical urllib3 user who does not use an HTTPS proxy. Note the vendor uses AC:L in 4.0 while the config-and-MITM dependency argues for higher complexity - this is captured via AT:P/UI:P in 4.0 and via AC:H in the independent 3.1 assessment below.

Exploit ScenarioDerived

A Python application routes HTTPS traffic through an HTTPS proxy while setting target-server TLS options (such as cert_reqs=CERT_NONE or a custom ssl_context), which are erroneously applied to - and can mutate in place - the proxy's certificate policy, disabling proxy certificate verification for reused connections. An attacker positioned on the network path to the proxy impersonates the HTTPS proxy with their own certificate, which the weakened policy now accepts. No public exploit code exists; the attacker must already hold a MITM position and the app must use the vulnerable proxy configuration.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.2% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Sep 29, 2026

Certificate validation bypass in urllib3 1.26.0 through 2.7.x allows a man-in-the-middle attacker who can impersonate the configured HTTPS proxy to intercept, observe, or modify traffic forwarded through that proxy, and in some configurations to obtain the target TLS client certificate. The flaw only affects applications that route requests through an HTTPS proxy while also setting target-server TLS options - proxy_ssl_context, proxy_assert_hostname, proxy_assert_fingerprint, ssl_context, cert_reqs, verify_mode, or CERT_NONE - because those target settings are incorrectly applied to the proxy TLS handshake; in particular, cert_reqs=CERT_NONE can overwrite proxy_ssl_context.verify_mode in place and the mutation persists across reused connections, silently disabling proxy certificate verification. End-to-end target TLS via CONNECT tunneling remains protected, and no public exploit identified at time of analysis; the issue is fixed in urllib3 2.8.0.

RemediationAI

Vendor-released patch: 2.8.0, available from https://github.com/urllib3/urllib3/releases/tag/2.8.0 and detailed in advisory GHSA-8988-9cw3-xx77; upgrading from any 1.26.0-through-2.7.x version to 2.8.0 removes the policy-separation defect. If immediate upgrade is not possible, avoid HTTPS proxy forwarding by setting use_forwarding_for_https=False so CONNECT tunneling is used (this may break deployments that rely on forwarding semantics and does not fix the underlying code path), and always supply an explicit proxy_ssl_context whose verify_mode is CERT_REQUIRED with the correct proxy CA bundle rather than relying on cert_reqs=CERT_NONE or on target ssl_context fallback; note that setting CERT_NONE for target connections remains dangerous because it can persist into reused contexts. Where HTTPS proxies are not essential, routing through plain HTTP proxies avoids the vulnerable proxy TLS handshake entirely, at the cost of losing proxy-channel encryption. Because exploitation requires a man-in-the-middle position on the proxy connection, network-level controls such as strict proxy certificate pinning via proxy_assert_fingerprint or a trusted proxy CA can reduce risk, but these are compensating measures and not substitutes for upgrading to 2.8.0.

Affected VersionsENISA

urllib3 1.26.0, < 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

This is an improper certificate validation flaw (CWE-295) caused by urllib3's HTTPSConnection.connect() and _connect_tls_proxy() reusing target-server TLS policy for the HTTPS proxy handshake instead of keeping proxy and target TLS configuration separate. When an application uses an HTTPS proxy with forwarding (use_forwarding_for_https=True) or otherwise mixes policies, parameters intended for the target - proxy_ssl_context, proxy_assert_hostname, proxy_assert_fingerprint, ssl_context, cert_reqs, verify_mode, and CERT_NONE - can be applied to the proxy connection. The most severe case is cert_reqs=CERT_NONE, which mutates proxy_ssl_context.verify_mode in place, and because the SSLContext is reused, later connections sharing that context may connect to an HTTPS proxy without certificate verification. An attacker with a man-in-the-middle position can then impersonate the HTTPS proxy using their own certificate once the effective proxy policy accepts it, allowing observation or modification of forwarded plaintext and potential collection of a target TLS client certificate. The code-level fix in pull request 5093 splits the proxy handshake path so proxy_config.ssl_context takes precedence for proxy policy, and the pool's ssl_context is used as a fallback only when an HTTPS proxy forwards an HTTP target; the first commit 07408cec79d1856d81bb42c74a904a24fdb9e465 and follow-up commit b6447295fff7b38fdffc67e0df9712d60cef3cc3 implement this separation.

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 7.6 HIGH
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N
vuln.today AI 7.4 HIGH

AC:H because exploitation needs a non-default HTTPS-forwarding proxy config plus an active MITM position; PR:N/UI:N as no victim credentials or interaction are required; C:H/I:H (observe and modify proxy-forwarded traffic, capture client cert), A:N, S:U as end-to-end target TLS is preserved.

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

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
Passive
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
High
Vulnerable system: Availability
None
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:30 cve.org
HIGH 7.6

DescriptionCVE.org

urllib3 is an HTTP client library for Python. From 1.26.0 until 2.8.0, the proxy_ssl_context, proxy_assert_hostname, proxy_assert_fingerprint, ssl_context, cert_reqs, verify_mode, use_forwarding_for_https=True, and CERT_NONE configuration paths fail to remain separated because target-server TLS settings are incorrectly applied to the HTTPS proxy connection. The trigger is that an application uses an HTTPS proxy and configures target-server TLS settings that must remain separate from the proxy TLS handshake, including HTTPS forwarding with target-specific identity or credentials. Applying cert_reqs=CERT_NONE can overwrite proxy_ssl_context.verify_mode in place, and the mutation persists so later connections reusing the same context may connect to the HTTPS proxy without certificate verification. The attack mechanism is that an attacker intercepts and impersonates the HTTPS proxy after the effective proxy policy accepts the attacker's certificate. The impact is that the attacker can observe or modify forwarded traffic or receive a target TLS client certificate, while CONNECT tunneling still preserves the separate end-to-end target TLS connection. 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
  • 25 pypi packages depend on urllib3 (23 direct, 2 indirect)

Ecosystem-wide dependent count for version 1.26.0.

Technical POC Analysis

No runnable PoC and no patch diff are present in the supplied evidence.

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

A high-severity certificate validation bypass in urllib3, a widely used Python HTTP library, could allow attackers to intercept sensitive data transmitted through HTTPS proxies in affected applications. Organizations that route requests through an HTTPS proxy while configuring target-server TLS options are at risk of data confidentiality and integrity breaches. Leadership should prioritize remediation because this vulnerability affects a foundational component across many services and could lead to regulatory or reputational damage if exploited.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.2%
Top 86% exploitable
Prevalence
Ubiquitous
urllib3 is a core Python HTTP library and dependency of requests, in nearly all Python environments
Threat Intel
1
1 sources
Data Quality
7 sources
Confidence: High

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 HIGH
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.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
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact
High
Technical Impact
Total

Priority Score

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

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

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-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

CVE-2019-11324 HIGH
7.5 Apr 18

The urllib3 library before 1.24.2 for Python mishandles certain cases where the desired set of CA certificates is differ

Vendor StatusVendor

SUSE

Severity: Important
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