Nov 11, 2026·11 min read·1 visit
An uninitialized memory reuse flaw (CWE-908) in ASP.NET Core 11.0 preview response buffering middleware allows residual HTTP response data from pooled memory buffers to leak into subsequent short responses or application log sinks. Upgrading to .NET 11.0.0 GA or Visual Studio 2026 18.12.0 resolves the issue.
CVE-2026-114150 is a network-accessible information disclosure vulnerability affecting Microsoft ASP.NET Core in .NET 11.0 preview releases and Microsoft Visual Studio 2026 prior to version 18.12.0. The flaw stems from the use of uninitialized resources (CWE-908) within response buffering components, specifically ResponseBufferingStream used by middleware such as HTTP Logging and Output Caching. Because rented memory segments from ArrayPool<byte> or MemoryPool<byte> are not cleared upon return or strictly bounded to the exact written byte count during subsequent reads, residual response payloads from earlier HTTP requests remain in the buffer tail. Downstream consumers or log sinks reading these buffers expose confidential cross-session data, including authentication tokens and personally identifiable information.
CVE-2026-114150 is an information disclosure vulnerability in Microsoft ASP.NET Core affecting .NET 11.0 preview releases (from 11.0.0-preview.1 up to, but excluding, 11.0.0 GA) across Linux, macOS, and Windows platforms, as well as Microsoft Visual Studio 2026 versions prior to 18.12.0. The vulnerability resides in the HTTP response body buffering infrastructure, specifically within stream wrapper classes such as ResponseBufferingStream. These abstractions are invoked when applications configure built-in middleware that inspects, caches, or logs outgoing HTTP payloads, primarily Microsoft.AspNetCore.HttpLogging and Microsoft.AspNetCore.OutputCaching.
In modern high-throughput web servers, allocating and garbage-collecting large byte arrays for every HTTP response introduces severe memory pressure and latency overhead. To optimize throughput, ASP.NET Core relies on shared memory pooling mechanisms provided by the runtime, notably ArrayPool<byte>.Shared and MemoryPool<byte>. When a middleware component needs to buffer a response body in memory before transmitting it over the network or writing it to a diagnostic sink, it rents fixed-size or bucketed byte segments from these shared pools rather than allocating fresh heap arrays.
Classified under CWE-908 (Use of Uninitialized Resource), this vulnerability occurs because pooled byte arrays retain the exact byte patterns written during previous lease lifecycles unless explicitly zeroed out. When ResponseBufferingStream processes an HTTP response that is smaller than the total capacity of the rented buffer segment, and fails to strictly clamp the reader view to the exact count of newly written bytes, the unwritten tail of the buffer remains accessible. Consequently, downstream stream consumers and HTTP logging facilities read past the logical end of the current response and ingest stale memory remnants left behind by prior, unrelated HTTP transactions.
> [!NOTE]
> While the .NET runtime automatically zeroes newly allocated managed heap objects to uphold memory safety, rented buffers from ArrayPool<byte> bypass initialization by design for performance reasons. Applications using pooled memory are responsible for tracking exact data boundaries or explicitly requesting zeroed memory upon return.
The root cause of CVE-2026-114150 is an interaction between non-zeroed memory pool recycling and improper slice boundary tracking within ASP.NET Core's response buffering streams. When HttpLoggingMiddleware or OutputCachingMiddleware intercepts an HTTP request, it replaces the default IHttpResponseBodyFeature stream with an intermediate buffering stream (ResponseBufferingStream). As the application pipeline writes response data, the buffering stream leases underlying byte[] segments from ArrayPool<byte>.Shared or MemoryPool<byte> to stage the payload.
Because ArrayPool<byte> organizes buffers into power-of-two size buckets (for example, 4,096 bytes, 8,192 bytes, or 16,384 bytes), a request for a buffer almost always yields an array whose physical capacity (byte[].Length) exceeds the actual number of bytes written during a given HTTP response. When Request $A$ completes, its rented buffer segment—populated with up to $N$ bytes of potentially sensitive response data—is returned to the pool via ArrayPool<byte>.Shared.Return(buffer, clearArray: false). Leaving clearArray set to false avoids the CPU cost of zeroing memory, which is safe only if all subsequent consumers strictly obey the high-water mark of their own write operations.
The vulnerability triggers during a subsequent Request $B$ that leases the exact same memory segment from the pool and writes a smaller payload of $M$ bytes, where $M < N$. Within the vulnerable preview builds of ASP.NET Core 11.0, the boundary tracking logic inside the buffering and logging pipeline fails to constrain the read window strictly to the range [0..M). Instead of exposing a tightly bounded slice (ReadOnlyMemory<byte>.Slice(0, actualBytesWritten)), the stream exposes the broader underlying segment or fails to reset internal offset state across stream reuse cycles.
When the downstream consumer—such as the HTTP Logging sink or W3C Logger—iterates over the buffered response body to record telemetry, it reads past index $M$ up to the segment's previous watermark $N$ or full buffer capacity. The residual bytes in the interval [M..N) contain the uninitialized tail of Request $A$'s response body, resulting in cross-request memory disclosure.
The affected components center around response body buffering and logging tests and implementations tracked in the dotnet/aspnetcore repository, specifically involving src/Middleware/OutputCaching/test/CachedResponseBodyTests.cs (tracked under issue #61053), src/Middleware/HttpLogging/test/W3CLoggerTests.cs (issue #61052), and src/Servers/HttpSys/test/FunctionalTests/ResponseBodyTests.cs (issue #63532). While the vulnerability manifests in the core buffering streams utilized by these components, examining the buffer leasing and slicing mechanics illustrates the exact programmatic flaw and its remediation in the .NET 11.0.0 GA release.
In the vulnerable pattern, a response buffering stream rents a segment from the pool and copies or writes outgoing response bytes into it. When the buffered content is later extracted for logging or caching, passing the raw segment without slicing to the active write count exposes the uninitialized tail:
// VULNERABLE PATTERN: Under-constrained buffer exposure and unzeroed pool return
public sealed class ResponseBufferingStream : Stream
{
private byte[]? _rentedBuffer;
private int _bytesWritten;
public override void Write(ReadOnlySpan<byte> buffer)
{
if (_rentedBuffer == null)
{
// Rents a bucketed array (e.g., 4096 bytes) containing stale data from prior requests
_rentedBuffer = ArrayPool<byte>.Shared.Rent(Math.Max(buffer.Length, 4096));
}
buffer.CopyTo(_rentedBuffer.AsSpan(_bytesWritten));
_bytesWritten += buffer.Length;
}
// FLAW: Exposes the entire rented buffer or improperly tracked segment length
// rather than clamping strictly to _bytesWritten.
public ReadOnlyMemory<byte> GetBufferedData()
{
if (_rentedBuffer == null)
{
return ReadOnlyMemory<byte>.Empty;
}
// Returning the un-sliced buffer exposes [0 .. _rentedBuffer.Length]
// where [_bytesWritten .. _rentedBuffer.Length] contains prior request data.
return new ReadOnlyMemory<byte>(_rentedBuffer);
}
protected override void Dispose(bool disposing)
{
if (_rentedBuffer != null)
{
// Returning without clearing leaves sensitive payloads in the shared pool
ArrayPool<byte>.Shared.Return(_rentedBuffer, clearArray: false);
_rentedBuffer = null;
// If _bytesWritten is not deterministically reset in IResettable paths, state leaks
}
base.Dispose(disposing);
}
}To remediate CWE-908 in high-performance .NET streams, the patch in v11.0.0 enforces strict boundary slicing on all read paths and ensures deterministic state cleanup during buffer return and object reset routines:
// PATCHED PATTERN: Strict boundary clamping and sanitized pool management
public sealed class ResponseBufferingStream : Stream, IResettable
{
private byte[]? _rentedBuffer;
private int _bytesWritten;
public override void Write(ReadOnlySpan<byte> buffer)
{
if (_rentedBuffer == null)
{
_rentedBuffer = ArrayPool<byte>.Shared.Rent(Math.Max(buffer.Length, 4096));
_bytesWritten = 0;
}
buffer.CopyTo(_rentedBuffer.AsSpan(_bytesWritten));
_bytesWritten += buffer.Length;
}
// FIX 1: Strictly clamp the exposed ReadOnlyMemory slice to [0 .. _bytesWritten]
public ReadOnlyMemory<byte> GetBufferedData()
{
if (_rentedBuffer == null || _bytesWritten == 0)
{
return ReadOnlyMemory<byte>.Empty;
}
// Prevents downstream loggers or stream consumers from reading residual tail bytes
return new ReadOnlyMemory<byte>(_rentedBuffer, 0, _bytesWritten);
}
public void Reset()
{
if (_rentedBuffer != null)
{
// FIX 2: Clear the active region or set clearArray: true to prevent cross-request residue
ArrayPool<byte>.Shared.Return(_rentedBuffer, clearArray: true);
_rentedBuffer = null;
}
// FIX 3: Deterministically reset length trackers
_bytesWritten = 0;
}
}The remediation applied in .NET 11.0.0 is comprehensive for built-in ASP.NET Core buffering middleware. By enforcing invariant slicing (Slice(0, actualBytesWritten)) before passing memory blocks to HttpLoggingMiddleware or OutputCachingMiddleware, downstream readers cannot access uninitialized indices even if the underlying ArrayPool<byte> contains non-zero bytes. However, third-party developers implementing custom IHttpResponseBodyFeature wrappers or custom MemoryPool<byte> managers remain susceptible to variant bugs if they expose raw array references rather than bounded Span<byte> or Memory<byte> slices.
Exploiting CVE-2026-114150 over the network requires specific environmental conditions and timing alignment, reflected in its High Attack Complexity (AC:H) CVSS metric. No authentication (PR:N) or user interaction (UI:N) is required to trigger the buggy code path, provided the target application exposes endpoints routed through response buffering middleware.
>= 11.0.0-preview.1 and < 11.0.0).HttpLoggingMiddleware configured with HttpLoggingFields.ResponseBody or OutputCachingMiddleware buffering dynamic responses.HttpLoggingMiddleware writes the un-truncated buffer.GET /api/v1/account/tokens returning OAuth Bearer tokens, session cookies, or PII). When these responses complete, their underlying byte[] segments are returned to ArrayPool<byte>.Shared containing the cleartext response bodies.ArrayPool<byte>.Shared uses per-core thread-local slots backed by shared buckets, buffers returned on a specific processor core are immediately prioritized for the next allocation request of the same size bucket on that same core.{} JSON response or a short 404 Not Found message).Currently, no public Proof-of-Concept (PoC) scripts or automated exploitation modules exist in Exploit-DB, Metasploit, or GitHub (Exploit Code Maturity: Unproven).
CVE-2026-114150 is rated Medium Severity with a CVSS v3.1 base score of 5.9 (CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N). The impact is strictly confined to Confidentiality (C:H), with no direct capability to modify server state (I:N) or degrade service availability (A:N).
Because ArrayPool<byte>.Shared is a process-wide singleton within the .NET runtime, every component within the ASP.NET Core worker process shares the same underlying memory buckets. Consequently, the residual memory leaked from an uninitialized buffer segment is not restricted to a single endpoint or controller. Any data serialized into a buffered HTTP response across the entire application lifecycle is subject to disclosure, including:
In enterprise environments where HttpLoggingMiddleware is enabled to satisfy audit and compliance requirements, this vulnerability creates a severe secondary exposure vector: log contamination. Security analysts, support engineers, and external log-processing pipelines normally granted access to sanitized or non-sensitive endpoint logs will inadvertently receive cleartext sensitive payloads spliced onto benign health-check or status log entries. Furthermore, if an attacker subsequently compromises an exposed session token harvested from the leaked tail buffer, they can pivot to full account takeover and privilege escalation within the target application.
Microsoft has resolved CVE-2026-114150 in the general availability (GA) release of .NET 11.0.0 and Microsoft Visual Studio 2026 version 18.12.0. Organizations running preview builds of .NET 11.0 must upgrade their SDKs, runtimes, and hosting bundles immediately.
Upgrade all target deployment environments, build agents, and container base images from .NET 11.0.0-preview.* to .NET 11.0.0 (GA) or later:
11.0.0.Dockerfile references from mcr.microsoft.com/dotnet/aspnet:11.0-preview to mcr.microsoft.com/dotnet/aspnet:11.0.18.12.0 or later.If immediate runtime upgrading is blocked by deployment freezes, operators can neutralize the primary vulnerable code path by disabling response body buffering in HttpLoggingMiddleware. Modify the service registration in Program.cs to exclude HttpLoggingFields.ResponseBody:
using Microsoft.AspNetCore.HttpLogging;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpLogging(logging =>
{
// WORKAROUND: Explicitly omit HttpLoggingFields.ResponseBody
// to prevent ResponseBufferingStream from leasing pooled body buffers.
logging.LoggingFields = HttpLoggingFields.RequestPropertiesAndHeaders
| HttpLoggingFields.ResponsePropertiesAndHeaders;
});
var app = builder.Build();
app.UseHttpLogging();
app.Run();> [!WARNING]
> Ensure HttpLoggingFields.All is not used in HttpLoggingOptions, as All implicitly includes HttpLoggingFields.ResponseBody and activates response stream buffering.
Security teams should audit existing log storage and SIEM indices collected from .NET 11.0 preview environments for signs of buffer tail leakage:
\u0000).Content-Length response header against the actual character/byte length recorded in the ResponseBody log field. Any entry where length(LoggedResponseBody) > Content-Length indicates that uninitialized buffer tail data was emitted.CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
.NET 11.0 (Linux, macOS, Windows) Microsoft | >= 11.0.0-preview.1, < 11.0.0 | 11.0.0 |
Visual Studio 2026 Microsoft | < 18.12.0 | 18.12.0 |
| Attribute | Detail |
|---|---|
| CVE ID | CVE-2026-114150 |
| Weakness Class | CWE-908 (Use of Uninitialized Resource) |
| CVSS v3.1 Score | 5.9 Medium (AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N) |
| Attack Vector | Network (HTTP/HTTPS Response Buffering) |
| Primary Impact | High Confidentiality Loss (Cross-Request Memory & Log Disclosure) |
| Affected Component | ASP.NET Core ResponseBufferingStream / HttpLogging & OutputCaching |
| Exploit Status | Unproven / No Public PoC |
| CISA KEV Status | Not Listed |
The software uses or accesses a resource that has not been initialized or reset to a known baseline state, exposing residual data from prior operations when shared memory pools are recycled without boundary clamping or zeroing.
An incorrect authorization vulnerability (CWE-863) exists in the ASP.NET Core SignalR HTTP Connection Dispatcher (`Microsoft.AspNetCore.Http.Connections`). The connection negotiation process failed to bind the authenticated caller identity to the generated connection state, and subsequent transport or message dispatch handlers failed to verify caller consistency. Consequently, an authenticated low-privilege attacker who obtains a valid connection identifier or token can inject messages into or hijack another user's SignalR session, achieving an elevation of privilege across security boundaries.
CVE-2026-109478 is a network-accessible Denial of Service (DoS) vulnerability in ASP.NET Core caused by inefficient algorithmic complexity (CWE-407) when parsing comma-separated HTTP request headers. Prior to the patch, the internal helper method ParsingHelpers.GetHeaderSplit repeatedly called StringValues.Concat inside a loop iterating over each comma-separated token. Because StringValues allocates a new array of size k + 1 and copies all existing elements upon each concatenation, processing N tokens incurs O(N^2) time and space complexity. An unauthenticated remote attacker can send HTTP requests with headers containing thousands of short, comma-separated values to exhaust CPU cycles and induce severe Garbage Collection (GC) pauses, rendering the web application unresponsive.
CVE-2026-114147 is a high-severity Denial of Service (DoS) vulnerability affecting ASP.NET Core and specifically the Microsoft.AspNetCore.SignalR.StackExchangeRedis scale-out provider across .NET 8.0, 9.0, 10.0, and 11.0 preview releases. The vulnerability originates from a string comparison mismatch between internal per-connection group collections and the centralized Redis channel subscription registry, compounded by a race condition during connection teardown. Remote unauthenticated attackers can exploit this flaw to leave orphaned connection contexts and active Redis pub/sub listeners pinned in memory, leading to unbounded memory exhaustion and application process termination.
CVE-2026-114156 is an improper resolution of path equivalence vulnerability (CWE-41) in Microsoft ASP.NET Core affecting .NET 11.0 preview releases and Microsoft Visual Studio 2026. The vulnerability stems from a discrepancy between how path prefix validation helpers (such as PathString.StartsWithSegments) and downstream routing mechanisms handle alternate path separators and percent-encoded characters. An unauthenticated remote attacker can exploit this mismatch over the network to bypass path-based authorization middleware and access restricted endpoints.
CVE-2026-114157 is a high-severity local privilege escalation and security feature bypass vulnerability affecting ASP.NET Core on Microsoft Windows. The flaw resides in the Kestrel web server's Named Pipes transport layer (Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes) and stems from a race condition (CWE-362) during broken pipe error recovery. When an active connection throws an IOException during handshake acceptance, the connection listener previously disposed of the broken NamedPipeServerStream instance before acquiring a replacement stream from its internal pool. This sequence created a momentary window where zero server instances of the named pipe existed in the Windows Named Pipe File System (NPFS). A local, low-privileged attacker can exploit this timing window to create a named pipe with the identical name and a permissive Discretionary Access Control List (DACL), hijacking subsequent inter-process communications and escalating privileges across security boundaries.
CVE-2026-124194 is a forced authentication and spoofing vulnerability in Microsoft Office Outlook caused by a missing user interface warning before dereferencing remote network paths (CWE-356). By embedding an attacker-controlled Universal Naming Convention (UNC) path within MAPI message properties such as PidLidReminderFileParameter, an unauthenticated remote attacker can force a victim's system to initiate an outbound SMB or WebDAV connection upon opening or previewing a crafted message. This automatic authentication handshake leaks the user's NetNTLMv2 hash, enabling offline password cracking or real-time NTLM relay attacks. The vulnerability was exploited in the wild as a zero-day prior to its remediation in Microsoft's November 2026 Patch Tuesday updates and is listed in the CISA Known Exploited Vulnerabilities (KEV) catalog.