Feb 28, 2026·7 min read·56 visits
Unauthenticated remote DoS in AIOHTTP via zip bomb. Attackers send small compressed payloads that expand to fill server memory. Fixed in version 3.13.3.
A high-severity Denial of Service (DoS) vulnerability exists in the AIOHTTP asynchronous HTTP client/server framework for Python (versions 3.13.2 and earlier). The flaw resides in the `auto_decompress` feature of the HTTP parser, which lacks appropriate size limits for decompressed data. This omission allows unauthenticated remote attackers to execute 'zip bomb' attacks, where a small, highly compressed request body expands into a massive payload in memory, causing resource exhaustion and server crashes.
AIOHTTP is a foundational asynchronous HTTP client/server framework for Python, widely used in modern microservices and web applications to handle concurrent connections efficiently. The framework supports automatic decompression of HTTP request bodies to simplify payload handling for developers. However, prior to version 3.13.3, this feature contained a critical oversight in its resource management logic.
The vulnerability, designated CVE-2025-69223, is a classic 'zip bomb' or decompression bomb scenario (CWE-409). When the auto_decompress setting is enabled (which is often the default or easily toggled configuration for handling compressed uploads), the server accepts request bodies encoded with algorithms such as gzip, deflate, brotli, or zstd. The parsing logic attempts to decompress the entire stream into memory without enforcing a maximum expansion limit.
This flaw allows an attacker to craft a malicious HTTP request with a high compression ratio—for example, a payload of a few kilobytes that decompresses into gigabytes of data. As the server processes this request, it allocates memory to store the decompressed output until the system's available RAM is exhausted, leading to an Out-of-Memory (OOM) crash or severe performance degradation affecting all users.
The root cause of CVE-2025-69223 lies in the implementation of the DeflateBuffer and DecompressionBaseHandler classes within aiohttp/http_parser.py and aiohttp/compression_utils.py. The framework delegates decompression to underlying Python libraries or bindings (such as zlib, brotli, or zstd) but failed to restrict the output size during the stream processing phase.
In the vulnerable versions, the feed_data method reads chunks of compressed data from the wire and passes them directly to the decompression context. While the input size might be small (and thus pass standard Content-Length checks), the output size is determined solely by the data's entropy. The parser lacked a mechanism to track the cumulative size of the decompressed data and abort the operation if a safety threshold was breached.
Specifically, the decompress calls inside the parsing loop did not utilize the max_length parameter (or equivalent) available in modern decompression APIs. This absence meant that the expansion loop would continue until the decompression was complete or the operating system terminated the process due to memory exhaustion. This represents a failure to implement Resource Allocation Throttling (CWE-770), effectively granting external actors control over the server's memory allocation.
The remediation in version 3.13.3 introduces a robust enforcement mechanism for decompression limits. The fix involves three key changes: defining a default limit, tracking the output size, and raising an exception when the limit is exceeded.
Below is a conceptual reconstruction of the patch applied to aiohttp/http_parser.py and related utilities.
Vulnerable Logic (Simplified):
# Inside the parsing loop, data is decompressed without limits
def feed_data(self, chunk):
# ... (code omitted)
try:
# The decompressor simply expands whatever it receives
decoded_chunk = self.decompressor.decompress(chunk)
self.payload.write(decoded_chunk)
except Exception:
# Generic error handling
passPatched Logic (Simplified):
DEFAULT_MAX_DECOMPRESS_SIZE = 2**25 # 32 MiB limit
class DecompressionBaseHandler:
def __init__(self, encoding, max_decompress_size=DEFAULT_MAX_DECOMPRESS_SIZE):
self._max_decompress_size = max_decompress_size
# ...
def decompress_sync(self, data):
# Check if the underlying library supports max_length
try:
# Enforce the limit directly in the decompress call
return self.decompressor.decompress(
data,
max_length=self._max_decompress_size
)
except (zlib.error, brotli.error) as exc:
# Handle specific decompression errors
raise DecompressionError() from excThe patch introduces DEFAULT_MAX_DECOMPRESS_SIZE, set to 32 MiB. If a request body expands beyond this threshold, the parser now raises a ContentEncodingError (specifically wrapping a DecompressSizeError), causing the connection to close immediately and freeing the allocated resources before they impact system stability.
Exploiting this vulnerability requires no authentication and can be performed with standard HTTP tooling, provided the attacker can construct a valid compressed payload. The attack targets endpoints that accept POST or PUT requests and respect the Content-Encoding header.
Attack Workflow:
Content-Encoding: gzip (or deflate, br). The body of the request contains the malicious compressed payload.The impact of CVE-2025-69223 is strictly a Denial of Service, but the severity is High (CVSS 7.5) due to the ease of exploitation and the potential for total service disruption. Unlike complex memory corruption bugs, this vulnerability relies on logical resource mismanagement, making it reliable and platform-independent.
Operational Impact:
There is no impact on Confidentiality or Integrity; the attacker cannot read memory or execute arbitrary code through this vector. The risk is purely regarding availability.
The primary remediation is to upgrade the aiohttp library to version 3.13.3 or later. This version enforces a hard limit of 32 MiB on decompressed data by default, which is sufficient for most standard API interactions but small enough to prevent memory exhaustion attacks.
Remediation Steps:
pip freeze or poetry show) for aiohttp versions <= 3.13.2.pip install --upgrade aiohttp
# OR
poetry update aiohttpmax_field_size or implement custom handling, though the patch specifically targets the decompression step handled by the parser.Defensive Coding (Workarounds):
If an immediate upgrade is impossible, developers should disable auto_decompress in their server configuration or middleware and handle decompression manually in the application logic. This allows developers to read the stream in chunks and count the bytes, aborting if the total size exceeds a safe threshold (e.g., 10 MB). Additionally, implementing a Web Application Firewall (WAF) rule to block requests with Content-Encoding from untrusted sources serves as a temporary stopgap.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
aiohttp aio-libs | <= 3.13.2 | 3.13.3 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-409 (Improper Handling of Highly Compressed Data) |
| CVSS v3.1 | 7.5 (High) |
| Attack Vector | Network (HTTP) |
| Impact | Denial of Service (Memory Exhaustion) |
| Authentication | None Required |
| Patch Status | Fixed in 3.13.3 |
The application does not properly control the amount of resources used when handling highly compressed data, leading to a denial of service.
CVE-2026-48861 is a client-side HTTP request-line CRLF (Carriage Return Line Feed) injection vulnerability in the popular Elixir HTTP client library, Mint. The vulnerability permits HTTP Request Splitting and HTTP Request Smuggling when an application forwards untrusted, attacker-controlled inputs to Mint's HTTP client requests as either the HTTP request method or target. By embedding CRLF characters within these parameters, an attacker can terminate the request line prematurely, inject malicious headers, or pipeline entirely independent requests. These smuggled requests are then processed by upstream or downstream proxy servers as separate HTTP queries on the same TCP connection. While Mint version 1.7.0 introduced target validation to secure the request target, the HTTP request method parameter remained completely unvalidated. This flaw allows attackers to bypass routing filters, access restricted internal APIs, or poison HTTP caches under default configurations.
An Inconsistent Interpretation of HTTP Requests (HTTP Request/Response Smuggling) vulnerability in the Elixir Mint HTTP client allows attacker-controlled HTTP/1 servers to desynchronize response framing on shared connections due to over-lenient parsing of sign-prefixed Content-Length headers.
An allocation of resources without limits or throttling vulnerability in Elixir Mint allows an attacker-controlled HTTP/2 server to exhaust memory in a Mint client. The vulnerability is exploited by sending a HEADERS frame without the END_HEADERS flag followed by an infinite stream of CONTINUATION frames. Because the client lacks limits on the incoming header-block accumulator, the client continuously consumes memory until an out-of-memory crash occurs.
CVE-2026-48596 is an Improper Neutralization of CRLF Sequences in HTTP Headers (HTTP Request/Response Splitting, CWE-113) in the Elixir Tesla HTTP client. The flaw resides in how multipart content-type parameters are joined and serialized, enabling attackers to inject arbitrary headers or split HTTP requests when applications pass untrusted inputs to the parameters of multipart uploads.
An improper handling of highly compressed data (decompression bomb) vulnerability exists in the Elixir Tesla HTTP client when utilizing response decompression middlewares. By serving highly compressed responses or stacked content-encoding headers, a malicious server can cause arbitrary heap exhaustion, leading to a denial of service (DoS) crash in the BEAM virtual machine.
A high-severity security vulnerability in Elixir's Tesla HTTP client library (CVE-2026-48595) allows unauthenticated remote attackers to harvest sensitive credentials, including Authorization headers and cookies. The flaw resides in the 'Tesla.Middleware.FollowRedirects' component, which performs case-sensitive lookups when stripping credentials during cross-origin redirects. Because HTTP headers are case-insensitive by RFC specifications, standard canonical casing (e.g., 'Authorization') bypasses the lowercase-only blocklist, leaking tokens to untrusted external redirect destinations.