Nov 11, 2026·9 min read·3 visits
An unauthenticated attacker can hijack an authenticated user's session security context in ASP.NET Core Blazor Server applications via a Cross-Site Request Forgery flaw in the `/_blazor/refresh` endpoint, leading to Elevation of Privilege.
CVE-2026-109481 is a high-severity Cross-Site Request Forgery (CSRF) vulnerability in the ASP.NET Core Blazor Server and interactive component architecture. The flaw exists within the internal circuit state synchronization endpoint (`/_blazor/refresh`), which fails to enforce antiforgery token validation or verify cross-origin request headers. By inducing an authenticated victim to issue a cross-site request targeting a pre-allocated circuit identifier, an unauthenticated attacker can bind the victim's security principal to the attacker's active SignalR circuit, resulting in full privilege elevation within the application scope.
CVE-2026-109481 is an Elevation of Privilege (EoP) vulnerability in Microsoft ASP.NET Core affecting .NET 11.0 preview releases and Microsoft Visual Studio 2026 version 18.12. The flaw resides in the server-side interactive component architecture, specifically within the Blazor Server and SignalR circuit management subsystem. This subsystem is responsible for maintaining stateful UI rendering and user session boundaries across persistent connections.
In a Blazor Server deployment, client-side events are transmitted over a persistent SignalR connection to a server-side construct known as a circuit. Each circuit encapsulates the component hierarchy, application state, and the authenticated security context (ClaimsPrincipal) of the connected user. To support dynamic authentication state changes—such as cookie sliding expiration or token refreshes—ASP.NET Core exposes an auxiliary HTTP endpoint at /_blazor/refresh.
Classified under CWE-352 (Cross-Site Request Forgery), the vulnerability occurs because the /_blazor/refresh endpoint accepts state-modifying HTTP requests without validating request origin or antiforgery tokens. An unauthenticated remote attacker can exploit this weakness by tricking an authenticated user into visiting a malicious web page that submits a cross-site request containing the attacker's circuit identifier.
When the vulnerable endpoint processes this cross-site request, it extracts the authenticated identity from the victim's ambient session cookies and binds that ClaimsPrincipal to the attacker-controlled circuit. Consequently, the attacker gains the ability to execute server-side component actions and access sensitive data under the victim's security context, achieving privilege elevation within the application.
The root cause of CVE-2026-109481 is the omission of origin verification and CSRF protection mechanisms on the /_blazor/refresh endpoint within the ASP.NET Core Blazor Server middleware pipeline. While standard SignalR connection negotiation and component rendering lifecycles implement baseline security checks, the auxiliary refresh endpoint processed incoming requests relying solely on ambient HTTP credentials.
During normal operation, when an application's HTTP authentication state updates, the client invokes /_blazor/refresh to synchronize the active HTTP HttpContext.User with the in-memory SignalR circuit. The server reads the target circuit identifier from the incoming HTTP request and updates that circuit's internal authentication state using the ClaimsPrincipal derived from the request's authentication cookies.
The endpoint failed to enforce three critical security controls required for state-synchronization routes:
IAntiforgery service.Origin or Referer headers matched the application's host authority, nor did it inspect Fetch Metadata headers (Sec-Fetch-Site).Because browsers automatically attach ambient session cookies to cross-site requests unless restricted by strict SameSite policies, a third-party origin can trigger this endpoint. When the server processes the forged request, it fails to distinguish between a legitimate synchronization event initiated by the client application and a cross-origin request forged by an external party.
While Microsoft did not publish a standalone commit diff isolated from the .NET 11.0.0 general availability release tag, the mechanics of the vulnerability and the necessary defensive logic can be analyzed through the ASP.NET Core middleware pipeline. In vulnerable pre-release versions (11.0.0-preview.1), the endpoint handler for /_blazor/refresh accepted incoming requests and immediately proceeded to circuit state hydration without passing through an antiforgery filter.
To remediate this flaw at the request pipeline level, the endpoint must enforce both cryptographic token validation and browser-enforced Fetch Metadata checks. The following implementation demonstrates the defensive middleware controls required to secure the /_blazor/refresh route against cross-site principal rebinding:
// Remediation pattern: Enforcing Antiforgery and Fetch Metadata on Blazor auxiliary endpoints
app.UseAntiforgery();
app.Use(async (context, next) =>
{
// Intercept requests targeting the internal Blazor circuit refresh endpoint
if (context.Request.Path.StartsWithSegments("/_blazor/refresh"))
{
// 1. Validate Fetch Metadata to block cross-site requests at the protocol boundary
if (context.Request.Headers.TryGetValue("Sec-Fetch-Site", out var site) &&
site != "same-origin" && site != "same-site")
{
context.Response.StatusCode = StatusCodes.Status403Forbidden;
return;
}
// 2. Enforce explicit Antiforgery token validation
var antiforgery = context.RequestServices.GetRequiredService<IAntiforgery>();
try
{
await antiforgery.ValidateRequestAsync(context);
}
catch (AntiforgeryValidationException)
{
context.Response.StatusCode = StatusCodes.Status400BadRequest;
return;
}
}
await next();
});In addition to endpoint-specific checks, session cookie configuration plays a decisive role in determining whether ambient credentials are transmitted during cross-origin requests. If an application configures authentication cookies with SameSite=None to support cross-domain embedding or federated authentication flows, the browser sends the session cookie with every cross-origin request.
// Hardening session cookie configuration to restrict cross-origin transmission
builder.Services.ConfigureApplicationCookie(options =>
{
// Restrict cookie transmission to first-party contexts and top-level navigation
options.Cookie.SameSite = SameSiteMode.Lax;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.HttpOnly = true;
});Assessing fix completeness requires evaluating both token validation and circuit ownership verification. Enforcing SameSiteMode.Lax prevents cookies from being sent on cross-site fetch or XMLHttpRequest calls, but top-level navigation requests (GET) still transmit Lax cookies. Therefore, complete remediation requires the server to reject GET requests for state synchronization, validate Sec-Fetch-Site headers, and verify cryptographic antiforgery tokens bound to the specific user identity.
Exploiting CVE-2026-109481 requires coordination between an attacker-controlled connection and an authenticated victim's browser session. This requirement accounts for the High Attack Complexity (AC:H) and Required User Interaction (UI:R) metrics in the CVSS v3.1 scoring. The attacker does not need valid credentials on the target application (PR:N), provided the application allows unauthenticated users to initialize a baseline Blazor circuit (such as on a public landing page or login view).
The exploitation sequence proceeds across six distinct phases:
circuitId) from the handshake response.https://<target-app>/_blazor/refresh, embedding the attacker's pre-allocated circuitId as a parameter./_blazor/refresh. If the target application's authentication cookies are configured to allow transmission in that request context, the browser includes the victim's session cookie.ClaimsPrincipal, and updates the in-memory circuit matching the provided circuitId with this authenticated identity.circuitId, all subsequent component interactions and server-side method invocations executed by the attacker are evaluated under the victim's elevated security context.> [!NOTE]
> As of the publication of this report, the CVSS Exploit Code Maturity metric is classified as Unproven (E:U). No public proof-of-concept scripts or weaponized exploit modules have been indexed in public repositories.
Successful exploitation of CVE-2026-109481 grants an unauthenticated attacker full access to the application capabilities and data authorized for the compromised victim account. Because Blazor Server circuits execute directly on the server and maintain direct access to backend services, database contexts, and internal APIs via dependency injection, hijacking a circuit's security principal compromises Confidentiality, Integrity, and Availability within the application's scope (S:U).
In terms of Confidentiality (C:H), the attacker can render privileged UI components and invoke component lifecycle methods that retrieve sensitive user data, administrative records, or configuration secrets exposed to the victim's role. For Integrity (I:H), the attacker can trigger state-changing server-side event handlers, modify database records, or create new administrative accounts if an administrator's session is targeted.
For Availability (A:H), the attacker can manipulate shared application state, terminate active administrative workflows, or exhaust circuit resources allocated to privileged operations. The CVSS v3.1 base score of 7.5 reflects the balance between the severe post-exploitation impact and the operational constraints of synchronizing an active SignalR circuit with a timed user interaction.
From a threat intelligence perspective, CVE-2026-109481 is not listed in the CISA Known Exploited Vulnerabilities (KEV) catalog, and there is no evidence of active exploitation in the wild. The vulnerability specifically impacts pre-release deployments running .NET 11.0 (11.0.0-preview.1) across Linux, macOS, and Windows platforms, as well as developer environments running Microsoft Visual Studio 2026 version 18.12 prior to 18.12.0.
The primary remediation for CVE-2026-109481 is to upgrade affected .NET runtimes, SDKs, and development environments to the patched general availability releases provided by Microsoft. Administrators and developers utilizing pre-release builds of .NET 11.0 must upgrade to .NET 11.0.0 or later. Users of Microsoft Visual Studio 2026 on Windows must update their installations to version 18.12.0 or higher.
For environments where immediate runtime patching cannot be completed, defense-in-depth mitigations can be applied within the application code or at the reverse proxy layer:
/_blazor/refresh and enforces Sec-Fetch-Site header validation. Reject any request where the Sec-Fetch-Site header is present and set to cross-site or none.app.UseAntiforgery() is explicitly registered in the HTTP request pipeline between UseAuthentication()/UseAuthorization() and endpoint mapping declarations (MapRazorComponents).AddCookie, OpenID Connect session handlers) to ensure SameSite is set to SameSiteMode.Lax or SameSiteMode.Strict, and CookieSecurePolicy is set to Always.At the perimeter or Web Application Firewall (WAF) layer, security engineers can deploy inspection rules targeting the /_blazor/refresh URI path. Blocking requests to this endpoint when the Sec-Fetch-Site header equals cross-site or when the Origin header does not match the Host header prevents cross-origin exploitation attempts before they reach the Kestrel web server.
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C| 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 (< 18.12.0) | 18.12.0 |
| Attribute | Detail |
|---|---|
| Vulnerability Type | Cross-Site Request Forgery (CWE-352) to Elevation of Privilege |
| CVSS v3.1 Score | 7.5 High (CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H) |
| Affected Component | ASP.NET Core Blazor Server Circuit Endpoint (/_blazor/refresh) |
| Attack Vector | Network (Cross-Origin Browser Request) |
| Privileges Required | None (Requires Victim User Interaction) |
| Security Impact | Hijacking of authenticated ClaimsPrincipal on attacker SignalR circuit |
| Exploit Status | Unproven (No public PoC or active exploitation) |
| CISA KEV Status | Not Listed |
The web application does not, or can not, sufficiently verify whether a well-formed, valid, consistent request was intentionally provided by the user who submitted the request.
CVE-2026-118745 is a high-severity remote code execution vulnerability affecting Microsoft Visual Studio 2026 and multiple supported versions of the .NET runtime (8.0, 9.0, 10.0, and 11.0) on Windows systems. The flaw is a heap-based buffer overflow (CWE-122) located within the native symbol reading library, Microsoft.DiaSymReader.Native, specifically in the routines responsible for extracting and parsing Program Database (.pdb) line number metadata. An attacker can exploit this vulnerability by supplying a crafted .pdb file alongside a repository, project, or compiled binary. When a developer or automated diagnostic process parses the malformed debug symbols, an out-of-bounds heap write occurs, permitting arbitrary code execution within the security context of the active user process.
A critical deserialization vulnerability exists in React Server Components (RSC) packages (`react-server-dom-webpack`, `react-server-dom-parcel`, and `react-server-dom-turbopack`) across versions 19.0.0 through 19.3.0. The flaw occurs during the processing of React Flight protocol streams when handling multiple typed arrays sharing a backing ArrayBuffer alongside attacker-controlled inputs. By combining byte-stream buffer detachment semantics with unvalidated thenable invocation and exposed internal response states, an unauthenticated attacker can achieve remote code execution on server runtimes supporting React Server Components.
An improper output neutralization vulnerability (CWE-117 / CWE-150) exists in compose-lint version 0.31.0. When compose-lint is invoked on untrusted file paths without a preceding '--' option delimiter, Python's standard argparse module rejects malformed or dash-prefixed paths and writes them directly to standard error without passing through the application's output sanitizer. An attacker submitting a pull request containing crafted directory or file names with carriage returns or Unicode whitespace can inject arbitrary CI workflow commands into GitHub Actions or Azure Pipelines job logs.
CVE-2026-125116 (GHSA-wr5m-5jph-8m96) is a type confusion vulnerability (CWE-843) in Mongoose, the MongoDB object modeling library for Node.js. When resolving discriminator models or schemas via user-supplied discriminator keys (defaulting to `__t`), Mongoose performs direct property indexing on plain JavaScript registry objects without verifying own-property ownership. Supplying inherited `Object.prototype` property names such as `'constructor'` causes Mongoose to resolve built-in functions rather than valid Mongoose constructors, resulting in unhandled runtime exceptions, schema validation bypasses, and persistent collection query denial of service.
A flaw in Mongoose's query condition casting pipeline causes the `sanitizeFilter` configuration option to be silently ignored when defined at the connection level via `mongoose.connect()` or `mongoose.createConnection()`. Because internal query methods inspect `Connection.options` rather than `Connection.config`, applications relying on connection-scoped filter sanitization remain vulnerable to NoSQL query selector injection (CWE-943), permitting authentication bypass and unauthorized data access across Mongoose versions 6.x through 9.x.
CVE-2026-125110 is a path canonicalization mismatch vulnerability in Rack (specifically within the Rack::Static middleware component). When serving static files, Rack normalizes the requested URL path to resolve the physical file on disk, but evaluates configured path-specific header rules against an unnormalized, raw path that has only undergone URL percent-decoding. Unauthenticated remote attackers can exploit this discrepancy by injecting raw or percent-encoded dot-segments into HTTP requests, causing Rack to serve restricted static assets without their intended security headers.