
Bypass de la política de autorización RBAC en gRPC-Go mediante la barra `:path` faltante (Bypass de autenticación)
Bypass de la política de autorización RBAC de gRPC-Go mediante la ausencia de la barra inicial en :path (Bypass de autenticación)
El paquete authz de google.golang.org/grpc implementa la autorización RBAC a nivel de SDK mediante reglas de denegación y de permiso que se comparan con la pseudo-cabecera :path. El transporte del servidor HTTP/2 almacena el valor bruto de :path procedente del cliente sin validar que comience con /. La capa de enrutamiento (handleStream) normaliza la ruta antes del despacho, pero el motor RBAC lee el valor previo a la normalización desde el contexto mediante grpc.Method(ctx).
Las reglas de denegación se escriben como /Service/Method (con barra inicial). Enviar :path = "Service/Method" (sin barra) provoca que la regla de denegación no coincida en la comparación del primer carácter. Se activa la regla de permiso por defecto y el método protegido se ejecuta.
Cualquier servidor gRPC que utilice authz.NewStatic() o authz.NewFileWatcher() con reglas de denegación es vulnerable. Un cliente HTTP/2 bruto (Python h2, curl --http2 o cualquier escritor de tramas personalizado) es suficiente para explotarlo: no se necesitan credenciales ni estado previo.
La verificación en vivo contra grpc-go v1.71.0 devolvió el estado gRPC 0 (OK) en un AdminMethod incluido en la lista de denegación cuando se omitió la barra inicial, mientras que la llamada idéntica con la barra canónica devolvió el estado 7 (PermissionDenied).
Versiones afectadas: google.golang.org/grpc < v1.79.3. Corregido en v1.79.3 (PR #8981).
# Install the Python HTTP/2 dependency:
pip install h2
# Against an existing vulnerable gRPC server:
python3 poc.py --host <HOST> --port <PORT>
python3 poc.py --host <HOST> --port <PORT> --service MyService --method SecretMethod
# When TCP destination and HTTP/2 authority differ:
python3 poc.py --host <VHOST> --connect-host <IP> --port 80 \
--service MyService --method SecretMethod
# Canonical upstream malformed path:
python3 poc.py --host <HOST> --port <PORT> --path-mode no-slash
# Reverse-proxy deployments that preserve a double slash before grpc_pass:
python3 poc.py --host <VHOST> --connect-host <IP> --port 80 \
--path-mode double-slash --service MyService --method SecretMethod
# Literal :path value when you already know the backend path shape:
python3 poc.py --host <VHOST> --connect-host <IP> --path-mode custom \
--attack-path '//MyService/SecretMethod'
# Save a decoded successful attack response for follow-on manual use:
python3 poc.py --host <HOST> --port <PORT> --output-response /tmp/grpc-response.txt
--host controla el host :authority de HTTP/2 a menos que se especifique --authority. --connect-host controla el destino TCP. Esto es útil para configuraciones de host virtual o proxy inverso donde la IP accesible es diferente de la autoridad del backend enrutado.
El caso canónico de grpc-go es --path-mode no-slash. double-slash y custom son utilidades genéricas para entornos en los que un proxy reenvía una forma de ruta malformada distinta al backend vulnerable.
h2 (pip install h2)authz con reglas de denegación| Archivo | Descripción |
|---|---|
poc.py | PoC en Python: envía 3 llamadas HTTP/2 brutas (baseline/attack/control) para demostrar el bypass |
README.md | Detalles de la vulnerabilidad, ejemplos de uso y referencias |
LICENSE | Licencia GPLv3 |
Este proyecto se publica bajo la GNU GPLv3.
Se proporciona para investigación de seguridad defensiva, educación y pruebas autorizadas. No utilice este código contra sistemas o servicios sin el permiso explícito del propietario.
El uso no autorizado puede infringir la legislación aplicable. Los autores no otorgan permiso para probar sistemas de terceros y no se hacen responsables del mal uso.
Consulte el archivo LICENSE para conocer los términos de garantía y responsabilidad.