gava-appsec 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/README.md +56 -0
- package/assets/AGENTS-appsec.md +48 -0
- package/assets/cheatsheet.md +42 -0
- package/assets/references/auth-sessao-contas.md +158 -0
- package/assets/references/controle-acesso.md +83 -0
- package/assets/references/cripto-dados-pii.md +78 -0
- package/assets/references/deteccao-resposta.md +88 -0
- package/assets/references/hardening-headers-cloud.md +94 -0
- package/assets/references/injecoes.md +185 -0
- package/assets/references/rate-limiting.md +24 -0
- package/assets/references/supply-chain-devsecops.md +72 -0
- package/bin/cli.js +78 -0
- package/package.json +33 -0
package/README.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# gava-appsec
|
|
2
|
+
|
|
3
|
+
Base de **AppSec acionável** (desenvolvimento seguro) para escrever e revisar código
|
|
4
|
+
seguro por padrão — em qualquer IDE que leia `AGENTS.md` (Cursor, GitHub Copilot,
|
|
5
|
+
Windsurf, Codex, Gemini CLI, Zed, JetBrains).
|
|
6
|
+
|
|
7
|
+
Baseada em **OWASP Top 10:2025 · OWASP ASVS 5.0.0 · API Security Top 10:2023 · CWE Top 25 · NIST SSDF / 800-63B**.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx gava-appsec init
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Instala no seu projeto:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
AGENTS-appsec.md ← instruções de AppSec para o agente
|
|
17
|
+
appsec/cheatsheet.md ← "estou escrevendo X → cheque Y"
|
|
18
|
+
appsec/references/auth-sessao-contas.md ← login/Argon2id, sessão, OAuth/OIDC
|
|
19
|
+
appsec/references/injecoes.md ← SQLi, XSS, SSRF, upload, XXE...
|
|
20
|
+
appsec/references/controle-acesso.md ← IDOR/BOLA, multi-tenant, race conditions
|
|
21
|
+
appsec/references/rate-limiting.md ← limites por rota/IP/tenant, 429
|
|
22
|
+
appsec/references/cripto-dados-pii.md ← TLS, AES-GCM, segredos/vault, PII
|
|
23
|
+
appsec/references/hardening-headers-cloud.md ← headers, cookies, CORS, containers/cloud
|
|
24
|
+
appsec/references/supply-chain-devsecops.md ← SCA/SBOM, CI/CD seguro, SAST/DAST
|
|
25
|
+
appsec/references/deteccao-resposta.md ← logging, threat modeling (STRIDE), IR
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Opções: `npx gava-appsec init --force` (sobrescreve) · `npx gava-appsec help`.
|
|
29
|
+
|
|
30
|
+
## Como usar
|
|
31
|
+
|
|
32
|
+
Depois do `init`, peça ao agente da sua IDE, por exemplo:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
Escreva o endpoint de login desta API seguindo o AGENTS-appsec.md.
|
|
36
|
+
```
|
|
37
|
+
```
|
|
38
|
+
Revise este controller de acesso a banco contra o checklist do AGENTS-appsec.md.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
O agente cruza o código com o checklist do domínio relevante (auth, injeções, controle
|
|
42
|
+
de acesso, cripto, etc.) e aplica o "Faça / Não faça" antes de entregar.
|
|
43
|
+
|
|
44
|
+
## No Claude Code / Cowork
|
|
45
|
+
|
|
46
|
+
Esta mesma base também está disponível como skill nativa (`desenvolvimento-seguro`)
|
|
47
|
+
via marketplace:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
/plugin marketplace add VgavaBR123/gava-skills
|
|
51
|
+
/plugin install seguranca-plugin@gava-tools
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Licença
|
|
55
|
+
|
|
56
|
+
[CC-BY-SA-4.0](https://creativecommons.org/licenses/by-sa/4.0/) — mantido por **Gava**.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Desenvolvimento Seguro — AppSec acionável (instruções para o agente)
|
|
2
|
+
|
|
3
|
+
> Instale por `npx gava-appsec init`. Este arquivo é a porta de entrada; o detalhe de cada domínio está em `appsec/references/`.
|
|
4
|
+
> **Base normativa**: OWASP Top 10:2025 · OWASP ASVS 5.0.0 · OWASP API Security Top 10:2023 · CWE Top 25 (MITRE) · NIST SSDF (SP 800-218) · NIST 800-63B-4 | **Escopo**: web/API
|
|
5
|
+
|
|
6
|
+
## Como usar
|
|
7
|
+
|
|
8
|
+
- **Ao escrever ou revisar código** que toque login, autenticação, sessão/logout, rotas/endpoints de API, acesso a banco, upload, OAuth/OIDC, rate limiting, criptografia, headers HTTP, CORS, CI/CD, dependências, containers/cloud ou dados pessoais — **mesmo sem a palavra "segurança"** —, cruze o resultado com o checklist do domínio relevante antes de entregar.
|
|
9
|
+
- Consulte o arquivo de referência do domínio na tabela abaixo (leia só o relevante).
|
|
10
|
+
- Meta de baseline: **OWASP ASVS L2** para qualquer app com contas/dados de clientes + os controles do **API Security Top 10** para toda superfície HTTP/JSON.
|
|
11
|
+
|
|
12
|
+
## Princípio central (aplicar em toda decisão)
|
|
13
|
+
|
|
14
|
+
Para cada peça de código, responda três perguntas: **ameaça** ("o que o atacante consegue fazer?"), **defesa** ("qual controle reduz isso?") e **anti-padrão** ("qual implementação parece correta mas ainda falha?"). Autenticar **não** é autorizar. Entrada do cliente é **sempre** não confiável. Negue por padrão. Valide no servidor, nunca só na UI.
|
|
15
|
+
|
|
16
|
+
## Domínios (leia o arquivo relevante)
|
|
17
|
+
|
|
18
|
+
| Domínio | Cobre | Arquivo |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| Autenticação, sessão e contas | Rotas de API, login, logout, recuperação de conta, OAuth 2.0/OIDC, anti-bot | [appsec/references/auth-sessao-contas.md](appsec/references/auth-sessao-contas.md) |
|
|
21
|
+
| Injeções e validação de entrada | SQLi, NoSQL/Command/LDAP/XXE/SSTI, XSS, CSRF, SSRF, upload/path traversal, desserialização/mass assignment/open redirect | [appsec/references/injecoes.md](appsec/references/injecoes.md) |
|
|
22
|
+
| Controle de acesso e lógica | Broken Access Control, IDOR/BOLA, multi-tenant, race conditions/TOCTOU, falhas de lógica | [appsec/references/controle-acesso.md](appsec/references/controle-acesso.md) |
|
|
23
|
+
| Rate limiting e anti-abuso | Algoritmos, limites por rota/IP/tenant, 429, proteção de endpoints caros | [appsec/references/rate-limiting.md](appsec/references/rate-limiting.md) |
|
|
24
|
+
| Criptografia, segredos e dados | TLS/repouso, AES-GCM, gestão de segredos/vault, PII e conformidade (LGPD/GDPR/PCI) | [appsec/references/cripto-dados-pii.md](appsec/references/cripto-dados-pii.md) |
|
|
25
|
+
| Hardening, headers e cloud | Cabeçalhos de segurança, cookies, CORS, tratamento de erros/secure defaults, containers/Kubernetes/cloud | [appsec/references/hardening-headers-cloud.md](appsec/references/hardening-headers-cloud.md) |
|
|
26
|
+
| Supply chain e DevSecOps | Dependências/SCA/SBOM, CI/CD seguro, SAST/DAST/IAST, Secure SDLC/Shift Left | [appsec/references/supply-chain-devsecops.md](appsec/references/supply-chain-devsecops.md) |
|
|
27
|
+
| Detecção, resposta e referências | Logging/monitoramento, threat modeling (STRIDE), resposta a incidentes, referências-mestras | [appsec/references/deteccao-resposta.md](appsec/references/deteccao-resposta.md) |
|
|
28
|
+
|
|
29
|
+
Referência rápida por gatilho: [appsec/cheatsheet.md](appsec/cheatsheet.md).
|
|
30
|
+
|
|
31
|
+
## Checklist-mestre consolidado
|
|
32
|
+
|
|
33
|
+
| Domínio | Controles mínimos |
|
|
34
|
+
|---|---|
|
|
35
|
+
| Auth e contas | Argon2id, blocklist de senha, MFA em contas sensíveis, mensagens de erro neutras, rate limit em login/reset, step-up em ações sensíveis |
|
|
36
|
+
| Sessão | Cookie `Secure` + `HttpOnly` + `SameSite`, prefixo `__Host-`, regenerar ID no login e mudança de privilégio, invalidar no servidor no logout |
|
|
37
|
+
| APIs | Autenticação separada de autorização, checagem por objeto/propriedade/tenant, inventário de versões e endpoints, superfícies internas em rede privada |
|
|
38
|
+
| Input e injeções | Prepared statements em 100% das queries, DTOs/allowlist, validação por contexto, evitar shell, desabilitar XXE |
|
|
39
|
+
| Browser security | Anti-CSRF em mutações, CSP, `frame-ancestors`, HSTS, `nosniff`, SRI, CORS explícito por origem |
|
|
40
|
+
| Arquivos e SSRF | Storage fora do web root, nome aleatório, validar MIME+magic bytes, bloquear IP privado/metadata, allowlist de hosts |
|
|
41
|
+
| Multi-tenant e lógica | `tenant_id` em toda query/cache/fila, transação atômica para saldo/cupom/estoque, idempotency key, máquina de estados explícita |
|
|
42
|
+
| Cripto e segredos | TLS em toda credencial/sessão, AES-GCM ou ChaCha20-Poly1305, vault central + rotação, zero segredo em Git/imagem/log |
|
|
43
|
+
| Cloud e containers | Non-root, capabilities mínimas, Pod Security Standards, NetworkPolicy, S3 Block Public Access, IAM least privilege, IMDSv2 |
|
|
44
|
+
| Supply chain e SDLC | SBOM por build, SCA contínuo, CI/CD com menor privilégio, SAST+DAST, assinatura/proveniência, threat modeling, logging útil, playbook de IR |
|
|
45
|
+
|
|
46
|
+
## Escopo e limites
|
|
47
|
+
|
|
48
|
+
Cobre a maioria dos vetores de aplicação web/API com foco em consenso OWASP/NIST/MITRE/MDN. Não substitui pentest, revisão humana de segurança nem parecer jurídico. Verifique sempre a versão vigente das normas (OWASP/NIST/ANPD) antes de citar em produção.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Cheatsheet — Desenvolvimento Seguro (AppSec)
|
|
2
|
+
|
|
3
|
+
Referência rápida. Para o detalhe de cada domínio, veja `references/`.
|
|
4
|
+
|
|
5
|
+
## Regra de ouro (aplicar a todo código)
|
|
6
|
+
Autenticar ≠ autorizar · entrada do cliente é sempre não confiável · negue por padrão · valide no servidor, nunca só na UI · separe dados de código (parametrização/encoding/APIs nativas).
|
|
7
|
+
|
|
8
|
+
## Gatilhos → o que checar
|
|
9
|
+
| Estou escrevendo… | Checar primeiro | Referência |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| Login / senha | Argon2id, MFA, rate limit, mensagem neutra, sem enumeração | auth-sessao-contas |
|
|
12
|
+
| Logout / sessão | Invalidar server-side, `__Host-` cookie, regenerar ID | auth-sessao-contas |
|
|
13
|
+
| OAuth / "login com…" | Authorization Code + PKCE, validar state/nonce/redirect_uri | auth-sessao-contas |
|
|
14
|
+
| Rota / endpoint de API | AuthZ por objeto+tenant, não confiar em claim do cliente | auth-sessao-contas + controle-acesso |
|
|
15
|
+
| Query de banco | Prepared statement em 100%, allowlist p/ campo dinâmico | injecoes |
|
|
16
|
+
| Renderizar dado do usuário | Encoding por contexto, sem `innerHTML`, CSP | injecoes |
|
|
17
|
+
| Chamar shell/parser/template | API nativa, desabilitar XXE, nunca template com input | injecoes |
|
|
18
|
+
| Buscar URL no servidor | Allowlist de host, bloquear IP privado/metadata, IMDSv2 | injecoes |
|
|
19
|
+
| Upload de arquivo | MIME+magic bytes, fora do webroot, nome novo, normalizar path | injecoes |
|
|
20
|
+
| Busca por ID | Checar ownership/tenant (IDOR/BOLA) | controle-acesso |
|
|
21
|
+
| Saldo/cupom/estoque | Update atômico, idempotency, sem check-then-update | controle-acesso |
|
|
22
|
+
| Endpoint caro/sensível | Rate limit por rota+conta, 429+Retry-After | rate-limiting |
|
|
23
|
+
| Dado sensível/segredo | AES-GCM, vault, TLS, sem hardcode; minimizar PII | cripto-dados-pii |
|
|
24
|
+
| Config de resposta HTTP | HSTS, CSP, nosniff, cookies seguros, CORS explícito | hardening-headers-cloud |
|
|
25
|
+
| Dockerfile / deploy cloud | Non-root, least privilege, sem bucket público, sem segredo na imagem | hardening-headers-cloud |
|
|
26
|
+
| package.json / build | SBOM, SCA, SAST no PR, dependência mantida | supply-chain-devsecops |
|
|
27
|
+
| Qualquer feature nova | Threat modeling (STRIDE), logging útil, requisito de segurança | deteccao-resposta |
|
|
28
|
+
|
|
29
|
+
## Top anti-padrões que reprovam revisão
|
|
30
|
+
- "Se o JWT é válido, está autorizado."
|
|
31
|
+
- Concatenar input em SQL "só nesse caso".
|
|
32
|
+
- `innerHTML = userInput`.
|
|
33
|
+
- `Access-Control-Allow-Origin: *` com credenciais.
|
|
34
|
+
- Segredo no `.env` commitado / na imagem Docker.
|
|
35
|
+
- Logout que só apaga o cookie no frontend.
|
|
36
|
+
- Ler saldo e atualizar em duas operações separadas.
|
|
37
|
+
- Validar "parece uma URL" e seguir redirects livremente.
|
|
38
|
+
- Confiar em `tenant_id`/`role` vindo do corpo da requisição.
|
|
39
|
+
- SHA-256 "com sal" para senha (use Argon2id).
|
|
40
|
+
|
|
41
|
+
## Meta de baseline
|
|
42
|
+
OWASP **ASVS L2** para apps com contas/dados de clientes + **API Security Top 10** para toda superfície HTTP/JSON.
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Autenticação, sessão e contas
|
|
2
|
+
|
|
3
|
+
Domínios: rotas de API, login, logout, recuperação de conta, OAuth 2.0/OIDC, anti-bot.
|
|
4
|
+
Base: OWASP Authentication/Session/Forgot Password/OAuth2/MFA/Credential Stuffing Cheat Sheets, NIST SP 800-63B-4, RFC 9700, OpenID Connect Core, OWASP API Security Top 10:2023.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Proteção de rotas de API
|
|
9
|
+
|
|
10
|
+
**Risco.** O erro central não é "falta de login" — é **confundir autenticação com autorização**. Uma API pode autenticar o usuário e ainda expor dados de outro cliente por não verificar autorização no nível do objeto, propriedade ou função (BOLA/IDOR, Broken Function Level Authorization). Autentique no gateway, mas **autorize no serviço e no acesso a dados**, com verificação explícita por recurso (`tenant_id`, `owner_id`, escopo, papel). Versões antigas e endpoints de debug esquecidos viram superfície de ataque persistente.
|
|
11
|
+
|
|
12
|
+
**Faça**
|
|
13
|
+
- Exija autenticação em todas as rotas não públicas e autorize por recurso, não só por papel.
|
|
14
|
+
- Valide ownership e tenant em cada requisição, especialmente IDs vindos da URL.
|
|
15
|
+
- Trate tokens como credenciais: assinatura, `audience`, `issuer`, expiração curta, escopos mínimos.
|
|
16
|
+
- Separe endpoints externos, administrativos e internos com políticas distintas de authN/authZ; prefira rede privada/mTLS para internos.
|
|
17
|
+
|
|
18
|
+
**Não faça**
|
|
19
|
+
- Não confie em `user_id`, `tenant_id`, `role` ou `is_admin` vindos do cliente.
|
|
20
|
+
- Não suponha que "rota interna" está segura só por ficar atrás do frontend.
|
|
21
|
+
- Não reutilize API keys amplas para múltiplos serviços/tenants.
|
|
22
|
+
- Não deixe versões antigas de API expostas sem o mesmo enforcement de autorização.
|
|
23
|
+
|
|
24
|
+
**Fontes**
|
|
25
|
+
- Artigos: `https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html` · `https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html` · `https://owasp.org/www-project-api-security/`
|
|
26
|
+
- Normas/PDF: OWASP ASVS 5.0.0 (2025) `https://raw.githubusercontent.com/OWASP/ASVS/v5.0.0/5.0/OWASP_Application_Security_Verification_Standard_5.0.0_en.pdf` · NIST SP 800-63B-4 `https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-63B-4.pdf`
|
|
27
|
+
- Vídeos: *OWASP API Security Top 10 Course* (freeCodeCamp, 2023) `https://www.youtube.com/watch?v=YYe0FdfdgDU` · *Broken Object Level Authorization* (SmartBear, 2024) `https://www.youtube.com/watch?v=nIWBp_nvzq4`
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Login
|
|
32
|
+
|
|
33
|
+
**Risco.** Combinação de vazamento de senha, credential stuffing, enumeração de usuário, brute force e session hijacking. Para senhas, o padrão é **Argon2id** (mínimo OWASP: 19 MiB, t=2, p=1); alternativas: scrypt, ou bcrypt em legado com custo adequado. NIST 800-63B-4 exige hashing com sal, blocklist de senhas vazadas, desencoraja troca periódica arbitrária e eleva o mínimo para 15 caracteres quando a senha é fator único (8 dentro de MFA). MFA é a melhor defesa operacional; prefira fatores phishing-resistant quando o risco justificar.
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import argon2 from "argon2";
|
|
37
|
+
export const hashPassword = (pw: string) =>
|
|
38
|
+
argon2.hash(pw, { type: argon2.argon2id, memoryCost: 19 * 1024, timeCost: 2, parallelism: 1 });
|
|
39
|
+
export const verifyPassword = (hash: string, pw: string) => argon2.verify(hash, pw);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Faça**
|
|
43
|
+
- Use Argon2id como primeira escolha; se indisponível, bcrypt/scrypt com parâmetros atuais.
|
|
44
|
+
- Implemente MFA para contas admin e acessos sensíveis; step-up em eventos de risco.
|
|
45
|
+
- Adote rate limiting por IP e por conta, detecção de credential stuffing e mensagens de erro genéricas.
|
|
46
|
+
- Normalize credenciais e registre tentativas suspeitas sem vazar PII no log.
|
|
47
|
+
|
|
48
|
+
**Não faça**
|
|
49
|
+
- Não use SHA-1, SHA-256 "puro" nem criptografia reversível para armazenar senha.
|
|
50
|
+
- Não revele se o usuário existe por diferença de mensagem, tempo ou status HTTP.
|
|
51
|
+
- Não trate MFA por SMS como equivalente a fator resistente a phishing.
|
|
52
|
+
- Não permita tentativas ilimitadas por IP, conta, ASN ou fingerprint.
|
|
53
|
+
|
|
54
|
+
**Fontes**
|
|
55
|
+
- Artigos: `https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html` · `https://cheatsheetseries.owasp.org/cheatsheets/Credential_Stuffing_Prevention_Cheat_Sheet.html`
|
|
56
|
+
- Normas: OWASP Password Storage Cheat Sheet `https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html` · NIST SP 800-63B-4 `https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-63B-4.pdf`
|
|
57
|
+
- Vídeos: *MFA Bypass Attack Protection* (Auth0) `https://www.youtube.com/watch?v=1apSJFtkfFA` · *Account enumeration* (Troy Hunt, 2016) `https://www.youtube.com/watch?v=l4-istLShi4`
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Logout e gestão de sessão
|
|
62
|
+
|
|
63
|
+
**Risco.** O erro mais comum é tratar logout como evento só no cliente. Sessão segura exige invalidação **servidor + cliente**. IDs de sessão devem ter ≥64 bits de entropia e ser **regenerados em toda mudança de privilégio** (especialmente no login) para evitar session fixation. IDs não devem carregar significado de negócio nem PII.
|
|
64
|
+
|
|
65
|
+
```http
|
|
66
|
+
Set-Cookie: __Host-session=RANDOM_OPAQUE_ID; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=1800
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Faça**
|
|
70
|
+
- Invalide a sessão server-side e remova cookies com `HttpOnly`/`Secure`/`SameSite` coerentes.
|
|
71
|
+
- Para tokens, use expiração curta, refresh token rotation e revogação onde o risco exigir.
|
|
72
|
+
- Limpe storage do cliente; considere `Clear-Site-Data` no logout.
|
|
73
|
+
- Ofereça "logout de todos os dispositivos" para contas com sessão persistente.
|
|
74
|
+
|
|
75
|
+
**Não faça**
|
|
76
|
+
- Não trate logout apenas como remoção visual no frontend.
|
|
77
|
+
- Não mantenha refresh tokens antigos válidos após rotação ou troca de senha.
|
|
78
|
+
- Não reutilize session ID após autenticação/reautenticação.
|
|
79
|
+
- Não esqueça mobile, SPAs e sessões paralelas.
|
|
80
|
+
|
|
81
|
+
**Fontes**
|
|
82
|
+
- Artigos: `https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html` · Auth0 Refresh Token Rotation `https://auth0.com/docs/secure/tokens/refresh-tokens/refresh-token-rotation`
|
|
83
|
+
- Normas: RFC 8725 (JWT BCP) `https://datatracker.ietf.org/doc/html/rfc8725` · RFC 7519 (JWT) `https://datatracker.ietf.org/doc/html/rfc7519`
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Recuperação de conta
|
|
88
|
+
|
|
89
|
+
**Risco.** Fluxos de reset são alvo clássico de account takeover (ATO). Padrão seguro: token único, aleatório, curto, armazenado hasheado no servidor, enviado só a canal já verificado, invalidado no primeiro uso, seguido de notificação.
|
|
90
|
+
|
|
91
|
+
**Faça**
|
|
92
|
+
- Use token único, aleatório, curto e com expiração agressiva.
|
|
93
|
+
- Responda de forma uniforme para "usuário existe / não existe".
|
|
94
|
+
- Exija reautenticação forte para trocar e-mail, senha ou MFA.
|
|
95
|
+
- Faça rate limiting por conta, IP e canal de entrega; monitore abuso de reset.
|
|
96
|
+
|
|
97
|
+
**Não faça**
|
|
98
|
+
- Não use links previsíveis, PIN curto sem contexto de risco ou perguntas secretas fracas.
|
|
99
|
+
- Não altere senha no primeiro clique sem validações adicionais quando o risco for alto.
|
|
100
|
+
- Não envie senha temporária em texto puro por e-mail.
|
|
101
|
+
- Não permita que a recuperação ignore MFA sem controles compensatórios.
|
|
102
|
+
|
|
103
|
+
**Fontes**
|
|
104
|
+
- Artigos: `https://cheatsheetseries.owasp.org/cheatsheets/Forgot_Password_Cheat_Sheet.html`
|
|
105
|
+
- Normas: OWASP MFA Cheat Sheet `https://cheatsheetseries.owasp.org/cheatsheets/Multifactor_Authentication_Cheat_Sheet.html` · NIST SP 800-63B-4
|
|
106
|
+
- Vídeos: *Account enumeration* (Troy Hunt) `https://www.youtube.com/watch?v=l4-istLShi4`
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## OAuth 2.0 e OpenID Connect
|
|
111
|
+
|
|
112
|
+
**Risco.** OAuth é autorização; para login federado use **OIDC**. O padrão moderno é **Authorization Code + PKCE** para SPAs e apps públicos; o Implicit Grant está depreciado. O callback é parte do perímetro de autenticação, não "só um redirect".
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
if (callback.state !== session.oauthState) throw new Error("invalid_state");
|
|
116
|
+
if (callback.issuer !== expectedIssuer) throw new Error("invalid_issuer");
|
|
117
|
+
if (callback.redirectUri !== registeredRedirectUri) throw new Error("invalid_redirect_uri");
|
|
118
|
+
// trocar code por tokens no back-channel; nunca aceitar access token via front-channel
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Faça**
|
|
122
|
+
- Use Authorization Code + PKCE para SPAs e apps públicos.
|
|
123
|
+
- Valide `state`, `nonce`, `iss`, `aud`, `exp` e `redirect_uri` por comparação estrita.
|
|
124
|
+
- Dê escopos mínimos e rotacione refresh tokens quando aplicável.
|
|
125
|
+
- Use OIDC para autenticação e OAuth para autorização; não misture os papéis.
|
|
126
|
+
|
|
127
|
+
**Não faça**
|
|
128
|
+
- Não use implicit flow em projetos novos.
|
|
129
|
+
- Não aceite `redirect_uri` com curingas.
|
|
130
|
+
- Não trate ID token como access token.
|
|
131
|
+
- Não dê refresh token amplo e eterno a cliente público sem proteção adicional.
|
|
132
|
+
|
|
133
|
+
**Fontes**
|
|
134
|
+
- Artigos: OpenID Connect Core `https://openid.net/specs/openid-connect-core-1_0-final.html` · Auth0 Refresh Token Rotation `https://auth0.com/docs/secure/tokens/refresh-tokens/refresh-token-rotation`
|
|
135
|
+
- Normas: OWASP OAuth2 Cheat Sheet `https://cheatsheetseries.owasp.org/cheatsheets/OAuth2_Cheat_Sheet.html` · RFC 9700 (OAuth 2.0 Security BCP, 2025) `https://www.rfc-editor.org/info/rfc9700/`
|
|
136
|
+
- Vídeos: *What's New With OAuth and OIDC?* (OktaDev) `https://www.youtube.com/watch?v=g_aVPdwBTfw` · *OAuth 2.0 and OIDC in plain English* (OktaDev, 2018) `https://www.youtube.com/watch?v=996OiexHze0`
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Anti-bot e scraping
|
|
141
|
+
|
|
142
|
+
**Risco.** Bots fazem scraping, credential stuffing, ATO e criação em massa de contas. Defesa é em camadas; CAPTCHA é auxiliar, não estratégia principal.
|
|
143
|
+
|
|
144
|
+
**Faça**
|
|
145
|
+
- Combine CAPTCHA/score-based bot defense com rate limiting, reputação, device signals e comportamento.
|
|
146
|
+
- Proteja login, recuperação, cadastro, busca e exportações com políticas diferentes.
|
|
147
|
+
- Separe tráfego humano, API partner, crawler permitido e bot malicioso.
|
|
148
|
+
- Monitore account creation abuse, scraping e credential stuffing como fluxos distintos.
|
|
149
|
+
|
|
150
|
+
**Não faça**
|
|
151
|
+
- Não dependa só de CAPTCHA visível.
|
|
152
|
+
- Não use um único limite global para todo o site.
|
|
153
|
+
- Não confunda scraping benigno de SEO com abuso de negócio.
|
|
154
|
+
- Não permita automação massiva em endpoints "pouco importantes".
|
|
155
|
+
|
|
156
|
+
**Fontes**
|
|
157
|
+
- Artigos: OWASP Automated Threats `https://owasp.org/www-project-automated-threats-to-web-applications/` · Google Cloud sobre credential stuffing `https://cloud.google.com/blog/products/identity-security/how-google-cloud-can-help-stop-credential-stuffing-attacks`
|
|
158
|
+
- Vídeos: *Super Bot Fight Mode* (Cloudflare, 2025) `https://www.youtube.com/watch?v=QKRQQ7_cez4`
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Controle de acesso, multi-tenant e lógica
|
|
2
|
+
|
|
3
|
+
Domínios: Broken Access Control (IDOR/BOLA), isolamento multi-tenant, falhas de lógica e race conditions/TOCTOU.
|
|
4
|
+
Base: OWASP Authorization / IDOR Prevention / Business Logic / Multi-Tenant Cheat Sheets, PortSwigger Access Control e Race Conditions, OWASP Top 10:2025 A01.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Broken Access Control
|
|
9
|
+
|
|
10
|
+
**Risco.** Categoria mais crítica do OWASP Top 10. Anti-padrão recorrente: autorização só na UI ou no controller. A verificação precisa existir em **cada camada** — rota, serviço, acesso a dados, fila, relatório exportado, backoffice. Privilégio vertical → cheque papel/permissão; horizontal → cheque propriedade do recurso; APIs → cheque objeto e propriedade, não só endpoint.
|
|
11
|
+
|
|
12
|
+
**Faça**
|
|
13
|
+
- Reavalie autorização no backend em cada operação, objeto e função.
|
|
14
|
+
- Separe claramente autoridade horizontal e vertical.
|
|
15
|
+
- Use decisão centralizável de policy quando o domínio ficar complexo.
|
|
16
|
+
- Teste IDOR/BOLA em APIs, filas, jobs e endpoints legados.
|
|
17
|
+
|
|
18
|
+
**Não faça**
|
|
19
|
+
- Não confie em esconder link, botão ou menu.
|
|
20
|
+
- Não exponha IDs sequenciais sem checagem de ownership.
|
|
21
|
+
- Não propague privilégios pelo frontend.
|
|
22
|
+
- Não trate "admin endpoint" sem auditoria e reautenticação.
|
|
23
|
+
|
|
24
|
+
**Fontes**
|
|
25
|
+
- Artigos: Authorization `https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html` · PortSwigger Access Control `https://portswigger.net/web-security/access-control` · OWASP Top 10:2025 A01 `https://owasp.org/Top10/2025/A01_2025-Broken_Access_Control/`
|
|
26
|
+
- Normas: IDOR Prevention `https://cheatsheetseries.owasp.org/cheatsheets/Insecure_Direct_Object_Reference_Prevention_Cheat_Sheet.html` · OWASP ASVS 5.0.0
|
|
27
|
+
- Vídeos: *Broken Access Control - OWASP Top 10 2025* `https://www.youtube.com/watch?v=vUFVxoV5y_I`
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Isolamento multi-tenant
|
|
32
|
+
|
|
33
|
+
**Risco.** Multi-tenant inseguro quase sempre falha por lookup sem `tenant_id`, índice errado, cache compartilhado ou job assíncrono sem contexto de tenant. Identifique o tenant a partir do **contexto autenticado**, nunca de parâmetro confiado.
|
|
34
|
+
|
|
35
|
+
```sql
|
|
36
|
+
SELECT * FROM invoices WHERE tenant_id = $1 AND invoice_id = $2;
|
|
37
|
+
-- anti-padrão: consultar só por invoice_id e "confiar" na UI
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Faça**
|
|
41
|
+
- Torne tenant scoping obrigatório em query, cache key, fila, storage e logs.
|
|
42
|
+
- Use credenciais, quotas e rate limits por tenant.
|
|
43
|
+
- Identifique tenant no backend a partir de contexto autenticado.
|
|
44
|
+
- Separe quebras de confiança em camadas: aplicação, banco, cache, observabilidade.
|
|
45
|
+
|
|
46
|
+
**Não faça**
|
|
47
|
+
- Não compartilhe cache keys, buckets, índices ou API keys entre tenants.
|
|
48
|
+
- Não aceite `tenant_id` vindo do cliente sem revalidação.
|
|
49
|
+
- Não permita query administrativa sem switch explícito e auditado.
|
|
50
|
+
- Não misture criptografia, exportação ou backup sem contexto de tenant.
|
|
51
|
+
|
|
52
|
+
**Fontes**
|
|
53
|
+
- Artigos: Multi-Tenant Security `https://cheatsheetseries.owasp.org/cheatsheets/Multi_Tenant_Security_Cheat_Sheet.html` · Azure Multitenancy `https://learn.microsoft.com/en-us/azure/architecture/guide/multitenant/overview`
|
|
54
|
+
- Normas: NIST SP 800-207 Zero Trust `https://nvlpubs.nist.gov/nistpubs/specialpublications/NIST.SP.800-207.pdf` · OWASP ASVS 5.0.0
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Falhas de lógica e race conditions / TOCTOU
|
|
59
|
+
|
|
60
|
+
**Risco.** Cupons, saldo, cashback, estoque, checkout e reset são alvos favoritos: a lógica "funciona" em uso honesto, mas quebra em concorrência adversarial. Não faça "check, depois update" em etapas separadas quando o valor é sensível.
|
|
61
|
+
|
|
62
|
+
```sql
|
|
63
|
+
UPDATE gift_cards SET balance = balance - $1
|
|
64
|
+
WHERE id = $2 AND tenant_id = $3 AND balance >= $1;
|
|
65
|
+
-- depois valide rows_affected == 1
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Faça**
|
|
69
|
+
- Modele fluxos críticos como máquina de estados explícita no servidor.
|
|
70
|
+
- Recalcule preço, saldo, ownership e elegibilidade no backend.
|
|
71
|
+
- Faça operações críticas idempotentes e transacionais.
|
|
72
|
+
- Teste concorrência: cupom único, checkout, wallet, estoque, reset, referral, aprovação.
|
|
73
|
+
|
|
74
|
+
**Não faça**
|
|
75
|
+
- Não confie em sequência imposta pelo frontend.
|
|
76
|
+
- Não mantenha "valide depois persista" sem proteção contra TOCTOU.
|
|
77
|
+
- Não presuma que requests iguais não chegarão em paralelo.
|
|
78
|
+
- Não trate abuso de negócio como se fosse só problema de WAF.
|
|
79
|
+
|
|
80
|
+
**Fontes**
|
|
81
|
+
- Artigos: Business Logic Security `https://cheatsheetseries.owasp.org/cheatsheets/Business_Logic_Security_Cheat_Sheet.html` · PortSwigger Race Conditions `https://portswigger.net/web-security/race-conditions`
|
|
82
|
+
- Normas: PortSwigger *Smashing the state machine* (2023) `https://portswigger.net/research/smashing-the-state-machine`
|
|
83
|
+
- Vídeos: *Race Condition Labs* (PortSwigger) `https://www.youtube.com/watch?v=A3Ah_xWDxyU`
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Criptografia, segredos e dados
|
|
2
|
+
|
|
3
|
+
Domínios: criptografia em trânsito/repouso, gestão de segredos, PII e conformidade (LGPD/GDPR/PCI).
|
|
4
|
+
Base: OWASP Cryptographic Storage / TLS / Secrets Management / User Privacy Cheat Sheets, NIST SP 800-57 e 800-53, LGPD, GDPR, ANPD, PCI DSS.
|
|
5
|
+
Para PII a fundo, ver a skill `nist-pii-protection`; para cripto teórica, `boneh-shoup-applied-crypto`.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Criptografia (trânsito e repouso)
|
|
10
|
+
|
|
11
|
+
**Risco.** Erros comuns: reutilizar nonce, inventar esquema próprio, armazenar chave junto do dado, esquecer rotação/versão de chave, misturar "criptografia" com "hashing de senha". Para senha, **nunca** use cifra reversível — use hash adaptativo (Argon2id, ver `auth-sessao-contas.md`).
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
ciphertext = AES_GCM_Encrypt(key, nonce, plaintext, aad) // nonce único por operação
|
|
15
|
+
plaintext = AES_GCM_Decrypt(key, nonce, ciphertext, aad)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Faça**
|
|
19
|
+
- Force HTTPS/TLS moderno em trânsito e criptografia forte em repouso onde houver risco real.
|
|
20
|
+
- Use AES-GCM ou ChaCha20-Poly1305 para dados; hashing de senha é separado.
|
|
21
|
+
- Planeje gestão de chaves: geração, rotação, revogação, segregação por uso.
|
|
22
|
+
- Preserve integridade/autenticidade (AEAD), não só confidencialidade.
|
|
23
|
+
|
|
24
|
+
**Não faça**
|
|
25
|
+
- Não invente algoritmo ou protocolo próprio.
|
|
26
|
+
- Não reuse chave para usos incompatíveis nem nonce em AES-GCM.
|
|
27
|
+
- Não misture criptografia com hashing de senha.
|
|
28
|
+
- Não desabilite validação de certificado em cliente ou backend.
|
|
29
|
+
|
|
30
|
+
**Fontes**
|
|
31
|
+
- Artigos: Cryptographic Storage `https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html` · Transport Layer Security `https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Security_Cheat_Sheet.html`
|
|
32
|
+
- Normas: NIST SP 800-57 Part 1 Rev.5 (Key Management) `https://nvlpubs.nist.gov/nistpubs/specialpublications/nist.sp.800-57pt1r5.pdf`
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Gestão de segredos
|
|
37
|
+
|
|
38
|
+
**Risco.** Segredo em `.env` local é aceitável em dev; em produção o padrão é **cofre centralizado** com acesso fino, auditoria, rotação e, idealmente, credenciais dinâmicas/temporárias.
|
|
39
|
+
|
|
40
|
+
**Faça**
|
|
41
|
+
- Use secret manager/vault e credenciais temporárias sempre que possível.
|
|
42
|
+
- Rotacione segredos e saiba revogá-los rapidamente.
|
|
43
|
+
- Escaneie CI, Git e artefatos para detectar vazamentos.
|
|
44
|
+
- Restrinja leitura de segredo por workload e ambiente.
|
|
45
|
+
|
|
46
|
+
**Não faça**
|
|
47
|
+
- Não hardcode em código, imagem Docker, Terraform state, wiki ou log de pipeline.
|
|
48
|
+
- Não compartilhe o mesmo segredo entre múltiplos sistemas sem necessidade.
|
|
49
|
+
- Não deixe `.env` e backups expostos.
|
|
50
|
+
- Não logue segredo em plaintext.
|
|
51
|
+
|
|
52
|
+
**Fontes**
|
|
53
|
+
- Artigos: Secrets Management `https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html` · AWS IAM best practices `https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html`
|
|
54
|
+
- Normas: NIST SP 800-53 Rev.5 `https://nvlpubs.nist.gov/nistpubs/specialpublications/NIST.SP.800-53r5.pdf`
|
|
55
|
+
- Vídeos: *Inside the Breach: Secrets Exposed* (Troy Hunt, NDC 2025) `https://www.youtube.com/watch?v=Og-cFpwqjQ4`
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## PII e conformidade (LGPD / GDPR / PCI)
|
|
60
|
+
|
|
61
|
+
**Risco.** LGPD e GDPR exigem base legal, minimização, limitação de finalidade e governança. Para engenharia: coletar menos, reter menos, separar identificação de dados operacionais, mascarar em telas e logs, e projetar resposta a incidente com comunicação regulatória.
|
|
62
|
+
|
|
63
|
+
**Faça**
|
|
64
|
+
- Colete só o mínimo necessário e defina base legal/finalidade por fluxo.
|
|
65
|
+
- Classifique dados, retenção, descarte e masking desde o desenho da feature.
|
|
66
|
+
- Separe PII de dados operacionais quando reduzir blast radius.
|
|
67
|
+
- Tenha trilha clara para direitos do titular, incidente e vendor risk.
|
|
68
|
+
|
|
69
|
+
**Não faça**
|
|
70
|
+
- Não peça "campo útil no futuro".
|
|
71
|
+
- Não logue PII desnecessária, PAN completo ou documento bruto.
|
|
72
|
+
- Não retenha indefinidamente por conveniência.
|
|
73
|
+
- Não trate LGPD/GDPR/PCI como "só jurídico".
|
|
74
|
+
|
|
75
|
+
**Fontes**
|
|
76
|
+
- Artigos/leis: GDPR (EUR-Lex) `https://eur-lex.europa.eu/eli/reg/2016/679/oj/eng` · LGPD (Lei 13.709/2018) `https://www.planalto.gov.br/ccivil_03/_ato2015-2018/2018/lei/l13709.htm`
|
|
77
|
+
- Normas: ANPD Guia de segurança `https://www.gov.br/anpd/pt-br/documentos-e-publicacoes/guia-vf.pdf` · PCI SSC document library `https://www.pcisecuritystandards.org/document_library/` · OWASP User Privacy Protection `https://cheatsheetseries.owasp.org/cheatsheets/User_Privacy_Protection_Cheat_Sheet.html`
|
|
78
|
+
- Cruzamento: use `nist-pii-protection` (classificação por nível de impacto, de-identificação vs. anonimização) e `auditoria-lgpd-fiscal`.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Detecção, resposta e referências-mestras
|
|
2
|
+
|
|
3
|
+
Domínios: logging e monitoramento, threat modeling (STRIDE), resposta a incidentes, referências-mestras.
|
|
4
|
+
Base: OWASP Logging / Threat Modeling Cheat Sheets, CISA IR playbooks, NIST CSF 2.0 e SP 800-61r3, OWASP Top 10:2025, ASVS 5.0.0, MITRE CWE.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Logging e monitoramento
|
|
9
|
+
|
|
10
|
+
**Risco.** Log útil para segurança não é "debug com tudo". Um bom log permite correlação, detecção e auditoria; um log ruim vira novo vazamento.
|
|
11
|
+
|
|
12
|
+
**Faça**
|
|
13
|
+
- Logue autenticação, autorização, mudança de privilégio, reset, fraude e ações administrativas.
|
|
14
|
+
- Tenha correlação por request/trace/user/tenant sem gravar dado sensível bruto.
|
|
15
|
+
- Defina alertas para padrões suspeitos, não só dashboards.
|
|
16
|
+
- Garanta integridade, retenção e acesso restrito aos logs.
|
|
17
|
+
|
|
18
|
+
**Não faça**
|
|
19
|
+
- Não logue senha, token, cookie de sessão, segredo ou PII desnecessária.
|
|
20
|
+
- Não use formatos inconsistentes impossíveis de correlacionar.
|
|
21
|
+
- Não dependa só de logs de infraestrutura.
|
|
22
|
+
- Não ignore falhas de logging em fluxos críticos.
|
|
23
|
+
|
|
24
|
+
**Fontes**
|
|
25
|
+
- Artigos: OWASP Logging `https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html` · Logging Vocabulary `https://cheatsheetseries.owasp.org/cheatsheets/Logging_Vocabulary_Cheat_Sheet.html`
|
|
26
|
+
- Normas: OWASP ASVS 5.0.0 · NIST CSF 2.0 `https://nvlpubs.nist.gov/nistpubs/CSWP/NIST.CSWP.29.pdf`
|
|
27
|
+
- Vídeos: *Ensuring Data Integrity in Incident Response* (SANS DFIR, 2025) `https://www.youtube.com/watch?v=gylFpAzRIoc`
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Threat modeling
|
|
32
|
+
|
|
33
|
+
**Risco.** É a ferramenta mais barata para evitar classes inteiras de bug antes do código. STRIDE é a taxonomia prática para começar; o projeto OWASP aceita STRIDE, PASTA, LINDDUN, abuse cases e attack trees.
|
|
34
|
+
|
|
35
|
+
**Faça**
|
|
36
|
+
- Modele trust boundaries, ativos, entradas, dependências externas e abuse cases.
|
|
37
|
+
- Use STRIDE como linguagem mínima comum do time.
|
|
38
|
+
- Atualize o threat model quando arquitetura, auth, integrações ou dados mudarem.
|
|
39
|
+
- Transforme ameaças priorizadas em requisito, teste e observabilidade.
|
|
40
|
+
|
|
41
|
+
**Não faça**
|
|
42
|
+
- Não trate threat modeling como workshop isolado sem backlog.
|
|
43
|
+
- Não foque só em componentes técnicos e esqueça o fluxo de negócio.
|
|
44
|
+
- Não ignore terceiros, pipelines e supply chain.
|
|
45
|
+
- Não produza diagrama bonito sem decisão acionável.
|
|
46
|
+
|
|
47
|
+
**Fontes**
|
|
48
|
+
- Artigos: Threat Modeling `https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html` · Attack Surface Analysis `https://cheatsheetseries.owasp.org/cheatsheets/Attack_Surface_Analysis_Cheat_Sheet.html`
|
|
49
|
+
- Vídeos: *Threat Modeling 101: Star Wars Edition* (STRONGER, 2023) `https://www.youtube.com/watch?v=ND7JV-kD8IA`
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Resposta a incidentes
|
|
54
|
+
|
|
55
|
+
**Risco.** Para aplicações, o mínimo é: preparação, detecção, contenção, erradicação, recuperação e pós-incidente. NIST finalizou o SP 800-61r3 (2025), integrando IR à gestão de risco e ao CSF 2.0. Em produto: saber desabilitar credenciais, forçar logout, rotacionar segredos, preservar evidências e decidir comunicação regulatória.
|
|
56
|
+
|
|
57
|
+
**Faça**
|
|
58
|
+
- Defina playbook para triagem, contenção, erradicação, recuperação e lições aprendidas.
|
|
59
|
+
- Garanta contatos, owners, runbooks e critérios de severidade antes do incidente.
|
|
60
|
+
- Preserve evidências e timestamps desde a triagem.
|
|
61
|
+
- Pratique tabletop: vazamento de segredo, ATO, ransomware, bucket exposto, supply chain.
|
|
62
|
+
|
|
63
|
+
**Não faça**
|
|
64
|
+
- Não improvise comunicação e contenção no meio do incidente.
|
|
65
|
+
- Não apague evidências cedo demais.
|
|
66
|
+
- Não gire segredos ou resete ambiente sem entender o escopo mínimo.
|
|
67
|
+
- Não encerre incidente sem ações corretivas verificáveis.
|
|
68
|
+
|
|
69
|
+
**Fontes**
|
|
70
|
+
- Artigos: CISA IR & Vulnerability Response Playbooks `https://www.cisa.gov/resources-tools/resources/federal-government-cybersecurity-incident-and-vulnerability-response-playbooks`
|
|
71
|
+
- Normas: CISA Incident Response Plan Basics `https://www.cisa.gov/sites/default/files/publications/Incident-Response-Plan-Basics_508c.pdf` · NIST CSF 2.0 `https://nvlpubs.nist.gov/nistpubs/CSWP/NIST.CSWP.29.pdf`
|
|
72
|
+
- Vídeos: *Incident Response 9-Line* (SANS DFIR, 2021) `https://www.youtube.com/watch?v=hU3i-jEF9cU`
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Referências-mestras
|
|
77
|
+
|
|
78
|
+
As cinco fontes primárias para a Skill:
|
|
79
|
+
- **OWASP Top 10:2025** — visão de riscos / awareness `https://owasp.org/www-project-top-ten/`
|
|
80
|
+
- **OWASP ASVS 5.0.0** — requisitos verificáveis (baseline L2) `https://raw.githubusercontent.com/OWASP/ASVS/v5.0.0/5.0/OWASP_Application_Security_Verification_Standard_5.0.0_en.pdf`
|
|
81
|
+
- **OWASP API Security Top 10:2023** — superfícies de API `https://owasp.org/www-project-api-security/`
|
|
82
|
+
- **CWE Top 25 (MITRE)** — causas-raiz para regras de revisão/código `https://cwe.mitre.org/top25/`
|
|
83
|
+
- **NIST SSDF (SP 800-218)** — processo de desenvolvimento seguro `https://nvlpubs.nist.gov/nistpubs/specialpublications/nist.sp.800-218.pdf`
|
|
84
|
+
|
|
85
|
+
Complementares: NIST 800-63B-4 (auth), RFC 9700 (OAuth security), NIST SP 800-61r3 (resposta a incidentes), NIST CSF 2.0.
|
|
86
|
+
|
|
87
|
+
**Faça** — use OWASP Top 10 para awareness, ASVS para requisito verificável, WSTG para teste, CWE Top 25 para treinar classes-raiz, e mapeie seus checklists internos para essas referências.
|
|
88
|
+
**Não faça** — não use OWASP Top 10 como checklist único de engenharia, nem confunda documento de awareness com padrão verificável.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Hardening, cabeçalhos e cloud
|
|
2
|
+
|
|
3
|
+
Domínios: cabeçalhos de segurança e cookies, CORS, tratamento de erros e secure defaults, containers e cloud.
|
|
4
|
+
Base: MDN HTTP Headers, OWASP HTTP Headers / Clickjacking / Error Handling / Docker / Kubernetes Cheat Sheets, docs oficiais AWS/GCP/Azure e Kubernetes.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Cabeçalhos de segurança e cookies
|
|
9
|
+
|
|
10
|
+
**Risco.** Defaults inseguros de header/cookie abrem XSS, clickjacking, downgrade de HTTPS e vazamento de referer.
|
|
11
|
+
|
|
12
|
+
**Faça**
|
|
13
|
+
- Configure HSTS, CSP, `X-Content-Type-Options: nosniff`, `frame-ancestors`/`X-Frame-Options`, `Referrer-Policy`.
|
|
14
|
+
- Cookies com `HttpOnly`, `Secure`, `SameSite` e prefixo `__Host-`/`__Secure-` quando aplicável.
|
|
15
|
+
- Use SRI para assets de terceiros.
|
|
16
|
+
- Teste headers em staging e produção com ferramentas automatizadas.
|
|
17
|
+
|
|
18
|
+
**Não faça**
|
|
19
|
+
- Não aplique CSP permissiva com `unsafe-inline` por padrão.
|
|
20
|
+
- Não deixe cookie de sessão sem `Secure` e `HttpOnly`.
|
|
21
|
+
- Não misture cookies de auth com domínios amplos sem necessidade.
|
|
22
|
+
- Não presuma que um header "ligado" está bem configurado.
|
|
23
|
+
|
|
24
|
+
**Fontes**
|
|
25
|
+
- Artigos: MDN HSTS `https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security` · MDN X-Frame-Options `https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Frame-Options`
|
|
26
|
+
- Normas: HTTP Security Headers `https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html` · CSP `https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html` · Clickjacking `https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html`
|
|
27
|
+
- Vídeos: *Understanding CSP* (Troy Hunt, 2016) `https://www.youtube.com/watch?v=L97wtYCqfwM`
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## CORS
|
|
32
|
+
|
|
33
|
+
**Risco.** CORS não é autenticação nem autorização — é contrato entre navegador e servidor. `Access-Control-Allow-Origin: *` com `Allow-Credentials: true` é inválido (o próprio navegador rejeita).
|
|
34
|
+
|
|
35
|
+
**Faça**
|
|
36
|
+
- Permita apenas origens exatas necessárias que você controla.
|
|
37
|
+
- Controle `Access-Control-Allow-Credentials` com extremo cuidado.
|
|
38
|
+
- Restrinja métodos e headers aceitos; trate preflight, cache e ambientes de preview explicitamente.
|
|
39
|
+
- Se a API não é chamada por browser cross-origin, desative CORS.
|
|
40
|
+
|
|
41
|
+
**Não faça**
|
|
42
|
+
- Não use `*` com credenciais.
|
|
43
|
+
- Não reflita a origin automaticamente.
|
|
44
|
+
- Não confunda CORS com anti-CSRF.
|
|
45
|
+
- Não abra CORS em endpoints internos por conveniência de frontend.
|
|
46
|
+
|
|
47
|
+
**Fontes**
|
|
48
|
+
- Artigos: MDN CORS `https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS` · PortSwigger CORS `https://portswigger.net/web-security/cors`
|
|
49
|
+
- Normas: OWASP HTML5 Security `https://cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html`
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Tratamento de erros e secure defaults
|
|
54
|
+
|
|
55
|
+
**Risco.** Stacktrace, nome de tabela, mensagem de parser, header interno e path de arquivo viram inteligência para o atacante. O usuário recebe erro genérico; o detalhe fica em log interno.
|
|
56
|
+
|
|
57
|
+
**Faça**
|
|
58
|
+
- Mostre erro genérico ao cliente; detalhe técnico só em log controlado.
|
|
59
|
+
- Desative debug, stack trace público e banners de tecnologia em produção.
|
|
60
|
+
- Aplique least privilege por padrão em app, banco, cloud e CI/CD.
|
|
61
|
+
- Fail-safe: se a policy falhar, negue o acesso.
|
|
62
|
+
|
|
63
|
+
**Não faça**
|
|
64
|
+
- Não exponha stack trace, SQL, path local, segredo ou config interna.
|
|
65
|
+
- Não deixe feature sensível "aberta por padrão".
|
|
66
|
+
- Não use exceção como canal de negócio.
|
|
67
|
+
- Não confie em ambiente "interno" para relaxar defaults.
|
|
68
|
+
|
|
69
|
+
**Fontes**
|
|
70
|
+
- Artigos: Error Handling `https://cheatsheetseries.owasp.org/cheatsheets/Error_Handling_Cheat_Sheet.html` · Secure Product Design `https://cheatsheetseries.owasp.org/cheatsheets/Secure_Product_Design_Cheat_Sheet.html`
|
|
71
|
+
- Normas: CISA Secure by Design · NIST SP 800-207 Zero Trust `https://nvlpubs.nist.gov/nistpubs/specialpublications/NIST.SP.800-207.pdf`
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Containers e cloud
|
|
76
|
+
|
|
77
|
+
**Risco.** Padrão recorrente em incidentes: storage público, role coringa, ambiente de teste acessível, segredo na imagem. Toda role "temporária" vira permanente se ninguém a remover.
|
|
78
|
+
|
|
79
|
+
**Faça**
|
|
80
|
+
- Rode container como usuário não-root, imagem mínima e base confiável.
|
|
81
|
+
- Aplique Pod Security Standards / admission policies e NetworkPolicies no cluster.
|
|
82
|
+
- Use IAM least privilege, roles temporárias e bloqueio de bucket público (S3 Block Public Access).
|
|
83
|
+
- Escaneie imagens, IaC e runtime com política de build/release.
|
|
84
|
+
|
|
85
|
+
**Não faça**
|
|
86
|
+
- Não empacote segredo na imagem.
|
|
87
|
+
- Não rode com `privileged`, hostPath, root FS mutável ou capabilities desnecessárias.
|
|
88
|
+
- Não deixe S3/buckets/blobs públicos por padrão.
|
|
89
|
+
- Não trate namespace como isolamento suficiente para tudo.
|
|
90
|
+
|
|
91
|
+
**Fontes**
|
|
92
|
+
- Artigos: Docker Engine security `https://docs.docker.com/engine/security/` · AWS IAM best practices `https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html` · S3 Block Public Access `https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html`
|
|
93
|
+
- Normas: OWASP Docker Security `https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html` · OWASP Kubernetes Security `https://cheatsheetseries.owasp.org/cheatsheets/Kubernetes_Security_Cheat_Sheet.html` · K8s Pod Security Standards `https://kubernetes.io/docs/concepts/security/pod-security-standards/`
|
|
94
|
+
- Vídeos: *GKE security posture tools* (GoogleCloudTech) `https://www.youtube.com/watch?v=Qe1nS3H1nvo`
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# Injeções e validação de entrada
|
|
2
|
+
|
|
3
|
+
Domínios: SQL Injection, outras injeções (NoSQL/Command/LDAP/XXE/SSTI), XSS, CSRF, SSRF, upload/path traversal, desserialização/mass assignment/open redirect.
|
|
4
|
+
Base: OWASP Cheat Sheets (SQLi, XSS, CSRF, SSRF, File Upload, Deserialization, Mass Assignment), PortSwigger Web Security Academy, MDN.
|
|
5
|
+
|
|
6
|
+
Princípio: toda entrada controlada pelo atacante que chega intacta a um interpretador (SQL, shell, template, parser, browser) é uma injeção em potencial. A defesa correta quase nunca é "sanitizar" — é **separar dados de código** (parametrização, APIs nativas, encoding por contexto).
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## SQL Injection
|
|
11
|
+
|
|
12
|
+
**Risco.** Entrada do atacante chega intacta ao interpretador SQL. Defesa correta: **query parametrizada / prepared statement**. Escaping é último recurso. ORMs ajudam mas não blindam quando há concatenação, raw query sem bind, ou cláusulas dinâmicas (`ORDER BY`, `LIMIT`, nome de coluna).
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
const sql = "SELECT id, email FROM users WHERE email = $1";
|
|
16
|
+
const row = await db.query(sql, [email]); // nunca interpolar string
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Faça**
|
|
20
|
+
- Use prepared statements / parameter binding em 100% das queries dinâmicas.
|
|
21
|
+
- Restrinja privilégios do usuário do banco ao mínimo necessário.
|
|
22
|
+
- Use allowlist para colunas, ordenação e filtros dinâmicos.
|
|
23
|
+
- Teste também stored procedures, relatórios e endpoints de export.
|
|
24
|
+
|
|
25
|
+
**Não faça**
|
|
26
|
+
- Não concatene input em SQL, nem "só para admin".
|
|
27
|
+
- Não confie que o ORM elimina todo SQLi automaticamente.
|
|
28
|
+
- Não conceda `DROP`, `ALTER`, `SUPERUSER` ao app.
|
|
29
|
+
- Não esqueça busca, paginação, sort e filtros compostos.
|
|
30
|
+
|
|
31
|
+
**Fontes**
|
|
32
|
+
- Artigos: PortSwigger SQLi `https://portswigger.net/web-security/sql-injection` · OWASP Database Security `https://cheatsheetseries.owasp.org/cheatsheets/Database_Security_Cheat_Sheet.html`
|
|
33
|
+
- Normas: SQLi Prevention `https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html` · Query Parameterization `https://cheatsheetseries.owasp.org/cheatsheets/Query_Parameterization_Cheat_Sheet.html`
|
|
34
|
+
- Vídeos: *What is SQL injection?* (PortSwigger) `https://www.youtube.com/watch?v=wX6tszfgYp4` · *Running an SQL Injection Attack* (Computerphile, 2016) `https://www.youtube.com/watch?v=ciNHn38EyRc`
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Outras injeções (NoSQL, Command, LDAP, XXE, SSTI)
|
|
39
|
+
|
|
40
|
+
**Risco.** NoSQL injection surge com operadores (`$ne`, `$gt`) construídos com input. Command injection aparece ao chamar shell com dados externos — a defesa preferida é **não chamar shell** e usar API nativa. LDAP pede escape/bind seguro. XXE se mitiga desabilitando DTD e entidades externas. SSTI ocorre quando input vira template — impacto frequente é **RCE**.
|
|
41
|
+
|
|
42
|
+
**Faça**
|
|
43
|
+
- NoSQL: valide operadores permitidos e proíba execução raw/eval.
|
|
44
|
+
- Command: prefira APIs nativas a shell e separe argumentos do comando.
|
|
45
|
+
- LDAP: use APIs de escape / bind seguro.
|
|
46
|
+
- XXE: desabilite external entities, DTDs e resolução remota.
|
|
47
|
+
- SSTI: nunca concatene template com input do usuário.
|
|
48
|
+
|
|
49
|
+
**Não faça**
|
|
50
|
+
- Não exponha engine de template, shell, filtro LDAP ou parser XML a input livre.
|
|
51
|
+
- Não aceite JSON arbitrário com operadores especiais do banco.
|
|
52
|
+
- Não trate "sanitização caseira" como defesa suficiente.
|
|
53
|
+
- Não confunda SSTI com XSS: o impacto costuma ser RCE.
|
|
54
|
+
|
|
55
|
+
**Fontes**
|
|
56
|
+
- Artigos: PortSwigger NoSQL `https://portswigger.net/web-security/nosql-injection` · PortSwigger SSTI `https://portswigger.net/web-security/server-side-template-injection`
|
|
57
|
+
- Normas: NoSQL `https://cheatsheetseries.owasp.org/cheatsheets/NoSQL_Security_Cheat_Sheet.html` · OS Command Injection `https://cheatsheetseries.owasp.org/cheatsheets/OS_Command_Injection_Defense_Cheat_Sheet.html` · LDAP `https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html` · XXE `https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html`
|
|
58
|
+
- Vídeos: *Server-Side Template Injections Explained* (PwnFunction, 2021) `https://www.youtube.com/watch?v=SN6EVIG4c-0`
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## XSS
|
|
63
|
+
|
|
64
|
+
**Risco.** Família: refletido, armazenado e DOM-based. Defesa real combina **encoding por contexto de saída** (HTML, atributo, JS, URL, CSS), templates com auto-escape, proibição de sinks perigosos e CSP como defesa em profundidade (não como única barreira).
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
element.innerHTML = userBio; // ruim
|
|
68
|
+
element.textContent = userBio; // bom
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Faça**
|
|
72
|
+
- Escape por contexto de saída — HTML, atributo, JS, CSS e URL são contextos diferentes.
|
|
73
|
+
- Use templates seguros, `textContent`, `setAttribute` e DOMPurify quando necessário.
|
|
74
|
+
- Ative CSP estrita como defesa em profundidade.
|
|
75
|
+
- Trate DOM XSS e JS de terceiros como parte do mesmo problema.
|
|
76
|
+
|
|
77
|
+
**Não faça**
|
|
78
|
+
- Não use `innerHTML`, `document.write` ou sinks perigosos com input não confiável.
|
|
79
|
+
- Não tente resolver XSS só com blacklist de caracteres.
|
|
80
|
+
- Não aplique um único encoder para todos os contextos.
|
|
81
|
+
- Não considere CSP substituto do encoding correto.
|
|
82
|
+
|
|
83
|
+
**Fontes**
|
|
84
|
+
- Artigos: PortSwigger XSS `https://portswigger.net/web-security/cross-site-scripting` · MDN CSP `https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy`
|
|
85
|
+
- Normas: XSS Prevention `https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html` · DOM XSS `https://cheatsheetseries.owasp.org/cheatsheets/DOM_based_XSS_Prevention_Cheat_Sheet.html`
|
|
86
|
+
- Vídeos: *Cross-Site Scripting (XSS) Explained* (PwnFunction, 2020) `https://www.youtube.com/watch?v=EoaDgUgS6QA`
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## CSRF
|
|
91
|
+
|
|
92
|
+
**Risco.** O navegador do usuário autenticado envia uma ação que o servidor aceita como legítima. Use proteção nativa do framework; senão, token anti-CSRF + `SameSite`. **XSS derrota quase toda proteção CSRF** — os dois andam juntos.
|
|
93
|
+
|
|
94
|
+
**Faça**
|
|
95
|
+
- Use token anti-CSRF para ações state-changing quando a auth depende de cookies.
|
|
96
|
+
- Habilite `SameSite` corretamente e valide `Origin`/`Referer` quando fizer sentido.
|
|
97
|
+
- Use `Sec-Fetch-Site` / Fetch Metadata como filtro adicional.
|
|
98
|
+
- Prefira bearer token fora de cookies em cenários adequados.
|
|
99
|
+
|
|
100
|
+
**Não faça**
|
|
101
|
+
- Não assuma que CORS resolve CSRF.
|
|
102
|
+
- Não dispense token anti-CSRF só porque usa POST.
|
|
103
|
+
- Não ignore XSS.
|
|
104
|
+
- Não mantenha endpoints sensíveis aceitando GET.
|
|
105
|
+
|
|
106
|
+
**Fontes**
|
|
107
|
+
- Artigos: PortSwigger CSRF `https://portswigger.net/web-security/csrf`
|
|
108
|
+
- Normas: CSRF Prevention `https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html`
|
|
109
|
+
- Vídeos: *CSRF and the Same-Origin Policy* (LiveOverflow, 2017) `https://www.youtube.com/watch?v=KaEj_qZgiKY` · *Cross Site Request Forgery* (Computerphile, 2017) `https://www.youtube.com/watch?v=vRBihr41JTo`
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## SSRF
|
|
114
|
+
|
|
115
|
+
**Risco.** Permitir que o servidor fale com destinos que o cliente não alcança — metadata de cloud, redes internas, localhost. Em cloud, trate o metadata service como ativo crítico (AWS: IMDSv2, desabilite IMDSv1).
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
const allowedHosts = new Set(["api.parceiro.com", "cdn.parceiro.com"]);
|
|
119
|
+
const u = new URL(inputUrl);
|
|
120
|
+
if (u.protocol !== "https:") throw new Error("invalid_scheme");
|
|
121
|
+
if (!allowedHosts.has(u.hostname)) throw new Error("host_not_allowed");
|
|
122
|
+
// resolução DNS + bloqueio de IP privado/loopback no cliente HTTP/egress proxy
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Faça**
|
|
126
|
+
- Valide URL por parse robusto, allowlist de host, esquema e porta.
|
|
127
|
+
- Force resolução DNS segura e bloqueie IPs internos, loopback e ranges de metadata.
|
|
128
|
+
- Use proxy de saída controlado e isolamento de rede para serviços que fazem fetch.
|
|
129
|
+
- Em cloud, bloqueie IMDS legado e use IMDSv2 / equivalentes.
|
|
130
|
+
|
|
131
|
+
**Não faça**
|
|
132
|
+
- Não confie em regex simples para validar URL.
|
|
133
|
+
- Não siga redirects livremente para destinos não verificados.
|
|
134
|
+
- Não permita protocolos desnecessários (`file:`, `gopher:`, `dict:`, `ftp:`).
|
|
135
|
+
- Não exponha serviço de fetch genérico para usuários.
|
|
136
|
+
|
|
137
|
+
**Fontes**
|
|
138
|
+
- Artigos: PortSwigger SSRF `https://portswigger.net/web-security/ssrf` · AWS IMDSv2 `https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html`
|
|
139
|
+
- Normas: SSRF Prevention `https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html`
|
|
140
|
+
- Vídeos: *A New Era of SSRF - Orange Tsai* (2017) `https://www.youtube.com/watch?v=D1S-G8rJrEk`
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Upload de arquivos e Path Traversal
|
|
145
|
+
|
|
146
|
+
**Risco.** Upload inseguro vira RCE, malware ou leitura/escrita indevida. Traversal com `../` ainda é falha recorrente.
|
|
147
|
+
|
|
148
|
+
**Faça**
|
|
149
|
+
- Valide extensão, MIME, assinatura mágica, tamanho e quantidade.
|
|
150
|
+
- Armazene fora do webroot e sirva por identificador interno, não por path livre.
|
|
151
|
+
- Gere nome novo no servidor; aplique antivírus/CDR quando o caso exigir; reencode imagens.
|
|
152
|
+
- Normalize path e faça allowlist de diretórios-alvo.
|
|
153
|
+
|
|
154
|
+
**Não faça**
|
|
155
|
+
- Não confie no `Content-Type` enviado pelo cliente.
|
|
156
|
+
- Não permita upload executável em pasta servida diretamente.
|
|
157
|
+
- Não use nome/caminho original sem canonicalização.
|
|
158
|
+
- Não monte filepath com concatenação ingênua.
|
|
159
|
+
|
|
160
|
+
**Fontes**
|
|
161
|
+
- Artigos: PortSwigger Path Traversal `https://portswigger.net/web-security/file-path-traversal` · OWASP Path Traversal `https://owasp.org/www-community/attacks/Path_Traversal`
|
|
162
|
+
- Normas: File Upload `https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html` · Input Validation `https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html`
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Desserialização, Mass Assignment e Open Redirect
|
|
167
|
+
|
|
168
|
+
**Risco.** Desserialização de dados não confiáveis leva a RCE/corrupção. Mass assignment liga o payload inteiro ao objeto de domínio (over-posting de `role`, `balance`, `isAdmin`). Open redirect facilita phishing e abuso de fluxos OAuth.
|
|
169
|
+
|
|
170
|
+
**Faça**
|
|
171
|
+
- Prefira formatos simples e esquemas explícitos a desserializar objetos arbitrários.
|
|
172
|
+
- Use DTOs / allowlist de campos graváveis para impedir over-posting.
|
|
173
|
+
- Em redirects, use destinos pré-cadastrados ou IDs internos.
|
|
174
|
+
- Assine e valide integridade de dados serializados quando não houver alternativa.
|
|
175
|
+
|
|
176
|
+
**Não faça**
|
|
177
|
+
- Não desserialize dados não confiáveis para classes com gadget chains.
|
|
178
|
+
- Não faça bind automático do body inteiro ao modelo de domínio.
|
|
179
|
+
- Não aceite `next`, `returnUrl` ou `redirect` arbitrários.
|
|
180
|
+
- Não exponha propriedades sensíveis ao binder.
|
|
181
|
+
|
|
182
|
+
**Fontes**
|
|
183
|
+
- Artigos: PortSwigger Deserialization `https://portswigger.net/web-security/deserialization` · PortSwigger Open Redirect `https://portswigger.net/web-security/open-redirection`
|
|
184
|
+
- Normas: Deserialization `https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html` · Mass Assignment `https://cheatsheetseries.owasp.org/cheatsheets/Mass_Assignment_Cheat_Sheet.html` · Unvalidated Redirects `https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html`
|
|
185
|
+
- Vídeos: *Insecure Deserialization Attack Explained* (PwnFunction, 2020) `https://www.youtube.com/watch?v=jwzeJU_62IQ`
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Rate limiting e anti-abuso
|
|
2
|
+
|
|
3
|
+
Base: OWASP Denial of Service / Automated Threats Cheat Sheets, OWASP API Security Top 10:2023 (API4 Unrestricted Resource Consumption), CISA DDoS guidance.
|
|
4
|
+
|
|
5
|
+
**Risco.** Sem limites, endpoints caros e sensíveis (login, reset, signup, busca, export) viram vetor de brute force, credential stuffing, DoS de aplicação e abuso de custo. Limite em camadas: gateway/WAF, aplicação e, quando necessário, por operação de negócio. Algoritmos comuns: fixed window, sliding window, token bucket (bom para burst) e leaky bucket. Responda com **HTTP 429** e `Retry-After`. Abuso de baixo volume e sequências maliciosas podem escapar de um limitador puramente volumétrico.
|
|
6
|
+
|
|
7
|
+
**Faça**
|
|
8
|
+
- Tenha limites por IP, usuário, token, tenant e rota — não um só limite global.
|
|
9
|
+
- Use algoritmos adequados: token bucket para controle de burst, sliding window para fairness.
|
|
10
|
+
- Responda com headers de quota e comportamento previsível (`429` + `Retry-After`).
|
|
11
|
+
- Proteja `/login`, `/reset`, `/signup`, exportações, busca e endpoints caros separadamente.
|
|
12
|
+
|
|
13
|
+
**Não faça**
|
|
14
|
+
- Não aplique um limite único para toda a aplicação.
|
|
15
|
+
- Não dependa só de WAF para abuso de negócio.
|
|
16
|
+
- Não esqueça IPv6, proxies, NATs e autenticação compartilhada (chave por conta, não só por IP).
|
|
17
|
+
- Não deixe jobs caros e endpoints de busca sem custo controlado.
|
|
18
|
+
|
|
19
|
+
**Fontes**
|
|
20
|
+
- Artigos: OWASP Denial of Service `https://cheatsheetseries.owasp.org/cheatsheets/Denial_of_Service_Cheat_Sheet.html` · OWASP Automated Threats `https://owasp.org/www-project-automated-threats-to-web-applications/`
|
|
21
|
+
- Normas: OWASP API4:2023 Unrestricted Resource Consumption `https://owasp.org/API-Security/editions/2023/en/0xa4-unrestricted-resource-consumption/` · CISA DDoS `https://www.cisa.gov/sites/default/files/2024-03/understanding-and-responding-to-distributed-denial-of-service-attacks_508c.pdf`
|
|
22
|
+
- Vídeos: *OWASP API Top 10 2023 — Unrestricted Resource Consumption* (Equixly, 2024) `https://www.youtube.com/watch?v=47nt8UGBws0`
|
|
23
|
+
|
|
24
|
+
**Nota de implementação.** NGINX usa leaky bucket; Envoy oferece token bucket; WAFs modernos agregam por IP, header, cookie, método ou combinações. Combine rate limiting com detecção de automação (ver anti-bot em `auth-sessao-contas.md`).
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Cadeia de suprimentos e DevSecOps
|
|
2
|
+
|
|
3
|
+
Domínios: segurança de dependências (SCA/SBOM), CI/CD seguro, SAST/DAST/IAST, Secure SDLC / Shift Left.
|
|
4
|
+
Base: NIST SSDF (SP 800-218), CISA SBOM, CycloneDX, OWASP Dependency-Check/Track, OWASP CI/CD Security Cheat Sheet, GitHub code scanning.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Dependências, SCA e SBOM
|
|
9
|
+
|
|
10
|
+
**Risco.** "Atualizar biblioteca" deixou de ser suficiente. Baseline: inventário de componentes, SBOM por build, scan contínuo de CVEs, revisão de transitivas críticas e priorização por explorabilidade e exposição real — não só CVSS.
|
|
11
|
+
|
|
12
|
+
**Faça**
|
|
13
|
+
- Gere SBOM por build e associe ao artefato liberado.
|
|
14
|
+
- Rode SCA continuamente; trate CVEs por criticidade, reachability e exposição real.
|
|
15
|
+
- Prefira dependências mantidas, com política de atualização e provenance verificável.
|
|
16
|
+
- Tenha inventário de bibliotecas, imagens base e componentes transitivos.
|
|
17
|
+
|
|
18
|
+
**Não faça**
|
|
19
|
+
- Não atualize bibliotecas só quando "der problema".
|
|
20
|
+
- Não ignore dependência transitiva ou imagem base.
|
|
21
|
+
- Não trate SBOM como documento estático sem uso operacional.
|
|
22
|
+
- Não libere pacote sem trilha de proveniência e scan mínimo.
|
|
23
|
+
|
|
24
|
+
**Fontes**
|
|
25
|
+
- Artigos: CISA SBOM `https://www.cisa.gov/topics/information-communications-technology-supply-chain-security/sbom` · OWASP Dependency-Check `https://owasp.org/www-project-dependency-check/` · OWASP Dependency-Track `https://owasp.org/www-project-dependency-track/`
|
|
26
|
+
- Normas: CycloneDX `https://cyclonedx.org/` · CISA 2025 Minimum Elements for an SBOM `https://www.cisa.gov/resources-tools/resources/2025-minimum-elements-software-bill-materials-sbom` · NIST SP 800-218 (SSDF) `https://nvlpubs.nist.gov/nistpubs/specialpublications/nist.sp.800-218.pdf`
|
|
27
|
+
- Vídeos: *OWASP Dependency-Track & CycloneDX* `https://www.youtube.com/watch?v=QV2JcwHpjeQ`
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## CI/CD e SAST, DAST, IAST
|
|
32
|
+
|
|
33
|
+
**Risco.** O pipeline é ativo de alto valor: segredos, runners, plugins, permissões de merge, tokens de publicação e workflows. Menor privilégio e ciclo de vida das identidades do pipeline são fundamentais.
|
|
34
|
+
|
|
35
|
+
**Faça**
|
|
36
|
+
- Rode SAST em PR/merge, DAST em ambiente implantado, IAST onde a stack suportar; secrets scanning no PR.
|
|
37
|
+
- Proteja runners, segredos, artefatos e permissões do pipeline.
|
|
38
|
+
- Assine artefatos (proveniência) e exija checks de segurança mínimos para promover release.
|
|
39
|
+
- Separe pipelines por ambiente e minimize permissões de plugins e integrações.
|
|
40
|
+
|
|
41
|
+
**Não faça**
|
|
42
|
+
- Não use token de deploy amplo em todos os jobs.
|
|
43
|
+
- Não confie em um só tipo de scanner.
|
|
44
|
+
- Não deixe runners compartilhados com credenciais persistentes.
|
|
45
|
+
- Não permita bypass informal de controles críticos.
|
|
46
|
+
|
|
47
|
+
**Fontes**
|
|
48
|
+
- Artigos: GitHub code scanning `https://docs.github.com/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/about-code-scanning` · OWASP DevSecOps Guideline (DAST) `https://owasp.org/www-project-devsecops-guideline/latest/02b-Dynamic-Application-Security-Testing`
|
|
49
|
+
- Normas: OWASP CI/CD Security `https://cheatsheetseries.owasp.org/cheatsheets/CI_CD_Security_Cheat_Sheet.html` · NIST SP 800-218
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Secure SDLC e Shift Left
|
|
54
|
+
|
|
55
|
+
**Risco.** "Shift left" não é jogar tudo no desenvolvedor — é mover decisões de segurança para design, backlog, arquitetura, revisão de código e definição de pronto. Segurança só no pentest final é tarde demais.
|
|
56
|
+
|
|
57
|
+
**Faça**
|
|
58
|
+
- Faça threat modeling, requisitos de segurança e casos de abuso antes do código.
|
|
59
|
+
- Traduza ASVS / OWASP Top 10 em critérios de aceite e checklists de engenharia.
|
|
60
|
+
- Ensine segurança no fluxo: templates, linters, code review, guardrails.
|
|
61
|
+
- Mantenha backlog contínuo de dívida de segurança, não campanha eventual.
|
|
62
|
+
|
|
63
|
+
**Não faça**
|
|
64
|
+
- Não deixe segurança só para pentest final.
|
|
65
|
+
- Não dependa de "boas intenções" sem processo verificável.
|
|
66
|
+
- Não separe AppSec do time de produto ao ponto de virar gargalo.
|
|
67
|
+
- Não meça maturidade apenas por número de findings.
|
|
68
|
+
|
|
69
|
+
**Fontes**
|
|
70
|
+
- Artigos: NIST SSDF v1.1 `https://csrc.nist.gov/pubs/sp/800/218/final` · OWASP ASVS Project `https://owasp.org/www-project-application-security-verification-standard/`
|
|
71
|
+
- Normas: NIST SP 800-218 `https://nvlpubs.nist.gov/nistpubs/specialpublications/nist.sp.800-218.pdf` · OWASP SAMM (modelo de maturidade)
|
|
72
|
+
- Vídeos: *Get Ready for the OWASP ASVS 5.0* (Josh Grossman, DevSecNext 2025) `https://www.youtube.com/watch?v=2NIEHvGYcH4`
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* gava-appsec — instala a base de AppSec acionável (desenvolvimento seguro) no projeto atual.
|
|
6
|
+
* Uso:
|
|
7
|
+
* npx gava-appsec init # copia AGENTS-appsec.md + appsec/ para o cwd
|
|
8
|
+
* npx gava-appsec init --force # sobrescreve arquivos existentes
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
|
|
14
|
+
const PKG_ROOT = path.resolve(__dirname, '..');
|
|
15
|
+
const ASSETS = path.join(PKG_ROOT, 'assets');
|
|
16
|
+
const CWD = process.cwd();
|
|
17
|
+
|
|
18
|
+
const args = process.argv.slice(2);
|
|
19
|
+
const cmd = args[0];
|
|
20
|
+
const force = args.includes('--force') || args.includes('-f');
|
|
21
|
+
|
|
22
|
+
function log(msg) { process.stdout.write(msg + '\n'); }
|
|
23
|
+
|
|
24
|
+
function copyFile(src, destRel) {
|
|
25
|
+
const dest = path.join(CWD, destRel);
|
|
26
|
+
if (fs.existsSync(dest) && !force) {
|
|
27
|
+
log(' ⏭ já existe (use --force para sobrescrever): ' + destRel);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
31
|
+
fs.copyFileSync(src, dest);
|
|
32
|
+
log(' ✓ ' + destRel);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function init() {
|
|
36
|
+
log('\n🛡️ Instalando a base de AppSec (desenvolvimento seguro) neste projeto...\n');
|
|
37
|
+
|
|
38
|
+
// 1. Instruções de AppSec na raiz (lidas por Cursor, Copilot, Windsurf, Codex, etc.)
|
|
39
|
+
copyFile(path.join(ASSETS, 'AGENTS-appsec.md'), 'AGENTS-appsec.md');
|
|
40
|
+
|
|
41
|
+
// 2. Cheatsheet (referência rápida por gatilho)
|
|
42
|
+
copyFile(path.join(ASSETS, 'cheatsheet.md'), path.join('appsec', 'cheatsheet.md'));
|
|
43
|
+
|
|
44
|
+
// 3. Referências detalhadas por domínio em appsec/references/
|
|
45
|
+
const refDir = path.join(ASSETS, 'references');
|
|
46
|
+
if (fs.existsSync(refDir)) {
|
|
47
|
+
for (const f of fs.readdirSync(refDir)) {
|
|
48
|
+
copyFile(path.join(refDir, f), path.join('appsec', 'references', f));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
log('\n✅ Pronto!');
|
|
53
|
+
log(' • AGENTS-appsec.md na raiz — peça ao agente da sua IDE para segui-lo ao escrever/revisar código.');
|
|
54
|
+
log(' • appsec/cheatsheet.md — referência rápida "estou escrevendo X → cheque Y".');
|
|
55
|
+
log(' • appsec/references/ — detalhe por domínio (auth, injeções, controle de acesso, cripto, etc.).');
|
|
56
|
+
log('\n Dica: se a sua IDE só lê AGENTS.md, aponte o agente para o AGENTS-appsec.md');
|
|
57
|
+
log(' ou cole o conteúdo dele no seu AGENTS.md quando for codar/revisar segurança.\n');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function help() {
|
|
61
|
+
log('\ngava-appsec — base de AppSec acionável (OWASP Top 10:2025 / ASVS 5.0) para qualquer IDE\n');
|
|
62
|
+
log('Uso:');
|
|
63
|
+
log(' npx gava-appsec init Instala AGENTS-appsec.md + appsec/ no projeto');
|
|
64
|
+
log(' npx gava-appsec init --force Sobrescreve arquivos existentes');
|
|
65
|
+
log(' npx gava-appsec help Mostra esta ajuda\n');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
switch (cmd) {
|
|
69
|
+
case 'init': init(); break;
|
|
70
|
+
case 'help':
|
|
71
|
+
case '--help':
|
|
72
|
+
case '-h':
|
|
73
|
+
case undefined: help(); break;
|
|
74
|
+
default:
|
|
75
|
+
log('Comando desconhecido: ' + cmd);
|
|
76
|
+
help();
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gava-appsec",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Base de AppSec acionável (desenvolvimento seguro) para qualquer IDE — instala um AGENTS.md de segurança de aplicação e referências por domínio (login/Argon2id, IDOR/ownership, prepared statements, OWASP Top 10:2025/ASVS 5.0) no seu projeto.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"gava-appsec": "bin/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"assets/"
|
|
11
|
+
],
|
|
12
|
+
"keywords": [
|
|
13
|
+
"appsec",
|
|
14
|
+
"security",
|
|
15
|
+
"owasp",
|
|
16
|
+
"asvs",
|
|
17
|
+
"secure-coding",
|
|
18
|
+
"sql-injection",
|
|
19
|
+
"authentication",
|
|
20
|
+
"agents-md",
|
|
21
|
+
"ai-coding"
|
|
22
|
+
],
|
|
23
|
+
"author": "Gava",
|
|
24
|
+
"license": "CC-BY-SA-4.0",
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "git+https://github.com/VgavaBR123/gava-skills.git",
|
|
28
|
+
"directory": "packages/gava-appsec"
|
|
29
|
+
},
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=14"
|
|
32
|
+
}
|
|
33
|
+
}
|