@lugom.io/hefesto 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/agents/hefesto-argos.md +93 -0
  2. package/agents/hefesto-athena.md +99 -0
  3. package/agents/hefesto-hermes.md +96 -0
  4. package/bin/install.js +122 -52
  5. package/hooks/hefesto-check-update.cjs +32 -11
  6. package/hooks/hefesto-statusline.cjs +8 -17
  7. package/hooks/hefesto-workflow.cjs +68 -0
  8. package/package.json +14 -4
  9. package/skills/hefesto-context/SKILL.md +67 -14
  10. package/skills/hefesto-debug/SKILL.md +54 -0
  11. package/skills/hefesto-design/SKILL.md +184 -0
  12. package/skills/hefesto-execute/SKILL.md +133 -0
  13. package/skills/hefesto-init/SKILL.md +105 -0
  14. package/skills/hefesto-init/references/api.md +116 -0
  15. package/skills/hefesto-init/references/cli.md +91 -0
  16. package/skills/hefesto-init/references/mobile.md +69 -0
  17. package/skills/hefesto-init/references/web.md +246 -0
  18. package/skills/hefesto-new-feature/SKILL.md +87 -0
  19. package/skills/hefesto-security/SKILL.md +89 -0
  20. package/skills/hefesto-security/references/boundaries-and-bypasses.md +152 -0
  21. package/skills/hefesto-security/references/secrets-detection.md +121 -0
  22. package/skills/hefesto-security/references/severity-and-judgment.md +176 -0
  23. package/skills/hefesto-simplify/SKILL.md +82 -0
  24. package/templates/TPL-CLAUDE.md +54 -0
  25. package/templates/TPL-CONFIG.json +19 -0
  26. package/templates/TPL-DESIGN.md +305 -0
  27. package/templates/{FEATURE.md → TPL-FEATURE.md} +13 -6
  28. package/templates/TPL-PROJECT.md +50 -0
  29. package/templates/TPL-RECON.md +60 -0
  30. package/templates/{RESEARCH.md → TPL-RESEARCH.md} +32 -35
  31. package/templates/TPL-SECURITY.md +42 -0
  32. package/templates/TPL-SIMPLIFY.md +40 -0
  33. package/templates/{STATE.md → TPL-STATE.md} +1 -7
  34. package/templates/TPL-VERDICT.md +34 -0
  35. package/agents/.gitkeep +0 -0
  36. package/agents/hefesto-researcher.md +0 -180
  37. package/commands/hefesto/init.md +0 -67
  38. package/commands/hefesto/new-feature.md +0 -50
  39. package/commands/hefesto/status.md +0 -46
  40. package/commands/hefesto/update.md +0 -31
  41. package/templates/PROJECT.md +0 -28
  42. package/templates/ROADMAP.md +0 -23
@@ -0,0 +1,87 @@
1
+ ---
2
+ name: hefesto-new-feature
3
+ description: >
4
+ Cria o spec de uma nova feature no Hefesto. Coleta visão e requisitos, propõe abordagens,
5
+ decompõe em fases risk-first com rastreabilidade de requisitos.
6
+ Usar com: /hefesto-new-feature. Gera o documento FEAT-NNN — para implementar, usar
7
+ /hefesto-execute depois.
8
+ user-invocable: true
9
+ disable-model-invocation: true
10
+ ---
11
+
12
+ # Hefesto New Feature
13
+
14
+ Cria um novo documento de feature em `.hefesto/features/`. Guia o usuário desde a visão inicial até um spec completo com requisitos testáveis, fases de implementação ordenadas por risco, e rastreabilidade requisito→fase.
15
+
16
+ ## Pré-requisitos
17
+
18
+ Verificar se `.hefesto/` existe. Se não, sugerir `/hefesto-init`.
19
+
20
+ ## Workflow
21
+
22
+ ### Fase 0 — Explorar Contexto
23
+
24
+ Antes de perguntar, entender o terreno:
25
+
26
+ 1. Ler `PROJECT.md` (valor central, stack, receitas), `STATE.md` (feature ativa, bloqueios), `config.json` (próximo ID)
27
+ 2. Listar features existentes (frontmatter) — notar áreas cobertas, padrões de naming
28
+ 3. Se há features `draft`/`blocked`, mencionar — talvez retomar em vez de criar nova
29
+
30
+ Resumo: `Projeto: X | Stack: Y | Features: N (X done, Y active) | Próxima: FEAT-NNN`
31
+
32
+ ### Fase 1 — Entender a Feature
33
+
34
+ O objetivo é sair desta fase com entendimento completo do que construir. Conversar com o usuário até ter clareza — pode ser uma mensagem ou várias.
35
+
36
+ 1. **Título** — curto e descritivo, identifica a feature de relance
37
+ 2. **Problema** — qual dor ou necessidade motiva essa feature? Por que importa agora?
38
+ 3. **Visão** — o que entrega e como o usuário se beneficia quando estiver pronta
39
+ 4. **Fluxo do usuário** — passos concretos que o usuário percorre do início ao fim
40
+ 5. **Requisitos** — testáveis, com critério claro de pass/fail. Perguntar: "como sei que está funcionando?"
41
+ 6. **Fora do escopo** — o que explicitamente NÃO faz parte. Perguntar: "tem algo parecido que não devemos incluir?"
42
+ 7. **Riscos/incertezas** — integração externa, tech nova, performance, dependência de terceiros
43
+ 8. **Receitas** — Se o PROJECT.md contiver receitas, consultar e sugerir as relevantes (ex: feature com formulário → React Hook Form + Zod). Se não houver, pular
44
+
45
+ ### Fase 2 — Propor Abordagens
46
+
47
+ Propor 2-3 abordagens com trade-offs quando relevante. Recomendar uma com razão concreta. Pular se feature é simples/óbvia.
48
+
49
+ ### Fase 3 — Decompor em Fases
50
+
51
+ Seguir estrutura de `TPL-FEATURE.md` (seção "Implementação"). Para definições de status e ciclo de vida, ver `/hefesto-context`.
52
+
53
+ #### Risk-first ordering
54
+
55
+ Incerteza primeiro — invalidar premissas cedo. Se sem risco, ordenar por dependência natural.
56
+
57
+ #### Rastreabilidade REQ→Fase
58
+
59
+ Cada fase lista quais REQ-NN cobre. Verificar cobertura total — alertar se algum REQ ficou órfão.
60
+
61
+ Cada fase atômica (~30 min).
62
+
63
+ ### Fase 4 — Detectar Escopo Excessivo
64
+
65
+ Se > 5 fases ou > 10 requisitos: alertar e sugerir divisão concreta. Advisory, não mandatório.
66
+
67
+ ### Fase 5 — Self-Review
68
+
69
+ - [ ] Título claro (não genérico)
70
+ - [ ] Visão inclui O QUE e POR QUÊ
71
+ - [ ] Pelo menos 2 requisitos testáveis
72
+ - [ ] "Fora do Escopo" preenchido
73
+ - [ ] Fases atômicas com critérios de aceitação
74
+
75
+ Se falhar, pedir complemento. Se usuário disser "segue assim", respeitar.
76
+
77
+ ### Fase 6 — Criar Arquivo
78
+
79
+ 1. Gerar ID `FEAT-NNN` (counter + 1, zero-padded) e slug (lowercase, hifenizado, max 40 chars, sem acentos)
80
+ 2. Ler `.hefesto/templates/TPL-FEATURE.md` e criar `.hefesto/features/FEAT-NNN-slug.md` substituindo placeholders
81
+ 3. Atualizar `config.json` (feature.counter)
82
+ 4. Atualizar tabela de Features em `PROJECT.md`
83
+ 5. Atualizar `STATE.md` se for primeira feature ou nenhuma ativa
84
+ 6. Seletor: "Promover para `ready` ou continuar iterando?"
85
+ - Se **ready**: atualizar status e STATE.md
86
+ - Se **iterar**: coletar ajustes, aplicar, repetir até promoção ou encerramento
87
+ 7. Sugerir `/hefesto-execute` quando pronto
@@ -0,0 +1,89 @@
1
+ ---
2
+ name: hefesto-security
3
+ description: >
4
+ Revisão de segurança de código. Encontra vulnerabilidades e aplica fixes.
5
+ ATIVAR quando: "segurança", "security", "vulnerabilidade", "XSS", "injection", "OWASP",
6
+ "segredo exposto", "código seguro", "auditoria de segurança", "security review".
7
+ Também: padrões perigosos (eval, exec, deserialização), inputs não validados, falhas silenciosas.
8
+ user-invocable: true
9
+ disable-model-invocation: false
10
+ argument-hint: '[arquivos ou escopo opcional]'
11
+ ---
12
+
13
+ # Hefesto Security
14
+
15
+ Revisão de segurança que encontra vulnerabilidades reais e aplica fixes concretos. Zero tolerância a falhas silenciosas e padrões perigosos.
16
+
17
+ ## Princípios
18
+
19
+ 1. **Falhas silenciosas são inaceitáveis** — catch vazio é bug escondido; todo erro deve ser logado
20
+ 2. **Validar nas bordas** — inputs de usuário, APIs externas, env vars. Dados internos entre módulos não precisam
21
+ 3. **Sem segredos em código** — API keys, tokens, passwords em variáveis de ambiente, nunca hardcoded
22
+
23
+ ## Workflow
24
+
25
+ ### Fase 1 — Identificar escopo
26
+
27
+ 1. Se argumentos fornecidos → usar esses arquivos
28
+ 2. Senão, buscar feature ativa:
29
+ - Ler `.hefesto/STATE.md` → extrair arquivos modificados do frontmatter
30
+ - Se STATE.md não existir ou não tiver arquivos → `git diff --name-only` (staged + unstaged)
31
+ 3. Fallback → `git diff --name-only HEAD~1`
32
+ 4. Filtrar apenas código-fonte (excluir binários, lock files, build artifacts, código gerado)
33
+ 5. Excluir: diretórios de dependências, `dist/`, `build/`, `*.lock`, `*.lockb`, arquivos auto-gerados
34
+
35
+ ### Fase 2 — Análise de vulnerabilidades
36
+
37
+ Ler `references/severity-and-judgment.md` — usar critérios de severidade e regras de falso positivo ao longo de toda a análise. Ler `references/boundaries-and-bypasses.md` — verificar cada boundary type aplicável.
38
+
39
+ Para cada arquivo no escopo, analisar semanticamente estas categorias universais:
40
+
41
+ 1. **Code injection** — eval, exec, desserialização insegura, template injection, dynamic imports — em qualquer linguagem
42
+ 2. **Data injection** — SQL, NoSQL, LDAP, command injection, XSS — em qualquer framework ou ORM
43
+ 3. **Input validation gaps** — dados cruzando trust boundaries sem validação (consultar boundaries reference)
44
+ 4. **Auth & access control** — rotas sem auth, IDOR, CORS permissivo, CSRF, missing role checks
45
+ 5. **Insecure configuration** — debug mode em produção, headers de segurança ausentes, crypto fraco, default credentials
46
+ 6. **Data exposure** — dados sensíveis em logs, responses, URLs, query params, error messages
47
+ 7. **Resource exhaustion** — queries sem limit, missing pagination, missing timeouts, body size ilimitado
48
+
49
+ Para cada finding, avaliar contexto antes de reportar — consultar "When NOT to Report" na referencia de severidade.
50
+
51
+ ### Fase 3 — Falhas silenciosas
52
+
53
+ Ler `references/severity-and-judgment.md` seção "Silent Failures" — contém as 6 categorias universais, critérios de classificação e exceções.
54
+
55
+ 1. Encontrar todos os construtos de error handling na(s) linguagem(ns) detectada(s)
56
+ 2. Classificar cada um usando as categorias e critérios da referência
57
+ 3. Consultar "Quando silenciamento é aceitável" antes de reportar
58
+
59
+ ### Fase 4 — Segredos
60
+
61
+ Ler `references/secrets-detection.md`.
62
+
63
+ 1. Usar regex por provider e genericos para grep nos arquivos do escopo
64
+ 2. Consultar "Exceptions" em `references/severity-and-judgment.md` antes de reportar — nem todo match e secret real
65
+ 3. Verificar `.gitignore` conforme "Gitignore Audit"
66
+ 4. Verificar se `.env` esta committed no git
67
+
68
+ ### Fase 5 — Aplicar correções
69
+
70
+ 1. Para issues **🔴 critical**: aplicar fix automaticamente
71
+ - Gerar correção apropriada para a linguagem/framework detectado
72
+ - Erros engolidos → adicionar log + re-throw ou return adequado
73
+ - Code injection → substituir por alternativa segura
74
+ - Segredos hardcoded → mover para variável de ambiente
75
+ - Queries com interpolação → parameterized queries
76
+
77
+ 2. Para issues **⚠ warning**: aplicar fix se a correção é clara e segura. Para mudanças que alteram comportamento (ex: adicionar validação que pode rejeitar inputs), perguntar antes
78
+
79
+ 3. Rodar verification commands após fixes para garantir que nada quebrou
80
+
81
+ 4. Apresentar relatório no formato `TPL-SECURITY.md` — preencher todas as seções aplicáveis, omitir seções sem issues
82
+
83
+ ## Notas
84
+
85
+ - Se o projeto não tiver `.hefesto/`, o skill funciona com `git diff` e `CLAUDE.md`
86
+ - Não reportar vulnerabilidades em dependências (escopo de ferramentas de audit de dependências)
87
+ - Não reportar issues em código gerado
88
+ - Priorizar issues com impacto real sobre issues teóricas
89
+ - Se invocado pelo `/hefesto-execute`, o relatório é passado para o Argos junto com o resultado da feature
@@ -0,0 +1,152 @@
1
+ # Boundaries e Bypass Techniques
2
+
3
+ Trust boundaries universais e tecnicas de bypass de validacao. Independente de linguagem ou framework.
4
+
5
+ ## Quick Index
6
+
7
+ - **Tipos de boundary** → "Boundaries" (linha 12)
8
+ - **Tecnicas de bypass** → "Bypass Vectors" (linha 72)
9
+ - **Como detectar** → "How to Detect" (linha 117)
10
+
11
+ ---
12
+
13
+ ## Boundaries
14
+
15
+ ### Form inputs / JSON body
16
+
17
+ Dados submetidos via form HTML ou JSON body em POST/PUT/PATCH.
18
+
19
+ | O que verificar | Quando e problema |
20
+ | ------------------------------- | ---------------------------------------------------- |
21
+ | Usado diretamente em DB query | Sempre |
22
+ | Usado em operacao de filesystem | Sempre |
23
+ | Usado em redirect | Sempre |
24
+ | Tipos nao verificados | Se vem de JSON body (pode ser string, array, objeto) |
25
+ | Tamanho nao limitado | Se e string longa — DoS via payload gigante |
26
+
27
+ ### Query params / route params
28
+
29
+ Dados na URL: `/users/:id?sort=name&order=asc`.
30
+
31
+ | O que verificar | Quando e problema |
32
+ | ------------------------------------ | ----------------------------- |
33
+ | Param numerico sem validacao de tipo | Sempre |
34
+ | Param usado em regex | Sempre — ReDoS |
35
+ | Param usado em path de filesystem | Sempre — path traversal |
36
+ | Sort/order sem whitelist | Se usado em query — injection |
37
+ | Pagination sem limites | Se usado em LIMIT — DoS |
38
+
39
+ ### Respostas de API externa
40
+
41
+ Dados retornados por APIs de terceiros. Nao confiar mesmo em APIs "de confianca".
42
+
43
+ | O que verificar | Quando e problema |
44
+ | ------------------------------ | ------------------------------------- |
45
+ | Estrutura nao validada | Sempre — crash se estrutura mudou |
46
+ | Dados renderizados no frontend | Se contem HTML/JS — XSS stored |
47
+ | Status code nao verificado | Se assume sucesso |
48
+ | Dados usados em query | Sempre — injection via dados externos |
49
+
50
+ ### Headers / Cookies
51
+
52
+ | O que verificar | Quando e problema |
53
+ | --------------------------------------------- | -------------------------------------------------------- |
54
+ | Cookie usado sem validacao | Se contem dados de sessao (JWT sem verificar assinatura) |
55
+ | Header Host / X-Forwarded-For usado em logica | Sempre — spoofavel |
56
+ | Content-Type nao verificado | Se processa body condicionalmente |
57
+ | Referer / Origin para autenticacao | Sempre — spoofavel |
58
+
59
+ ### File uploads
60
+
61
+ | O que verificar | Quando e problema |
62
+ | -------------------------------------- | --------------------------------------- |
63
+ | Tipo nao validado (MIME + magic bytes) | Sempre |
64
+ | Tamanho nao limitado | Sempre — DoS |
65
+ | Nome do arquivo nao sanitizado | Se usado no filesystem — path traversal |
66
+ | Conteudo nao escaneado | Se armazenado/servido — polyglot files |
67
+ | Extensao dupla | Se whitelist por extensao — bypass |
68
+
69
+ ### Boundaries adicionais
70
+
71
+ | Boundary | O que verificar |
72
+ | -------------------------------- | ---------------------------------------------------------------------------------------- |
73
+ | **WebSocket messages** | Cada mensagem deve ser validada — nao ha "sessao validada" que garanta mensagens futuras |
74
+ | **GraphQL inputs** | Validar args de cada resolver. Queries aninhadas → DoS (query depth limiting) |
75
+ | **CLI args** | Validar antes de usar em shell commands, file operations, ou regex |
76
+ | **Variaveis de ambiente** | Validar formato esperado no startup (URL valida, numero, enum) |
77
+ | **IPC / inter-process** | Mensagens entre processos devem ser validadas — outro processo pode ser comprometido |
78
+ | **Database read-back** | Dados lidos do DB podem ter sido inseridos sem sanitizacao em versao anterior do codigo |
79
+ | **gRPC / RPC inputs** | Mesmo com tipos definidos no proto, validar ranges e constraints de negocio |
80
+ | **Event queue / message broker** | Mensagens de filas (Kafka, RabbitMQ, SQS) sao tao untrusted quanto HTTP requests |
81
+
82
+ ---
83
+
84
+ ## Bypass Vectors
85
+
86
+ Tecnicas que atacantes usam para contornar validacao fraca. Verificar se a validacao cobre estes cenarios:
87
+
88
+ ### Type coercion
89
+
90
+ Input esperado num tipo, recebido em outro. Comparacoes fracas (`==` vs `===`), conversoes implicitas, e frameworks que aceitam tipos variados para o mesmo parametro (string se 1 valor, array se multiplos).
91
+
92
+ **Deteccao**: comparacao fraca de input com valor fixo; ausencia de type check explicito.
93
+
94
+ ### Prototype / object pollution
95
+
96
+ Payload JSON com propriedades especiais (`__proto__`, `constructor.prototype`) que injetam propriedades em objetos. Afeta linguagens com heranca prototipal ou merge recursivo de objetos.
97
+
98
+ **Deteccao**: JSON parse seguido de merge/assign/spread sem filtrar keys especiais.
99
+
100
+ ### Unicode normalization
101
+
102
+ Caracteres Unicode que normalizam para equivalentes ASCII. Pode bypassar blacklists de filename, filtros de input, e comparacoes de string.
103
+
104
+ **Deteccao**: validacao de filename ou input sem normalizacao previa; filtros baseados em comparacao byte-a-byte.
105
+
106
+ ### Null byte injection
107
+
108
+ Null bytes (`\0`, `\x00`, `%00`) que truncam strings em sistemas baseados em C. Path traversal classico: `../../etc/passwd\0.png` — extensao ignorada.
109
+
110
+ **Deteccao**: input usado em operacoes de filesystem sem filtrar null bytes.
111
+
112
+ ### Array vs scalar ambiguity
113
+
114
+ Parametros que podem ser string ou array dependendo de quantos valores sao enviados. Frameworks web frequentemente tem este comportamento em query params.
115
+
116
+ **Deteccao**: input de query params usado sem type check ou conversao explicita.
117
+
118
+ ---
119
+
120
+ ## How to Detect
121
+
122
+ Heuristicas para identificar "input → operacao sem validacao no meio":
123
+
124
+ ### 1. Rastrear fluxo de dados
125
+
126
+ ```
127
+ input source → variavel local → operacao perigosa
128
+ ```
129
+
130
+ Se entre a origem (request, CLI arg, env var, file upload, API response) e o destino (DB query, filesystem op, shell command, redirect, HTML render) nao ha:
131
+
132
+ - Schema validation (qualquer biblioteca de validacao)
133
+ - Type assertion / type guard
134
+ - Sanitizacao explicita
135
+ - Parameterized query / prepared statement
136
+
137
+ → Reportar como ⚠ warning.
138
+
139
+ ### 2. Sinais de validacao ausente
140
+
141
+ - Input de request usado na mesma funcao que operacao perigosa sem chamada de validacao entre eles
142
+ - Dados de API externa usados diretamente sem schema validation
143
+ - Parametros de rota usados em query sem conversao de tipo
144
+
145
+ ### 3. Sinais de validacao presente
146
+
147
+ - Import de biblioteca de validacao no arquivo
148
+ - Schema definido antes do handler
149
+ - Middleware de validacao na rota
150
+ - Type guards explicitos
151
+ - Parameterized queries (placeholders em vez de interpolacao)
152
+ - Sanitization functions entre input e uso
@@ -0,0 +1,121 @@
1
+ # Detecção de Segredos
2
+
3
+ Regex por provider e padrões genéricos para detecção automatizada de segredos hardcoded. Inclui auditoria de `.gitignore`.
4
+
5
+ ## Quick Index
6
+
7
+ - **API keys por provider** → "API Keys by Provider" (linha 12)
8
+ - **Padrões genéricos** → "Generic Patterns" (linha 31)
9
+ - **.env commitado** → ".env Committed" (linha 47)
10
+ - **Auditoria de .gitignore** → "Gitignore Audit" (linha 55)
11
+ - **Regex para grep** → "Grep Patterns" (linha 87)
12
+
13
+ ---
14
+
15
+ ## API Keys by Provider
16
+
17
+ | Provider | Prefixo / Padrão | Regex |
18
+ | ------------- | ---------------------- | -------------------------------------------------------- |
19
+ | **AWS** | `AKIA` (access key) | `AKIA[0-9A-Z]{16}` |
20
+ | **AWS** | Secret key | `['"]\w{40}['"]` proximo de `aws_secret` ou `AWS_SECRET` |
21
+ | **GCP** | Service account JSON | `"type":\s*"service_account"` em `.json` |
22
+ | **GCP** | API key | `AIza[0-9A-Za-z_-]{35}` |
23
+ | **GitHub** | Personal access token | `ghp_[0-9a-zA-Z]{36}` |
24
+ | **GitHub** | OAuth token | `gho_[0-9a-zA-Z]{36}` |
25
+ | **GitHub** | App token | `ghs_[0-9a-zA-Z]{36}` |
26
+ | **Stripe** | Secret key (live) | `sk_live_[0-9a-zA-Z]{24,}` |
27
+ | **Stripe** | Publishable key (live) | `pk_live_[0-9a-zA-Z]{24,}` |
28
+ | **Slack** | Bot token | `xoxb-[0-9]{10,}-[0-9a-zA-Z]{24,}` |
29
+ | **Slack** | User token | `xoxp-[0-9]{10,}-[0-9a-zA-Z]{24,}` |
30
+ | **Anthropic** | API key | `sk-ant-[0-9a-zA-Z_-]{80,}` |
31
+ | **OpenAI** | API key | `sk-[0-9a-zA-Z]{48,}` |
32
+ | **Twilio** | Account SID | `AC[0-9a-f]{32}` |
33
+ | **SendGrid** | API key | `SG\.[0-9A-Za-z_-]{22}\.[0-9A-Za-z_-]{43}` |
34
+ | **Mailgun** | API key | `key-[0-9a-zA-Z]{32}` |
35
+
36
+ ---
37
+
38
+ ## Generic Patterns
39
+
40
+ | Tipo | O que procurar | Regex |
41
+ | ----------------------- | -------------------------------------------------- | ---------------------------------------------------------------------- |
42
+ | **API key generica** | Variavel com nome sugestivo atribuida a string | `(?:api_key\|apikey\|api_secret\|secret_key)\s*=\s*['"][^'"]{10,}['"]` |
43
+ | **Password hardcoded** | Variavel password/senha atribuida a string | `(?:password\|passwd\|pwd\|senha)\s*=\s*['"][^'"]+['"]` |
44
+ | **JWT hardcoded** | String que comeca com `eyJ` (base64 de `{"`) | `['"]eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]+['"]` |
45
+ | **URL com credentials** | `user:pass@` em URL | `https?://[^/\s:]+:[^/\s@]+@` |
46
+ | **Connection string** | MongoDB, Postgres, MySQL, Redis | `(?:mongodb\|postgres\|mysql\|redis)://[^/\s:]+:[^/\s@]+@` |
47
+ | **SSH private key** | Begin/end markers | `-----BEGIN (?:RSA\|DSA\|EC\|OPENSSH) PRIVATE KEY-----` |
48
+ | **Arquivo de key** | Extensoes de arquivo sensiveis | `\.(pem\|key\|p12\|pfx\|keystore)$` em arquivos tracked |
49
+ | **Base64 longa** | Strings base64 suspeitas (>40 chars) em atribuicao | `['"][A-Za-z0-9+/=]{40,}['"]` proximo de `key\|secret\|token` |
50
+
51
+ ---
52
+
53
+ ## .env Committed
54
+
55
+ Verificar se `.env` esta no git:
56
+
57
+ 1. `git ls-files .env .env.local .env.production .env.staging` — se retorna algo, esta commitado
58
+ 2. Verificar `.gitignore` — se `.env` nao esta listado, qualquer .env futuro sera commitado
59
+
60
+ ---
61
+
62
+ ## Gitignore Audit
63
+
64
+ Verificar que estes padroes estao em `.gitignore`:
65
+
66
+ ```
67
+ # Secrets e credentials
68
+ .env
69
+ .env.local
70
+ .env.production
71
+ .env.staging
72
+ *.pem
73
+ *.key
74
+ *.p12
75
+ *.pfx
76
+ *.keystore
77
+ credentials.json
78
+ service-account*.json
79
+ *-credentials.json
80
+
81
+ # IDE e sistema
82
+ .idea/
83
+ .vscode/settings.json
84
+ *.swp
85
+ .DS_Store
86
+
87
+ # Databases locais
88
+ *.sqlite
89
+ *.sqlite3
90
+ *.db
91
+ ```
92
+
93
+ Se `.gitignore` nao tem estes padroes, reportar como ⚠ warning.
94
+
95
+ Se algum destes arquivos ja esta tracked (`git ls-files`), reportar como 🔴 critical — precisam ser removidos do tracking com `git rm --cached`.
96
+
97
+ ---
98
+
99
+ ## Grep Patterns
100
+
101
+ Regex prontos para busca automatizada com `Grep` tool.
102
+
103
+ ```
104
+ AKIA[0-9A-Z]{16}
105
+ AIza[0-9A-Za-z_-]{35}
106
+ ghp_[0-9a-zA-Z]{36}
107
+ gho_[0-9a-zA-Z]{36}
108
+ sk_live_[0-9a-zA-Z]{24,}
109
+ pk_live_[0-9a-zA-Z]{24,}
110
+ xoxb-[0-9]{10,}
111
+ xoxp-[0-9]{10,}
112
+ sk-ant-[0-9a-zA-Z_-]{80,}
113
+ sk-[0-9a-zA-Z]{48,}
114
+ SG\.[0-9A-Za-z_-]{22}
115
+ -----BEGIN\s+(?:RSA|DSA|EC|OPENSSH)\s+PRIVATE\s+KEY
116
+ eyJ[A-Za-z0-9_-]{10,}\.eyJ
117
+ (?:password|passwd|pwd|senha)\s*=\s*['"][^'"]+['"]
118
+ (?:api_key|apikey|api_secret|secret_key)\s*=\s*['"][^'"]{10,}['"]
119
+ https?://[^/\s:]+:[^/\s@]+@
120
+ (?:mongodb|postgres|mysql|redis)://[^/\s:]+:[^/\s@]+@
121
+ ```
@@ -0,0 +1,176 @@
1
+ # Severidade e Julgamento
2
+
3
+ Critérios universais para classificar findings, evitar falsos positivos e calibrar decisões de fix.
4
+
5
+ ## Quick Index
6
+
7
+ - **Níveis de severidade** → "Severity Levels" (linha 14)
8
+ - **Falhas silenciosas** → "Silent Failures" (linha 50)
9
+ - **Quando NÃO reportar** → "When NOT to Report" (linha 108)
10
+ - **SEMPRE reportar** → "When to ALWAYS Report" (linha 156)
11
+ - **Migrations e schema** → "Migration and Schema Changes" (linha 172)
12
+
13
+ ---
14
+
15
+ ## Severity Levels
16
+
17
+ ### Critical — aplicar fix automaticamente
18
+
19
+ Condições (independente de linguagem):
20
+
21
+ - Erro completamente ignorado (catch vazio, erro descartado, bare except equivalente)
22
+ - Processo pode crashar ou ficar em estado inconsistente
23
+ - Panic/crash engolido sem log
24
+ - Segredos de produção hardcoded
25
+ - Input de usuário direto em code execution, shell commands, ou queries sem sanitização
26
+ - Desserialização de dados não confiáveis usando deserializadores inseguros
27
+ - Permissões excessivas de filesystem (world-writable)
28
+
29
+ ### Warning — aplicar fix se seguro, perguntar se altera comportamento
30
+
31
+ Condições:
32
+
33
+ - Erro logado mas não propagado (pode ser intencional)
34
+ - Valor default pode confundir chamador (retorna `[]` ou `null` em vez de erro)
35
+ - Catch/except muito amplo mas pelo menos trata o erro
36
+ - Validação ausente em trust boundary
37
+ - Configuração permissiva (CORS wildcard, debug mode, crypto fraco)
38
+ - Rate limiting ausente em endpoints sensíveis (login, reset, signup)
39
+ - Queries sem limit/pagination
40
+
41
+ ### Info — apenas reportar
42
+
43
+ Condições:
44
+
45
+ - Optional chaining ou null coalescing que pode ser intencional
46
+ - Error handling via context managers sem except explícito
47
+ - Configuração que pode ser intencional no contexto
48
+ - Minor code smells sem impacto de segurança direto
49
+
50
+ ---
51
+
52
+ ## Silent Failures
53
+
54
+ Falhas silenciosas são um dos riscos mais subestimados em segurança. Quando erros são engolidos, bugs ficam invisíveis em produção — incluindo bugs de segurança.
55
+
56
+ ### Categorias universais
57
+
58
+ Estas categorias se aplicam a **qualquer linguagem** — os mecanismos mudam (try/catch, error returns, Result types, defer, promises), mas os anti-padrões são os mesmos:
59
+
60
+ | Categoria | Definição | Severidade |
61
+ | --------------------------- | --------------------------------------------------------------------------------------------- | ---------- |
62
+ | **Swallowed errors** | Erro capturado/retornado e completamente ignorado. Sem log, sem propagação, sem feedback | critical |
63
+ | **Log-only handling** | Erro logado mas execução continua como se fosse sucesso. Chamador não sabe que houve falha | warning |
64
+ | **Deceptive defaults** | Handler retorna valor indistinguível de sucesso (lista vazia, null, zero) sem indicar erro | warning |
65
+ | **Overly broad catching** | Captura todos os erros quando só específicos eram esperados, escondendo bugs não relacionados | warning |
66
+ | **Abandoned intent** | Handler com TODO/FIXME — intenção de tratar nunca materializada | critical |
67
+ | **Panic/crash suppression** | Mecanismo de recovery (recover, catch-all, global handler) que suprime sem logar | critical |
68
+
69
+ ### O que procurar (por paradigma)
70
+
71
+ | Paradigma | Mecanismos a inspecionar |
72
+ | -------------------------------------------------------- | ------------------------------------------------------------------------------- |
73
+ | **Exception-based** (JS/TS, Python, Java, C#, Ruby, PHP) | try/catch/except blocks, promise .catch(), global exception handlers |
74
+ | **Error-return** (Go, Rust, C) | `_ = err`, `Result` não verificado, errno ignorado |
75
+ | **Event-based** (Node.js, browsers) | EventEmitters sem handler de 'error', unhandled rejection handlers |
76
+ | **Async** (qualquer) | Promises/Futures sem tratamento de rejeição, async sem try/catch em entrypoints |
77
+ | **Deferred cleanup** (Go defer, Python with, C++ RAII) | Erros em cleanup ignorados (ex: close() falha em escrita) |
78
+
79
+ ### Quando silenciamento é aceitável
80
+
81
+ Não reportar como critical se:
82
+
83
+ - **Cleanup code** — tentativa de deletar temp file em finally/defer. Falha não é crítica
84
+ - **Feature detection** — testar se recurso existe, catch para saber que não existe
85
+ - **Documentado** — catch com comentário explicando por que é intencional
86
+ - **Best-effort** — operações explicitamente opcionais (ex: enviar analytics, prefetch de cache)
87
+
88
+ ---
89
+
90
+ ## When NOT to Report
91
+
92
+ ### Test code
93
+
94
+ Arquivos em diretórios ou com padrões de teste:
95
+
96
+ - `*.test.*`, `*.spec.*`, `__tests__/`, `test_*`, `*_test.go`, `*_test.py`, `*_test.rs`, `*Test.java`, `*_test.rb`, `tests/`, `spec/`
97
+ - Exceção: se o teste usa input de PRODUÇÃO ou segredos reais → reportar
98
+
99
+ ### Static/literal input
100
+
101
+ - O valor perigoso é uma string fixa no código, não controlada pelo usuário
102
+ - `eval("2 + 2")` é code smell, não vulnerabilidade
103
+ - Pode ser mencionado como ℹ info, nunca como 🔴 critical
104
+
105
+ ### Sanitization present
106
+
107
+ - Existe validação/sanitização entre a fonte de input e a operação perigosa
108
+ - Procurar: schema validation, type guards, sanitization functions, parameterized queries, middleware de validação
109
+ - Se a sanitização está presente mas é insuficiente → reportar com contexto
110
+
111
+ ### Generated code
112
+
113
+ - Arquivos com header de auto-geração, em diretórios de código gerado (ex: `components/ui/`, migrations geradas por ORM, código de protobuf)
114
+ - Vulnerabilidades devem ser reportadas ao gerador, não corrigidas inline
115
+
116
+ ### Dependencies
117
+
118
+ - Código em diretórios de dependência (`node_modules/`, `vendor/`, `site-packages/`, `.cargo/`, `Pods/`, etc.)
119
+ - Escopo de ferramentas de auditoria de dependências, não desta revisão
120
+
121
+ ### Secret exceptions
122
+
123
+ | Situação | Por quê |
124
+ | -------------------------------------------------------------------- | ---------------------------------------------------------------------- |
125
+ | Valores em `.env.example` / `.env.template` | Placeholders, não segredos reais |
126
+ | Referências a variáveis de ambiente (leitura, não valor) | Estão usando env vars corretamente |
127
+ | Valores em arquivos de teste que são claramente mock | Fixtures intencionais |
128
+ | Keys de modo teste de providers (ex: `sk_test_`, `pk_test_`) | Keys de teste são públicas por design |
129
+ | Keys de exemplo em documentação | Exemplos pedagógicos |
130
+ | Variáveis marcadas como públicas pelo framework (ex: `NEXT_PUBLIC_`) | Intencionalmente públicas — mas verificar que não contêm secrets reais |
131
+
132
+ ---
133
+
134
+ ## When to ALWAYS Report
135
+
136
+ Independente de contexto — estas são sempre vulnerabilidades:
137
+
138
+ | Situação | Por quê |
139
+ | ---------------------------------------------------------------------------------- | --------------------------------------------- |
140
+ | Secrets de produção hardcoded (live API keys, SSH private keys, credentials reais) | Compromisso imediato se repositório é público |
141
+ | `.env` com valores reais commitado no git | Credenciais no git history permanentemente |
142
+ | Desserialização insegura de dados de rede | Arbitrary code execution |
143
+ | Shell execution com input de usuário não sanitizado | Command injection |
144
+ | Permissões excessivas em filesystem (world-writable, 777) | Qualquer processo pode modificar |
145
+ | Private key no repositório | Compromisso criptográfico |
146
+
147
+ ---
148
+
149
+ ## Migration and Schema Changes
150
+
151
+ ### Operações destrutivas
152
+
153
+ | Operação | Risco | Verificação necessária |
154
+ | ---------------------------- | ---------------------------------------- | ---------------------------------------------------------------- |
155
+ | DROP TABLE / DROP COLLECTION | Perda de dados irreversível | Backup confirmado. Dados migrados antes |
156
+ | DROP COLUMN / Remove field | Perda de dados da coluna | Confirmar que campo não é usado. Deploy em fases |
157
+ | TRUNCATE / Delete all | Deleta todos os registros | Nunca em migration de produção sem backup |
158
+ | ALTER TYPE / Change schema | Pode falhar com dados existentes | Testar com dados reais. Considerar nova coluna + migrar + dropar |
159
+ | RENAME | Quebra código que referencia nome antigo | Deploy em fases com período de compatibilidade |
160
+
161
+ ### Seed files
162
+
163
+ - Sem passwords reais em seeds
164
+ - Sem API keys de produção em dados de seed
165
+ - Sem PII real (usar dados fake)
166
+ - Guard de ambiente: seeds não devem ser executáveis em produção
167
+
168
+ ### Permissões
169
+
170
+ | Contexto | Princípio |
171
+ | ------------------------ | ----------------------------------------------------------- |
172
+ | User da aplicação | Apenas CRUD nas tabelas da app. Sem CREATE/DROP/ALTER/GRANT |
173
+ | User de migration | Pode ter DDL. Não deve ser usado pelo app em runtime |
174
+ | Connection string do app | Apontar para user da aplicação, não admin/root |
175
+ | Backups | SELECT apenas |
176
+ | Row-level security | Habilitar em tabelas multi-tenant onde suportado |