CVE-2026-97689
Executive Summary
CVE-2026-97689 is a denial-of-service (DoS) vulnerability in the Python urllib3 HTTP client library. It affects versions from 1.10.3 up to (but not including) 2.8.0, where the HTTPResponse.read_chunked and HTTPResponse.stream methods allocate unbounded memory when processing malformed chunked transfer encoding responses. A malicious or compromised HTTP server can exploit this flaw to exhaust client-side process memory, leading to application crashes or resource exhaustion.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
The vulnerability resides in urllib3's HTTP chunked transfer encoding parser. Per the NVD description, when a server responds with Transfer-Encoding: chunked, the client's streaming chunk parser reads the chunk-size field by buffering bytes until it encounters a newline (\n) or end-of-file (EOF). There is no maximum length bound applied to this buffering operation.
Specifically, the methods HTTPResponse.read_chunked and HTTPResponse.stream are affected. A malicious server can send a Transfer-Encoding: chunked response and then transmit a very long run of bytes without ever sending a newline character. Because the parser must buffer the entire chunk-size line to determine where the chunk data begins, it will continue to allocate memory for these bytes indefinitely. This results in unbounded memory allocation in the client process.
The root cause maps to CWE-770 (Allocation of Resources Without Limits or Throttling). The attack is network-based and requires no authentication or user interaction. The vulnerability is triggered solely by the server's response, meaning any application using an affected urllib3 version to make HTTP requests to external or untrusted endpoints is potentially vulnerable.
The issue is fixed in version 2.8.0, where a length bound is presumably enforced on the chunk-size field buffering. No public proof-of-concept (PoC) or exploit code is available, and the CVSS vector is not provided by NVD, but the impact is rated as high availability due to memory exhaustion.
Exploitation Scenarios
Reconnaissance/target identification: An attacker identifies a victim application or service that uses an affected version of
urllib3(1.10.3 to <2.8.0) to make outbound HTTP requests. This could be a web application, microservice, or any Python-based client that fetches resources from URLs controlled or influenced by the attacker.Triggering the flaw class: The attacker controls or compromises an HTTP server that the victim client connects to. The server responds to an HTTP request with a header
Transfer-Encoding: chunked. It then begins sending a response body consisting of a very long sequence of bytes without a newline character. This causes the client's chunk parser to buffer the incomplete chunk-size line indefinitely. The vulnerability class is a resource exhaustion / denial-of-service through malformed input handling.Payload/execution method at the vulnerability-class level: The "payload" is simply a stream of bytes (no newline) sent after the chunked transfer encoding header. No code execution is required; the attack relies on the client's parser behavior. The attacker can maintain the connection and continue sending bytes, causing the client process's memory usage to grow until it crashes, becomes unresponsive, or is killed by the operating system's out-of-memory (OOM) killer.
Post-exploitation impact: Successful exploitation results in a denial of service on the client side. The affected process may crash, hang, or consume excessive system memory, potentially affecting other processes on the same host. In a multi-tenant or containerized environment, this could lead to broader service disruption. No confidentiality or integrity impact is expected.
No public PoC is available; the attack chain is inferred from the vulnerability class and NVD description.
Impact Assessment
The vulnerability allows a remote, unauthenticated attacker to cause a denial of service on systems using affected urllib3 versions. The CVSS v3.1 vector (as estimated) indicates network attack vector (AV:N), low attack complexity (AC:L), no privileges required (PR:N), no user interaction (UI:N), and high availability impact (A:H). Confidentiality and integrity impacts are none. The blast radius includes any application, service, or script that uses urllib3 to make HTTP requests to untrusted or attacker-controlled endpoints. Given the widespread use of urllib3 in Python ecosystems (including as a dependency of requests), the potential impact is broad. However, exploitation requires the attacker to control the server side of the HTTP communication, which may limit scenarios to malicious external services, compromised upstreams, or man-in-the-middle positions.
Detection Guidance
Sigma Rule
title: urllib3 Unbounded Memory Allocation via Malformed Chunked Encoding
id: 3f8a1c2e-5b7d-4a9f-8c3e-1d2f4a6b8c9e
status: experimental
description: Detects potential exploitation of CVE-2026-97689 where a server sends a very long unterminated chunk-size line in a chunked transfer encoding response, leading to unbounded memory allocation in urllib3 clients.
author: Threat Intelligence
date: 2026-01-01
logsource:
category: application
product: python
service: urllib3
detection:
selection:
EventID: 1001 # Hypothetical application log event for HTTP response parsing errors
Message|contains: 'chunked'
Message|contains: 'newline'
condition: selection
fields:
- Message
- SourceIP
- DestinationIP
falsepositives:
- Legitimate large chunked responses with delayed newlines (rare)
level: high
YARA Rule
rule CVE_2026_97689_urllib3_Memory_Exhaustion
{
meta:
description = "Detects Python scripts or binaries that may be vulnerable to CVE-2026-97689"
author = "Threat Intelligence"
date = "2026-01-01"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-97689"
severity = "high"
strings:
$s1 = "read_chunked" ascii wide nocase
$s2 = "HTTPResponse" ascii wide nocase
$s3 = "urllib3" ascii wide nocase
$s4 = "Transfer-Encoding" ascii wide nocase
condition:
(uint16(0) == 0x5A4D or uint32(0) == 0x464C457F) and // PE or ELF
any of ($s1, $s2, $s3) and $s4
}
Suricata IDS Rule
alert tcp any any -> any any (msg:"CVE-2026-97689 urllib3 Unbounded Memory Allocation via Chunked Encoding"; flow:to_client,established; content:"Transfer-Encoding|3a| chunked"; nocase; content:"|0a|"; distance:0; within:10; pcre:"/Transfer-Encoding\x3a\s*chunked\r\n\r\n[^\n]{10000,}/i"; sid:1000001; rev:1;)
Note: This rule attempts to detect a chunked response with a very long initial line without newline. Due to TCP stream reassembly limitations, a more robust detection would require stateful inspection.
Elastic Detection
sequence by process.entity_id
[network where network.protocol == "http" and http.response.headers contains "Transfer-Encoding: chunked"]
[network where network.protocol == "http" and length(http.response.body) > 1000000 and not http.response.body contains "\n"]
Splunk SPL Query
index=proxy OR index=network sourcetype=http
| search "Transfer-Encoding: chunked"
| rex field=http_response_body "(?<chunk_line>[^\n]+)"
| where len(chunk_line) > 10000
| stats count by src_ip, dest_ip, url
| where count > 0
Wazuh OSSEC Rule
<group name="urllib3,CVE-2026-97689,">
<rule id="100100" level="12">
<decoded_as>json</decoded_as>
<field name="event_type">http_response</field>
<match>Transfer-Encoding: chunked</match>
<regex>[^\n]{10000,}</regex>
<description>CVE-2026-97689: Potential urllib3 unbounded memory allocation via malformed chunked encoding</description>
<mitre>
<id>T1190</id>
</mitre>
</rule>
</group>
Mitigation & Patch Guidance
Patch confidence: 0/4 (UNPATCHED — no patch evidence from any tracked source).
Immediate mitigations:
- Avoid making HTTP requests to untrusted or user-controlled endpoints using affected
urllib3versions. - Implement network-level filtering or application-level timeouts to limit the duration of HTTP responses.
- Monitor client process memory usage for anomalies when communicating with external servers.
- If possible, use a reverse proxy or HTTP client with built-in response size limits.
- Avoid making HTTP requests to untrusted or user-controlled endpoints using affected
Patch/upgrade steps:
- Upgrade
urllib3to version 2.8.0 or later. This version contains the fix for the unbounded memory allocation. - For applications using
requests, upgrade to a version that depends onurllib3 >= 2.8.0. - Verify the upgrade by checking
pip show urllib3or equivalent.
- Upgrade
Long-term hardening:
- Enforce strict limits on HTTP response sizes and header lengths at the application or proxy level.
- Adopt a security-focused dependency management process to track CVEs in critical libraries like
urllib3. - Consider using a language or library with built-in protections against unbounded memory allocation in protocol parsers.
- Conduct regular security assessments of third-party dependencies.
References
- NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-97689
- urllib3 GitHub Repository: https://github.com/urllib3/urllib3
- CWE-770: Allocation of Resources Without Limits or Throttling: https://cwe.mitre.org/data/definitions/770.html
- Python Security Advisories: https://www.python.org/security/
- CISA KEV: Not applicable (CVE not listed as of report date).
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.