Security é tratado como "pessoa do time security cuida". Quando você é o time, você é a pessoa. E quando há time security, eles olham PRs reativamente, não escrevem o código com você. A maioria dos bugs reportados em bug bounty são triviais: SSRF em uploader, IDOR cruzando tenant, XSS em render de markdown, header de CORS errado, JWT alg: none, rate limit ausente em endpoint sensível.
Este módulo é AppSec aplicado: OWASP Top 10 (atual), Top 10 API, threat modeling (STRIDE), input validation, secrets, supply chain, AppSec pipeline (SAST/DAST/SCA), pentesting básico, secure SDLC. Você sai escrevendo código defensivo por default e revisando PRs com olho de atacante.
2. Teoria Hard
2.1 OWASP Top 10 (2021/2025), web
Ordenado por incidência:
Broken Access Control: IDOR, lack of authz check, force browse.
GDPR / LGPD: dados pessoais, direito ao esquecimento, consent, DPA.
PCI-DSS: cartão de crédito.
HIPAA: saúde nos EUA.
Compliance acelera com infra que já incorpora controls (audit log, encryption at rest, RBAC, logs imutáveis).
2.17.1 Privacy engineering, disciplina, não compliance checklist
GDPR/LGPD aparecem como compliance ("o que jurídico exige"). Privacy engineering é diferente: discipline de design que coloca privacy como restrição técnica primária, não atenuação posterior.
Princípios técnicos (não legais):
Privacy by design (Cavoukian, 2009): privacy é default, end-to-end, não trade-off.
Data minimization: colete só o que precisa. Cada campo PII tem custo (storage, breach impact, compliance overhead).
Purpose limitation: dado coletado pra X não migra pra Y sem consent novo.
Storage limitation: TTL em dado pessoal. Logs, eventos, sessões, todos com expiry.
Pseudonymization: substitui PII por token reversível (mantido em vault separado). Eventos podem usar tokens.
Anonymization: irreversível (k-anonymity, differential privacy). Aceitável pra analytics.
App principal e logs usam só tokens. Breach do app principal não vaza PII.
Vault tem audit log + access controls extra-rigorosos.
Field-level encryption:
DB tem campo email_encrypted (não email). Decryption só em código que precisa exibir.
Postgres pgcrypto ou app-level com KMS.
Trade-off: search direto fica impossível (use deterministic encryption ou hash separado pra search).
Right to be forgotten (LGPD/GDPR Art. 17):
Não é só DELETE FROM users. É:
Anonymize PII em event log e materialized data (analytics, replicas, backups).
Drop ou re-anonymize backup snapshots dentro de janela legal.
Notify processors downstream (third-party APIs onde dado foi compartilhado).
Técnica comum: soft anonymization mantém row pra integridade referencial mas substitui campos PII por hash determinístico (hash(salt + user_id)). Foreign keys continuam válidas, PII vai embora.
Differential privacy:
Adiciona noise calibrado a queries agregadas pra que individual record não seja inferível.
Apple usa em telemetry de iOS. Google em Chrome stats.
Lib: Google's differential-privacy, OpenDP.
Útil pra publish analytics sem violar privacy.
k-anonymity, l-diversity, t-closeness:
k-anonymity: cada row indistinguível de pelo menos k-1 outras em quasi-identifiers.
l-diversity: dentro de cada bucket k-anonymized, valores sensíveis variam.
t-closeness: distribution dentro de bucket próxima de geral.
Aplicação prática: ANTES de share dataset, valide que quasi-identifiers (CEP+idade+gênero) não permitem re-identification.
Data flow mapping:
Diagrama de DPIA (Data Protection Impact Assessment): pra cada PII field, mapeie de onde vem, onde fica, com quem é compartilhado, quanto tempo retém, base legal.
Atualize em cada feature nova. Privacy-by-design exige isso seja artifact vivo.
Patterns de minimização concretos:
Cookies: Strict-Transport-Security, SameSite=Strict, sem PII em cookie value.
IP logging: store hash diário do IP (rotaciona key) em vez de raw IP. Permite analytics, perde re-id de longo prazo.
Email: hash determinístico (SHA256(email + salt)) em logs de evento. Original só no user record.
Address: country/state em analytics, full address só onde shipping precisa.
Tools de privacy engineering:
Datafold, Bigeye: data lineage incluindo PII flow.
Privacy Dynamics, Skyflow: vaults de PII.
Transcend, OneTrust: automation de DSARs (Data Subject Access Requests).
Syft (federated) e OpenDP: differential privacy libs.
Antipatterns comuns:
"Vamos coletar X agora, decidir uso depois.", viola purpose limitation. Coleta sem necessidade é débito legal e técnico.
"Logamos full request pra debug", logs com PII = breach quando logs vazarem.
"Anonimizado = name = 'redacted'", quasi-identifiers (CEP+idade+gênero) podem re-id em datasets pequenos.
Documente em THREAT-MODEL.md: threat → mitigation → status.
Headers e CSP:
helmet em backend, defaults rigorosos.
CSP no front Next: source-list pra script-src, style-src; nonce-based pra inline.
Auth hardening:
Auditoria do 02-13: cobre todas threats (replay, IDOR, mass assignment, brute force, CSRF, JWT armadilhas)?
Adicione lockout adaptive (1 tentativa/s após 3 falhas; aumenta).
Login de novo device → email de notificação.
API authz:
1 endpoint vulnerável a IDOR detectado e fix (pode ser intencional pra demo, depois corrige).
Audit log de cada cross-tenant attempt.
Postgres RLS em orders como última linha.
Input/output:
Audit de cada endpoint pra mass assignment. Use DTOs strict() em Zod.
Sanitize markdown/HTML em qualquer campo que renderiza no front (DOMPurify server-side).
SSRF guard:
Endpoint que aceita URL pra scrap (mock), bloqueia IPs privados, localhost, allowlist domains.
Secrets:
gitleaks rodando em pre-commit + CI.
Demonstre que cleaning history se um secret leak (cuidado com rewrite, em projetos próprios ok).
Pipeline:
SAST: Semgrep com regras OWASP + custom (proibir eval, dangerouslySetInnerHTML sem allowlist, raw SQL).
SCA: Trivy/Snyk fs em PR.
DAST: OWASP ZAP baseline scan em staging nightly.
Image scan: Trivy image em build, gate em CRITICAL.
Pentest manual:
Use Burp Suite Community pra interceptar e tentar 5 ataques: IDOR, mass assignment, JWT manipulation, rate limit bypass, CSRF.
Documente em PENTEST.md cada tentativa, resultado, fix.
Compliance lite:
Implemente endpoint DELETE /me (right to be forgotten LGPD): anonimiza dados pessoais, mantém referências business (orders ficam mas customerName vira "Anônimo").
Audit log immutable: append-only table com checksum por linha.
Restrições
Sem deps com CVE CRITICAL aberta.
Sem secret hardcoded.
Sem endpoint sem authz check (mesmo que seja "qualquer logado").
Sem header Server exposto identificando versão.
Threshold
README documenta:
Threat model executivo (resumo da THREAT-MODEL.md).
Headers configurados + verify via SecurityHeaders.com (ou similar).
Resultado SAST/SCA/DAST com triagem (ignorar com motivo se for falso-positivo).