OPSEC

Threat Modeling STRIDE en Sprints : Exemple Complet sur un Microservice

Por Equipe Basilisk ·

Comment appliquer STRIDE a un vrai microservice de paiement dans un sprint de deux semaines, avec DFD, menaces priorisees et mitigations actionnables.

Le threat modeling meurt au fond d'un tiroir des qu'il devient une reunion de quatre heures sans pilote. Chez Basilisk OffSec, on integre STRIDE dans des sprints de deux semaines avec un microservice de paiement comme cobaye : 1 dev backend, 1 SRE, 1 chercheur offensif, 90 minutes de kickoff et 30 minutes de revue a mi-sprint. Le livrable n'est pas un PDF de 40 pages mais 12 tickets Jira avec des mitigations verifiables. Ce post detaille comment on l'a execute sur payments-api, qui recoit des webhooks de PSPs, dialogue avec Postgres, Redis et un KMS, et comment chaque lettre de STRIDE est devenue un patch concret dans le code.

Avant de modeliser, on a dessine le DFD (Data Flow Diagram) sur draw.io avec quatre elements : entites externes (PSP, frontend), processus (payments-api, worker-reconciliation), datastores (Postgres tx_db, Redis idempotency_cache) et flux. On a trace les trust boundaries : internet -> Cloudflare -> ingress -> mesh interne -> KMS. Le diagramme n'a pas besoin d'etre beau, il doit etre correct. En 25 minutes, tout le monde l'avait valide. Quiconque a monte un lab de pentest sait qu'un diagramme faux genere des tests faux Pentest Web depuis Zero: Construire un Lab Sur avec DVWA, Juice Shop et Burp Suite. Si votre flux webhook ne montre pas la verification HMAC avant le parse JSON, vous modelisez le service qui vit dans votre tete, pas celui qui tourne en production.

Le Spoofing est apparu d'abord sur le flux PSP -> payments-api. Le webhook arrivait avec un header X-Signature, mais la verification s'executait apres json.loads(body), ouvrant une fenetre de parser differential. Correctif : valider le HMAC SHA-256 avec une cle rotative du KMS avant de toucher au body, en comparaison constant-time via hmac.compare_digest. Le Tampering est apparu sur Redis : le cache d'idempotence n'avait ni TTL fixe ni signature, donc un attaquant avec acces reseau interne pouvait injecter des entrees et provoquer un replay de paiement. On a ajoute un prefixe namespaced + HMAC court sur la cle, et ACL avec requirepass + TLS sur Redis 7. Le Repudiation a ete couvert par un log append-only dans une table audit_log avec hashes chaines, un pattern qu'on retrouve dans nos labs de pivoting sur reseaux segmentes Pivoting avec Chisel et Ligolo-ng : Reseaux Segmentes en Lab de Pentest.

Information Disclosure a ete la categorie la plus chargee avec huit findings. Des stack traces fuyaient via les 500 de FastAPI sur un environnement de staging miroir de prod, des secrets apparaissaient sur /debug derriere un header magique oublie par un stagiaire en 2024, et le endpoint /metrics de Prometheus exposait des labels avec card_bin. Correction : un middleware qui ne renvoie que {error_id, code}, suppression de /debug, et relabel_config Prometheus pour drop les labels sensibles. Pour rendre l'impact tangible, on a montre une POC equivalente a un SSRF qui aspire des cloud metadata, exercice deja documente dans un autre lab SSRF Demystifie: Exploiter Cloud Metadata dans un Lab AWS Local. On a aussi branche un SAST avec des regles Semgrep custom et un SCA avec osv-scanner, tous deux en gates bloquants sur High et Critical dans le pipeline.

Denial of Service n'a pas ete traite comme du simple rate limit. On a mappe l'amplification algorithmique : un endpoint /search acceptait une regex client et tapait Postgres avec LIKE %term%. Remplace par tsvector + index GIN et cap a 64 caracteres sur le terme. Ajout d'un token bucket par cle API dans envoy (100 rps, burst 200) et d'un circuit breaker sur le client KMS via pybreaker, parce que le KMS gere a un quota de 1200 ops/s par cle et qu'on avait deja provoque un incident de 14 minutes en janvier. Elevation of Privilege a clos la liste : le JWT de l'API interne utilisait HS256 avec un secret partage entre 6 services. Migration vers RS256 avec cle par service dans le KMS, claims aud specifiques, et validation exp + nbf + iss dans un middleware unique publie comme bibliotheque interne basilisk-authz==2.3.0.

A la fin du sprint, chaque item est devenu une issue intitulee STRIDE--: avec un tag mitigation:. Sur les 12 menaces identifiees, 9 ont ete livrees en PR mergees dans le meme sprint, 2 acceptees comme risque residuel avec revue a 90 jours, et 1 transformee en epic de refacto du module webhook. Cout total : 4 heures de reunion reparties, plus le travail de code deja prevu au sprint. STRIDE n'est pas une checklist d'audit, c'est un langage commun entre dev, SRE et offensif. Takeaway pratique : commencez par un DFD d'une page, forcez les 6 lettres sur chaque flux qui traverse une trust boundary, et exigez que chaque menace devienne une issue avec un critere d'acceptation verifiable. Si ca ne devient pas du code dans le sprint, ce n'etait pas du threat modeling, c'etait du theatre.

Nenhum comentário ainda

Seja o primeiro a comentar.

Deixe seu comentário

Entre com sua conta Canverly para comentar. Você pode usar a mesma conta em qualquer site da rede.

Entrar com Canverly