Sep 28, 2026·6 min read·3 visits
A logical error in the @grpc/grpc-js xDS path matcher applies a prefix match instead of an exact match when case-insensitive comparison is enabled. This allows clients to bypass RBAC policies and access restricted service endpoints that share a prefix with authorized endpoints.
An authorization bypass vulnerability exists in the @grpc/grpc-js Node.js package (specifically within the xDS plugin wrapper @grpc/grpc-js-xds) due to a logical error in its Role-Based Access Control (RBAC) path matching component. When case-insensitive path matching is enabled, the matching logic performs a prefix comparison using the startsWith method instead of a strict equality comparison. This logic flaw allows unauthenticated or low-privilege clients with access to a shorter path to gain unauthorized access to longer, more privileged method names that share the same prefix.
The @grpc/grpc-js library is a pure JavaScript implementation of the gRPC protocol for Node.js. In microservices architectures, authorization is frequently managed via xDS-based Role-Based Access Control (RBAC) policies, which are parsed and enforced by the @grpc/grpc-js-xds plugin. This component is responsible for examining incoming remote procedure calls (RPCs) and ensuring that clients possess the correct permissions to execute requested methods.
Within this architecture, exact path matching represents a critical mechanism for limiting access to specific gRPC endpoints. Paths are defined hierarchically in the format /ServiceName/MethodName. The vulnerability lies in the logical verification of these paths when processing rules that specify case-insensitive matching.
The attack surface is exposed to any network client capable of sending gRPC requests to an endpoint that relies on the @grpc/grpc-js-xds component for RBAC. Exploitation does not require authentication to the target service if the underlying RBAC rule relies on case-insensitive exact matching to grant permissions.
The root cause of this vulnerability is a logical flaw classified as CWE-187 (Partial String Comparison) and CWE-863 (Incorrect Authorization). In @grpc/grpc-js-xds, the exact path matching logic is implemented within the PathExactValueMatcher class inside packages/grpc-js-xds/src/matcher.ts. This class handles evaluations of incoming RPC paths against configured authorization policies.
When a policy demands an exact match, the evaluator is designed to perform a strict string comparison. However, the implementation branches based on whether the matching rule is case-sensitive. If caseInsensitive is false, the engine correctly performs a strict equality comparison using the identity operator.
When caseInsensitive is true, the engine attempts to normalize the strings using the JavaScript toLowerCase() method. Instead of applying a strict equality check to the normalized strings, the code invokes the startsWith() method. This implementation error changes the behavior from an exact match to a prefix match, validating any incoming path that begins with the target value defined in the policy.
An analysis of the vulnerable codebase in packages/grpc-js-xds/src/matcher.ts reveals the precise code path responsible for the comparison error. The implementation of the apply method in PathExactValueMatcher was written as follows before the patch:
export class PathExactValueMatcher {
// ...
apply(value: string) {
if (this.caseInsensitive) {
// VULNERABLE: Performs a prefix check instead of a strict equality check
return value.toLowerCase().startsWith(this.targetValue.toLowerCase());
} else {
// CORRECT: Performs a strict equality check
return value === this.targetValue;
}
}
}Because of the startsWith() call, an incoming string value such as /myService.Service/MethodSecret matches a policy path of /myService.Service/Method because the prefix matches perfectly. The security patch resolves this discrepancy by replacing the prefix evaluation with a strict equality comparison of the lowercased strings:
export class PathExactValueMatcher {
// ...
apply(value: string) {
if (this.caseInsensitive) {
// FIXED: Performs case-insensitive strict equality check
return value.toLowerCase() === this.targetValue.toLowerCase();
} else {
return value === this.targetValue;
}
}
}The fix is complete and robust against basic prefix-matching bypass vectors. However, developers should be aware that JavaScript toLowerCase() does not account for complex Unicode case folding. While standard gRPC paths are limited to ASCII, any implementations utilizing non-ASCII characters in route configurations could theoretically experience normalization discrepancies.
Exploitation of CVE-2026-101914 requires specific configuration prerequisites on the target gRPC server. The target server must employ xDS-based RBAC policies, contain at least one rule using case_insensitive: true for an exact path matcher, and host service endpoints where one method name serves as a prefix to another more restrictive method.
Consider a deployment where a low-privilege client is authorized to access the /Service/Check method. The server also hosts a highly privileged administrative method named /Service/CheckAdmin. The RBAC policy uses case-insensitive exact matching to authorize access to /Service/Check.
An attacker sends a gRPC request targeting /Service/CheckAdmin. The RBAC engine intercepting the request evaluates the path against the policy. Because of the bug, the evaluation /service/checkadmin.startsWith(/service/check) returns true. The server then executes /Service/CheckAdmin, granting the attacker unauthorized access to administrative functionality.
The overall security impact of this vulnerability is calculated at a CVSS 3.1 Base Score of 6.5 (Medium). The attack vector is Network, and complexity is rated as High due to the specific naming and policy configurations required to trigger the exploit.
When successfully exploited, the integrity of the application is severely compromised because attackers can perform actions they are not authorized to execute. The confidentiality impact is rated as Low because the primary outcome is unauthorized function execution, though this execution may leak state or data. The availability impact is rated as None because the logical flaw does not directly cause application crashes or resource depletion.
This vulnerability is particularly significant in microservices environments that utilize a single gRPC server interface to handle both public and internal endpoints. Bypassing service mesh security boundaries at the gRPC transport layer allows attackers to bypass lateral movement protections and access backend administrative controls.
To fully remediate CVE-2026-101914, administrators and developers must update their @grpc/grpc-js and @grpc/grpc-js-xds dependencies to patched versions. The official fixes are backported and released in multiple release streams.
For systems running on the 1.13.x release line, the package must be upgraded to version 1.13.1 or higher. For systems running on the 1.14.x release line, the package must be upgraded to version 1.14.1 or higher.
If upgrading dependencies is not immediately viable, the vulnerability can be mitigated by disabling case-insensitive matching in the xDS control plane configurations. Setting case_insensitive to false in RBAC policies ensures the engine executes the strict equality code branch. Additionally, services can be refactored to eliminate naming overlaps where one method name is a prefix of another.
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
@grpc/grpc-js gRPC | < 1.13.1 | 1.13.1 |
@grpc/grpc-js gRPC | >= 1.14.0, < 1.14.1 | 1.14.1 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-187 |
| Attack Vector | Network |
| CVSS v3.1 Score | 6.5 |
| Confidentiality Impact | Low |
| Integrity Impact | High |
| Exploit Status | PoC available |
| KEV Status | Not listed |
The software performs a string comparison that only evaluates a portion of the strings, such as checking if one string starts with another, instead of verifying the entire contents of both strings.
An incomplete denylist vulnerability in FasterXML jackson-databind's DefaultBaseTypeLimitingValidator allows unauthenticated remote attackers to bypass polymorphic type limitations. By declaring properties of type java.lang.Comparable, attackers can instantiate arbitrary Comparable subclasses on the classpath, leading to path traversal, local file access, or application-specific state manipulation.
A vulnerability in the scim-patch library allows authenticated users to pollute the global JavaScript execution environment. By transmitting a SCIM PATCH operation targeting inherited built-in methods, such as toString, valueOf, or hasOwnProperty, attackers bypass blocklist filters and mutate global prototype objects. This flaw occurs due to the library relying on standard prototype lookup and the 'in' operator during path-resolution and assignment, resolving to shared native functions instead of treating them as missing own-properties.
An OS command injection vulnerability in the grep_search tool of the code-ollama package allows remote code execution. This vulnerability is triggered when a local client executes the CLI against a malicious or compromised Ollama server. Due to grep_search being classified as a read-only tool, the CLI executes it automatically in Plan mode without human-in-the-loop validation, leading to zero-interaction local system compromise.
On September 16, 2026, Cisco disclosed a critical authentication bypass vulnerability affecting Cisco Identity Services Engine (ISE) and Cisco ISE Passive Identity Connector (ISE-PIC). This vulnerability allows unauthenticated, remote attackers to bypass the administrative interface controls and execute privileged API requests. Due to active exploitation in the wild, the Cybersecurity and Infrastructure Security Agency (CISA) added this vulnerability to the Known Exploited Vulnerabilities (KEV) Catalog with an immediate remediation deadline.
containerd is an open-source container runtime. Prior to versions 1.7.36, 2.0.13, 2.2.9, 2.3.6, and 2.4.1, a crafted OCI index graph can force very high CPU/memory usage during PullImage (before container start), causing long ContainerCreating stalls and, at larger sizes, node/runtime instability. The vulnerability occurs because containerd's image-pull descriptor graph resolution handlers processed OCI image indices and manifests recursively without enforcing boundaries on traversal depth or breadth, and without maintaining a global visited registry to count duplicate references.
An unauthenticated path traversal vulnerability exists in the Khoj AI assistant platform via the static file serving endpoint `/home/{file_path:path}`. Due to improper path sanitization when handling user input with Python's pathlib module, a remote attacker can read arbitrary files from the server's filesystem.