Nov 11, 2026·8 min read·1 visit
An improper path equivalence resolution flaw in ASP.NET Core (.NET 11.0 preview builds) allows unauthenticated remote attackers to bypass path-based security controls using alternate or encoded path delimiters. Updating to .NET 11.0.0 GA or Visual Studio 2026 version 18.12.0 resolves the issue.
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.
Microsoft ASP.NET Core provides a modular HTTP request pipeline where middleware components inspect, modify, or short-circuit incoming requests before they reach terminal routing endpoints. A common architectural pattern involves inspecting the request URI path within custom middleware to enforce authentication, authorization, or rate-limiting policies on specific route prefixes, such as /admin or /internal. To facilitate this, the framework exposes the Microsoft.AspNetCore.Http.PathString struct and its associated segment-matching methods.
CVE-2026-114156 is a security feature bypass vulnerability classified under CWE-41 (Improper Resolution of Path Equivalence). The defect resides in how ASP.NET Core HTTP path evaluation helpers validate segment boundaries when requests contain non-standard path delimiters or percent-encoded characters, specifically within .NET 11.0 preview builds (>= 11.0.0-preview.1, < 11.0.0) and associated Microsoft Visual Studio 2026 releases.
When an application relies on prefix-matching methods like PathString.StartsWithSegments to gate access to restricted areas, an attacker can supply an equivalent path representation using encoded backslashes (%5C) or mixed directory separators. The prefix validation check evaluates to false, allowing the request to bypass the security middleware. Downstream routing or reverse proxy components subsequently normalize the path, resolving it to the protected target endpoint.
The root cause of CVE-2026-114156 is a canonicalization discrepancy—often referred to as an impedance mismatch—between early-stage path evaluation methods and late-stage route dispatching within the ASP.NET Core request processing pipeline. In the HTTP specification (RFC 3986), the forward slash (/) is the standard path segment delimiter. However, Windows-based file systems, legacy web servers (such as IIS), and certain reverse proxies treat the backslash (\) or its percent-encoded equivalent (%5C / %5c) as interchangeable with the forward slash.
Within the ASP.NET Core HTTP abstractions layer, PathString.StartsWithSegments is designed to verify whether a request path begins with a given prefix on a strict segment boundary. For example, checking if a path starts with /admin must match /admin and /admin/users, but must not match /administrator. To enforce this, the method verifies that the character immediately following the matched prefix is either the end of the string or a forward slash delimiter (/).
When an incoming request contains a percent-encoded backslash (e.g., /admin%5Cusers) or an unnormalized literal backslash, PathString.StartsWithSegments inspects the character following /admin. If the method evaluates the raw or partially decoded string where \ is not recognized as a valid segment boundary, it treats admin\users as a single contiguous segment (similar to administrator). Consequently, StartsWithSegments("/admin") returns false.
Once the request passes the middleware guard without triggering the authorization requirement, it reaches the endpoint routing middleware, static file provider, or an upstream/downstream proxy layer that performs full path normalization. This downstream component converts \ or %5C into a standard / delimiter and dispatches the request directly to the /admin/users handler.
In ASP.NET Core applications, developers frequently write custom middleware to apply security policies across groups of endpoints before the routing table is evaluated. The vulnerable pattern involves branching security logic based on the boolean return value of PathString.StartsWithSegments.
// Vulnerable Middleware Pattern in ASP.NET Core
app.Use(async (context, next) =>
{
// Developer attempts to restrict access to all routes under /admin
if (context.Request.Path.StartsWithSegments("/admin", out var remainingPath))
{
if (!context.User.Identity?.IsAuthenticated ?? true)
{
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
return;
}
if (!context.User.IsInRole("Administrator"))
{
context.Response.StatusCode = StatusCodes.Status403Forbidden;
return;
}
}
// If StartsWithSegments returns false, execution continues unchallenged
await next(context);
});Inside the PathString implementation, segment boundary validation historically checked only for the standard forward slash / character after confirming the prefix characters matched:
// Conceptual representation of the vulnerable boundary check
public bool StartsWithSegments(PathString other, StringComparison comparisonType, out PathString remaining)
{
var value1 = Value ?? string.Empty;
var value2 = other.Value ?? string.Empty;
if (value1.StartsWith(value2, comparisonType))
{
// Vulnerable assumption: only '/' is checked as a valid segment delimiter.
// If value1[value2.Length] is '\' (decoded from %5C), this check fails.
if (value1.Length == value2.Length || value1[value2.Length] == '/')
{
remaining = new PathString(value1.Substring(value2.Length));
return true;
}
}
remaining = PathString.Empty;
return false;
}To remediate this class of vulnerability, the HTTP request pipeline and path manipulation primitives in .NET 11.0.0 GA were updated to enforce consistent path canonicalization and delimiter handling across Kestrel, HTTP.sys, IIS integration, and PathString evaluation. Additionally, architectural guidance requires binding authorization directly to resolved endpoints rather than inspecting uncanonicalized path prefixes:
// Secure Pattern: Endpoint-bound authorization policy
app.MapGroup("/admin")
.RequireAuthorization("AdminPolicy")
.MapGet("/users", () => Results.Ok(GetUsers()));By attaching .RequireAuthorization() to the route group or endpoint definition, the authorization check executes only after the routing engine has normalized the path and matched the exact terminal handler, eliminating the possibility of a desynchronization bypass.
Exploiting CVE-2026-114156 requires no authentication (PR:N) and no user interaction (UI:N), though it is rated as having High Attack Complexity (AC:H). The complexity rating reflects that the target application must be configured in a specific manner: it must rely on path-prefix checks (such as custom middleware using PathString.StartsWithSegments) rather than endpoint routing authorization, and it must operate behind a web server or pipeline configuration that normalizes alternate path separators downstream.
An attacker initiates exploitation by identifying a protected route prefix (e.g., /admin/config or /api/internal/export) that returns 401 Unauthorized or 403 Forbidden when accessed directly via standard HTTP requests.
GET /admin/config HTTP/1.1
Host: vulnerable-target.example.com
HTTP/1.1 403 ForbiddenThe attacker then crafts an HTTP request replacing the segment delimiter immediately following the protected prefix with a percent-encoded backslash (%5C or %5c), or mixes path traversal sequences that resolve equivalently in the backend dispatcher:
GET /admin%5Cconfig HTTP/1.1
Host: vulnerable-target.example.com
HTTP/1.1 200 OK
Content-Type: application/jsonWhen the server receives GET /admin%5Cconfig, the request parsing layer decodes %5C into \ (or leaves it unnormalized depending on the hosting model). The custom authorization middleware executes Request.Path.StartsWithSegments("/admin"). Because the character at index 6 is \ rather than /, the method returns false. The middleware assumes the request targets an unrelated public route and invokes await next(context). The downstream router then normalizes \ to / and executes the /admin/config controller action.
> [!NOTE]
> As of the vulnerability publication date, Microsoft classifies exploit code maturity as Unproven (E:U), and no standalone weaponized PoCs have been published in public exploit databases.
The primary impact of CVE-2026-114156 is a high loss of integrity (I:H) and a low loss of confidentiality (C:L), resulting in a CVSS v3.1 base score of 6.5 (Medium). Because the vulnerability is a security feature bypass rather than a direct memory corruption or code execution flaw, the exact operational impact is governed by the functionality exposed by the unprotected downstream endpoints.
In scenarios where applications use middleware prefix checks to protect state-changing administrative operations—such as user management, configuration updates, or data deletion—an unauthenticated attacker can invoke these endpoints directly, leading to a high integrity impact. Similarly, attackers can read restricted application data exposed by bypassed endpoints, accounting for the confidentiality impact.
Availability is not directly impacted (A:N) by the path resolution mechanism itself, unless an exposed administrative endpoint explicitly provides system shutdown or resource-exhaustion functionality.
From a threat intelligence perspective, CVE-2026-114156 affects preview builds of .NET 11.0 (>= 11.0.0-preview.1, < 11.0.0) across Linux, macOS, and Windows platforms, as well as early builds of Visual Studio 2026 prior to 18.12.0. Because affected versions are limited to pre-release SDK and runtime distributions prior to the .NET 11.0.0 General Availability (GA) release, production exposure is confined to organizations deploying preview frameworks in internet-facing environments.
Microsoft addressed CVE-2026-114156 in the official General Availability release of .NET 11.0 (11.0.0) and Microsoft Visual Studio 2026 version 18.12.0. Organizations running any .NET 11.0.0-preview.* or .NET 11.0.0-rc.* builds on Linux, macOS, or Windows must upgrade their SDKs, ASP.NET Core runtimes, and hosting bundles to version 11.0.0 or later.
For environments where immediate runtime patching is delayed, security teams can mitigate the vulnerability through architectural and infrastructure changes. First, developers should audit application source code for custom middleware utilizing Request.Path.StartsWithSegments, Request.Path.Value.StartsWith, or regular expressions for security enforcement. These checks should be replaced with ASP.NET Core's built-in Endpoint Routing authorization (RequireAuthorization() or [Authorize] attributes), which binds access control directly to the resolved endpoint metadata.
Second, edge reverse proxies (such as Nginx, Envoy, YARP, or IIS) and Web Application Firewalls (WAFs) should be configured to strictly canonicalize incoming request URIs before forwarding traffic to Kestrel backends. Specifically, edge proxies should reject or normalize requests containing literal backslashes (\) or percent-encoded backslashes (%5C, %5c) within the URI path component.
# Example Nginx configuration block to reject encoded backslashes in URI paths
if ($request_uri ~* "%5c") {
return 400;
}Implementing strict URI validation at the network perimeter prevents path equivalence payloads from reaching the ASP.NET Core middleware pipeline.
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/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 |
Microsoft Visual Studio 2026 Microsoft | < 18.12.0 | 18.12.0 |
| Attribute | Detail |
|---|---|
| Vulnerability ID | CVE-2026-114156 |
| Weakness Class | CWE-41 (Improper Resolution of Path Equivalence) |
| CVSS v3.1 Score | 6.5 Medium (CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N) |
| Attack Vector | Network (Unauthenticated HTTP Request) |
| Primary Impact | Security Feature Bypass (High Integrity, Low Confidentiality) |
| Affected Component | ASP.NET Core Path Processing (PathString.StartsWithSegments) |
| Exploit Status | Unproven (No Public PoCs) |
| CISA KEV Status | Not Listed |
The software is vulnerable when two or more paths point to the same resource (path equivalence), but the software fails to canonicalize or resolve them equivalently before applying security checks.
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.
CVE-2026-114154 is a high-severity Denial of Service (DoS) and uncontrolled resource consumption vulnerability in the Microsoft.AspNetCore.Server.HttpSys component of ASP.NET Core. When processing an HTTP request that simultaneously contains a chunked Transfer-Encoding header, a Content-Length header, and an explicit X-Content-Length header, the server throws an unhandled ArgumentException during header normalization. In certain versions, subsequent exception handling attempts to dereference a disposed native request context, aborting error response dispatch and leaking unmanaged HTTP.sys request structures.
A local elevation of privilege vulnerability exists in the Microsoft .NET Aspire CLI (`Aspire.Cli`) versions 13.5.4 prior to 13.6.5. When executing SDK management commands (`aspire sdk generate`, `aspire sdk dump`, and `aspire sdk export`), the CLI creates temporary project directories inside the shared operating system temporary folder (such as `/tmp` on Unix-like systems) without restricting directory permissions or disabling MSBuild automatic response file resolution. A local, low-privileged attacker on a multi-user system can place a crafted `Directory.Build.rsp` file in the shared temporary directory hierarchy. When a victim user executes an affected Aspire CLI command, MSBuild traverses upward, ingests the attacker-controlled response file, and executes arbitrary commands in the security context of the victim user.
CVE-2026-120792 is a high-severity local information disclosure vulnerability in the Microsoft .NET Aspire CLI (Aspire.Cli) affecting versions 13.5.4 prior to 13.6.5. The flaw stems from the insertion of sensitive information into a shared temporary log file (CWE-532) combined with insecure temporary file creation (CWE-377) within the DeprecatedMcpCommandScanner component. During agent configuration scanning, the CLI unconditionally appends internal workspace paths and the first 200 characters of Model Context Protocol (MCP) agent configuration files to a statically named file in the system temporary directory. On multi-user systems, unprivileged local users can read this file to harvest API keys, authentication tokens, and internal service endpoints.
CVE-2026-114159 is a heap-based buffer overflow vulnerability (CWE-122) in Microsoft.DiaSymReader.Native affecting Microsoft Visual Studio and the .NET Runtime on Windows. An integer truncation error during the parsing of oversized document names in Portable PDB symbol files causes an undersized heap allocation, leading to an out-of-bounds memory write and remote code execution.