Segurança de APIs GraphQL: pentest autônomo que modela o schema
APIs GraphQL escondem os bugs que pagam dentro do schema: IDOR em nós, autorização por campo, batching. Veja como o Omni modela o schema e deduz esses bypasses.
Por que GraphQL quebra a ferramenta tradicional
GraphQL move a autorização do endpoint para o campo. Um único /graphql expõe dezenas de tipos, nós e mutations — e o scanner que varre rota por rota não enxerga essa superfície. Por isso os bugs que pagam em GraphQL raramente são injeções clássicas: são falhas de lógica e de autorização escondidas no schema.
Os riscos reais
- Introspection exposta:
__schemaliberado em produção entrega o mapa inteiro da API — tipos, campos, argumentos, deprecations. Não é o bug em si, mas é o combustível de todos os outros. - IDOR em nós (node-level):
node(id: "...")ou queries por ID que devolvem objetos de outro tenant. A autorização passa no resolver do topo mas vaza num campo aninhado. - Autorização por campo (field-level): o usuário pode ler
user { email }mas não deveria veruser { paymentMethods }— e o resolver daquele campo esqueceu de checar. - Batching e DoS: aliases repetidos, queries aninhadas profundas ou um array de operations num único POST que multiplicam o custo — brute force sob o radar do rate limit e amplificação de carga.
- Mutations sem escopo: a mutation confia no ID que o cliente manda em vez de derivar do token.
Como o Omni modela o schema e deduz o bypass
O diferencial do Omni Pentest é modelar-e-deduzir em vez de só disparar payloads. Em GraphQL isso é literal:
- Reconstrói o schema — via introspection quando disponível, ou inferido a partir do tráfego observado quando ela está desligada.
- Mapeia a matriz de autorização inteira (
authz_matrix): qual ator alcança qual tipo/campo/mutation, cruzando papéis e tenants. - Aprende a máquina de estados dos fluxos críticos (auth, checkout) e faz model-checking — cada contraexemplo é um bypass de autorização deduzido, não um chute.
- Resolve o input exato do bypass e valida com verificação metamórfica para bugs de lógica.
Todo candidato passa pelo firewall determinístico: 10 gates + AutoReject + confiança recomputada. Quem decide se vira report é código, não o modelo — um "IDOR" que na verdade era dado público, ou uma introspection sem impacto, morre ali.
Comparação honesta
| Capacidade | Omni Pentest | Scanner de template | Pentest manual |
|---|---|---|---|
| Introspection / má-config | Detecta | Detecta bem | Detecta |
| IDOR em nó aninhado | Deduz do modelo | Raramente | Sim, com esforço |
| Bypass de autorização por campo | Deriva da matriz | Não | Sim |
| Cobertura contínua | Sim (Modo Profundo) | Sim | Pontual |
| Lógica de negócio densa | Boa | Nenhuma | A melhor |
Quando usar cada um:
- Scanner de template (graphql-cop, nuclei): triagem rápida de má-configuração — introspection ligada, field suggestions, CSRF. Barato, mas para na superfície.
- Pentest manual: quando o alvo é crítico e você precisa do julgamento humano sobre lógica de negócio densa. Insubstituível — e caro por hora.
- Omni Pentest: quando você quer cobertura autônoma e persistente da matriz de autorização, deduzindo bypasses de nó e de campo que o template não acha, sem pagar hora de consultor. Ele não substitui o pentester sênior num alvo de alto valor; cobre o volume e o longo prazo que o humano não escala.
O Omni roda no seu VPS/k3s, com workers isolados em pods gVisor e escopo fail-closed — nada sai do seu perímetro. BYO-key: você traz sua chave de LLM, sem custo de inferência embutido.
Quer ver o Omni modelar o schema de um alvo GraphQL do seu programa? Conecte um escopo e deixe o Modo Profundo rodar.