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

CVE-2026-128065: Authorization Bypass via Unapplied RBAC Overrides in @grpc/grpc-js-xds

Alon Barad
Alon Barad
Software Engineer

Nov 12, 2026·10 min read·2 visits

Executive Summary (TL;DR)

An incorrect authorization flaw (CWE-863) in @grpc/grpc-js-xds versions 1.14.0 and 1.14.1 causes XdsServer to ignore VirtualHost and Route-level RBAC override configurations. Deployments relying on permissive top-level RBAC filters combined with restrictive route-specific overrides will fail to block unauthorized RPC requests. Upgrading @grpc/grpc-js-xds to version 1.14.2 resolves the issue.

CVE-2026-128065 (also tracked as GHSA-gg5j-6742-v827) is an authorization bypass vulnerability affecting the @grpc/grpc-js-xds library in the Node.js gRPC ecosystem. In versions 1.14.0 and 1.14.1, XdsServer acknowledges Route and VirtualHost resources from an xDS control plane while failing to parse, store, or apply RBACPerRoute override configurations. When experimental RBAC is enabled and a broad top-level ALLOW policy is paired with restrictive VirtualHost or Route overrides, the server evaluates requests strictly against the top-level policy, permitting unauthorized RPC execution.

Vulnerability Overview

The @grpc/grpc-js-xds package implements xDS (Discovery Service) client and server functionality for the pure-JavaScript Node.js gRPC implementation (@grpc/grpc-js). In modern service mesh architectures, xDS servers receive dynamic configuration updates—including Listener Discovery Service (LDS) and Route Discovery Service (RDS) resources—from a centralized control plane such as Istio or Envoy-based management servers. Among these features, XdsServer supports experimental Role-Based Access Control (RBAC) via HTTP filters to enforce fine-grained access policies on incoming gRPC calls.

In accordance with the Envoy xDS specification, HTTP filters are configured at the top-level HttpConnectionManager within a Listener resource, while more granular overrides can be defined per VirtualHost or per Route using the typed_per_filter_config map. This hierarchical design allows administrators to specify a baseline security policy at the listener level and selectively tighten or relax restrictions for specific domains or gRPC methods.

CVE-2026-128065 (tracked as GHSA-gg5j-6742-v827) is an Incorrect Authorization vulnerability (CWE-863) affecting @grpc/grpc-js-xds versions 1.14.0 and 1.14.1. Due to three compounding implementation defects in how XdsServer registers, keys, and parses per-route filter configurations, all RBACPerRoute overrides specified within VirtualHost and Route resources are silently discarded.

Because the server still sends positive acknowledgments (ACKs) for the RDS and LDS updates back to the xDS control plane, operators receive no indication that the security policies failed to apply. When a deployment configures a permissive top-level RBAC policy (such as ALLOW all) and relies on route-level or virtual-host-level DENY or restricted ALLOW overrides to protect sensitive RPC methods, incoming requests bypass the intended restrictions and execute with unauthorized privileges.

Root Cause Analysis

The authorization bypass stems from three distinct logic defects in @grpc/grpc-js-xds across packages/grpc-js-xds/src/http-filter/rbac-filter.ts and packages/grpc-js-xds/src/server.ts. Each defect independently prevents RBAC override policies from taking effect during request routing.

The first defect is a protobuf type URL registration mismatch in rbac-filter.ts. When parseOverrideFilterConfig() in http-filter.ts processes an entry from typed_per_filter_config, it queries the internal FILTER_REGISTRY using the protobuf @type URL embedded in the configuration message. While top-level Envoy RBAC filters use the type URL type.googleapis.com/envoy.extensions.filters.http.rbac.v3.RBAC, route and virtual host overrides use a distinct protobuf message type: type.googleapis.com/envoy.extensions.filters.http.rbac.v3.RBACPerRoute. During module initialization, setup() in rbac-filter.ts registered the RBAC filter parser solely under the top-level RBAC type URL and omitted RBAC_FILTER_OVERRIDE_URL. Consequently, every invocation of parseOverrideFilterConfig() for an RBACPerRoute resource failed the registry lookup and returned null.

The second defect is a map key mismatch within the FilterChainEntry class in packages/grpc-js-xds/src/server.ts. When initializing top-level HTTP filters for a listener filter chain, the server creates a per-filter map (filterOverrideConfigMap) to store route-specific override configurations and registers it inside this.overrideConfigMaps. However, the vulnerable code indexed this.overrideConfigMaps using filterConfig.typeUrl (the protobuf type URL) rather than filter.name (the HTTP filter instance name). Per the Envoy xDS specification, the typed_per_filter_config dictionary in Route and VirtualHost messages is keyed by the filter instance name (e.g., "rbac"). When the route processor subsequently attempted to store parsed overrides via this.overrideConfigMaps.get(filterName), the lookup missed and the configuration was dropped.

The third defect is the complete omission of VirtualHost per-filter configuration parsing in server.ts. While FilterChainEntry iterated over route.typed_per_filter_config for individual routes, it contained no logic to inspect virtualHost.typed_per_filter_config. Any RBAC overrides applied at the VirtualHost level were never parsed or inherited by the child routes belonging to that virtual host.

> [!NOTE] > Because all three failures occur silently during asynchronous xDS resource ingestion without throwing exceptions or triggering NACK responses, the control plane assumes the security policy is active while XdsServer falls back exclusively to the top-level filter configuration.

Code Analysis

Commit b8f3ced4d4699338dd33dc0f7b1d68d689a31d0e addresses all three root causes across rbac-filter.ts and server.ts. In packages/grpc-js-xds/src/http-filter/rbac-filter.ts, the setup() function was updated to register both the base filter type URL and the override filter type URL (RBAC_FILTER_OVERRIDE_URL) in the HTTP filter registry.

File: packages/grpc-js-xds/src/http-filter/rbac-filter.ts
@@ -171,5 +171,10 @@ export function setup() {
       parseOverrideFilterConfig: parseOverrideRbacConfig,
       createServerFilter: createRbacServerFilter
     });
+    // Register the RBACPerRoute protobuf type URL so parseOverrideFilterConfig resolves it
+    registerHttpFilter(RBAC_FILTER_OVERRIDE_URL, {
+      parseTopLevelFilterConfig: parseTopLevelRbacConfig,
+      parseOverrideFilterConfig: parseOverrideRbacConfig,
+      createServerFilter: createRbacServerFilter
+    });
   }
 }

In packages/grpc-js-xds/src/server.ts, the patch modifies FilterChainEntry in two places. First, when initializing the filter chain interceptors, this.overrideConfigMaps is updated to use filter.name as the map key instead of filterConfig.typeUrl, aligning the internal storage structure with the keys provided in xDS typed_per_filter_config maps.

File: packages/grpc-js-xds/src/server.ts
@@ -170,7 +170,7 @@ class FilterChainEntry {
       const filterConfig = parseTopLevelFilterConfig(filter.typed_config!, false);
       if (filterConfig) {
         const filterOverrideConfigMap = new Map<string, HttpFilterConfig>();
-        this.overrideConfigMaps.set(filterConfig.typeUrl, filterOverrideConfigMap);
+        this.overrideConfigMaps.set(filter.name, filterOverrideConfigMap);
         const filterInterceptor = createServerHttpFilter(filterConfig, filterOverrideConfigMap);
         if (filterInterceptor) {
           httpFilterInterceptors.push(filterInterceptor);

Second, the route configuration ingestion loop in FilterChainEntry was restructured to parse virtualHost.typed_per_filter_config into a temporary virtualHostOverrideConfigs map before iterating over child routes. For each route and each registered filter name, the server now assigns the VirtualHost override as the baseline and supersedes it if a more specific override exists in route.typed_per_filter_config.

File: packages/grpc-js-xds/src/server.ts
@@ -227,6 +227,14 @@ class FilterChainEntry {
         domains: virtualHost.domains,
         routes: []
       };
+      // Parse VirtualHost-level per-filter overrides keyed by filter name
+      const virtualHostOverrideConfigs = new Map<string, HttpFilterConfig>()
+      for (const [filterName, overrideConfig] of Object.entries(virtualHost.typed_per_filter_config)) {
+        const parsedConfig = parseOverrideFilterConfig(overrideConfig);
+        if (parsedConfig) {
+          virtualHostOverrideConfigs.set(filterName, parsedConfig);
+        }
+      }
       for (const [routeIndex, route] of virtualHost.routes.entries()) {
         const routeEntry: RouteEntry = {
           id: `virtualhost=${virtualHostIndex} route=${routeIndex}`,
@@ -238,10 +246,19 @@ class FilterChainEntry {
           this.logConfigurationError('For domains matching [' + virtualHostEntry.domains + '] requests will be rejected for routes matching ' + routeEntry.matcher.toString());
         }
         virtualHostEntry.routes.push(routeEntry);
-        for (const [filterName, overrideConfig] of Object.entries(route.typed_per_filter_config)) {
-          const parsedConfig = parseOverrideFilterConfig(overrideConfig);
-          if (parsedConfig) {
-            this.overrideConfigMaps.get(filterName)?.set(routeEntry.id, parsedConfig);
+        for (const filterName of this.overrideConfigMaps.keys()) {
+          // Inherit the VirtualHost override by default
+          let routeOverrideConfig = virtualHostOverrideConfigs.get(filterName);
+          if (filterName in route.typed_per_filter_config) {
+            const parsedConfig = parseOverrideFilterConfig(route.typed_per_filter_config[filterName]);
+            if (parsedConfig) {
+              /* Route-level override takes precedence over VirtualHost override */
+              routeOverrideConfig = parsedConfig;
+            }
+          }
+          if (routeOverrideConfig) {
+            this.overrideConfigMaps.get(filterName)!.set(routeEntry.id, routeOverrideConfig);
           }
         }
       }

The fix is complete with respect to VirtualHost and Route resources in @grpc/grpc-js-xds. By iterating directly over this.overrideConfigMaps.keys(), the patched implementation ensures that only active filters configured in the filter chain are evaluated, and that route-specific rules properly override virtual-host-level rules according to the Envoy xDS specification.

Exploitation

Exploiting CVE-2026-128065 does not require crafting malformed network packets or subverting the xDS control plane. Instead, the vulnerability manifests passively whenever a target deployment uses @grpc/grpc-js-xds (versions 1.14.0 or 1.14.1) with experimental server RBAC enabled and relies on RBACPerRoute overrides to restrict access to specific gRPC services or methods.

To trigger the unauthorized access, an attacker only needs network connectivity to the exposed XdsServer port and the ability to invoke gRPC methods that are nominally restricted by a VirtualHost or Route override policy. No special authentication credentials or headers are required if the top-level HTTP filter is configured with a wildcard principal (principals: [{any: true}]) and an ALLOW action.

The official regression test suite (packages/grpc-js-xds/test/test-rbac-filter.ts) included in the patch demonstrates the exact configuration structure that triggers the bypass. In this scenario, the top-level RBAC filter permits all traffic, while a VirtualHost or Route resource defines an RBACPerRoute override with a DENY action for all principals:

// Top-level HTTP Filter Configuration: Permissive baseline policy
const rbacFilter: AnyExtension & RBAC = {
  '@type': 'type.googleapis.com/envoy.extensions.filters.http.rbac.v3.RBAC',
  rules: {
    action: 'ALLOW',
    policies: {
      local: {
        principals: [{any: true}],
        permissions: [{any: true}]
      }
    }
  }
};
 
// Per-Route / VirtualHost Override Configuration: Restrictive DENY policy
const overrideConfig: AnyExtension & RBACPerRoute = {
  '@type': 'type.googleapis.com/envoy.extensions.filters.http.rbac.v3.RBACPerRoute',
  rbac: {
    rules: {
      action: 'DENY',
      policies: {
        local: {
          principals: [{any: true}],
          permissions: [{any: true}]
        }
      }
    }
  }
};
 
// RouteConfiguration delivered via RDS/LDS
const routeConfiguration: RouteConfiguration = {
  virtual_hosts: [{
    domains: ['*'],
    routes: [{
      match: { prefix: '' },
      action: 'non_forwarding_action',
      non_forwarding_action: {},
      typed_per_filter_config: { rbac: overrideConfig }
    }]
  }]
};

When a gRPC client sends a unary or streaming RPC matching prefix: '' to an unpatched server running this configuration, XdsServer matches the route (virtualhost=0 route=0) and invokes the RBAC filter interceptor. The interceptor checks filterOverrideConfigMap.get('virtualhost=0 route=0'), receives undefined because the override failed to register during RDS ingestion, and evaluates the request against rbacFilter. The call succeeds with gRPC status 0 (OK) instead of being rejected with status 7 (PERMISSION_DENIED).

Impact Assessment

The primary security impact of CVE-2026-128065 is an authorization bypass (CWE-863) that permits unauthenticated or under-privileged clients to invoke restricted gRPC endpoints. In microservice environments managed by an xDS control plane, administrators frequently define a baseline listener configuration shared across multiple services and apply route-specific RBAC policies to isolate administrative endpoints, internal health checks, or privileged data mutation methods.

When affected versions of @grpc/grpc-js-xds are deployed in this manner, any client capable of reaching the gRPC listener can invoke routes that were explicitly configured with DENY rules or narrower principal requirements in RBACPerRoute. The concrete impact depends on the functionality exposed by the unprotected gRPC methods, ranging from unauthorized disclosure of application data (Confidentiality: Low) to unauthorized state modification (Integrity: Low).

The vulnerability is scored at CVSS v4.0 Base Score 6.9 (Medium) with the vector CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N. The Attack Vector is Network (AV:N) with Low Attack Complexity (AC:L) and No Attack Requirements (AT:N), reflecting that standard gRPC requests over the network directly bypass the unapplied filter rules without requiring race conditions or environmental manipulation.

Privilege Required (PR:N) and User Interaction (UI:N) are both None, as the bypass occurs during automated policy evaluation prior to method execution. Scope is limited to the vulnerable gRPC server (SC:N/SI:N/SA:N), and availability is unaffected (VA:N) because the flaw does not cause resource exhaustion or process termination.

Remediation

Development and operations teams using @grpc/grpc-js-xds to host xDS-enabled gRPC servers in Node.js should upgrade to version 1.14.2 or later immediately. Version 1.14.2 incorporates commit b8f3ced4d4699338dd33dc0f7b1d68d689a31d0e, which registers the RBACPerRoute type URL, keys override maps by filter instance name, and enforces the proper inheritance hierarchy between VirtualHost and Route configurations.

Update the dependency specification in package.json and regenerate the lockfile:

{
  "dependencies": {
    "@grpc/grpc-js-xds": "^1.14.2"
  }
}

If an immediate library upgrade is not operationally feasible, administrators must modify their xDS control plane policies to avoid relying on typed_per_filter_config within VirtualHost or Route resources for access control. Instead, consolidate all authorization rules directly into the top-level envoy.extensions.filters.http.rbac.v3.RBAC filter configuration attached to the Listener's HttpConnectionManager.

Within the top-level RBAC filter, route-specific restrictions can be expressed using Envoy Permission rules that match on HTTP :path headers (corresponding to /package.Service/Method in gRPC) combined with Principal definitions. Alternatively, enforce method-level authentication and authorization directly within the Node.js application layer using native @grpc/grpc-js server interceptors until @grpc/grpc-js-xds can be patched.

Official Patches

GitHub / gRPCGitHub Security Advisory GHSA-gg5j-6742-v827
GitHub / gRPCOfficial Patch Commit in grpc/grpc-node
GitHub / gRPCOfficial Release @grpc/grpc-js-xds@1.14.2

Fix Analysis (1)

Technical Appendix

CVSS Score
6.9/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N

Affected Systems

@grpc/grpc-js-xdsgrpc-node XdsServer

Affected Versions Detail

Product
Affected Versions
Fixed Version
@grpc/grpc-js-xds
gRPC / Google
>= 1.14.0, < 1.14.21.14.2
AttributeDetail
CVE IDCVE-2026-128065 (GHSA-gg5j-6742-v827)
Weakness ClassCWE-863 (Incorrect Authorization)
CVSS v4.0 Score6.9 Medium (CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N)
Affected Component@grpc/grpc-js-xds (>= 1.14.0, < 1.14.2)
Attack VectorNetwork (Unauthenticated gRPC Request)
Security ImpactBypass of VirtualHost and Route RBACPerRoute authorization policies
Exploit StatusPoC Available (Official Unit Tests)
Patched Version@grpc/grpc-js-xds 1.14.2

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-863
Incorrect Authorization

The software performs an authorization check when an actor attempts to access a resource or perform an action, but does not correctly execute the check, leading to incorrect authorization decisions.

Known Exploits & Detection

GitHubOfficial unit and integration regression tests demonstrating VirtualHost and Route-level RBAC override bypass scenarios.

Vulnerability Timeline

Fix commit b8f3ced4d4699338dd33dc0f7b1d68d689a31d0e authored in grpc/grpc-node
2026-10-16
CVE-2026-128065 and GitHub Security Advisory GHSA-gg5j-6742-v827 published
2026-11-12

References & Sources

  • [1]GitHub Security Advisory GHSA-gg5j-6742-v827
  • [2]Official Fix Commit b8f3ced4d4699338dd33dc0f7b1d68d689a31d0e
  • [3]Release @grpc/grpc-js-xds@1.14.2
  • [4]CVE-2026-128065 Record on CVE.org
  • [5]MITRE ATT&CK Search for CVE-2026-128065

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

•about 2 hours ago•CVE-2026-126188
3.7

CVE-2026-126188: Local Media Information Disclosure in Ruby on Rails Active Storage via FFmpeg Demuxer Selection

CVE-2026-126188 (GHSA-3f4q-8x5m-76v8) is an information disclosure vulnerability in the Active Storage component of Ruby on Rails prior to versions 8.0.5.2 and 8.1.4.1. When generating previews or extracting metadata from uploaded media files, Active Storage invokes the external command-line tools ffmpeg and ffprobe without specifying a format whitelist. An attacker who can upload a crafted HTTP Live Streaming (HLS) playlist while declaring a standard video or audio MIME type can cause FFmpeg to engage the HLS demuxer, resolve file:// segment URIs, and disclose visual frames or metadata from local media files readable by the Rails application process.

Amit Schendel
Amit Schendel
2 views•10 min read
•about 3 hours ago•CVE-2026-126206
5.3

CVE-2026-126206: Cross-Site Scripting via HTML5 Named Solidus Entity in Loofah URI Validator

CVE-2026-126206 (GHSA-jcff-cj73-4w4f) is a Cross-Site Scripting (XSS) vulnerability in version 2.25.2 of the Loofah Ruby gem. The vulnerability stems from an incomplete character reference normalization routine in the `Loofah::HTML5::Scrub.allowed_uri?` method, which fails to decode the HTML5 named character reference `&sol;` (representing the solidus character `/`). Consequently, a crafted `data:` URI such as `data:text&sol;html,<script>alert(1)</script>` bypasses mediatype validation by triggering the WHATWG MIME parser fallback to `text/plain`, while web browsers later resolve `&sol;` to `/` and execute the payload as `text/html`.

Alon Barad
Alon Barad
3 views•9 min read
•about 4 hours ago•CVE-2026-125325
5.9

CVE-2026-125325: Cross-Request Information Disclosure via Shared BM25 Index Race Condition in pgEdge RAG Server

pgEdge RAG Server versions prior to 2.0.0 contain a race condition in the hybrid search pipeline orchestrator (CWE-362, CWE-488). The server maintains a single shared, in-memory BM25 index instance across all incoming HTTP requests on a pipeline. Concurrent queries to the unauthenticated HTTP REST API interleave non-atomic clear, document addition, and search operations on this singleton index. As a result, documents fetched using one caller's search filter can be queried and returned to another concurrent caller, bypassing multi-tenant data isolation without generating any anomalous audit trail in server or database logs.

Amit Schendel
Amit Schendel
2 views•10 min read
•about 6 hours ago•CVE-2026-118740
9.1

CVE-2026-118740: Missing Authorization in Microsoft Aspire Dashboard Blazor Router

CVE-2026-118740 is a Missing Authorization (CWE-862) vulnerability in the Microsoft Aspire Dashboard and Aspire.Dashboard.Sdk.linux-x64 packages. In versions 13.6.1 prior to 13.6.5, an architectural flaw in the Blazor routing configuration (Routes.razor) causes unmapped (404 / Not-Found) routes to bypass the AuthorizeRouteView component. By navigating to an arbitrary non-existent route, an unauthenticated remote attacker forces the application into the NotFound template, which unconditionally renders the primary MainLayout component and initializes global user interface services, interaction providers, and underlying SignalR/Blazor circuits without verifying authentication credentials.

Alon Barad
Alon Barad
6 views•9 min read
•1 day ago•CVE-2026-120006
7.5

CVE-2026-120006: Elevation of Privilege in .NET Aspire via Unintended Dashboard Endpoint Tunneling

An elevation of privilege vulnerability exists in .NET Aspire versions prior to 13.6.5 due to the insertion of sensitive information into sent data (CWE-201). When the Developer Control Plane (DCP) container tunneling feature is enabled, the orchestration engine implicitly exposes all endpoints of the Aspire Dashboard—including its administrative frontend and management APIs—to containerized workloads instead of restricting tunnel access solely to OpenTelemetry Protocol (OTLP) collection endpoints. This exposure allows an attacker operating within a compromised or untrusted container to query the dashboard frontend, extract sensitive environment variables and connection strings, and elevate privileges across the host orchestration boundary.

Amit Schendel
Amit Schendel
6 views•10 min read
•1 day ago•CVE-2026-118750
7.5

CVE-2026-118750: Uncontrolled Resource Allocation in ASP.NET Core FileBufferingReadStream

CVE-2026-118750 is an uncontrolled resource allocation vulnerability (CWE-770) affecting the Microsoft.AspNetCore.WebUtilities component in ASP.NET Core. Specifically, the FileBufferingReadStream class eagerly allocates large memory buffers from the shared ArrayPool<byte> inside its constructor prior to reading any incoming request payload data. An unauthenticated remote attacker can exploit this behavior by opening numerous concurrent connections and stalling or omitting request body transmission, exhausting shared memory pools and causing a server-wide Denial of Service (DoS).

Amit Schendel
Amit Schendel
6 views•10 min read