Segurança de Software de Verdade: threat model ao SBOM
- ⬜🧪 Testes Profissionais: pirâmide, propriedades, contrato e fuzz(Engenharia de Software Moderna)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Segurança não é dept de outra pessoa. É propriedade do código. Em 2026, com agents gerando muito código e stack distribuída por 10 vendors, atacar vira mais barato que defender. A boa notícia: as ferramentas para shift-left (prevenir em design/code) e shift-right (detectar em runtime) amadureceram. Este módulo monta o mínimo que uma pessoa sênior deve operar — sem viramentação de cerimônia.
O modelo mental (Defense in Depth)
Threat Modeling com STRIDE
Em reunião de design (30 min), pegue cada fluxo novo e passe a régua STRIDE. Para cada componente do diagrama, pergunte:
| Sigla | Ameaça | Exemplo | Mitigação típica |
|---|---|---|---|
| S | Spoofing | Atacante se passa por usuário ou serviço | Auth forte (MFA, mTLS), identidade verificada |
| T | Tampering | Dados ou binário alterados em trânsito ou repouso | HTTPS, HMAC, assinatura, integridade |
| R | Repudiation | Usuário nega ter feito uma ação | Audit log imutável, assinatura de ação |
| I | Information disclosure | Vazamento de dado sensível | Criptografia, mascaramento, mínimo privilégio |
| D | Denial of service | Indisponibilidade por ataque | Rate limit, WAF, autoscaling, circuit breaker |
| E | Elevation of privilege | Baixo → alto privilégio | RBAC rigoroso, sandbox, patches |
OWASP Top 10 (2021, ainda vigente) em PT-BR
Secrets: onde eles morram
# Pre-commit hook: trufflehog ou gitleaks bloqueia secret antes do commit
# .pre-commit-config.yaml
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.0
hooks:
- id: gitleaks
# CI
- name: Scan for secrets
uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Em runtime (Node + AWS)
import { SecretsManagerClient, GetSecretValueCommand } from '@aws-sdk/client-secrets-manager';
const client = new SecretsManagerClient({ region: 'us-east-1' });
const secret = await client.send(new GetSecretValueCommand({ SecretId: 'prod/db/password' }));
// nunca console.log(secret), nunca persiste em disco.env no repo. (2) console.log(process.env) em dev deixado em prod. (3) Secret como variável de build que fica no histórico do Docker (--build-arg com senha → use --secret). (4) Token de service account com TTL infinito.Supply Chain: SBOM, SLSA, Sigstore
# Gerar SBOM
syft packages dir:. -o cyclonedx-json > sbom.json
# Scan de vuln contra SBOM
grype sbom:./sbom.json --fail-on high
# Assinar imagem Docker
cosign sign --key cosign.key ghcr.io/empresa/app:${SHA}
# Verificar na hora do deploy (policy de admission)
cosign verify --key cosign.pub ghcr.io/empresa/app:${SHA}SAST, DAST, IAST, SCA
| Tipo | Onde | O que pega | Ferramenta |
|---|---|---|---|
| SAST | Código (static) | SQLi, XSS, command injection via taint analysis | CodeQL, Semgrep, SonarQube |
| DAST | App rodando (black-box) | Vulns expostas via HTTP: XSS, injection, config | ZAP, Burp Suite, Nuclei |
| IAST | App rodando (instrumentado) | Vulns reais com contexto de runtime | Contrast, Seeker |
| SCA | Dependências | CVE em lib usada | Snyk, Dependabot, Trivy, Grype |
| Fuzz | Código + input | Crash, UAF, overflow em parser | AFL, libFuzzer, go-fuzz, OSS-Fuzz |
| Secret scan | Repo + commits | Token/chave esquecidos | gitleaks, trufflehog |
| Container scan | Imagem Docker | Vuln em base image e binários | Trivy, Grype, Snyk Container |
| Infra scan | IaC (Terraform, K8s) | Config errada, permissão frouxa | Checkov, tfsec, kubescape |
Headers e defesas padrão
# Headers mínimos em toda resposta HTTP (API ou web) Strict-Transport-Security: max-age=31536000; includeSubDomains; preload Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-...'; object-src 'none' X-Content-Type-Options: nosniff X-Frame-Options: DENY Referrer-Policy: strict-origin-when-cross-origin Permissions-Policy: camera=(), microphone=(), geolocation=() Cross-Origin-Opener-Policy: same-origin Cross-Origin-Resource-Policy: same-site
https://securityheaders.com ou observatory.mozilla.org contra seu domínio. Grau A é pré-requisito.Autenticação e autorização sem dor
Dois cenários reais
📋 API nova de saúde com dados sensíveis (LGPD/PII)
Stack completa: STRIDE no design; AWS Secrets Manager + KMS; CodeQL no CI; SBOM publicado com artefato; audit log com HMAC de encadeamento (não-repúdio); TLS 1.3 e criptografia de coluna sensível no DB.
📋 Microserviço interno que consome webhook de parceiro
Input externo → trate como hostil. Validar HMAC do payload, idempotency-key, rate limit por parceiro, WAF bloqueia pattern conhecido, fuzz no parser do JSON/XML garante que input malicioso não quebra.
Checklist de go-live de segurança
- ✔ Threat model existe e foi revisado.
- ✔ Secrets em vault + rotation + audit.
- ✔ SAST sem HIGH/CRITICAL aberto.
- ✔ SBOM gerado e publicado. SCA sem HIGH+ aberto.
- ✔ Headers de segurança grau A.
- ✔ Auth com MFA; sessão com expiração.
- ✔ RBAC testado via testes de IDOR.
- ✔ Rate limit + WAF em endpoints públicos.
- ✔ Log estruturado + alerta em eventos críticos (login falho em massa, 5xx spike).
- ✔ DR plan testado nos últimos 90 dias.
- ✔ Runbook de incidente + contato responsável.
- ✔ SLO e error budget conhecido.
Perguntas típicas
❓ Preciso de time de segurança dedicado?
❓ Pentest anual é suficiente?
❓ Como lidar com CVE em dep sem fix?
❓ Agent pode fazer review de segurança?
❓ Certificações valem a pena?
Quiz rápido
4 perguntas · Acerte tudo e ganhe o badge 🎯 Gabarito