Sep 9, 2026·7 min read·83 visits
A Medium severity (CVSS 5.9) denial-of-service vulnerability in ASP.NET Core allows unauthenticated attackers to cause memory exhaustion and crash the server via compressed HTTP request payloads.
An Improper Handling of Highly Compressed Data (Data Amplification) vulnerability (CVE-2026-69304) exists in Microsoft ASP.NET Core and Microsoft .NET. It allows unauthenticated remote attackers to trigger resource exhaustion and denial of service via highly compressed request payloads.
ASP.NET Core provides support for transparent decompression of incoming HTTP request bodies through specialized middleware and hosting integrations. This capability enables servers to dynamically unpack payloads compressed using standard algorithms such as GZIP, Deflate, and Brotli. By processing these payloads on-the-fly, applications can reduce bandwidth utilization and improve throughput for clients operating under restricted network conditions.
The vulnerability identified as CVE-2026-69304 stems from improper resource management during the decompression phase. The flaw resides in how the web host handles highly compressed, redundant data structures, commonly classified under CWE-409 (Improper Handling of Highly Compressed Data). Under specific conditions, the decompression libraries inflate incoming payloads without validating the output volume against the resource constraints of the system.
The attack surface is exposed to unauthenticated remote attackers who can send crafted HTTP requests directly to endpoints utilizing request decompression. Because decompression occurs early in the request-processing pipeline, the server allocates resources before performing authentication, routing, or authorization checks. This structural design amplifies the impact of the flaw, as arbitrary network actors can trigger resource exhaustion with minimal cost.
The root cause of CVE-2026-69304 lies in the sequential read and expansion mechanisms of .NET decompression streams, including GzipStream, DeflateStream, and BrotliStream. When an HTTP request containing a 'Content-Encoding: gzip' header is processed, the ASP.NET Core request decompression middleware wraps the incoming network stream in an instance of the corresponding decompression class. The wrapper then reads the compressed bytes and reconstructs the original uncompressed payload in system memory.
The vulnerability occurs because the original decompression stream wrapper did not correlate the size of the compressed network payload with the cumulative length of the decompressed output. Decompression algorithms function by replacing repeating sequences of data with short pointer references. A malicious payload can contain long strings of repeating characters, such as zero bytes, which compress down to a few kilobytes but expand to multiple gigabytes of memory upon decompression.
During processing, as the server continuously pulls data from the decompression stream, it repeatedly allocates heap buffers to accommodate the rapidly expanding output. If the decompressed size exceeds available physical RAM, the .NET Garbage Collector becomes overloaded attempting to reclaim memory, leading to severe CPU starvation. Ultimately, the hosting runtime encounters an unhandled OutOfMemoryException, causing the worker process to terminate and resulting in a denial-of-service condition.
To visualize the progression of an incoming compressed payload through the vulnerable stack, the sequence of events is illustrated below:
The fundamental defect is the absence of a size-limiting boundary within the decompression loop. The framework read the stream until the end of the payload was reached, relying on the client-supplied structure rather than defensive runtime constraints. The listing below represents a conceptual contrast between the vulnerable structure and the patched stream wrapper implementation:
// VULNERABLE: Reads decompression stream without tracking inflated output size
public async Task DecompressRequestAsync(HttpContext context, Stream compressedStream)
{
using (var decompressor = new GzipStream(compressedStream, CompressionMode.Decompress))
{
// The buffer expands dynamically without size checks
await decompressor.CopyToAsync(context.Response.Body);
}
}
// PATCHED: Implements a size-limiting wrapper to enforce strict thresholds
public async Task DecompressRequestPatchedAsync(HttpContext context, Stream compressedStream, long maxLimit)
{
// The framework wraps the decompression stream in a size-limiting stream
using (var decompressor = new GzipStream(compressedStream, CompressionMode.Decompress))
using (var limitedStream = new SizeLimitingStream(decompressor, maxLimit))
{
try
{
await limitedStream.CopyToAsync(context.Response.Body);
}
catch (InvalidDataException ex)
{
// Abruptly terminates the connection and reclaims memory resources
context.Abort();
throw new InvalidOperationException("Decompressed body size limit exceeded.", ex);
}
}
}In the patched version, the SizeLimitingStream monitors the accumulated decompressed byte count during each read operation. If the decompressed byte count surpasses the configured limit (such as MaxRequestBodySize), the stream immediately raises an exception. This early termination prevents further memory allocations, discards the half-processed stream, and closes the connection to preserve host resources.
Exploitation of CVE-2026-69304 does not require valid credentials, administrative privileges, or complex pre-conditions. The primary requirement is that the targeted ASP.NET Core application must have request decompression explicitly configured and enabled. This is typical in applications that process high-volume API telemetry or large document uploads from remote clients.
An attacker begins by preparing a payload containing highly redundant, repeatable byte sequences, such as continuous arrays of hexadecimal zeros. Using a compression utility, the attacker compresses this payload, achieving an extremely high data amplification ratio (often exceeding 1:1000). The resulting compressed file remains exceptionally small, typically measuring less than 10 kilobytes, which easily bypasses standard network packet length restrictions.
The attacker then transmits this payload to any exposed endpoint on the target server using an HTTP POST or PUT request. The request is sent with the header 'Content-Encoding: gzip' (or 'deflate' / 'br') to instruct the ASP.NET Core middleware to initiate decompression. Upon receipt, the middleware immediately invokes the vulnerable stream handlers, triggering unbounded memory allocations on the server's heap until resource starvation occurs.
The primary impact of CVE-2026-69304 is a complete Denial of Service (DoS) affecting the availability of the web application. Because the runtime runs out of memory, the underlying operating system or IIS process manager terminates the worker process. In out-of-process hosting environments, this leads to persistent HTTP 502 (Bad Gateway) errors for all subsequent legitimate incoming requests.
The CVSS v3.1 base score is calculated as 5.9 (Medium) with the vector CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H. The Attack Complexity is classified as High (AC:H) because exploitation depends on the specific operational configuration where request decompression is actively enabled. The impact metrics are isolated to Availability, while Confidentiality and Integrity remain unaffected.
Additionally, this vulnerability presents detection challenges for security operations centers. Standard signature-based Web Application Firewalls (WAF) inspect incoming requests based on size and typical exploit patterns. Because the payload size of a decompression bomb is extremely small, it often passes through security boundaries undetected, only revealing its destructive nature once processed by the internal application server.
Remediation of CVE-2026-69304 is achieved primarily by updating the underlying .NET SDK and hosting runtimes. Administrators must apply the relevant security updates released by Microsoft: upgrade to .NET 10.0.12 or higher, .NET 9.0.20 or higher, or .NET 8.0.31 or higher. Rebuilding and redeploying the application with these patched SDKs ensures that the decompression wrapper streams implement the necessary size validations.
If immediate patching is not feasible, administrators can apply temporary workarounds to reduce risk. The most direct workaround is to disable the request decompression middleware globally within the application's configuration file (typically 'Program.cs' or 'Startup.cs'). This is done by removing or commenting out the 'app.UseRequestDecompression()' middleware registration.
Alternatively, administrators should configure strict request size limits on the Kestrel server or the reverse proxy. By setting the 'MaxRequestBodySize' limit, the application will reject oversized incoming payloads before they can undergo decompression. Implementing deep packet inspection or rate-limiting rules at the reverse proxy (such as Nginx or HAProxy) can also block compressed payloads destined for endpoints that do not require them.
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
.NET 10.0 Microsoft | 10.0.0 to < 10.0.12 | 10.0.12 |
.NET 9.0 Microsoft | 9.0.0 to < 9.0.20 | 9.0.20 |
.NET 8.0 Microsoft | 8.0.0 to < 8.0.31 | 8.0.31 |
ASP.NET Core 11.0 Microsoft | 11.0 to < 11.0 RC1 | 11.0 RC1 |
ASP.NET Core 10.0 Microsoft | 10.0.0 to < 10.0.12 | 10.0.12 |
ASP.NET Core 9.0 Microsoft | 9.0.0 to < 9.0.20 | 9.0.20 |
ASP.NET Core 8.0 Microsoft | 8.0.0 to < 8.0.31 | 8.0.31 |
Visual Studio 2022 (v17.14) Microsoft | 17.14.0 to < 17.14.40 | 17.14.40 |
Visual Studio 2026 (v18.9) Microsoft | 18.9.0 to < 18.9.3 | 18.9.3 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-409 |
| Attack Vector | Network (AV:N) |
| CVSS v3.1 Score | 5.9 (Medium) |
| EPSS Score | 0.00768 |
| Impact | Availability (High) |
| Exploit Status | None |
| KEV Status | Not Listed |
The product does not sufficiently limit the resources used to decompress highly compressed data, leading to resource exhaustion.
CVE-2026-115895 is a high-severity code injection vulnerability (CWE-94) in the happy-dom npm package prior to version 21.0.4. The vulnerability exists within the ECMAScriptModuleCompiler component, which transforms ECMAScript module syntax into executable Node.js functions when JavaScript evaluation is enabled. Due to an incomplete fix for CVE-2026-33943, the compiler failed to validate local named import aliases against legal JavaScript identifier rules. Attackers supplying crafted module imports—specifically utilizing destructuring default initializers alongside JSON module attributes—can inject arbitrary JavaScript expressions directly into the host Node.js runtime context.
An improper input validation and authorization bypass vulnerability exists in the LangGraph storage layer affecting langgraph, langgraph-checkpoint-postgres, and langgraph-checkpoint-sqlite. Because relational store implementations serialize namespace tuples into dot-delimited strings without validating labels on read, search, delete, and batch operations, an attacker who controls a namespace label can inject periods (.) to traverse namespace boundaries and access, modify, or delete data belonging to other namespaces.
CVE-2026-115886 (GHSA-2wqp-q3c6-ccj5) is a Server-Side Request Forgery (SSRF) and Unsafe Reflection vulnerability in MLflow versions 3.12.0rc0 prior to 3.17.0. Unauthenticated REST API endpoints accept serialized third-party scorer JSON payloads that are dynamically deserialized and reflectively instantiated without sanitizing constructor keyword arguments. When optional dependencies such as trulens and trulens-providers-litellm are installed, attackers can inject egress-steering arguments into the scorer payload, forcing the MLflow server to dispatch outbound HTTP requests to arbitrary internal destinations or cloud metadata services.
CVE-2026-113872 (GHSA-q7qp-rjg7-q26m) is a high-severity denial-of-service vulnerability affecting the multer multipart/form-data upload middleware for Node.js and Express in versions 2.0.0 through 2.4.0. When an endpoint is configured to accept multiple files using an asynchronous fileFilter callback, a crafted, truncated multipart HTTP request can trigger an unhandled error event on the underlying busboy stream parser after request teardown has already completed. Because all error listeners are stripped during teardown, Node.js treats the resulting error event as an uncaught exception and immediately terminates the server process.
CVE-2026-115897 (also tracked as GHSA-m5mm-p8h7-m29v and aliased as CVE-2026-115754) is a Cross-Site Scripting (XSS) vulnerability in the Yahoo serialize-javascript npm package prior to version 7.1.3. The flaw exists in the regular expression used by escapeFunctionBody() to neutralize HTML script closing tags within serialized JavaScript functions. Because function bodies are sanitized in isolation before structural formatting is applied, a function whose string representation terminates directly with the sequence '</script' bypasses the positive lookahead check. When combined with serialization formatting options that introduce whitespace delimiters and a subsequent property that supplies a closing bracket, an attacker can prematurely terminate an enclosing HTML <script> block and inject arbitrary HTML or JavaScript into the rendered document.
CVE-2026-109841 is a Subresource Integrity (SRI) verification bypass vulnerability in undici, the official HTTP/1.1 and HTTP/2 client library for Node.js that powers the global fetch() implementation. The flaw stems from improper handling of case sensitivity (CWE-178) when validating cryptographic hash algorithm tokens within SRI metadata. Because undici compared incoming algorithm identifiers against a strictly lowercase set without prior ASCII-lowercase normalization, valid uppercase or mixed-case tokens such as SHA256- or Sha384- were treated as unrecognized algorithms and discarded. Under SRI forward-compatibility rules, discarding all provided tokens results in an empty integrity list, causing undici to fail open and accept tampered HTTP response bodies without cryptographic verification.