Skip to main content

05. gRPC Security Tools & Auditing Frameworks

Auditing, penetration testing, and statically analyzing gRPC applications requires specialized security tooling capable of interpreting Protocol Buffer wire formats and HTTP/2 framing.


1. Reconnaissance & Reflection Auditing (grpcurl & grpcui)​

A. grpcurl - The Command-Line gRPC Audit Workhorse​

grpcurl is a lightweight CLI utility for interacting with gRPC servers. It supports Reflection-based schema discovery as well as static .proto file parsing.

1. Discover Exposed Services (Server Reflection Check)​

# Attempt to list services on target server (Checks if Reflection is vulnerable!)
grpcurl -insecure target.example.com:50051 list

# Expected output on vulnerable server:
# grpc.reflection.v1alpha.ServerReflection
# order.v1.OrderService
# user.v1.UserService
# admin.v1.InternalAdminService <-- Vulnerable internal service exposed!

2. Describe Endpoint & Inspect Protobuf Schema​

# Extract full message definitions and methods from reflection
grpcurl -insecure target.example.com:50051 describe user.v1.UserService.GetUserProfile

# Output:
# user.v1.UserService.GetUserProfile is a method:
# rpc GetUserProfile ( .user.v1.GetUserRequest ) returns ( .user.v1.UserProfile );

3. Crafting Custom RPC Exploits with Custom Metadata Headers​

# Invoke RPC method passing custom JSON payload & Authorization metadata header
grpcurl -insecure \
-H "authorization: Bearer eyJhbGciOi..." \
-d '{"user_id": "target_user_99"}' \
target.example.com:50051 \
user.v1.UserService/GetUserProfile

B. grpcui - Interactive Web GUI for gRPC Testing​

grpcui provides an interactive web interface (built on top of grpcurl) for exploring gRPC services in a browser.

# Launch interactive browser UI connected to target gRPC endpoint
grpcui -insecure -port 8080 target.example.com:50051

[!WARNING] If grpcui successfully loads service forms without requiring a .proto file, Server Reflection is enabled in production, exposing all service contracts to unauthenticated attackers.


2. Performance & DoS Stress Testing (ghz)​

ghz is an open-source gRPC benchmarking and load-testing CLI tool. Security engineers use ghz to test rate limiters and detect stream exhaustion DoS vulnerabilities.

A. Simulating Stream Flooding / High-Concurrency DoS​

# Launch 200 concurrent workers sending 10,000 requests to test stream exhaustion
ghz --insecure \
--proto=./order.proto \
--call=order.v1.OrderService.CreateOrder \
--data='{"order_id": "test-123", "quantity": 5}' \
--concurrency=200 \
--total=10000 \
--cpus=4 \
target.example.com:50051

Key Metrics to Monitor During Load Testing:​

  • Error Code ResourceExhausted (Code 8): Indicates rate limiters or stream quotas are functioning correctly.
  • Error Code Unavailable (Code 14) / Server Crash: Indicates the server lacks stream limits and is vulnerable to DoS.

3. Protobuf Security & Linting (buf)​

The Buf CLI (buf) provides linting, breaking change detection, and formatting for Protocol Buffer definitions.

A. Auditing Schema Security with buf lint​

Create a buf.yaml configuration:

version: v1
lint:
use:
- DEFAULT
- COMMENTS
except:
- PACKAGE_DIRECTORY_MATCH

Run schema audit:

# Run lint checks across all proto definitions
buf lint

4. Static Application Security Testing (SAST) with Semgrep​

Semgrep can detect hardcoded insecure gRPC transport configurations across codebase repositories.

Custom Semgrep Rules for gRPC Hardening (grpc-sast-rules.yaml):​

rules:
- id: insecure-grpc-dial-go
languages: [go]
severity: ERROR
message: "CRITICAL: gRPC client dialing with grpc.WithInsecure(). Traffic will be transmitted in unencrypted plaintext!"
pattern: grpc.Dial($ADDR, ..., grpc.WithInsecure(), ...)

- id: insecure-grpc-server-python
languages: [python]
severity: ERROR
message: "CRITICAL: gRPC server using add_insecure_port(). Enable ssl_server_credentials with mTLS!"
pattern: $SERVER.add_insecure_port(...)

- id: insecure-grpc-plaintext-java
languages: [java]
severity: ERROR
message: "CRITICAL: Java gRPC ServerBuilder configured with usePlaintext(). Transport encryption disabled!"
pattern: $BUILDER.usePlaintext()

- id: grpc-reflection-production
languages: [go]
severity: WARNING
message: "WARNING: Server Reflection registered. Ensure reflection.Register() is guarded by environment checks!"
pattern: reflection.Register($SERVER)

Executing Semgrep Audit:​

semgrep --config=grpc-sast-rules.yaml ./src/

5. gRPC Security Tooling Summary​

Tool NameTypeKey Security Purpose
grpcurlCLI UtilityReflection inspection, crafting RPC requests, header metadata testing
grpcuiWeb GUIInteractive browser testing of exposed gRPC methods
ghzBenchmarking / DoSLoad testing, testing stream concurrency limits & rate limiters
bufSchema LinterAuditing .proto contracts, breaking change detection, validation
SemgrepSAST ScannerAutomated code detection of WithInsecure(), plaintext servers, and reflection leaks

Next Chapter: 06. Hands-on Vulnerability Lab: Exploiting & Securing gRPC →