Threat modeling — STRIDE¶
Identifier les menaces techniques composant par composant avant qu'elles ne se materialisent.
Pourquoi le threat modeling¶
Le threat modeling est une approche structurée pour identifier les menaces de sécurité d'un système avant que le code ne soit écrit. Plutôt que d'attendre les tests de penetration en fin de projet, on anticipe les vecteurs d'attaque des la conception.
STRIDE est un framework de categorisation des menaces développé par Microsoft. Les 6 catégories couvrent l'ensemble des vecteurs d'attaque possibles sur un système. Pour les définitions détaillées de chaque catégorie et leur application au code, voir Securiser son code — fondamentaux.
| Lettre | Menace | Propriété violee | Exemple architectural |
|---|---|---|---|
| S | Spoofing | Authentification | Service interne usurpant l'identité d'un autre |
| T | Tampering | Intégrité | Message modifie entre deux services |
| R | Repudiation | Non-repudiation | Action critique sans trace d'audit |
| I | Information Disclosure | Confidentialite | Données sensibles exposees dans les logs |
| D | Denial of Service | Disponibilité | Surchargé d'un service par un appelant interne |
| E | Elevation of Privilege | Autorisation | Service obtenant des droits supérieurs a son rôle |
Processus en 4 étapes¶
Étape 1 — Dessiner le diagramme de flux (DFD)¶
Le DFD (Data Flow Diagram) est la base de l'analyse. On identifie les composants, les flux de données entre eux, les frontieres de confiance et les stockages de données.
Les éléments du DFD :
| Élément | Représentation | Description |
|---|---|---|
| Processus | Rectangle | Service, API, composant actif |
| Stockage | Cylindre | Base de données, file, cache |
| Flux de données | Fleche | Communication entre composants |
| Frontiere de confiance | Ligne pointillee | Séparation entre zones de confiance différentes |
| Entité externe | Rectangle double | Acteur externe au système (utilisateur, API tierce) |
La précision du DFD détermine la qualité de l'analyse. Un DFD trop abstrait manque les menaces. Un DFD trop détaillé rend l'analyse ingerable. On vise le niveau ou chaque flux de données significatif est visible.
Étape 2 — Identifier les menaces par composant¶
Pour chaque composant et chaque flux du DFD, on appliqué STRIDE systematiquement. La question n'est pas "est-ce que cette menace est probable ?" mais "est-ce que cette menace est possible ?". La priorisation vient ensuite.
| Composant / Flux | S | T | R | I | D | E |
|---|---|---|---|---|---|---|
| API Gateway | x | . | . | . | x | . |
| Flux Gateway -> Service | x | x | . | x | . | . |
| Service de commandes | . | x | x | . | . | x |
| Base de données | . | x | x | x | . | . |
| Flux Service -> DB | . | x | . | x | . | . |
Chaque "x" est une menace a documenter avec une description concrète.
Étape 3 — Prioriser avec une risk matrix¶
Toutes les menaces n'ont pas le même impact ni la même probabilite. Une risk matrix simple croise probabilite et impact sur une échelle 1-3 :
| Menace | Probabilite | Impact | Score | Priorité |
|---|---|---|---|---|
| Spoofing API Gateway | 2 | 3 | 6 | Haute |
| DoS sur l'API | 3 | 2 | 6 | Haute |
| Info Disclosure DB | 1 | 3 | 3 | Moyenne |
| Repudiation commande | 1 | 2 | 2 | Basse |
Les menaces de score >= 5 sont traitees en priorité. Les autres sont documentees et revisitees lors du prochain cycle.
La méthode DREAD (Damage, Reproducibility, Exploitability, Affected users, Discoverability) offre une granularité supplémentaire si la risk matrix simple ne suffit pas.
Étape 4 — Définir les mitigations¶
Pour chaque menace prioritaire, on définit la mesure d'attenuation concrète et l'équipe responsable.
| Menace | Mitigation | Responsable |
|---|---|---|
| Spoofing API Gateway | mTLS + JWT validation avec expiration courte | Équipe plateforme |
| DoS sur l'API | Rate limiting par IP et par token + auto-scaling | Équipe SRE |
| Info Disclosure DB | Chiffrement at-rest + column-level encryption | Équipe data |
Exemple complet : API e-commerce¶
graph LR
U[Utilisateur] --text--> GW[API Gateway]
GW --text--> OS[Order Service]
OS --text--> DB[(Base de donnees)]
OS --text--> PP[Payment Provider]
OS --text--> NS[Notification Service] Analyse STRIDE¶
| Composant | Menace STRIDE | Description | Mitigation |
|---|---|---|---|
| API Gateway | Spoofing | Usurpation d'identité utilisateur | mTLS + JWT validation avec expiration courte |
| API Gateway | Denial of Service | Surchargé par volume de requêtes | Rate limiting, throttling par IP et par token |
| Order Service | Tampering | Modification de commande en transit | Signature des événements, validation des schémas |
| Order Service | Elevation of Privilege | Accès a des endpoints admin | RBAC sur les endpoints, validation des rôles |
| Order Service | Repudiation | Commande passee sans trace | Audit log immutable sur toutes les écritures |
| Base de données | Information Disclosure | Accès non autorise aux données | Chiffrement at-rest + column-level encryption |
| Base de données | Repudiation | Modification de données sans trace | Audit log immutable sur toutes les écritures |
| Payment Provider | Tampering | Webhook modifie entre le provider et le service | Vérification HMAC des webhooks entrants |
| Payment Provider | Spoofing | Faux callback de paiement | Vérification signature + IP whitelisting |
| Notif Service | Information Disclosure | Données sensibles dans les notifications | Masquer les données sensibles (PII) dans les messages |
Threat modeling automatise¶
Le threat modeling manuel est indispensable pour les analyses profondes. Mais pour les systèmes complexes avec de nombreux composants, des outils automatises aident à couvrir la surface et a maintenir l'analyse dans le temps.
Outils principaux¶
| Outil | Type | Forces | Limites |
|---|---|---|---|
| OWASP Threat Dragon | Open source | Modèles DFD, génération automatique de menaces | Menaces génériques, nécessité validation manuelle |
| Microsoft Threat Modeling Tool | Gratuit | Intégration ecosystem Microsoft, templates | Windows only, templates orientes Microsoft |
| IriusRisk | Commercial | Intégration CI/CD, bibliotheque de menaces riche | Coût, courbe d'apprentissage |
| Threagile | Open source | Modèle en YAML, génération automatique de risques | Moins mature, communauté plus petite |
OWASP Threat Dragon¶
Threat Dragon est l'outil de référence open source. Il permet de dessiner des DFD, d'appliquer STRIDE automatiquement à chaque composant, et de générer un rapport de menaces.
Workflow typique :
- Dessiner le DFD dans l'interface (composants, flux, frontieres)
- Pour chaque composant, l'outil suggère les menaces STRIDE applicables
- Valider ou rejeter chaque menace suggérée
- Documenter les mitigations pour les menaces retenues
- Générer le rapport final
L'avantage principal : le modèle est versionne avec le code. À chaque modification architecturale, on met à jour le DFD et l'outil signale les nouvelles menaces potentielles.
Threagile¶
Threagile adopte une approche "as code" — le modèle du système est défini en YAML et l'outil généré automatiquement les risques identifiés :
# threagile.yaml (extrait)
technical_assets:
api-gateway:
description: API Gateway public
type: process
technologies:
- web-service-rest
internet: true
confidentiality: confidential
integrity: critical
availability: critical
order-service:
description: Service de commandes
type: process
technologies:
- web-service-rest
internet: false
communication_links:
api-gateway-to-order:
source: api-gateway
target: order-service
protocol: https
authentication: token
L'approche "as code" permet d'intégrer le threat model dans le pipeline CI. À chaque changement d'architecture, le modèle est mis à jour et les risques sont recalcules automatiquement.
Intégrer le threat modeling dans le cycle¶
Le threat modeling n'est pas un exercice ponctuel. Il doit être rejoue à chaque modification architecturale significative.
Déclencheurs de revue¶
| Événement | Action |
|---|---|
| Ajout d'un nouveau composant | Ajouter au DFD, appliquer STRIDE |
| Nouveau flux de données | Analyser le flux, identifier les menaces |
| Changement de frontiere de confiance | Re-évaluer les menaces des composants affectes |
| Nouveau type de données sensibles | Évaluer Information Disclosure sur tous les flux |
| Incident de sécurité | Vérifier si le threat model couvrait le vecteur |
Bonnes pratiques¶
- Intégrer le threat modeling au processus de design review — avant le code, pas après
- Versionner le DFD avec le code source du projet
- Maintenir un registre des menaces et de leur statut (ouverte, mitigee, acceptee)
- Impliquer les développeurs, pas seulement les specialistes sécurité
- Commencer simple : un DFD papier et une matrice STRIDE sur un tableau blanc suffisent pour démarrer
Tip
Le meilleur moment pour faire du threat modeling est avant d'écrire le code. Le deuxieme meilleur moment est maintenant. Ne laissez pas la perfection du processus empêcher de commencer.
STRIDE per élément vs STRIDE per interaction¶
Deux variantes de STRIDE existent selon la granularité souhaitee :
STRIDE per élément — on applique les 6 catégories à chaque composant du DFD. C'est l'approche classique, plus rapide mais moins précisé.
STRIDE per interaction — on appliqué STRIDE à chaque flux de données entre composants. Plus détaillé, cette variante identifie des menaces spécifiques aux communications (homme du milieu, rejeu, etc.).
Pour un premier threat model, STRIDE per élément suffit. Pour les systèmes critiques ou les flux sensibles (paiement, authentification), STRIDE per interaction apporte une couverture plus fine.
Arbres d'attaque¶
Les arbres d'attaque sont un complement a STRIDE pour les menaces complexes. La ou STRIDE identifie les catégories de menaces, l'arbre d'attaque decompose un objectif d'attaque en sous-objectifs et en chemins alternatifs.
La racine de l'arbre est l'objectif de l'attaquant. Les branches représentent les différentes manières d'atteindre cet objectif. Les nœuds intermédiaires sont des sous-objectifs. Les feuilles sont des actions concrètes.
graph TD
ROOT["Exfiltrer les donnees\nde paiement"]
ROOT --> A["Compromettre\nla base de donnees"]
ROOT --> B["Intercepter\nles flux de paiement"]
ROOT --> C["Compromettre\nun backup"]
A --> A1["Injection SQL\nvia l'API"]
A --> A2["Credentials DB\nen clair dans la config"]
A --> A3["Acces direct\nport DB expose"]
B --> B1["Man-in-the-middle\nsans mTLS"]
B --> B2["Compromission\ndu payment gateway"]
C --> C1["Backup non chiffre\nsur S3 public"]
C --> C2["Acces au NAS\nvia credentials par defaut"] Chaque feuille est évaluée en termes de faisabilite et de coût pour l'attaquant. Les chemins les plus accessibles (faible coût, forte probabilite) sont les priorités de traitement.
Les arbres d'attaque sont particulièrement utiles pour :
- Les menaces complexes qui impliquent plusieurs étapes
- La communication avec les decideurs non techniques (la représentation visuelle est intuitive)
- L'identification de points de convergence ou une seule mesure bloque plusieurs chemins
Registre des menaces¶
Le registre des menaces est le livrable opérationnel du threat modeling. Il centralise toutes les menaces identifiées, leur évaluation, leur statut de traitement et les responsables.
| ID | Composant | Menace | Catégorie STRIDE | Probabilite | Impact | Score | Mitigation | Statut | Responsable |
|---|---|---|---|---|---|---|---|---|---|
| T-001 | API Gateway | Usurpation d'identité | Spoofing | 2 | 3 | 6 | mTLS + JWT | En cours | Équipe plateforme |
| T-002 | API Gateway | Surchargé volumetrique | DoS | 3 | 2 | 6 | Rate limiting | Déployé | Équipe SRE |
| T-003 | Base de données | Accès non autorise | Info Disclosure | 1 | 3 | 3 | Chiffrement | Planifie | Équipe data |
| T-004 | Order Service | Modification commande | Tampering | 2 | 3 | 6 | Signature events | En cours | Équipe dev |
Le registre est un document vivant. Il est révisé à chaque modification architecturale et chaque incident de sécurité. Les menaces traitees restent documentees pour la traçabilite. Les nouvelles menaces sont ajoutees au fur et à mesure que le système évolue.
Note
Un registre des menaces non maintenu est pire que pas de registre — il donne une fausse impression de sécurité. Si l'équipe ne peut pas le maintenir, commencer par un scope limite (services critiques uniquement) est preferable a un registre exhaustif mais obsolète.
Chapitre suivant : Zero trust — ne jamais faire confiance par défaut, même à l'intérieur du réseau.