| Ameaça | Mitigação |
|---|---|
| Vazamento cross-tenant | RLS em 100% das tabelas + queries sob role=authenticated com claims JWT (withTenantDb) + scoping explícito por org nos repositórios |
| Escalada de privilégio | Convites com papel owner bloqueados na policy; admin não toca em owners; org nunca fica sem owner (guards app + RLS) |
| Spam de formulários públicos | Zod estrito + honeypot + rate limit por IP (5/min por página, 10/min global) |
| Webhook forjado | Token único por integração/conta (32 bytes base64url); phone_number_id/plataforma validados contra a conta roteada; unsubscribe por HMAC timing-safe |
| Bounce/complaint ignorados | Suppression automática no evento — endereço nunca mais é tentado |
| Secrets no cliente | Nenhum *_KEY vaza: scan de bundle no CI (scripts/scan-secrets.sh); service role apenas server-side |
| CSRF em server actions | Next.js valida Origin por padrão em actions/POSTs |
| XSS | React escapa por padrão; nenhum dangerouslySetInnerHTML; imagens por URL arbitrária não passam por next/image (allowlist impossível — decisão documentada) |
| Força bruta de tokens | Rate limit por IP em webhooks; tokens ≥ 16 chars; HMAC com comparação timing-safe |
| Mass mailing acidental | Daily cap por campanha + limite mensal do plano + janela horária + aprovação humana por padrão |
- Todos via env (
.env.localnunca versionado;.env.exampleé template). SUPABASE_SERVICE_ROLE_KEY: apenas workers server-side.OPENROUTER_API_KEY,RESEND_API_KEY,GOOGLE_PLACES_API_KEY,WHATSAPP_TOKEN,CRON_SECRET,WHATSAPP_VERIFY_TOKEN,LINK_TOKEN_SECRET: server-only.- Scan automatizado no CI falha o build com padrões reais (gho_, sk-, whsec_, re_, AIza, JWTs).
next.config.ts aplica em todas as rotas: X-Frame-Options: DENY,
X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin,
Permissions-Policy restritivo, poweredByHeader: false.
In-process (token bucket) para captura pública e webhooks (upgrade para Postgres planejado — IMPLEMENTATION_PLAN §27). Limites de provedores (Google, Meta, Resend, OpenRouter) são respeitados, jamais contornados (429 vira mensagem honesta).
- CI: typecheck + lint + 100+ testes + build + smoke + secret scan.
- Suíte RLS (com
DATABASE_URL) valida isolamento de tenants em 17 cenários, incluindo os invariáveis: suprimido nunca recebe; opt-out exclui de campanhas; webhook de venda é idempotente.
Abra uma issue privada/security advisory no repositório. Não abra issue pública com detalhes exploráveis.