CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-69244

CVE-2026-69244: Heap Out-of-Bounds Read in aiohttp C-Parser Error Handling

Alon Barad
Alon Barad
Software Engineer

Aug 3, 2026·7 min read·1 visit

Executive Summary (TL;DR)

A heap out-of-bounds read in the C-parser of aiohttp allows unauthenticated remote attackers to crash application processes or leak adjacent heap memory by sending specially crafted malformed HTTP requests or responses.

A high-severity heap-based out-of-bounds (OOB) read vulnerability exists in the Cython-based HTTP response and request parser extension of aiohttp. When processing malformed HTTP traffic, the parser fails to properly handle raw C pointers returned by the underlying llhttp library during error-message construction. This triggers an uncontrolled strlen() call on non-null-terminated network buffers, which can result in a Denial of Service (DoS) via worker process crash or the exposure of adjacent heap memory inside exception messages.

Vulnerability Overview

The aiohttp framework is a widely deployed asynchronous HTTP client and server library built on Python's asyncio subsystem. To maximize parsing throughput, the project implements a high-performance native C-parser extension in Cython, which wraps the low-level llhttp library. This architecture minimizes the overhead of HTTP message framing, header ingestion, and chunk validation. However, handling execution errors at the boundary between native Python code and raw C memory constructs introduces significant memory safety hazards.

This vulnerability, designated CVE-2026-69244, is a heap-based out-of-bounds (OOB) read that occurs during exception generation. When the llhttp parser encounters syntactically invalid input, the Cython wrapper tries to format a descriptive error message displaying the context of the error. During this process, the parser obtains a raw C pointer pointing to the invalid payload byte and incorrectly treats it as a standard null-terminated C-string.

The attack surface is exposed to any network endpoint that processes untrusted HTTP requests (in server-side configurations) or untrusted HTTP responses (in client-side configurations). The vulnerability is classified under CWE-125 (Out-of-bounds Read), with secondary impacts associated with CWE-416 (Use After Free) and CWE-400 (Uncontrolled Resource Consumption). The vulnerability is completely resolved in version 3.14.3 of the library.

Root Cause Analysis

To understand the root cause, it is necessary to examine how llhttp and Cython interact during error handling. When the llhttp state machine detects a protocol violation (such as invalid characters in a chunk size or a missing carriage return), it halts parsing. The Cython wrapper class HttpParser then calls cparser.llhttp_get_error_pos(self._cparser). This C function returns a raw char * pointer indicating the exact memory address in the parsing buffer where the error occurred.

In the vulnerable implementation, the Cython wrapper assigns this raw pointer to the variable after. The code subsequently executes the Python slicing and splitting statement after_b = after.split(b"\r\n", 1)[0]. Because after is a raw C char * and .split() is a Python string method, Cython must implicitly convert the C pointer into a Python bytes object before executing the method. Because Cython is not given an explicit length for the buffer at the C-pointer address, it assumes the pointer references a standard, null-terminated C-string.

To perform this implicit conversion, Cython invokes the native C-library function strlen() on the pointer. However, network buffers received from sockets are not null-terminated; they contain raw bytes representing TCP stream segments. If a parsing error occurs exactly at the end of the incoming buffer chunk, strlen() will fail to find a null byte (\x00) within the boundaries of the allocated buffer. The function then continues reading sequentially through adjacent heap memory blocks until it eventually hits a null byte. This behavior leads directly to a heap-based out-of-bounds read.

Code Analysis

The following code block highlights the exact flaw in the Cython-based HTTP parser (aiohttp/_http_parser.pyx) and contrasts the vulnerable logic with the official patch.

# === VULNERABLE CODE (aiohttp < 3.14.3) ===
# The parser retrieves the raw C error position pointer.
# Cython implicitly casts the raw char* pointer to a Python bytes object
# using strlen() because no buffer length is specified.
after = cparser.llhttp_get_error_pos(self._cparser)
before = data[:after - base]
# The split method forces an un-bounded strlen call on a non-null-terminated heap buffer.
after_b = after.split(b"\r\n", 1)[0]
 
# === PATCHED CODE (aiohttp 3.14.3) ===
# The patch computes the safe integer offset relative to the base pointer.
error_pos = cparser.llhttp_get_error_pos(self._cparser)
error_off = error_pos - base
# Slicing is performed strictly on the native Python 'data' bytes object.
before = data[:error_off]
after = data[error_off:].split(b"\r\n", 1)[0]

The patched version replaces pointer-based manipulation with integer offset calculations. Rather than converting the raw pointer after directly to a Python object, the code calculates error_off = error_pos - base. Since base is the starting address of the known buffer and error_pos is the error address within that buffer, error_off is a safe, relative integer offset.

Slicing is then performed directly on data, which is already a native Python bytes object representing the buffer. Slicing in Python is strictly bounds-checked by the interpreter. If error_off points to the end of the buffer, Python safely handles the slice without reading beyond the underlying memory allocation. This approach completely prevents unsafe native-level pointer parsing and eliminates the vulnerability.

Exploitation Methodology

Exploitation of CVE-2026-69244 does not require authentication and can be executed via either server-side or client-side vectors. In a server-side attack vector, the target is an aiohttp-based web server. The attacker crafts a malicious HTTP request designed to trigger a protocol syntax error precisely at the termination boundary of the request payload. For example, the attacker can transmit a request utilizing chunked transfer encoding where the chunk specification ends abruptly as 0_ or 0\rX without a trailing carriage return line feed (CRLF).

When the server receives this payload, the socket buffer terminates immediately after the malformed character. The llhttp engine flags the error, and the exception handler is executed. Because the buffer lacks a trailing null terminator, the strlen() call traverses the heap, attempting to locate a null byte. The physical flow of this exploitation sequence is illustrated below:

The vulnerability behaves in two ways depending on the heap layout. If the strlen() scan crosses page boundaries into unmapped virtual memory, the operating system kernel immediately kills the python worker process with a segmentation fault (SIGSEGV). This results in an immediate Denial of Service. Alternatively, if the scan resolves within mapped memory, the adjacent heap bytes are converted into the python exception object and can be leaked to logs or directly to the attacker in HTTP error responses.

Impact Assessment

The primary threat posed by this vulnerability is a remote, unauthenticated Denial of Service (DoS). For applications running aiohttp as a web server, sending a steady stream of malformed requests can repeatedly crash active worker processes. This forces container engines or service managers to repeatedly restart the process, exhausting system resources and causing a sustained outage for legitimate users.

The CVSS v4.0 base score is rated at 7.1 with the vector CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N. This calculation highlights that the vulnerability is remotely exploitable with low complexity, requires no special system configurations, and demands no administrative privileges. Although the CVSS evaluation conservatively rates confidentiality impact as None, real-world exploitation in multi-tenant environments introduces a localized risk of informational leakage.

Because the out-of-bounds heap data is formatted into a Python exception object, any application configured to return verbose error tracebacks to clients may leak adjacent heap memory. This leaked memory can contain sensitive objects, such as session cookies, database connection strings, or encryption keys from other active connection threads. This behavior elevates the actual risk beyond a simple process crash.

Remediation and Mitigation

The recommended remediation is to upgrade all installations of aiohttp to version 3.14.3 or later. This replaces the vulnerable Cython pointer manipulation logic with the safe, offset-based slicing mechanism. Package managers can execute the following command to update the dependency:

pip install -U aiohttp>=3.14.3

If upgrading is not immediately feasible due to legacy system constraints, administrators can fully mitigate the vulnerability by disabling the compiled Cython extensions. This forces aiohttp to fall back on its pure-Python HTTP parser, which is inherently safe from native-level memory bounds issues. To implement this workaround, set the following environment variable in the application's runtime environment:

export AIOHTTP_NO_EXTENSIONS=1

Note that disabling C extensions will decrease HTTP parsing performance and increase CPU utilization under high-traffic conditions. Consequently, this workaround should only be used as a temporary measure until the library can be updated. Organizations should also monitor deployment environments for container crashes returning exit code 139 (SIGSEGV) to identify potential exploitation attempts.

Official Patches

aio-libsOfficial security advisory containing remediation steps and severity details.
aio-libsPull request applying the offset calculation patch to the HTTP parser.
aio-libsRelease notes and changelog for stable version 3.14.3.

Fix Analysis (1)

Technical Appendix

CVSS Score
7.1/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Affected Systems

aiohttp client-side applications running on versions prior to 3.14.3 with C extensions enabledaiohttp server-side applications running on versions prior to 3.14.3 with C extensions enabled

Affected Versions Detail

Product
Affected Versions
Fixed Version
aiohttp
aio-libs
< 3.14.33.14.3
AttributeDetail
CWE IDCWE-125
Attack VectorNetwork
CVSS v4.0 Score7.1
EPSS ScoreNot Available
Vulnerability ClassHeap Out-of-Bounds Read
Exploit StatusProof-of-Concept (PoC)
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
T1203Exploitation for Client Execution
Execution
T1068Exploitation for Privilege Escalation
Privilege Escalation
T1005Data from Local System
Collection
CWE-125
Out-of-bounds Read

The program reads data past the end, or before the beginning, of the intended buffer.

Known Exploits & Detection

aio-libs repository testsRegression test cases simulating truncated chunked transfer payloads that trigger the C-parser crash.

Vulnerability Timeline

Vulnerability fixed in aio-libs/aiohttp codebase.
2026-07-22
Official release of patched version 3.14.3.
2026-07-22
CVE-2026-69244 officially published and documented.
2026-08-03

References & Sources

  • [1]GitHub Security Advisory GHSA-cq5v-8q36-5273
  • [2]CVE-2026-69244 Official CVE Record

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•26 minutes ago•CVE-2026-69248
6.9

CVE-2026-69248: Name Constraints Bypass via Wildcard SANs in Python cryptography

An improper certificate validation vulnerability (CWE-295) in the Rust-based X.509 verification engine of python-cryptography allows wildcard Subject Alternative Names (SANs) to bypass permitted Name Constraints. This enables an attacker to construct certificates that escape the restricted scope of a subordinate Certificate Authority (CA) and successfully authenticate against vulnerable client installations. The vulnerability is tracked as CVE-2026-69248 and GHSA-m2h6-j472-rp4c, with a CVSS v4.0 base score of 6.9.

Alon Barad
Alon Barad
1 views•6 min read
•about 2 hours ago•CVE-2026-69192
7.7

CVE-2026-69192: SSRF Bypass via Parser Differential (Octal vs Decimal) in ip-address JavaScript Library

CVE-2026-69192 is a critical parser differential vulnerability in the 'ip-address' JavaScript library (versions <= 10.3.0). The library parses IPv4 octets containing leading zeros as base-10 (decimal), whereas standard system resolvers and web environments parse them as base-8 (octal). This discrepancy allows remote attackers to bypass SSRF guards and route malicious requests to internal RFC 1918 networks.

Alon Barad
Alon Barad
7 views•6 min read
•about 3 hours ago•CVE-2026-69151
7.6

CVE-2026-69151: Stored Cross-Site Scripting (XSS) in Angular Compiler i18n Pipeline via Event-Handler Attributes

A high-severity security vulnerability has been identified within the Angular compiler's internationalization (i18n) metadata collection and translation pipeline. Angular implements strict defenses against client-side execution injection by validating standard attribute and property bindings. However, when parsing elements containing both i18n translation attributes and inline event-handler elements (such as `i18n-onerror`), the compiler failed to assert the safety of the target attribute. Consequently, compromised or untrusted localization translation source files can supply arbitrary JavaScript payloads that replace static event-handler bindings. This arbitrary code is compiled directly into the localized build bundle and executed dynamically by the web browser, bypassing runtime sanitization, security checks, and standard binding constraints.

Amit Schendel
Amit Schendel
3 views•8 min read
•about 4 hours ago•CVE-2026-69153
6.3

CVE-2026-69153: Arbitrary File Read via Path Traversal in PostCSS

A directory traversal and arbitrary file read vulnerability exists in PostCSS due to an incomplete fix of CVE-2026-45623. When parsing a CSS file containing a sourceMappingURL comment with the 'from' parameter unset, path traversal and absolute path validations are bypassed, enabling attackers to read arbitrary local .map files.

Amit Schendel
Amit Schendel
3 views•5 min read
•about 5 hours ago•CVE-2026-69152
7.5

CVE-2026-69152: Denial of Service via Resource Exhaustion in brace-expansion

CVE-2026-69152 is a high-severity Denial of Service (DoS) vulnerability in brace-expansion that allows remote, unauthenticated attackers to cause a process crash or infinite thread-blocking condition. The vulnerability stems from a complete mitigation bypass of the security checks implemented for CVE-2026-14257.

Alon Barad
Alon Barad
7 views•7 min read
•about 6 hours ago•CVE-2026-68945
8.8

CVE-2026-68945: Cache-Key Ambiguity in Angular HttpTransferCache Leading to State Poisoning

An in-depth technical analysis of CVE-2026-68945, a high-severity security vulnerability in Angular's `@angular/common/http` package. The flaw stems from an ambiguity in how query parameters are serialized to generate cache keys during Server-Side Rendering (SSR) within the `HttpTransferCache` component. By failing to encode delimiters and implicitly coercing arrays to comma-joined strings, the serialization mechanism yields identical cache keys for distinct requests, facilitating State Poisoning and Cross-Request Response Reuse.

Amit Schendel
Amit Schendel
8 views•5 min read