CVE-2026-33186: gRPC-Go has an authorization bypass via missing leading slash in :path
Impact What kind of vulnerability is it? Who is impacted?
It is an Authorization Bypass resulting from Improper Input Validation of the HTTP/2 :path pseudo-header.
The gRPC-Go server was too lenient in its routing logic, accepting requests where the :path omitted the mandatory leading slash (e.g., Service/Method instead of /Service/Method). While the server successfully routed these requests to the correct handler, authorization interceptors (including the official grpc/authz package) evaluated the raw, non-canonical path string. Consequently, "deny" rules defined using canonical paths (starting with /) failed to match the incoming request, allowing it to bypass the policy if a fallback "allow" rule was present.
Who is impacted? This affects gRPC-Go servers that meet both of the following criteria: 1. They use path-based authorization interceptors, such as the official RBAC implementation in google.golang.org/grpc/authz or custom interceptors relying on info.FullMethod or grpc.Method(ctx). 2. Their security policy contains specific "deny" rules for canonical paths but allows other requests by default (a fallback "allow" rule).
The vulnerability is exploitable by an attacker who can send raw HTTP/2 frames with malformed :path headers directly to the gRPC server.
Patches Has the problem been patched? What versions should users upgrade to?
Yes, the issue has been patched. The fix ensures that any request with a :path that does not start with a leading slash is immediately rejected with a codes.Unimplemented error, preventing it from reaching authorization interceptors or handlers with a non-canonical path string.
Users should upgrade to the following versions (or newer): v1.79.3 The latest master branch.
It is recommended that all users employing path-based authorization (especially grpc/authz) upgrade as soon as the patch is available in a tagged release.
Workarounds Is there a way for users to fix or remediate the vulnerability without upgrading?
While upgrading is the most secure and recommended path, users can mitigate the vulnerability using one of the following methods:
1. Use a Validating Interceptor (Recommended Mitigation) Add an "outermost" interceptor to your server that validates the path before any other authorization logic runs:
go func pathValidationInterceptor(ctx context.Context, req any, info grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) { if info.FullMethod == "" || info.FullMethod[0] != '/' { return nil, status.Errorf(codes.Unimplemented, "malformed method name") } return handler(ctx, req) }
// Ensure this is the FIRST interceptor in your chain s := grpc.NewServer( grpc.ChainUnaryInterceptor(pathValidationInterceptor, authzInterceptor), )
2. Infrastructure-Level Normalization If your gRPC server is behind a reverse proxy or load balancer (such as Envoy, NGINX, or an L7 Cloud Load Balancer), ensure it is configured to enforce strict HTTP/2 compliance for pseudo-headers and reject or normalize requests where the :path header does not start with a leading slash.
3. Policy Hardening Switch to a "default deny" posture in your authorization policies (explicitly listing all allowed paths and denying everything else) to reduce the risk of bypasses via malformed inputs.
Other sources
gRPC-Go is the Go language implementation of gRPC. Versions prior to 1.79.3 have an authorization bypass resulting from improper input validation of the HTTP/2 :path pseudo-header. The gRPC-Go server was too lenient in its routing logic, accepting requests where the :path omitted the mandatory leading slash (e.g., Service/Method instead of /Service/Method). While the server successfully routed these requests to the correct handler, authorization interceptors (including the official grpc/authz package) evaluated the raw, non-canonical path string. Consequently, "deny" rules defined using canonical paths (starting with /) failed to match the incoming request, allowing it to bypass the policy if a fallback "allow" rule was present. This affects gRPC-Go servers that use path-based authorization interceptors, such as the official RBAC implementation in google.golang.org/grpc/authz or custom interceptors relying on info.FullMethod or grpc.Method(ctx); AND that have a security policy contains specific "deny" rules for canonical paths but allows other requests by default (a fallback "allow" rule). The vulnerability is exploitable by an attacker who can send raw HTTP/2 frames with malformed :path headers directly to the gRPC server. The fix in version 1.79.3 ensures that any request with a :path that does not start with a leading slash is immediately rejected with a codes.Unimplemented error, preventing it from reaching authorization interceptors or handlers with a non-canonical path string. While upgrading is the most secure and recommended path, users can mitigate the vulnerability using one of the following methods: Use a validating interceptor (recommended mitigation); infrastructure-level normalization; and/or policy hardening.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
go/google.golang.org/grpcto a version that resolves this vulnerability.Fixed in 1.79.3 - Upgrade
Upgrade
gRPC-Goto a version that resolves this vulnerability.Fixed in 1.79.3 - Configuration
Configure the front proxy/load balancer to enforce strict HTTP/2 compliance for pseudo-headers and reject or normalize HTTP/2 requests where the `:path` pseudo-header does not start with `/`.
gRPC server behind reverse proxy / load balancer (Envoy/NGINX/L7 LB) strict HTTP/2 compliance for pseudo-headers = enabled and reject/normalize requests where the `:path` header does not start with a leading slash - Configuration
Switch authorization policies that use path-based authorization to a default-deny posture by explicitly listing all allowed paths and denying everything else to reduce bypasses via malformed inputs.
gRPC authorization policies (path-based authorization, e.g., grpc/authz) policy default posture = default deny (explicitly list allowed paths, deny everything else) - Configuration
Add an outermost (first) validating interceptor to your server that checks the HTTP/2 `:path` pseudo-header before any other authorization logic runs; reject requests where `:path` does not start with a leading slash by returning `codes.Unimplemented`.
gRPC server interceptors validating interceptor for HTTP/2 `:path` = placed as the FIRST interceptor in the chain; reject requests with non-canonical `:path`
Event History
Frequently Asked Questions
What is the severity of CVE-2026-33186?
CVE-2026-33186 is classified as an authorization bypass vulnerability due to improper input validation.
Who is affected by CVE-2026-33186?
CVE-2026-33186 affects users of the gRPC-Go library prior to version 1.79.3.
How do I fix CVE-2026-33186?
To mitigate CVE-2026-33186, upgrade the gRPC-Go library to version 1.79.3 or later.
What causes CVE-2026-33186?
CVE-2026-33186 is caused by the gRPC-Go server's leniency in validating the HTTP/2 ':path' pseudo-header.
Can CVE-2026-33186 lead to data exposure?
Yes, CVE-2026-33186 can potentially lead to unauthorized access and data exposure due to the authorization bypass.