Skip to main content

GraphQL, gRPC, WebSocket

Vulkro checks GraphQL, gRPC and WebSocket servers for the misconfigurations that REST checklists miss. These checks run in every vulkro scan.

vulkro scan .
vulkro explain GQL-001 # full explainer for any rule

GraphQL (GQL-*, GQL-INTRO-*)​

AreaChecks
IntrospectionIntrospection or a playground left on in production (Apollo, graphql-js, Strawberry, Ariadne, gqlgen, Hot Chocolate); __schema reachable through a meta-field allowlist.
Query costNo depth limit, no complexity analysis, batching with no cap, alias amplification, fragment cycles, unbounded findMany() results, N+1 lookups without DataLoader.
AuthorizationMutation or subscription resolver without an auth check, sensitive field without field-level auth, federation __resolveReference skipping auth, wide input spread into an ORM update.
OperationalError masking absent, user data in error messages, persisted queries not enforced, endpoint reachable by GET, subscriptions over ws://.

gRPC (GRPC-*, GO-GRPC-*)​

AreaChecks
TransportServer without TLS credentials, grpc.WithInsecure() or insecure client credentials.
DiscoveryReflection registered without an environment guard.
AuthService registered with no interceptor; metadata used as auth with no token check; trailers trusted as a business signal.
Resource limitsNo MaxRecvMsgSize, unbounded MaxConcurrentStreams, streaming handlers that ignore cancellation or never stop.
LeaksInternal errors returned to the client, logging interceptors that capture full payloads.

Covers Go, Python, Node.js and Rust (tonic) servers.

WebSocket (WS-*)​

RuleChecks
WS-001No origin check on the server (cross-site WebSocket hijacking).
WS-002No auth on the first message.
WS-003Token in the ws:// URL query string.
WS-004No per-connection rate limit.
WS-005Unbounded message size.
WS-006permessage-deflate enabled.
WS-007Socket.IO default namespace accepts everything.
WS-008No heartbeat or ping interval.
WS-009Plaintext ws:// URL in source.
WS-010Cross-tenant broadcast with io.emit(...).

Object-level and function-level authorization (OWASP API1 and API5) apply here as they do to REST handlers. See OWASP API Top 10.

See also: Supported languages