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-56170

CVE-2026-56170: Remote Denial of Service via Resource Exhaustion in ASP.NET Core

Amit Schendel
Amit Schendel
Senior Security Researcher

Jul 21, 2026·7 min read·5 visits

Executive Summary (TL;DR)

A remote, unauthenticated attacker can exploit multiple resource-allocation weaknesses (CWE-770) within ASP.NET Core to exhaust heap memory or trigger unhandled stack overflows, leading to a complete Denial of Service.

CVE-2026-56170 is a high-severity Remote Denial of Service (DoS) vulnerability in Microsoft's ASP.NET Core framework. The vulnerability spans three separate resource-management vectors within the ASP.NET Core ecosystem, including SignalR Stateful Reconnect allocations, JSON Patch Type Confusion leading to stack exhaustion, and Kestrel HTTP/2 synchronization issues. An unauthenticated remote attacker can exploit these issues to cause process-terminating exceptions, rendering applications unavailable.

Vulnerability Overview

CVE-2026-56170 represents a cluster of resource-management flaws classified under CWE-770 (Allocation of Resources Without Limits or Throttling). The vulnerability resides in core components of the ASP.NET Core framework, specifically the SignalR transport subsystem, the Microsoft.AspNetCore.JsonPatch middleware, and the Kestrel HTTP/2 stream handler. Because these components run at the front line of incoming HTTP traffic, they expose a highly critical attack surface.

An unauthenticated remote attacker can leverage these flaws to induce resource exhaustion over a network. Depending on the targeted vector, the exploit results in either system-wide heap memory saturation, thread pool starvation, or immediate worker-process termination via an unhandled stack overflow. The vulnerability affects standard configurations of .NET 8.0, 9.0, and 10.0 deployments.

The impact is limited to system availability, but because the underlying processes are completely terminated or starved of execution context, recovery often requires administrator intervention or automated process-recycling mechanisms. No data disclosure or integrity loss has been identified in connection with this vulnerability.

Root Cause Analysis

The vulnerability is split into three primary technical vectors, each targeting a distinct resource-allocation weakness in ASP.NET Core.

Vector A: SignalR Stateful Reconnect Resource Saturation

The Stateful Reconnect feature, designed to preserve client sessions during transient network drops, stores outbound messages in an in-memory buffer (StatefulReconnectBufferSize). In affected versions, the SignalR transport manager does not enforce global limits on the cumulative memory allocated for all disconnected sessions or limit the total number of concurrently suspended connections. Consequently, an attacker can open numerous connections, trigger outbound traffic, drop the TCP connection, and force Kestrel to keep these active, pinned memory structures allocated on the heap.

Vector B: JSON Patch Type Confusion & Recursion

Inside the JSON Patch parser implementation (Microsoft.AspNetCore.JsonPatch.SystemTextJson), the TryTraverse method in ListAdapter.cs attempts to identify if a target deserialized object is an array by casting it using the non-generic IList interface. However, modern System.Text.Json collection nodes—such as JsonArray—implement the generic IList<JsonNode> interface but do not implement the legacy, non-generic IList interface. When encountering a JsonArray, this cast returns null, causing the parser to fall back to the generic ObjectAdapter.

The ObjectAdapter attempts to traverse the JsonArray properties using reflection. Because these JSON node structures contain cyclic parent-child node pointers, the reflective property traversal falls into an infinite loop, exhausting the thread's stack frame and triggering an unrecoverable StackOverflowException.

Vector C: Kestrel HTTP/2 Stream Lifetime Desynchronization

When handling an HTTP/2 stream abort via a RST_STREAM frame, a race condition exists between the application thread writing response headers and the Kestrel connection-processing thread. If the application delegate continues writing to the stream while the abort sequence is running, Kestrel fails to execute a timely connection-level teardown. This delay leaves connection-bound resources, such as SignalR message buffers, allocated in memory far longer than expected, compounding the heap exhaustion attack vectors.

Code Analysis

The fix for the JSON Patch vulnerability (Vector B) directly resolves the type-confusion issue in ListAdapter.cs. Below is the comparison of the vulnerable logic versus the type-safe collection detection introduced in the official patch.

// VULNERABLE CODE
public virtual bool TryTraverse(object target, string segment, JsonSerializerOptions serializerOptions, out object value, out string errorMessage)
{
    // Non-generic IList cast fails on System.Text.Json.Nodes.JsonArray
    var list = target as IList;
    if (list == null)
    {
        value = null;
        errorMessage = null; // Forces fallback to ObjectAdapter (reflective traversal)
        return false;
    } 
    // ...
}

To remediate this, Microsoft replaced the legacy cast with a type-aware detection helper TryGetListTypeArgument and introduced a safe utility wrapper (GenericListOrJsonArrayUtilities) to access index elements without relying on standard reflection:

// PATCHED CODE (Commit: 73c3f2518a77f716685c6ba8e694fce2199b1df0)
public virtual bool TryTraverse(object target, string segment, JsonSerializerOptions serializerOptions, out object value, out string errorMessage)
{
    // Correctly inspects if target is a generic IList<T> or JsonArray
    if (!TryGetListTypeArgument(target, out _, out errorMessage))
    {
        value = null;
        return false;
    }
 
    if (!int.TryParse(segment, out var index))
    {
        value = null;
        errorMessage = Resources.FormatInvalidIndexValue(segment);
        return false;
    }
 
    // Retrieve counts safely via a specialized utility
    var count = GenericListOrJsonArrayUtilities.GetCount(target);
    if (index < 0 || index >= count)
    {
        value = null;
        errorMessage = Resources.FormatIndexOutOfBounds(segment);
        return false;
    }
 
    // Extract element using generic access, avoiding infinite reflective loops
    value = GenericListOrJsonArrayUtilities.GetElementAt(target, index);
    errorMessage = null;
    return true;
}

This fix completely prevents the code from falling back to reflection-based traversal on standard JSON nodes, thereby eliminating the infinite loop and the resulting stack overflow condition.

Exploitation Methodology

An attacker can exploit these issues using two distinct approaches depending on the configured application endpoints.

Scenario A: SignalR Heap Saturation

  1. The attacker establishes 5,000 to 10,000 parallel WebSocket or HTTP transport connections to a vulnerable SignalR hub.
  2. The attacker triggers actions that prompt the server to queue outbound responses to the clients.
  3. The attacker terminates the socket TCP connection abruptly (using TCP RST packets), preventing normal session closure handshakes.
  4. Kestrel transitions the connections to a Suspended state, allocating tracking buffers and retaining outbound queues on the heap.
  5. The attacker repeats the sequence. Because global limits are not enforced, cumulative allocations consume the server's available virtual memory, causing an OutOfMemoryException.

Scenario B: JSON Patch Stack Overflow

  1. The attacker targets an HTTP endpoint that accepts JsonPatchDocument input parameters.
  2. The attacker sends a PATCH request targeting a parameter backed by a JsonArray structures containing recursive properties.
  3. The payload contains a traversal path designed to force index evaluation.
  4. The server-side JSON Patch processor runs the vulnerable TryTraverse path, fails the IList cast, falls back to property-reflection on the cyclic array nodes, and overflows the stack.

Impact Assessment

The overall security impact of CVE-2026-56170 is rated as High (CVSS Base Score 7.5). Successful exploitation results in a complete Denial of Service on the affected application hosting process.

In the case of Vector B, the exploitation leads to a native StackOverflowException. Within the .NET CLR, a stack overflow is an unrecoverable runtime exception that immediately terminates the worker process. Unlike standard exceptions, it cannot be caught or handled within user code. This results in immediate downtime for all users sharing the application pool.

In the case of Vector A, memory exhaustion degrades application performance before culminating in an OutOfMemoryException. This crash degrades the availability of any other application instances hosted on the same container, VM, or IIS application pool, representing a high-impact infrastructure vulnerability.

Remediation & Hardening

To address this vulnerability, security teams must deploy official Microsoft updates to the .NET runtime and SDK, or apply configuration-level mitigations to reduce the attack surface.

Upgrade Paths:

Deploy the patched runtime versions according to the channel in use:

  • .NET 8.0: Upgrade to version 8.0.29 or newer.
  • .NET 9.0: Upgrade to version 9.0.18 or newer.
  • .NET 10.0: Upgrade to version 10.0.6 or newer.

Workaround - Hardening SignalR Configurations:

If upgrading the runtime is delayed, you can mitigate Vector A by disabling the Stateful Reconnect feature or restricting the connection-buffer size in Program.cs:

builder.Services.AddSignalR(options =>
{
    // Set buffer size to 0 to disable Stateful Reconnect globally
    options.StatefulReconnectBufferSize = 0;
});

Workaround - Request Size Limitations:

Enforce strict maximum limits on the request body sizes handled by Kestrel to prevent processing exceptionally large or deeply nested JSON Patch requests:

builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.MaxRequestBodySize = 1048576; // Cap request sizes at 1MB
});

Fix Analysis (4)

Technical Appendix

CVSS Score
7.5/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H/E:U/RL:O/RC:C
EPSS Probability
0.80%
Top 48% most exploited

Affected Systems

ASP.NET Core applications built on .NET 8.0ASP.NET Core applications built on .NET 9.0ASP.NET Core applications built on .NET 10.0Applications implementing Microsoft.AspNetCore.JsonPatch.SystemTextJsonApplications implementing SignalR with Stateful Reconnect enabled

Affected Versions Detail

Product
Affected Versions
Fixed Version
ASP.NET Core 8.0
Microsoft
>= 8.0.0, < 8.0.298.0.29
ASP.NET Core 9.0
Microsoft
>= 9.0.0, < 9.0.189.0.18
ASP.NET Core 10.0
Microsoft
>= 10.0.0, < 10.0.610.0.6
AttributeDetail
CWE IDCWE-770
Attack VectorNetwork
CVSS Score7.5 (High)
EPSS Score0.00798 (Percentile: 52.50%)
ImpactDenial of Service (DoS)
Exploit StatusTheoretical / Proof of Concept
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1499.002Endpoint Denial of Service: Application Exhaustion
Impact
T1499.001Endpoint Denial of Service: OS Credential/Resource Starvation
Impact
CWE-770
Allocation of Resources Without Limits or Throttling

The software allocates memory, CPU, or other resources based on actor-controlled inputs without enforcing limits on the size, quantity, or rate of allocations.

Vulnerability Timeline

Microsoft developers commit internal hotfixes to private mirrors.
2026-02-20
Hardening tests and fixes for Kestrel and JSON Patch merged into public branches.
2026-03-04
Microsoft releases .NET updates (10.0.6, 9.0.18, 8.0.29) resolving the issues.
2026-07-14
Microsoft publishes CVE-2026-56170 advisory on the MSRC portal.
2026-07-14

References & Sources

  • [1]Microsoft Security Advisory for CVE-2026-56170
  • [2]NVD - CVE-2026-56170 Detail
  • [3]CVE.org - CVE-2026-56170 Record
  • [4]Wiz Vulnerability Database - CVE-2026-56170 Analysis

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

•15 minutes ago•CVE-2026-58426
9.6

CVE-2026-58426: Cryptographic Boundary-Shifting in Gitea Actions Artifacts

CVE-2026-58426 is a critical security vulnerability in Gitea Actions where improper signature serialization allows an authenticated attacker to execute a canonicalization (boundary-shifting) attack. By rewriting query parameters while keeping the signature intact, the attacker can bypass access control checks to read private workflow artifacts or modify concurrent task upload states.

Alon Barad
Alon Barad
1 views•6 min read
•about 1 hour ago•GHSA-2F96-G7MH-G2HX
8.8

GHSA-2F96-G7MH-G2HX: Command Injection Bypass in GitPython Options Validation

GitPython prior to version 3.1.51 contains a command injection vulnerability due to flaws in its option validation routine. By exploiting Git's native argument parser behavior, specifically long-option abbreviation resolution and short-option clustering, attackers can bypass the check_unsafe_options blocklist to execute arbitrary OS commands.

Amit Schendel
Amit Schendel
3 views•5 min read
•about 2 hours ago•CVE-2026-59879
8.7

CVE-2026-59879: Infinite Loop and Integer Overflow in Immutable.js List Sizing

CVE-2026-59879 describes a critical integer overflow vulnerability in the Immutable.js library when handling indices near 32-bit boundaries. An attacker can leverage this flaw to cause a denial of service via CPU thread lockup or process crashes, as well as data corruption through silent size truncation.

Amit Schendel
Amit Schendel
5 views•8 min read
•about 3 hours ago•CVE-2026-54291
8.2

CVE-2026-54291: Silent Channel-Binding Authentication Downgrade in PostgreSQL JDBC Driver (pgjdbc)

A critical security bypass and algorithm downgrade vulnerability in the PostgreSQL JDBC Driver (pgjdbc) allows Man-in-the-Middle (MITM) attackers to silently bypass channel binding requirements. When configured with `channelBinding=require`, the driver fails to assert that the negotiated SCRAM mechanism utilizes channel binding, allowing downgrade to plain SCRAM-SHA-256 when encountering unsupported server certificate signature algorithms (such as Ed25519 or Ed448).

Alon Barad
Alon Barad
5 views•7 min read
•about 5 hours ago•GHSA-8WHX-365G-H9VV
2.3

GHSA-8whx-365g-h9vv: HTML5 Named Whitespace Bypass in Loofah allowed_uri? Validation

The Loofah Ruby gem version 2.25.0 and 2.25.1 contains an incomplete validation vulnerability in its public string-level utility Loofah::HTML5::Scrub.allowed_uri?. This helper fails to detect 'javascript:' URIs that are split by HTML5 named whitespace character references such as &Tab; and &NewLine;. Applications manually invoking this utility to validate links are vulnerable to stored Cross-Site Scripting (XSS), as browsers parse and remove these entities during rendering.

Alon Barad
Alon Barad
4 views•7 min read
•about 6 hours ago•CVE-2026-50525
7.5

CVE-2026-50525: Denial of Service Vulnerability in Microsoft .NET XML Cryptography Stack

CVE-2026-50525 is a high-severity Denial of Service (DoS) vulnerability in the Microsoft .NET XML Cryptography stack. The vulnerability resides in the `System.Security.Cryptography.Xml` library, specifically within the `EncryptedXml` processing engine. Unauthenticated remote attackers can exploit this flaw by sending specifically crafted XML documents containing nested or recursive structures, or utilizing resource-intensive transforms. Processing such payloads leads to infinite CPU loops, stack exhaustion, or memory starvation, resulting in application termination.

Amit Schendel
Amit Schendel
5 views•6 min read