Cloudanix VulnDB

CVE-2025-66418

High · 8.6

urllib3 allows an unbounded number of links in the decompression chain

CVSS

8.6

EPSS

0.7%

Published

Dec 5, 2025

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

A malicious website or server can send a specially crafted compressed response that may crash or severely slow software that fetches it.

Exploitation
Remote Unauthenticated
Attacker needs
None
Complexity
Moderate
Impact
Denial Of Service
Component
Library
Class
Denial of service
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

The flaw allows an HTTP response processed by urllib3 to specify an unbounded chain of content encodings, such as repeated or deeply nested compression algorithms in the Content-Encoding header. When a client using an affected urllib3 version receives such a response, it may repeatedly decompress the body, consuming excessive CPU and allocating large amounts of memory. The result is a denial of service in the client application or service that initiated the HTTP request. The issue is not a remote code execution or data disclosure vulnerability; its primary impact is resource exhaustion triggered by a malicious or compromised HTTP server, proxy, or man-in-the-middle position.

Why it matters to the business

Applications, automation jobs, image-processing workflows, package-fetching tools, API clients, and backend services that retrieve content from external or untrusted HTTP endpoints can be crashed, slowed, or restarted by a malicious response. This can cause service degradation, failed jobs, autoscaling cost increases, alert noise, and operational instability. The CVSS score is high because exploitation can cause significant availability impact, but current public exploitation signals are low: EPSS is 0.00692, the vulnerability is not listed in CISA KEV, and exploit maturity is reported as none. Organizations with broad use of urllib3 or affected Ubuntu ImageMagick packages should still prioritize remediation because urllib3 is a widely reused HTTP client dependency and vulnerable code may be present transitively.

How an attack unfolds

An attacker first needs to influence an application into making an HTTP request to a server or endpoint the attacker controls, or to intercept/modify HTTP traffic where TLS is absent or broken. The attacker-controlled server replies with a crafted HTTP response that contains an excessive Content-Encoding chain, for example many repeated compression algorithms, along with response content designed to expand through decompression. The affected urllib3 client attempts to honor the chained encodings according to HTTP semantics but lacks a sufficient bound on the number of decompression steps. As decompression proceeds, the client process consumes high CPU and memory, potentially causing timeouts, worker exhaustion, container OOM kills, process crashes, or service restarts. Exploitation is most plausible in software that fetches arbitrary URLs, follows redirects to untrusted domains, processes user-supplied links, imports remote media, or relies on third-party APIs that could be compromised.

How to fix it

Upgrade affected components to versions that include the urllib3 fix limiting decompression-chain handling. For urllib3 source-based consumers, use a release that contains commit 720f484b605f18887a48eef448d0084e2b76902d or later. For Ubuntu packages, apply the vendor fixed packages: imagemagick on Ubuntu 20.04 LTS fixed in 8:6.9.10.23+dfsg-2.1ubuntu11.4, and imagemagick on Ubuntu 22.04 LTS fixed in 8:6.9.11.60+dfsg-1ubuntu1. Because urllib3 is often pulled in transitively, review Python dependency lockfiles, container images, virtual environments, and packaged applications rather than only direct dependencies. As compensating controls, restrict server-side URL fetching to trusted destinations, enforce allowlists for outbound fetch features, limit response sizes, set aggressive HTTP timeouts, disable automatic decompression where feasible, cap worker memory, and ensure container/process supervisors restart failed workers without causing cascading outage.

How to confirm the fix worked

Confirm dependency and package versions after patching. For Python environments, inspect installed versions with tools such as pip show urllib3, pip freeze, pipdeptree, poetry show, pip-audit, safety, or software composition analysis tooling, and verify the resolved urllib3 build contains the fix. For Ubuntu systems, verify package versions with dpkg -l imagemagick or apt-cache policy imagemagick and confirm they are at or above the fixed versions. For containers, rebuild from patched base images and rescan the final image rather than only the source repository. Functional validation can include a controlled test using a local mock HTTP server that returns an excessive Content-Encoding chain and confirming the client rejects, limits, or safely fails the response without abnormal memory growth. Also confirm outbound-fetch features have destination allowlists, response-size limits, read timeouts, and memory ceilings in place.

Typical attack path

  1. Identify an application or workflow that uses affected urllib3 code and fetches attacker-influenced HTTP URLs or third-party content.
  2. Cause the target application to request an attacker-controlled URL, compromised endpoint, redirect destination, or intercepted HTTP response.
  3. Return an HTTP response with an unusually long or repeated Content-Encoding chain such as gzip, zstd, deflate, or br repeated many times.
  4. Provide compressed response content that causes repeated decompression work and large memory allocation in the client.
  5. Allow the affected client to exhaust CPU or memory, leading to slowdowns, request failures, process termination, container OOM kills, or service restarts.

How to detect it

Evidence of prior exploitation is most likely to appear as availability and resource-exhaustion artifacts rather than clear compromise indicators. Review application logs, HTTP client debug logs, outbound proxy logs, gateway logs, EDR telemetry, container orchestration events, system logs, and APM metrics for a sequence of outbound HTTP requests to unusual or user-supplied destinations followed by sharp CPU or memory growth, worker termination, OOM kills, request timeouts, or service restarts. Where response headers are logged, search for Content-Encoding headers with unusually long comma-separated chains or repeated encodings such as gzip, gzip, gzip or zstd, zstd, zstd. In Linux environments, inspect syslog, journald, dmesg, and container runtime events for OOM killer entries affecting Python, application worker, or ImageMagick-related processes. In Kubernetes or similar platforms, look for pods entering OOMKilled or CrashLoopBackOff states shortly after outbound HTTP activity. Correlate suspicious events with URLs submitted by users, webhook payloads, remote media imports, feed ingestion, document/image conversion jobs, and third-party API calls. Absence of these artifacts does not prove non-exploitation, especially if response headers and outbound HTTP metadata were not retained.

  • Content-Encoding: gzip, gzip, gzip
  • Content-Encoding: zstd, zstd, zstd
  • Content-Encoding: deflate, deflate, deflate
  • Content-Encoding: br, br, br
  • Content-Encoding: gzip, zstd, gzip, zstd
  • Content-Encoding: gzip, deflate, gzip, deflate
  • Out of memory: Killed process
  • Killed process
  • MemoryError
  • OOMKilled
  • CrashLoopBackOff
  • status=9/KILL
  • urllib3
  • ContentDecodingError
  • DecodeError

What your security team should do

  • Inventory applications, containers, CI jobs, and packaged tools that include urllib3 directly or transitively, prioritizing internet-facing services and systems that fetch user-supplied or third-party URLs.
  • Patch urllib3 consumers to a release containing commit 720f484b605f18887a48eef448d0084e2b76902d or later, and apply the fixed Ubuntu ImageMagick packages where applicable.
  • Prioritize remediation for services that process arbitrary URLs, webhooks, remote images, attachments, feeds, package metadata, or third-party API responses.
  • Add or verify egress controls and URL-fetch allowlists so applications cannot retrieve content from arbitrary attacker-controlled hosts.
  • Enforce HTTP client safeguards: maximum response size, connection/read timeouts, redirect limits, decompression limits where available, and per-process/container memory limits.
  • Search recent logs for unexplained OOM kills, worker crashes, CPU saturation, and outbound HTTP requests followed immediately by process restarts or memory errors.
  • Create detection logic for unusually long or repeated Content-Encoding response headers in proxy, gateway, WAF, packet-capture, or HTTP client telemetry.
  • Because this is not currently KEV-listed and has low EPSS, treat it as a high-availability-impact patching item rather than an active widespread exploitation emergency unless local telemetry shows suspicious crashes.

The record

urllib3 supports chained HTTP encoding algorithms for response content according to RFC 9110 (e.g., `Content-Encoding: gzip, zstd`). However, the number of links in the decompression chain was unbounded allowing a malicious server to insert a virtually unlimited number of compression steps leading to high CPU usage and massive memory allocation for the decompressed data.

Affected packages

Ecosystem Package Introduced Fixed
PyPI urllib3 1.24 2.6.0
AlmaLinux:10 python3-urllib3 0 1.26.19-2.el10_1.1
AlmaLinux:8 python3-urllib3 0 1.24.2-9.el8_10
AlmaLinux:8 python3.11-urllib3 0 1.26.12-6.el8_10
AlmaLinux:8 python3.12-urllib3 0 1.26.19-2.el8_10
AlmaLinux:9 python3-urllib3 0 1.26.5-6.el9_7.1
AlmaLinux:9 python3.11-urllib3 0 1.26.12-5.el9_7.1
AlmaLinux:9 python3.12-urllib3 0 1.26.19-1.el9_7.1
Chainguard airflow-2 0 2.11.0-r16
Chainguard airflow-2-bitnami-compat 0 2.11.0-r16
Chainguard airflow-2-compat 0 2.11.0-r16
Chainguard airflow-2-iamguarded-compat 0 2.11.0-r16
Chainguard airflow-3 0 3.1.4-r0
Chainguard airflow-3-bitnami-compat 0 3.1.4-r0
Chainguard airflow-3-compat 0 3.1.4-r0
Chainguard airflow-3-iamguarded-compat 0 3.1.4-r0
Chainguard airflow-core-2 0 2.11.0-r9
Chainguard airflow-core-2-compat 0 2.11.0-r9
Chainguard airflow-core-2-oci-entrypoint 0 2.11.0-r9
Chainguard airflow-core-3 0 3.1.3-r1
Chainguard airflow-core-3-compat 0 3.1.3-r1
Chainguard airflow-core-3-oci-entrypoint 0 3.1.3-r1
Chainguard ansible-operator-compat 0 1.42.0-r3
Chainguard apache-beam-python-3.11-sdk 0 2.69.0-r2
Chainguard authentik 0 2025.10.2-r3
Chainguard authentik-go-server 0 2025.10.2-r3
Chainguard az 0 2.81.0-r1
Chainguard az-iamguarded-compat 0 2.81.0-r1
Chainguard azure-functions-host 0 4.1045.200-r0
Chainguard azure-functions-host-compat 0 4.1045.200-r0
Chainguard azure-functions-host-nodejs-worker 0 4.1045.200-r0
Chainguard barman 0 3.16.2-r1
Chainguard barman-cloudnative-pg 0 3.16.2-r1
Chainguard confluent-docker-utils 0 0.0.162-r4
Chainguard dask-gateway 0 2025.4.0-r7
Chainguard dask-gateway-server 0 2025.4.0-r7
Chainguard dask-kubernetes 0 2025.7.0-r2
Chainguard datadog-agent-7.71-fakeintake 0 7.71.2-r6
Chainguard datadog-agent-7.71-jmx 0 7.71.2-r6
Chainguard datadog-agent-7.71-oci-compat 0 7.71.2-r6
Chainguard datadog-agent-7.71-s6-overlay 0 7.71.2-r6
Chainguard datadog-agent-7.72-fakeintake 0 7.72.4-r4
Chainguard datadog-agent-7.72-jmx 0 7.72.4-r4
Chainguard datadog-agent-7.72-oci-compat 0 7.72.4-r4
Chainguard datadog-agent-7.72-s6-overlay 0 7.72.4-r4
Chainguard datadog-agent-7.73-fakeintake 0 7.73.2-r0
Chainguard datadog-agent-7.73-jmx 0 7.73.1-r0
Chainguard datadog-agent-7.73-oci-compat 0 7.73.1-r0
Chainguard datadog-agent-7.73-s6-overlay 0 7.73.2-r0
Chainguard datadog-agent-fips-7.71-fakeintake 0 7.71.2-r5
Chainguard datadog-agent-fips-7.71-jmx 0 7.71.2-r5
Chainguard datadog-agent-fips-7.71-oci-compat 0 7.71.2-r5
Chainguard datadog-agent-fips-7.71-s6-overlay 0 7.71.2-r5
Chainguard datadog-agent-fips-7.72-fakeintake 0 7.72.4-r3
Chainguard datadog-agent-fips-7.72-jmx 0 7.72.4-r3
Chainguard datadog-agent-fips-7.72-oci-compat 0 7.72.4-r3
Chainguard datadog-agent-fips-7.72-s6-overlay 0 7.72.4-r3
Chainguard datadog-agent-fips-7.73-fakeintake 0 7.73.2-r0
Chainguard datadog-agent-fips-7.73-jmx 0 7.73.2-r0
Chainguard datadog-agent-fips-7.73-oci-compat 0 7.73.2-r0
Chainguard datadog-agent-fips-7.73-s6-overlay 0 7.73.2-r0
Chainguard datadog-cluster-agent-7.71 0 7.71.2-r6
Chainguard datadog-cluster-agent-7.71-oci-compat 0 7.71.2-r6
Chainguard datadog-cluster-agent-7.72 0 7.72.4-r4
Chainguard datadog-cluster-agent-7.72-oci-compat 0 7.72.4-r4
Chainguard datadog-cluster-agent-7.73 0 7.73.2-r0
Chainguard datadog-cluster-agent-7.73-oci-compat 0 7.73.1-r0
Chainguard datadog-cluster-agent-fips-7.71 0 7.71.2-r5
Chainguard datadog-cluster-agent-fips-7.71-oci-compat 0 7.71.2-r5
Chainguard datadog-cluster-agent-fips-7.72 0 7.72.4-r3
Chainguard datadog-cluster-agent-fips-7.72-oci-compat 0 7.72.4-r3
Chainguard datadog-cluster-agent-fips-7.73 0 7.73.2-r0
Chainguard datadog-cluster-agent-fips-7.73-oci-compat 0 7.73.2-r0
Chainguard dogstatsd-7.71 0 7.71.2-r6
Chainguard dogstatsd-7.72 0 7.72.4-r4
Chainguard dogstatsd-7.73 0 7.73.2-r0
Chainguard emissary 0 3.10.0-r14
Chainguard emissary-apiext 0 3.10.0-r14
Chainguard emissary-oci-entrypoint 0 3.10.0-r14
Chainguard ggshield 0 1.46.0-r0
Chainguard ggshield 0 1.48.0-r0
Chainguard gitaly-config-18.4 0 18.4.6-r0
Chainguard gitaly-config-18.5 0 18.5.3-r1
Chainguard gitaly-config-18.6 0 18.6.2-r0
Chainguard gitaly-config-18.7 0 18.7.0-r0
Chainguard gitlab-base-18.4 0 18.4.6-r0
Chainguard gitlab-base-18.5 0 18.5.3-r1
Chainguard gitlab-base-18.6 0 18.6.2-r0
Chainguard gitlab-base-18.7 0 18.7.0-r0
Chainguard gitlab-base-fips-18.4 0 18.4.5-r1
Chainguard gitlab-base-fips-18.5 0 18.5.4-r1
Chainguard gitlab-base-fips-18.6 0 18.6.2-r1
Chainguard gitlab-base-fips-18.7 0 18.7.0-r0
Chainguard gitlab-certificates-18.4 0 18.4.6-r0
Chainguard gitlab-certificates-18.5 0 18.5.4-r0
Chainguard gitlab-certificates-18.6 0 18.6.2-r0
Chainguard gitlab-certificates-18.7 0 18.7.0-r0
Chainguard gitlab-cfssl-self-sign-scripts-18.4 0 18.4.5-r1
Chainguard gitlab-cfssl-self-sign-scripts-18.5 0 18.5.3-r1
Chainguard gitlab-cfssl-self-sign-scripts-18.6 0 18.6.1-r1
Chainguard gitlab-cfssl-self-sign-scripts-18.7 0 18.7.0-r0
Chainguard gitlab-cng-18.4 0 18.4.5-r1
Chainguard gitlab-cng-18.5 0 18.5.3-r1
Chainguard gitlab-cng-18.6 0 18.6.2-r0
Chainguard gitlab-cng-18.7 0 18.7.0-r0
Chainguard gitlab-cng-fips-18.4 0 18.4.5-r1
Chainguard gitlab-cng-fips-18.5 0 18.5.4-r1
Chainguard gitlab-cng-fips-18.6 0 18.6.1-r1
Chainguard gitlab-cng-fips-18.7 0 18.7.0-r0
Chainguard gitlab-container-registry-18.4 0 18.4.6-r0
Chainguard gitlab-container-registry-18.5 0 18.5.4-r0
Chainguard gitlab-container-registry-18.6 0 18.6.2-r0
Chainguard gitlab-container-registry-18.7 0 18.7.0-r0
Chainguard gitlab-container-registry-fips-18.4 0 18.4.5-r1
Chainguard gitlab-container-registry-fips-18.5 0 18.5.4-r1
Chainguard gitlab-container-registry-fips-18.6 0 18.6.2-r1
Chainguard gitlab-container-registry-fips-18.7 0 18.7.0-r0
Chainguard gitlab-container-registry-scripts-18.4 0 18.4.6-r0
Chainguard gitlab-container-registry-scripts-18.5 0 18.5.4-r0
Chainguard gitlab-container-registry-scripts-18.6 0 18.6.1-r1
Chainguard gitlab-container-registry-scripts-18.7 0 18.7.0-r0
Chainguard gitlab-exporter-18.4 0 18.4.6-r0
Chainguard gitlab-exporter-18.5 0 18.5.4-r0
Chainguard gitlab-exporter-18.6 0 18.6.2-r0
Chainguard gitlab-exporter-18.7 0 18.7.0-r0
Chainguard gitlab-exporter-scripts-18.4 0 18.4.5-r1
Chainguard gitlab-exporter-scripts-18.5 0 18.5.4-r0
Chainguard gitlab-exporter-scripts-18.6 0 18.6.2-r0
Chainguard gitlab-exporter-scripts-18.7 0 18.7.0-r0
Chainguard gitlab-gitaly-scripts-18.4 0 18.4.5-r1
Chainguard gitlab-gitaly-scripts-18.5 0 18.5.3-r1
Chainguard gitlab-gitaly-scripts-18.6 0 18.6.2-r0
Chainguard gitlab-gitaly-scripts-18.7 0 18.7.0-r0
Chainguard gitlab-logger-18.4 0 18.4.6-r0
Chainguard gitlab-logger-18.5 0 18.5.4-r0
Chainguard gitlab-logger-18.6 0 18.6.2-r0
Chainguard gitlab-logger-18.7 0 18.7.0-r0
Chainguard gitlab-logger-fips-18.4 0 18.4.5-r1
Chainguard gitlab-logger-fips-18.5 0 18.5.4-r1
Chainguard gitlab-logger-fips-18.6 0 18.6.1-r1
Chainguard gitlab-logger-fips-18.7 0 18.7.0-r0
Chainguard gitlab-pages-scripts-18.4 0 18.4.5-r1
Chainguard gitlab-pages-scripts-18.5 0 18.5.3-r1
Chainguard gitlab-pages-scripts-18.6 0 18.6.2-r0
Chainguard gitlab-pages-scripts-18.7 0 18.7.0-r0
Chainguard gitlab-rails-scripts-18.4 0 18.4.5-r1
Chainguard gitlab-rails-scripts-18.5 0 18.5.3-r1
Chainguard gitlab-rails-scripts-18.6 0 18.6.2-r0
Chainguard gitlab-rails-scripts-18.7 0 18.7.0-r0
Chainguard gitlab-rails-scripts-fips-18.4 0 18.4.5-r1
Chainguard gitlab-rails-scripts-fips-18.5 0 18.5.4-r1
Chainguard gitlab-rails-scripts-fips-18.6 0 18.6.2-r0
Chainguard gitlab-rails-scripts-fips-18.7 0 18.7.0-r0
Chainguard gitlab-shell-18.4 0 18.4.6-r0
Chainguard gitlab-shell-18.5 0 18.5.3-r1
Chainguard gitlab-shell-18.6 0 18.6.2-r0
Chainguard gitlab-shell-18.7 0 18.7.0-r0
Chainguard gitlab-shell-fips-18.4 0 18.4.5-r1
Chainguard gitlab-shell-fips-18.5 0 18.5.4-r1
Chainguard gitlab-shell-fips-18.6 0 18.6.1-r1
Chainguard gitlab-shell-fips-18.7 0 18.7.0-r0
Chainguard gitlab-shell-scripts-18.4 0 18.4.5-r1
Chainguard gitlab-shell-scripts-18.5 0 18.5.3-r1
Chainguard gitlab-shell-scripts-18.6 0 18.6.2-r0
Chainguard gitlab-shell-scripts-18.7 0 18.7.0-r0
Chainguard gitlab-sidekiq-ce-18.4 0 18.4.6-r0
Chainguard gitlab-sidekiq-ce-18.5 0 18.5.3-r1
Chainguard gitlab-sidekiq-ce-18.6 0 18.6.2-r0
Chainguard gitlab-sidekiq-ce-18.7 0 18.7.0-r0
Chainguard gitlab-sidekiq-ce-fips-18.4 0 18.4.5-r1
Chainguard gitlab-sidekiq-ce-fips-18.5 0 18.5.3-r1
Chainguard gitlab-sidekiq-ce-fips-18.6 0 18.6.1-r1
Chainguard gitlab-sidekiq-ce-fips-18.7 0 18.7.0-r0
Chainguard gitlab-webservice-ce-18.4 0 18.4.6-r0
Chainguard gitlab-webservice-ce-18.5 0 18.5.3-r1
Chainguard gitlab-webservice-ce-18.6 0 18.6.2-r0
Chainguard gitlab-webservice-ce-18.7 0 18.7.0-r0
Chainguard gitlab-webservice-ce-fips-18.4 0 18.4.5-r1
Chainguard gitlab-webservice-ce-fips-18.5 0 18.5.3-r1
Chainguard gitlab-webservice-ce-fips-18.6 0 18.6.1-r1
Chainguard gitlab-webservice-ce-fips-18.7 0 18.7.0-r0
Chainguard gitlab-workhorse-scripts-18.4 0 18.4.6-r0
Chainguard gitlab-workhorse-scripts-18.5 0 18.5.4-r0
Chainguard gitlab-workhorse-scripts-18.6 0 18.6.2-r0
Chainguard gitlab-workhorse-scripts-18.7 0 18.7.0-r0
Chainguard gitlab-workhorse-scripts-fips-18.4 0 18.4.5-r1
Chainguard gitlab-workhorse-scripts-fips-18.5 0 18.5.4-r1
Chainguard gitlab-workhorse-scripts-fips-18.6 0 18.6.2-r0
Chainguard gitlab-workhorse-scripts-fips-18.7 0 18.7.0-r0
Chainguard graalvm-23 0 23.0.2-r8
Chainguard graalvm-23-ce 0 23.0.2-r8
Chainguard graalvm-23-ce-dbg 0 23.0.2-r8
Chainguard graalvm-23-ce-default-jdk 0 23.0.2-r8
Chainguard graalvm-23-ce-jmods 0 23.0.2-r8
Chainguard graalvm-23-ce-nodejs 0 23.0.2-r8
Chainguard graalvm-23-ce-nodejs-dbg 0 23.0.2-r8
Chainguard graalvm-23-ce-nodejs-default-jdk 0 23.0.2-r8
Chainguard graalvm-23-ce-nodejs-jmods 0 23.0.2-r8
Chainguard graalvm-23-graalpy 0 23.0.2-r8
Chainguard graalvm-23-truffleruby 0 23.0.2-r8

Related vulnerabilities