Feb 28, 2026·6 min read·37 visits
Aiohttp versions < 3.13.3 are vulnerable to a remote Denial of Service attack. Attackers can send a single HTTP request with thousands of malformed cookies, forcing the server to synchronously log a warning for each one. This 'logging storm' consumes system resources and floods log files. The fix aggregates errors into a single debug-level log entry.
A resource exhaustion vulnerability exists in the aiohttp Python library versions prior to 3.13.3. The flaw, identified as a 'Logging Storm' (CWE-779), allows unauthenticated remote attackers to trigger excessive log generation by sending HTTP requests containing numerous malformed cookies. This behavior can lead to Denial of Service (DoS) conditions through CPU saturation and disk I/O exhaustion, as well as the overwhelming of log aggregation infrastructure.
CVE-2025-69230 is a resource exhaustion vulnerability affecting aiohttp, a ubiquitous asynchronous HTTP client/server framework for Python. The vulnerability manifests in the HTTP cookie parsing logic, specifically within the _cookie_helpers.py module. It is classified under CWE-779 (Uncontrolled Log Activities), often referred to as a "Logging Storm."
In affected versions, the application does not limit the number of log entries generated when processing invalid inputs in the Cookie HTTP header. When an HTTP request includes cookies with invalid characters (such as commas or control characters) in their names, the parser triggers a WARNING level log event for each invalid cookie found.
Because the Cookie header can hold a significant amount of data (often up to 8KB or more depending on server configuration), an attacker can pack thousands of short, invalid cookie definitions into a single request. This forces the application to execute thousands of logging calls for a single incoming connection, disproportionately consuming CPU cycles for string formatting and I/O bandwidth for writing logs.
The root cause lies in the iterative validation logic within the parse_cookie_header function. The function is designed to split the Cookie header string by semicolons and validate each key-value pair. The validation checks the cookie name against a regular expression, _COOKIE_NAME_RE, to ensure it contains only legal characters.
Prior to version 3.13.3, the code handled validation failures by immediately emitting a log message within the parsing loop. The logic proceeded as follows:
internal_logger.warning().This implementation creates an O(n) relationship between the number of malformed cookies provided by the client and the number of log write operations performed by the server. Since logging operations often involve synchronous I/O (writing to a file or standard error) or expensive network calls (sending to a log collector), this linear scaling allows an attacker to amplify the cost of processing a single HTTP request significantly.
The vulnerability is evident when comparing the loop implementation in aiohttp before and after the patch. The remediation strategy involves decoupling the identification of invalid cookies from the logging action.
Vulnerable Code (Simplified):
# Inside parse_cookie_header()
for key, value in parsed_cookies:
if not _COOKIE_NAME_RE.match(key):
# VULNERABILITY: Immediate logging inside the loop
# A separate log entry is created for EVERY invalid key
internal_logger.warning("Can not load cookie: Illegal cookie name %r", key)Patched Code (Commit 64629a0):
# Inside parse_cookie_header()
invalid_names = [] # buffer for invalid keys
for key, value in parsed_cookies:
if not _COOKIE_NAME_RE.match(key):
# FIX: Collect the invalid key, do not log yet
invalid_names.append(key)
# ... loop finishes ...
# FIX: Single log entry for the entire request
if invalid_names:
# FIX: Downgrade from WARNING to DEBUG to reduce noise
internal_logger.debug("Cannot load cookie. Illegal cookie names: %r", invalid_names)The patch introduces two critical changes:
invalid_names) and logged in a single batch operation after parsing completes. This changes the logging complexity from O(n) to O(1) per request.WARNING to DEBUG. In most production environments, DEBUG logs are disabled, meaning the attack payload will trigger zero log output.Exploitation of CVE-2025-69230 is trivial and requires no authentication. The attacker constructs a standard HTTP request but populates the Cookie header with a repetitive pattern of invalid keys. Specifically, characters like the comma (,) are typically disallowed in cookie names but valid as separators in some contexts, triggering the validation failure.
Proof of Concept:
import requests
# Target URL
target = "http://localhost:8080/"
# Construct a payload with 3,000 malformed cookies
# Each entry "bad,cookieN=1" triggers the regex failure due to the comma
payload = "; ".join(f"bad,cookie{i}=1" for i in range(3000))
headers = {
"Cookie": payload
}
# Sending this request causes the server to write 3,000 log lines
requests.get(target, headers=headers)When the server processes this request, it attempts to write 3,000 distinct lines to its log output. If an attacker sends these requests concurrently (e.g., 100 requests per second), the server attempts to write 300,000 log lines per second. This I/O pressure can saturate the disk write buffer, blocking the main event loop in synchronous logging configurations, or flood remote log aggregators (e.g., Splunk, ELK), leading to increased infrastructure costs and dropped alerts.
The primary impact of this vulnerability is Denial of Service (DoS) targeting the application's resources and observability infrastructure. While the CVSS v3.1 score is 5.3 (Medium), the operational impact can be severe depending on the logging configuration.
It is important to note that this vulnerability does not allow for Remote Code Execution (RCE) or unauthorized data access. The C:L (Confidentiality Low) vector in some reports likely refers to the theoretical possibility of side-channel leakages via logs, but the primary risk is Availability.
The vulnerability is addressed in aiohttp version 3.13.3. All users of the library should upgrade immediately.
Upgrade Instructions:
pip install aiohttp>=3.13.3Mitigation Strategies:
If an immediate upgrade is not feasible, the following mitigations can reduce the impact:
WARNING level logs from the aiohttp.server or aiohttp.internal loggers, raising the threshold to ERROR.Cookie header. Block requests where the number of semicolons exceeds a reasonable threshold (e.g., 50) or where cookie names contain known illegal characters like commas.aiohttp backend.CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
aiohttp aio-libs | < 3.13.3 | 3.13.3 |
| Attribute | Detail |
|---|---|
| CWE | CWE-779 |
| Attack Vector | Network |
| CVSS v3.1 | 5.3 (Medium) |
| CVSS v4.0 | 2.7 (Low) |
| EPSS Score | 0.013% |
| Impact | Resource Exhaustion (DoS) |
| Exploit Status | Proof of Concept Available |
The application performs uncontrolled logging activities, which can consume excess resources or flood log files.
Grav CMS prior to version 1.7.53 and 2.0.0-rc.8 is vulnerable to an unauthenticated remote denial of service (DoS) vulnerability. By supplying crafted query parameters with extremely large dimensions to image assets, remote unauthenticated attackers can force the server to allocate massive amounts of system memory, leading to kernel Out-Of-Memory (OOM) termination of web worker processes.
CVE-2026-53657 is a local privilege escalation vulnerability in Lima (lima-vm/lima) affecting versions prior to 2.1.3 when configured with the QEMU driver. The guest agent daemon, running as root, creates its communication socket `/run/lima-guestagent.sock` with world-writable permissions (0777). This allows unprivileged local users to command the agent to establish arbitrary tunnels, including to privileged local UNIX sockets (like D-Bus). Because the target daemon authenticates the incoming connection using the credentials of the root-owned guest agent (via SO_PEERCRED), unprivileged users can perform root operations, resulting in complete guest VM compromise.
An unauthenticated Denial of Service vulnerability exists in the s2n-quic library's CryptoStream reassembler due to a lack of buffer limits on out-of-order cryptographic frames. An attacker can transmit a crafted CRYPTO frame with an extremely high offset and nominal payload, forcing the receiver to execute unbounded memory allocations and causing service crashes.
A JNDI Injection and Deserialization Gadget vulnerability exists in mchange-commons-java prior to version 0.6.0. The com.mchange.v2.naming.JavaBeanObjectFactory component permits arbitrary class instantiation and setter invocation, allowing attackers to perform Server-Side Request Forgery (SSRF) and remote class loading.
SurrealDB versions supporting element-level SELECT permissions on arrays are vulnerable to a logical authorization bypass. Due to an index-shifting error during array filtration, restricted elements can skip permission checks and leak to unauthorized record users.
CVE-2026-12243 is a path traversal vulnerability in the Natural Language Toolkit (NLTK) version 3.9.4. The flaw exists because the input validation routine fails to account for percent-encoded directory traversal sequences like '..%2f' before passing them to urllib.request.url2pathname(), which decodes them into active traversal sequences.