Soluções

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: __schema liberado 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 ver user { 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:

  1. Reconstrói o schema — via introspection quando disponível, ou inferido a partir do tráfego observado quando ela está desligada.
  2. Mapeia a matriz de autorização inteira (authz_matrix): qual ator alcança qual tipo/campo/mutation, cruzando papéis e tenants.
  3. 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.
  4. 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.

Perguntas frequentes

O Omni Pentest precisa de introspection ligada para testar GraphQL?
Não. Quando `__schema` está exposto, ele acelera o mapeamento; quando está desligado, o Omni infere o schema a partir do tráfego observado e continua deduzindo a matriz de autorização.
Qual a diferença entre graphql security testing com scanner e com o Omni?
O scanner de template acha má-configuração (introspection, CSRF, field suggestions). O Omni modela o schema e deduz bypasses de autorização por nó e por campo — bugs de lógica que o template não enxerga.
Como o Omni evita falso-positivo de IDOR em GraphQL?
Todo candidato passa por um firewall determinístico (10 gates + AutoReject + confiança recomputada). O juiz é código, não o modelo: um IDOR sobre dado público ou autocontido é morto antes de virar report.
O Omni causa DoS ao testar batching e profundidade de query?
Não. Ele modela o vetor (aliases, aninhamento, batching) e demonstra a primitiva de forma contida, com contenção declarada. A prova é de alcance, não de dano — degradar o serviço é proibido.
Dá para rodar contra APIs GraphQL internas ou self-hosted?
Sim. O Omni é self-hosted (seu VPS/k3s, pods gVisor, escopo fail-closed), então testar uma API interna não expõe dados fora do seu perímetro.