@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.
- package/agents/hefesto-argos.md +93 -0
- package/agents/hefesto-athena.md +99 -0
- package/agents/hefesto-hermes.md +96 -0
- package/bin/install.js +122 -52
- package/hooks/hefesto-check-update.cjs +32 -11
- package/hooks/hefesto-statusline.cjs +8 -17
- package/hooks/hefesto-workflow.cjs +68 -0
- package/package.json +14 -4
- package/skills/hefesto-context/SKILL.md +67 -14
- package/skills/hefesto-debug/SKILL.md +54 -0
- package/skills/hefesto-design/SKILL.md +184 -0
- package/skills/hefesto-execute/SKILL.md +133 -0
- package/skills/hefesto-init/SKILL.md +105 -0
- package/skills/hefesto-init/references/api.md +116 -0
- package/skills/hefesto-init/references/cli.md +91 -0
- package/skills/hefesto-init/references/mobile.md +69 -0
- package/skills/hefesto-init/references/web.md +246 -0
- package/skills/hefesto-new-feature/SKILL.md +87 -0
- package/skills/hefesto-security/SKILL.md +89 -0
- package/skills/hefesto-security/references/boundaries-and-bypasses.md +152 -0
- package/skills/hefesto-security/references/secrets-detection.md +121 -0
- package/skills/hefesto-security/references/severity-and-judgment.md +176 -0
- package/skills/hefesto-simplify/SKILL.md +82 -0
- package/templates/TPL-CLAUDE.md +54 -0
- package/templates/TPL-CONFIG.json +19 -0
- package/templates/TPL-DESIGN.md +305 -0
- package/templates/{FEATURE.md → TPL-FEATURE.md} +13 -6
- package/templates/TPL-PROJECT.md +50 -0
- package/templates/TPL-RECON.md +60 -0
- package/templates/{RESEARCH.md → TPL-RESEARCH.md} +32 -35
- package/templates/TPL-SECURITY.md +42 -0
- package/templates/TPL-SIMPLIFY.md +40 -0
- package/templates/{STATE.md → TPL-STATE.md} +1 -7
- package/templates/TPL-VERDICT.md +34 -0
- package/agents/.gitkeep +0 -0
- package/agents/hefesto-researcher.md +0 -180
- package/commands/hefesto/init.md +0 -67
- package/commands/hefesto/new-feature.md +0 -50
- package/commands/hefesto/status.md +0 -46
- package/commands/hefesto/update.md +0 -31
- package/templates/PROJECT.md +0 -28
- 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 |
|