Pular para o conteúdo
01 / 00 ·
ALQUIM_IA.LAB Claude Code e Codex · Apache 2.0

Skill de cybersecurity que enxerga
o atacante e o que falha sem ele

Ela varre as nove famílias que um invasor explora, de RLS e policies a SECURITY DEFINER, privilégio, webhook, injeção e storage. E varre o que checklist nenhum olha: o que o seu sistema erra com quem age de boa-fé, sem atacante nenhum.

saas-security-auditgithub.com/thdamas
19detectores mecânicos
2dimensões de auditoria
ALQUIM_IA.LAB
01 - Instalação

Quatro comandos, e ela vira o /auditor no seu Claude Code

Não tem servidor para subir, nem chave de API, nem pacote para instalar. O que precisa existir na máquina é Python 3.11 ou mais novo. Roda no Claude Code e no Codex, porque os dois têm subagentes, que é o que o método exige.

01

Clone o repositório

git clone https://github.com/thdamas/saas-security-audit

Baixa a skill inteira: o motor em Python, os prompts de cada lente e os dois catálogos.

O que esperar. Uma pasta de 34 arquivos, sem nenhum pacote para instalar.

02

Ponha na pasta de skills

cp -r saas-security-audit ~/.claude/skills/auditor

É o que faz o Claude Code enxergar a skill e criar o comando /auditor.

O que esperar. No Codex, o AGENTS.md do repositório já traz o mesmo método.

03

Prove que funciona

python verificar.py

Roda contra um SaaS de exemplo que tem um defeito plantado para cada detector.

O que esperar. APROVADO com 19 detectores, a cobertura e o painel conferidos na sua máquina.

04

Chame no seu app

/auditor

A skill pede o perfil do app, mostra o inventário medido e só então gasta agente.

O que esperar. Portão humano entre as fases: nada avança sem você aprovar.

Antes de rodar em app de cliente. A skill é somente leitura e nunca altera o seu código. Mas ela escreve o relatório em disco, e relatório de vulnerabilidade não pode cair no repositório: por padrão ele vai para fora, e o scanner avisa se você apontar a saída para dentro.

Instalada, a primeira pergunta é o que ela responde. É a próxima parada.
02 - A pauta

O que esta apresentação responde, e por que a pergunta existe

Um SaaS pequeno chega no momento de escalar e alguém pergunta se pode abrir o cadastro, subir a verba, trazer volume. A resposta costuma ser um palpite.

O que disparou

Um caminho de acesso novo num app de assinatura, e um punhado de telas que passaram a tratar mal quem tinha direito. Nenhuma delas era invasão.

As opções em jogo

Contratar pentest custa caro e responde outra pergunta. Rodar um prompt de auditoria é barato e audita por amostragem sem avisar que amostrou.

Por que esta pergunta

Porque escalar multiplica o dano de um defeito que já existe. O custo de descobrir depois é sempre maior que o de olhar antes.

O caminho inteiro em uma tela é a próxima parada.
03 - O mapa da leitura

Oito paradas, e o que se aprende em cada uma

O método

Duas dimensões, e por que a segunda não existe no mercado

01

Dimensão A

Nove famílias de falha, da RLS ao denial of wallet

02

Dimensão B

As quatro lentes do erro que acontece sem atacante

03

O loop

Seis fases, com portão humano entre elas

04

A prova

Cobertura provada por aritmética, não por promessa

05

Os céticos

Agentes independentes tentando derrubar cada achado

06

O painel

Um arquivo, offline, com o gate de escala

07

Os limites

O que ela não faz, dito antes de alguém descobrir

08
Começa pelo método, que é o que separa esta ferramenta de um prompt de auditoria.
04 - O método

Duas dimensões, e a segunda não existe em checklist nenhum

A indústria audita abuso. O prejuízo mais provável num SaaS pequeno vem do outro eixo, e ele não depende de existir alguém interessado em te atacar.

O que todo mundo audita

Abuso

O que um atacante alcança que não deveria?

  • Precisa de alguém interessado em você
  • Exige uma falha de controle
  • O checklist fecha verde quando o controle existe
O que ninguém audita

Corretude

O sistema faz a coisa certa com quem age de boa-fé?

  • Não precisa de atacante nenhum
  • O controle está lá e funcionando
  • O defeito é a pergunta que a guarda faz

Por que o checklist não acusa. Ele pergunta se o controle existe, e nesses casos ele existe e está funcionando. O RLS está ligado, a policy está certa, a guarda está lá. O defeito é a pergunta que a guarda faz, e nenhuma lista de verificação tem uma linha para isso.

A dimensão A é a parte conhecida. Vale ver o tamanho dela antes.
05 - Dimensão A

Segurança e abuso, em nove famílias de falha

Cada classe tem severidade base, como confirmar e, o que quase nenhum material traz, o que a REFUTA. Sem a última coluna o cético improvisa e aceita tudo.

RLS e policies

Tabela sem RLS, tautologia, escrita sem WITH CHECK, policy empilhada que vira OU

Funções e RPC

SECURITY DEFINER sem search_path, view rodando como dono, RPC sem vínculo

Privilégio e segredo

Chave de service role alcançável pelo bundle, segredo literal, env com prefixo público

Rotas e webhook

Assinatura, idempotência, replay, enumeração de documento, rota cara sem cota

Front e injeção

XSS armazenado, filtro cru do PostgREST, autorização só na interface

Storage

Bucket público com documento, URL pública onde devia ser assinada, path sem dono

IA e LLM

Injeção de prompt, contexto de um usuário no outro, denial of wallet

Plataforma

Backup não confirmado, projeto pausável, push direto na main sem gate

Privacidade

Trilha ausente, exclusão incompleta, dado atravessando escopo de tenant

Essa parte o mercado cobre. A próxima é a que não aparece em lugar nenhum.
06 - Dimensão B

Corretude de negócio, em quatro lentes

A severidade não mede explorabilidade, mede consequência. Cobrar de quem não devia é pior que negar a quem tem direito: negação se conserta com um pedido de desculpa, cobrança se conserta com estorno e confiança perdida.

B1

Matriz de acesso

Quais portas essa pessoa encontra, e todas sabem que ela existe?

Na prática. Uma guarda exige assinatura paga. O convidado de cortesia não tem linha naquela tabela, então ele é tratado como inexistente em cada tela que pergunta assim.

B2

Direção da falha

Quando a leitura protegida falha ou volta vazia, cai em negado ou em liberado?

Na prática. Uma query lê tabela de staff com o client do usuário. O RLS devolve zero linha sem erro, e zero linha vira estado válido na tela.

B3

Consistência entre caminhos

Se N caminhos escrevem o mesmo dado, todos gravam os mesmos campos?

Na prática. Três caminhos gravam pagamento e um esquece o id do provedor. O estorno não acha a venda, e a comissão segue sendo paga.

B4

Âncora de regra externa

A regra de data ou valor sai da fonte que o mundo real honra?

Na prática. O código calcula a vigência do jeito conveniente. O parceiro externo honra outra data, e a promessa está escrita na tela do cliente.

Duas dimensões exigem um processo que não deixe nada de fora. É o loop.
07 - O loop

Sete fases, com portão humano entre elas

Nenhuma fase começa sem aprovação, e as aprovadas ficam registradas em arquivo. Ao retomar, a auditoria diz em que fase parou antes de fazer qualquer coisa.

Fase 0

Perfil

O mapa do app, aprovado por um humano

Mapa errado audita o lugar errado com confiança

Fase 1

Ground truth

Estado real do banco, não só as migrations

Migration diz o que foi pedido, o dump diz o que é

Fase 2

Mecânico

Scanner determinístico, zero LLM

Inventário, detecção e partição provada

Fase 3

Lote 01

Portão de calibragem com um lote só

Prompt torto morre em 1, não se multiplica por 14

Fase 4

Fan-out

Um subagente por lote, em paralelo

Dinheiro e matriz ficam com o orquestrador

Fase 5

Céticos

Agentes diferentes, contexto limpo

Sem isso a auditoria concorda consigo mesma

Fase 6

Painel

Um HTML com o gate de escala

Mais o que não foi verificado, declarado

A fase 2 é a que carrega a promessa mais difícil de cumprir: cobertura total.
08 - A prova

Cobertura provada por aritmética, não por promessa

Agente que escolhe o que auditar audita por amostragem e não avisa. O scanner parte o universo em lotes com lista explícita e checa a partição por asserção.

O que ele afirma

soma dos lotes=universo
interseção entre lotes=vazia

Se qualquer uma falhar, a rodada para com erro. A auditoria não continua sabendo que deixou algo de fora.

O que entra na conta

  • Cada tabela do banco
  • Cada função de servidor exportada
  • Cada rota de API
  • Arquivo de servidor sem export nomeado vira uma unidade própria
Detectores mecânicos
19
zero LLM, reproduzíveis
Dimensões auditadas
2
abuso e corretude
Dependências externas
0
só biblioteca padrão
Cobertura garante que nada foi esquecido. Não garante que o achado é verdadeiro.
09 - Os céticos

Quem procura o furo não pode julgar o próprio furo

Todo achado crítico e alto vai para um agente diferente, de contexto limpo, cuja única tarefa é derrubar a acusação. Ele é a defesa, não a revisão.

confirmado

procurou os bloqueadores e nenhum existe, com a lista do que procurou

ajustado

o problema existe, a severidade estava errada, com o fato que a mudou

refutado

existe bloqueador real, citado com arquivo e linha. Sem localização não vale

refutado, não implantado

o bloqueador existe no código e não na branch que vai ao ar. Segue contando

A assimetria é deliberada. Refutar é mais difícil que confirmar. Um achado exagerado custa dez minutos de leitura, um achado descartado por engano custa o incidente.

No fim de tudo, uma pergunta só precisa ser respondida.
10 - O painel

Um arquivo, offline, com uma pergunta no topo

11
Pronto pra escalar? Não escalar

11 bloqueadores em aberto, contando crítico e alto que ainda não foram corrigidos ou aceitos.

  • Zero requisição externa, abre sem internet
  • Status de cada achado editável, e persiste entre rodadas
  • Nenhum segredo aparece inteiro, em nenhuma hipótese
01Veredito e gate de escala
02Panorama por dimensão
03Mapa de calor do schema
04Matriz de acesso
05Achados agrupados
06Plano de correção
07Prova de cobertura
Toda ferramenta de segurança promete demais. Esta declara o que não faz.
11 - Os limites

O que ela não faz, dito antes de alguém descobrir

Não faz
  • Pentest. Não forja requisição nem sonda produção
  • Substituir revisão humana de segurança
  • Certificar coisa nenhuma. O gate é um veredito, não um selo
  • Ver o banco real sozinha: ela lê migrations, e migration é o que foi pedido
Faz
  • Análise estática e passiva, read-only no seu repositório
  • Declarar a camada que não foi verificada, em vez de omitir
  • Mascarar todo segredo: tipo, arquivo e linha, nunca o valor
  • Manter o artefato fora do repositório auditado, sempre

A calibragem também é um limite. O motor foi afinado em Supabase com TypeScript. Em outra stack as duas dimensões continuam valendo e os detectores mecânicos acham menos. Isso está escrito na primeira página do projeto, e não em uma nota de rodapé.

Sabendo o que ela faz e o que não faz, falta saber o que esperar de cada fase.
12 - A implementação

Cinco estágios, e o que esperar em cada um

Dia 1

Ter o mapa certo

  • Rodar a descoberta de caminhos
  • Preencher o perfil do app
  • Declarar os tipos de acesso, inclusive quem não paga

O que esperar. Vai parecer burocracia. É a fase que decide se o resto audita o lugar certo.

Dia 1, ainda

Ver o que é mecânico

  • Rodar o scanner
  • Ler o inventário medido
  • Conferir a prova de cobertura

O que esperar. Aparecem achados de graça, sem gastar um agente. Alguns vão ser óbvios e antigos.

Semana 1

Julgar com contexto

  • Calibrar no lote 01
  • Rodar os lotes em paralelo
  • Fazer dinheiro e matriz no próprio contexto

O que esperar. O volume assusta na primeira leitura. A maioria é médio e baixo, e é normal.

Semana 1, fim

Derrubar o que não se sustenta

  • Despachar os céticos
  • Exigir arquivo e linha em toda refutação
  • Conferir se o conserto está na branch implantada

O que esperar. Parte dos achados cai. É o sistema funcionando, não desperdício.

Contínuo

Fechar sem reabrir

  • Corrigir um achado por vez, com teste
  • Marcar aceito o que for decisão
  • Rodar de novo em marco de negócio

O que esperar. O baseline guarda o que já foi julgado. A segunda rodada não recomeça do zero.

Tudo isso cabe em uma imagem só.
13 - Em uma imagem

A ferramenta inteira, numa visão só

saas-security-audit read-only, prova o que afirma, declara o que não viu
Dimensão ANove famílias, cada uma com o que a refuta
Dimensão BQuatro lentes para o erro sem atacante
CoberturaProvada por asserção, não por promessa
CéticosRefutar exige arquivo e linha
PainelUm arquivo offline com o gate
LimitesDeclarados antes de alguém descobrir
14 - Perguntas

O que perguntam antes de rodar a primeira vez

Ela mexe no meu código?

Não. A auditoria é somente leitura e nunca altera, move ou apaga arquivo do seu app. O único arquivo que ela escreve lá é o perfil de configuração, que é o mapa do projeto. O relatório vai para fora do repositório, porque relatório de vulnerabilidade dentro do repo fica a um comando de distância de subir para o lugar errado.

O que ela audita, exatamente?

Duas dimensões. A primeira é segurança e abuso, em nove famílias: RLS e policies, funções e RPC, privilégio e segredo, rotas e webhook, injeção no front, storage, IA, plataforma e privacidade. A segunda é corretude de negócio, que pergunta se o sistema faz a coisa certa com quem age de boa-fé.

O que é o erro sem atacante?

É quando o controle está presente e funcionando, o checklist fecha verde, e mesmo assim o produto erra. Por exemplo: uma guarda nega acesso a quem tem direito porque foi escrita assumindo que ter direito é o mesmo que ter assinatura paga; ou uma consulta lê tabela protegida com o client errado, o RLS devolve zero linha sem erro, e o app lê isso como sinal de que está tudo certo.

Preciso pagar alguma coisa ou ter chave de API?

Não. A licença é Apache 2.0 e o motor é Python puro, sem nenhuma dependência externa. O que precisa existir na máquina é Python 3.11 ou mais novo. O custo que existe é o dos agentes de IA nas fases de julgamento, que roda na sua própria assinatura do Claude Code ou do Codex.

Funciona na minha stack?

O motor foi calibrado em Supabase, com Postgres, RLS e PostgREST, mais TypeScript. Em outra stack, como Rails, Django ou Go, as duas dimensões e os catálogos continuam valendo, mas os detectores mecânicos encontram menos, porque eles leem migrations SQL e código TypeScript. Isso está dito na primeira página do projeto de propósito.

Como ela garante que não deixou nada de fora?

Por aritmética, não por promessa. Um scanner determinístico inventaria o app e particiona o trabalho em lotes com lista explícita, e a partição é validada por asserção: a soma dos lotes tem que ser igual ao universo e a interseção entre eles tem que ser vazia. Se falhar, a rodada para com erro.

Como eu sei que os achados são verdadeiros?

Todo achado crítico ou alto vai para um agente cético diferente, com contexto limpo, cuja única tarefa é derrubar a acusação. Ele só pode refutar citando o bloqueador com arquivo e linha. A assimetria é deliberada: um achado exagerado custa dez minutos de leitura, um achado descartado por engano custa o incidente.

Ela substitui um pentest?

Não. É análise estática e passiva: não forja requisição, não sonda produção, não chama função direto. Passar no gate não é certificação, é um veredito informado sobre o que foi examinado, acompanhado da lista do que não foi verificado.

Próximo passo

Instala como skill, roda com um comando

Instala como skill do Claude Code e vira o comando /auditor. O motor é Python puro, sem dependência, então roda sozinho em qualquer lugar.

terminal
$ git clone https://github.com/thdamas/saas-security-audit
$ cp -r saas-security-audit ~/.claude/skills/auditor

# prova que funciona, contra o app de exemplo
$ python verificar.py
APROVADO: 19 detectores, cobertura e painel

# no Claude Code
> /auditor
ALQUIM_IA.LAB ALQUIM_IA.LAB Apache 2.0 · github.com/thdamas/saas-security-audit