Security Audit
Auditoria de segurança completa do projeto (6 categorias: isolamento de tenant, autorização client-side, IDOR, segredos hardcoded, XSS, armazenamento inseguro de token de auth), com relatório em PDF e issues prontas para o tracker. Invoque para validação final antes de release/PR develop→main, ou na FASE 0 do bootstrap quando o projeto já tem código (para surfacear falhas logo no início). Diferente da skill genérica `security-review` (revisão de diff) — esta é uma auditoria completa do código-fonte, mais pesada, com saída em PDF.
Auditoria de segurança do projeto
Revisa o código atrás de seis falhas de segurança. Antes de começar, detecte a stack do projeto (linguagem, framework, ORM/query builder, mecanismo de auth, frontend, arquivos de deploy como Docker/CI/Helm/Terraform) e adapte cada categoria ao equivalente dessa stack.
Quando rodar
- Validação final do projeto — antes de um PR
develop → main, ou quando o dev pedir uma auditoria de segurança pontual. - FASE 0 do bootstrap, em projeto EXISTENTE — depois do sumário curto da análise (ver
commands/bootstrap.md→ FASE 0), ofereça rodar esta auditoria completa antes de seguir a entrevista, para já indicar falhas de segurança logo no início em vez de descobri-las depois. É pesada — confirme com o dev antes de disparar, não rode sem perguntar.
As seis categorias
1. Banco sem tranca (isolamento de inquilino/dono)
Em Supabase é RLS ausente; em APIs próprias são queries de listagem/busca/agregação/relatório/exportação que não filtram pelo usuário autenticado ou pela organização/workspace/tenant ao qual ele pertence. Identifique primeiro qual é o mecanismo de isolamento do projeto (RLS, middleware de tenant, filtro manual por user_id, etc.) e aponte onde ele está ausente ou furado.
2. Permissão definida no navegador
Operações privilegiadas (admin, configurações, gestão de usuários, ações de escrita) em que o frontend esconde a UI por papel (isAdmin, canEdit, role...) mas o servidor não faz a verificação equivalente. Cruze cada gate de papel do frontend com o endpoint correspondente e confirme se o backend valida o privilégio em toda rota sensível.
3. IDOR
Rotas que buscam, alteram ou deletam um objeto por ID (path, query ou body) sem verificar se o objeto pertence ao usuário/tenant do chamador. Percorra sistematicamente todos os handlers de rota do backend, não amostras.
4. Chaves expostas (hardcode)
API keys, tokens, senhas, segredos de assinatura (JWT, webhooks), chaves privadas e credenciais padrão embutidos no código-fonte, configs, docker-compose, charts, CI, scripts e documentação. Atenção especial a defaults públicos que viram segredo real se não forem sobrescritos (ex.: ${VAR:-valor-default}) e à ausência de validação de startup que rejeite esses defaults. Verifique também o histórico git por segredos commitados e o bundle do frontend por chaves embutidas.
5. Inputs sem tratamento (XSS)
No frontend: innerHTML/dangerouslySetInnerHTML/equivalentes do framework (v-html, [innerHTML], dangerouslySet...), renderização de markdown/HTML sem sanitização, URLs controladas por usuário em href/src (javascript:), eval/new Function. No backend: input do usuário entrando em HTML de e-mails, templates ou respostas sem escape. Verifique se existe lib de sanitização no projeto e se ela é aplicada nos pontos encontrados.
6. Token de autenticação em armazenamento inseguro
Verifique onde o token/sessão de autenticação é persistido no cliente:
localStorage/sessionStoragesão acessíveis via JS e portanto vulneráveis a exfiltração via XSS.- Cookie sem
HttpOnlytem o mesmo problema (qualquer XSS lêdocument.cookie). - A preferência é sempre cookie
HttpOnly(+Secure+SameSite=LaxouStrict) definido pelo servidor, nunca legível por JS do lado cliente.
Verifique especificamente:
- Mecanismo de storage usado — grep por
localStorage.setItem/getItemde token,sessionStorage, ouSet-CookiesemHttpOnly. - Se o cookie tem os atributos
SecureeSameSitecorretos para o contexto (cross-site vs same-site). - Se existe proteção CSRF complementar quando cookies são usados para autenticação — necessária porque
HttpOnlyprotege contra leitura via XSS mas não contra CSRF: double-submit token, header customizado (X-Requested-With/token custom que CSRF não consegue setar cross-origin), ouSameSite=Strictquando o fluxo permite. - Se o refresh token (se houver) segue a mesma regra de armazenamento.
Aponte cada lugar que usa localStorage/sessionStorage para token como achado de severidade alta (exposição a XSS), e recomende migração para cookie HttpOnly com as boas práticas acima. Se o projeto não tem frontend com sessão de usuário (ex.: API pura machine-to-machine com API key), declare a categoria não aplicável em vez de forçar achado.
Regras da auditoria
- Reporte apenas achados verificados no código real. Nada de especulação. Para cada achado: caminho do arquivo, número(s) exato(s) da linha, trecho do código, por que é explorável e severidade (crítica/alta/média/baixa/informativa).
- Liste arquivo por arquivo, linha por linha.
- Registre também o que foi verificado e está correto (ex.: "router X valida posse em todos os handlers") — isso vira a seção de pontos fortes e prova a cobertura da auditoria.
- Quando a categoria não se aplicar à stack (ex.: projeto sem frontend), diga isso explicitamente em vez de forçar achados.
- Note condições de explorabilidade (feature flags, config insegura necessária, etc.).
Relatório em PDF
Depois da auditoria, gere um RELATÓRIO EM PDF, visualmente amigável, em pt-BR, salvo em docs/security-audit/relatorio-auditoria-seguranca.pdf, contendo:
a) Capa — título "Relatório de Auditoria de Segurança — <nome do projeto>", data, escopo auditado e nota metodológica (como cada categoria foi mapeada para a stack detectada).
b) Resumo executivo — total de achados por severidade, gráfico de rosca por severidade e gráfico de barras por categoria (7 categorias agora, incluindo a #6). Paleta: crítica #B91C1C, alta #EA580C, média #D97706, baixa #2563EB, ponto forte #059669.
c) Pontos fortes (o que está protegido, com evidência) e pontos fracos (os riscos centrais).
d) Tabela de achados detalhados por categoria — Severidade | Arquivo:linha | Descrição, com chip de severidade colorido.
e) Recomendações priorizadas (P1, P2, P3...).
f) Ao final do PDF, uma seção "ISSUES PARA O TRACKER" — este projeto usa Forgejo como tracker (nunca GitHub — ver workflow-issues; GitHub é só espelho de backup). Para cada achado acionável, o texto completo de uma issue em Markdown, pronto para copiar e colar ou publicar via API do Forgejo (workflow-issues), dentro de um bloco delimitado (--- ISSUE n --- / --- FIM ISSUE n ---). Cada issue deve conter:
- Título no formato
[Segurança] <descrição curta da falha> - Labels sugeridas:
security+ label de severidade (crie-as viaworkflow-issuesse ainda não existirem no Forgejo do projeto) - Descrição do problema e por que é explorável
- Evidência: arquivo:linha com trecho de código
- Impacto
- Sugestão de correção
- Critérios de aceite (checklist verificável — mesmo formato do template de issue em
workflow-issues)
Agrupe achados triviais relacionados numa issue única quando fizer sentido (ex.: vários defaults de segredo no mesmo tema), para não gerar spam de issues.
Geração do PDF — regras técnicas
- Não instale nada globalmente. Use ambiente isolado (venv Python com
reportlab+matplotlib, ou ferramenta equivalente da stack local; se houver navegador headless/wkhtmltopdf/pandocdisponível, HTML→PDF também vale). - Deixe o script gerador em
docs/security-audit/para regerar o relatório depois. - Verifique o PDF gerado: número de páginas, renderização dos gráficos e legibilidade das tabelas (rasterize as páginas se possível). Corrija defeitos visuais antes de entregar.
- Páginas A4, margens ~2cm, cabeçalho/rodapé com nome do relatório e número de página.
Entrega final
Ao terminar, entregue:
- O relatório em PDF.
- A lista de achados no chat (arquivo por arquivo, linha por linha).
- O caminho de todos os arquivos gerados.
Skills relacionadas
- Revisão leve de diff (não substitui esta auditoria completa): skill genérica
security-review - Publicar as issues geradas no Forgejo:
workflow-issues - FASE 0 de bootstrap em projeto existente: ver
commands/bootstrap.md - Métricas de qualidade que só podem melhorar:
ratchet-feature-list