Pular para o conteúdo principal

🧪 Exemplo prático - Threat Modeling de um serviço de autenticação com JWT

🎯 Contexto técnico

Durante a fase de concepção de um novo serviço de autenticação (auth-service), a equipa identificou os seguintes componentes e fluxos:

  • API REST acessível publicamente em https://auth.exemplo.com
  • Fluxo de login:
    1. Utilizador submete email + password via POST /login
    2. O serviço valida as credenciais localmente numa base de dados
    3. Se válidas, o serviço gera um token JWT
    4. O JWT é devolvido ao cliente e usado em pedidos futuros (Authorization: Bearer)
  • Configuração inicial:
    • JWT com alg: none (sem assinatura)
    • Claims: sub, email, role, exp (24h)
    • Sem MFA
    • Endpoint /admin/config acessível com qualquer JWT
    • Sem logging estruturado nem controlo de perfis

🔁 Modelação com OWASP Threat Dragon

🔷 Threat Model - auth-service (DFD em Mermaid)


🧱 Elementos identificados

ElementoTipoDescrição
Browser / Mobile AppExternal ActorCliente que inicia login
auth.exemplo.comProcessAPI pública que expõe o endpoint /login
JWT GeneratorProcessLógica que gera os tokens JWT
User DatabaseData StoreBase de dados de utilizadores
SIEM / LogsData StoreArmazenamento de eventos estruturado
Admin Config EndpointProcessEndpoint sensível: /admin/config
Backend APIsProcessAPIs protegidas que consomem e validam o JWT

🔁 Fluxos de dados

FonteDestinoDados Transmitidos
Browser → auth APIemail/password via POST /login (HTTPS)
auth API → DBConsulta de utilizador
auth API → JWT GenPedido de token JWT
JWT Gen → BrowserJWT (Authorization: Bearer <token>)
Browser → Backend APIsPedido autenticado com JWT
Browser → Admin ConfigAcesso com JWT a /admin/config
auth API → SIEM(Ausente) - sem logs estruturados

🔍 Ameaças STRIDE por elemento

ElementoCategoria STRIDEAmeaça IdentificadaGravidadeMitigação Recomendada
auth.exemplo.comSpoofingLogin com credenciais reutilizadas ou sem MFAAltaMFA, rate limiting, análise de contexto (device/IP)
JWT GeneratorTamperingJWTs manipuláveis (alg: none)AltaAssinatura RS256, validação do header, TTL reduzido
Admin ConfigElevation of PrivilegeQualquer utilizador pode aceder a endpoints administrativosAltaRBAC baseado em claims, validação de role no backend
auth.exemplo.comRepudiationSem registo de login ou alterações sensíveisMédiaLogging estruturado com userId, IP, acção, resultado
JWT GeneratorInformation DisclosureClaims excessivos (email, role, createdAt) expostos ao clienteMédiaMinimizar claims no JWT, scoping baseado em contexto
auth.exemplo.comDenial of ServiceBrute-force em /login ou reuse massivo de JWTsMédiaRate limiting, CAPTCHA, delays progressivos

🛡️ Mapa ameaça ↔ controlo

AmeaçaControlo Recomendado
SpoofingMFA obrigatório; login context-aware; device binding
TamperingJWT assinado (RS256); validação de alg, aud, iss; TTL ≤ 15 min
Elevation of PrivilegeRBAC com controlo explícito de claims (ex: role: admin)
RepudiationLogging centralizado; rastreamento de acções; integração com SIEM
Information DisclosureJWT minimalista; segregação de claims por endpoint; scoping
Denial of ServiceRate limiting no endpoint /login; protecção no API Gateway; quotas

✅ Conclusão

Este exemplo ilustra um caso típico de arquitectura moderna com:

  • Autenticação baseada em JWT
  • API pública acessível via Internet
  • Falta de validações e controlos básicos

Mesmo em arquitecturas aparentemente simples, o uso indevido de standards (ex: JWT sem assinatura) pode introduzir falhas críticas.
O uso de uma abordagem estruturada (como STRIDE e OWASP Threat Dragon) permite identificar e mitigar ameaças antes da entrada em produção.

Este modelo de ameaça deve ser documentado, versionado e reutilizado noutros serviços com arquitectura idêntica, conforme descrito na secção “♻️ Reutilização de Threat Models”.