Aug 12, 2026·6 min read·178 visits
Use-after-free in MSQuic leads to high-impact remote information disclosure of server memory.
A critical use-after-free vulnerability in Microsoft QUIC allows unauthenticated remote attackers to disclose sensitive system memory over the network. The vulnerability is caused by a race condition during rapid connection termination and asynchronous packet retransmission.
The Microsoft QUIC library (msquic.dll) forms the foundational transport layer for high-performance networks in the .NET runtime ecosystem. It handles state machines, packet processing, and transport-level encryption for protocols like HTTP/3. In multi-tenant or concurrent environments, this component exposes a critical network attack surface, as it directly processes raw, untrusted incoming network frames before dispatching them to the application layer.
CVE-2026-62898 identifies a critical memory lifecycle vulnerability within this transport library. The flaw is classified under CWE-416 (Use After Free). It allows an unauthenticated remote attacker to compromise system confidentiality by forcing the host to transmit sensitive process memory over the network.
Because the underlying library operates within high-privilege user-space processes (such as Kestrel web servers hosting ASP.NET Core applications), the leaked data may contain cryptographic keys, session tokens, or transaction payloads. This analysis explores the technical architecture of the vulnerability, its root causes, and remediation paths.
The vulnerability is located in the memory buffer synchronization mechanism between the managed .NET layer (System.Net.Quic) and the native MSQuic library (msquic.dll). To minimize garbage collection overhead, .NET pins managed byte arrays and passes their memory addresses directly to native code as zero-copy QUIC_BUFFER structures. MSQuic manages these transport buffers through high-speed internal lookaside lists and memory pools, such as CXPLAT_POOL.
A synchronization defect occurs when a connection or stream is abruptly torn down while asynchronous write operations are still pending in the queue. Under normal circumstances, MSQuic maintains an internal reference counter on active packets to prevent premature reclamation. However, a race condition exists during immediate connection terminations, such as when a CONNECTION_CLOSE or RESET_STREAM frame is processed simultaneously with an active retransmission event.
When the connection aborts, the cleanup routine prematurely decrements the reference count of the associated network buffers, freeing the memory back to the global allocator. Crucially, the pointer to this buffer remains in the asynchronous send queue or the loss-recovery retransmission queue. If another thread reallocates this memory block for a different session, the subsequent asynchronous transmission routine reads from the dangling pointer and serializes recycled data to the remote peer.
The vulnerability in the .NET runtime was resolved by updating the dependency configuration to point to a patched version of the MSQuic native library. The fix is tracked in the dotnet/runtime repository.
File: eng/Versions.props
@@ -161,7 +161,7 @@
<!-- Docs -->
<MicrosoftPrivateIntellisenseVersion>10.0.0-preview-20251006.1</MicrosoftPrivateIntellisenseVersion>
<!-- MsQuic -->
- <MicrosoftNativeQuicMsQuicSchannelVersion>2.4.18</MicrosoftNativeQuicMsQuicSchannelVersion>
+ <MicrosoftNativeQuicMsQuicSchannelVersion>2.5.9</MicrosoftNativeQuicMsQuicSchannelVersion>
<SystemNetMsQuicTransportVersion>9.0.0-alpha.1.24167.3</SystemNetMsQuicTransportVersion>
<!-- emscripten / Node -->
<MicrosoftNETRuntimeEmscriptenVersion>$(MicrosoftDotNetApiCompatTaskPackageVersion)</MicrosoftNETRuntimeEmscriptenVersion>The update from MSQuic 2.4.18 to 2.5.9 implements critical architectural changes within the native packet allocation engine. In version 2.5.9, MSQuic introduces stricter ownership boundaries and memory barriers during stream destruction. This prevents the cleanup code path from releasing packets while they are registered in any active retransmission or send queues.
In the patched version, the reference counting tracking packet lifecycles covers the lifetime of both the primary transmission queue and the connection's loss recovery timers. The underlying buffer cannot be returned to the CXPLAT_POOL lookaside list until the socket layer confirms that no further retransmission attempts can occur for that specific packet identifier.
An attack targeting CVE-2026-62898 does not require prior authentication or specialized privileges. The adversary must establish a standard QUIC handshake with a vulnerable service, such as an HTTP/3 endpoint hosted on Kestrel in .NET 10.0, 9.0, or 8.0. Once the connection is established, the attacker must generate high volumes of concurrent stream requests to populate the server's asynchronous I/O queues.
To trigger the race condition, the attacker issues a rapid series of stream reset requests (RESET_STREAM or CONNECTION_CLOSE) immediately after transmitting payloads. Simultaneously, the attacker must induce packet loss by selectively dropping specific acknowledgement (ACK) packets sent by the server. This sequence forces the server's loss recovery state machine to schedule retransmissions of the recently closed streams.
If the race condition succeeds, the server processes the stream destruction and frees the associated transport buffers before the retransmission routine executes. When the retransmission event eventually triggers, the server reads the current contents of the freed memory block—now populated with data from concurrent server threads—and transmits it to the attacker. The attacker extracts sensitive heap remnants directly from the incoming encrypted payload without crashing the remote process.
The security impact of CVE-2026-62898 is classified as High, with a CVSS v3.1 base score of 7.5. The impact vector is evaluated as CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N. Because the vulnerability resides in the network transport layer, the attack can be executed entirely over the network without local access or user interaction.
The vulnerability is limited to information disclosure (Confidentiality: High) and does not directly support arbitrary code execution (Integrity: None, Availability: None). However, the leakage of heap memory from a high-performance web server poses a significant operational risk. The leaked buffers may contain raw HTTP request headers, session tokens, authorization headers, database queries, or TLS session keys belonging to other users.
Furthermore, because the memory pool reuse occurs silently within the native process, exploiting this flaw does not cause application crashes or trigger system alerts. This lack of crash indicators makes detection via traditional availability monitoring tools highly difficult, allowing prolonged unauthorized data collection under specific network conditions.
The primary remediation for CVE-2026-62898 is applying the official security updates released by Microsoft. Developers and administrators must upgrade their .NET runtimes, SDKs, and Visual Studio installations to the designated secure versions immediately.
For .NET environments, the required secure versions are:
For development environments running Microsoft Visual Studio, the patched versions are:
In scenarios where immediate patching is not feasible, organizations should evaluate whether HTTP/3 (QUIC) can be temporarily disabled at the web server layer (e.g., Kestrel configuration or reverse proxy) to fall back to HTTP/2 over standard TLS (TCP). This configuration change effectively eliminates the attack surface by bypassing the vulnerable msquic.dll state machine.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
.NET 10.0 Microsoft | >= 10.0.0, < 10.0.11 | 10.0.11 |
.NET 9.0 Microsoft | >= 9.0.0, < 9.0.19 | 9.0.19 |
.NET 8.0 Microsoft | >= 8.0.0, < 8.0.30 | 8.0.30 |
Microsoft Visual Studio 2022 Microsoft | >= 17.14.0, < 17.14.38 | 17.14.38 |
Microsoft Visual Studio 2026 Microsoft | >= 18.0, < 18.8.3 | 18.8.3 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-416 |
| Attack Vector | Network |
| CVSS Score | 7.5 (High) |
| EPSS Score | 0.00% |
| Exploit Status | No weaponized exploit available |
| KEV Status | Not listed in CISA KEV |
The product uses a pointer after it has been freed, which can lead to unexpected behaviors, including crashes, use of stale data, or memory corruption.
CVE-2026-109619 (PHP2Shell) is a critical Use-After-Free vulnerability in the core PHP engine caused by improper global state cleanup during out-of-memory exception handling across persistent worker requests.
In Python virtualenv prior to version 21.14.9, activation script generators and configuration writers use Path.exists() before writing files. Because Path.exists() resolves symbolic links, it returns False for dangling symlinks. Consequently, virtualenv skips unlinking pre-planted symbolic links or hard links, writing data directly to target locations outside the intended virtual environment directory.
A remote code execution vulnerability exists in Microsoft .NET due to untrusted data deserialization within the PresentationCore component. The flaw stems from implicit auto-conversion flags during clipboard data retrieval operations.
An out-of-bounds write vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio allows unauthenticated remote attackers to execute arbitrary code via crafted pixel-shader bytecode or auto-converted clipboard payloads.
ASP.NET Core contains a thread deadlock vulnerability (CWE-833) that allows an unauthenticated remote attacker to cause a denial of service over the network by exhausting server thread pool resources.
CVE-2026-70035 is a high-severity Remote Code Execution (RCE) vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio caused by improper handling during the deserialization of untrusted data (CWE-502). An unauthenticated attacker can execute arbitrary code within the context of the affected process by delivering a crafted serialized payload.