Le CWE (Common Weakness Enumeration) est la taxonomie de référence maintenue par MITRE depuis 2006 pour classifier les classes de défaut logiciel, pas les instances (c'est le rôle du CVE), pas les scores (c'est CVSS), mais les catégories abstraites qui décrivent un type de bug exploitable. La version 4.16 (publiée en 2025) référence environ 1 500 CWE organisés en hiérarchie multi-vues (Research View, Development View, Architectural View, Hardware Design View). Le Top 25 Most Dangerous Software Weaknesses publié annuellement (édition 2024 publiée en novembre 2024) concentre 70-75 % du volume des CVE majeurs : CWE-79 (XSS) en tête avec plus de 23 000 CVE associés sur 25 ans, CWE-787 (Out-of-bounds Write), CWE-89 (SQL Injection). Comprendre la différence CWE / CVE / CVSS, les vues, le mapping CWE↔CVE dans les records 5.1, et l'usage en SAST et threat modeling est un prérequis pour tout AppSec, DevSecOps ou pentester qui veut produire des rapports normalisés et industrialiser la prévention.
Pour le contexte adjacent : voir CVE - Définition, format, processus pour l'identifiant d'instance, et CVSS - Scoring vulnérabilités pour la métrique de sévérité associée.
1. Définition précise et distinction CWE / CVE / CVSS
CWE répond à une question différente de CVE et de CVSS. Un CWE est une abstraction, une catégorie nommée et numérotée qui décrit un type de défaut indépendamment d'un produit ou d'une version. Le format est CWE-<id-numérique> sans préfixe d'année (contrairement à CVE-YYYY-NNNNN).
| Concept | Question | Exemple |
|---|---|---|
| CWE | « De quel type de défaut s'agit-il ? » | CWE-89 « Improper Neutralization of Special Elements used in an SQL Command » |
| CVE | « Où ce défaut a-t-il été trouvé ? » | CVE-2024-39123 dans WordPress plugin X version 2.1.0 |
| CVSS | « Quelle est la sévérité technique ? » | 9.8 (CVSS v3.1) |
Confondre les trois est l'erreur de débutant la plus fréquente. Dire « le CWE-79 a un score de 6.1 » est incorrect : 6.1 est le score CVSS d'une instance de CWE-79 dans un produit précis, pas une propriété du CWE lui-même. CWE existe en amont des instances ; les CVE en aval pointent vers le ou les CWE qui les caractérisent.
2. Hiérarchie et vues CWE - le mental model
CWE n'est pas une liste plate. C'est un graphe orienté avec des relations parent/enfant et des regroupements par vue. La nomenclature MITRE distingue quatre niveaux d'abstraction :
| Niveau | Définition | Exemple |
|---|---|---|
| Pillar | Concept le plus abstrait | CWE-664 « Improper Control of a Resource Through its Lifetime » |
| Class | Famille générale | CWE-118 « Incorrect Access of Indexable Resource » |
| Base | Défaut nommé spécifique | CWE-787 « Out-of-bounds Write » |
| Variant | Spécialisation d'un Base | CWE-121 « Stack-based Buffer Overflow » |
Vues principales utilisées en pratique :
| Vue | ID | Cible | Usage |
|---|---|---|---|
| Research View | CWE-1000 | Académique | Hiérarchie par nature de défaut |
| Development View | CWE-699 | Équipes dev / AppSec | Regroupement par phase SDLC |
| Architectural View | CWE-1008 | Architectes / threat modelers | Regroupement par décision de conception |
| Hardware Design View | CWE-1194 | Ingénieurs hardware / silicium | Défauts chip et SoC |
| CWE Top 25 | CWE-1387 (2024) | Tout le monde | Classement par fréquence + impact |
Pour un programme AppSec entreprise, j'utilise la Development View (CWE-699) comme entrée principale. Elle aligne directement les défauts sur les phases (Architecture, Design, Implementation, Test, Operation, Patching) et facilite l'intégration dans un référentiel de secure coding par phase.
3. Top 25 Most Dangerous Software Weaknesses 2024
Publié annuellement par MITRE depuis 2019, le Top 25 classe les CWE par un score composite combinant fréquence (nombre de CVE associés sur les 2 dernières années) et impact (sévérité moyenne CVSS des CVE associés). C'est l'unique benchmark industriel pour prioriser un programme secure coding.
Top 25 édition 2024 (extrait des 10 premières positions, publié en novembre 2024 sur cwe.mitre.org/top25) :
| Rang | CWE | Nom | Type |
|---|---|---|---|
| 1 | CWE-79 | Cross-site Scripting (XSS) | Injection |
| 2 | CWE-787 | Out-of-bounds Write | Memory safety |
| 3 | CWE-89 | SQL Injection | Injection |
| 4 | CWE-352 | Cross-Site Request Forgery (CSRF) | Auth/session |
| 5 | CWE-22 | Path Traversal | Injection / file |
| 6 | CWE-125 | Out-of-bounds Read | Memory safety |
| 7 | CWE-78 | OS Command Injection | Injection |
| 8 | CWE-416 | Use After Free | Memory safety |
| 9 | CWE-862 | Missing Authorization | AuthZ |
| 10 | CWE-434 | Unrestricted Upload of File with Dangerous Type | File handling |
Position tranchée : aligner le secure coding training strictement sur l'ordre du Top 25 vaut mieux que toutes les listes maison ou « les CWE qu'on a vus passer ». Ces 10 premiers couvrent typiquement 40-50 % du volume CVE annuel et 60 % des CVE Critical (CVSS ≥ 9.0). Couvrir Top 10 en 6 mois, Top 25 complet en 18 mois est un objectif tenable et mesurable.
Évolution 2021-2024 (extraits) :
- CWE-79 XSS : reste #1 ou #2 toutes éditions confondues. Dominant en web app et SaaS.
- CWE-787 Out-of-bounds Write : monté au #1 en 2022, redescendu #2 en 2024. Dominant en C/C++ legacy, embarqué, parsers.
- CWE-918 Server-Side Request Forgery (SSRF) : ré-entré au Top 25 en 2024, conséquence de l'écosystème cloud.
- CWE-269 Improper Privilege Management : entré dans le Top 25 récent, conséquence de la complexification des contrôles IAM cloud.
4. Mapping CWE↔CVE - le pont opérationnel
Le mapping CWE↔CVE vit dans le record CVE au format JSON 5.1, sous containers.cna.problemTypes[].descriptions[].cweId. Exemple d'extraction CLI :
# Extraire tous les CVE 2024 avec leur CWE associé
git clone --depth 1 https://github.com/CVEProject/cvelistV5.git
find cvelistV5/cves/2024 -name "CVE-*.json" -exec jq -r '
.cveMetadata.cveId as $id |
(.containers.cna.problemTypes[]?.descriptions[]? | select(.cweId)) |
[$id, .cweId, .description] | @tsv
' {} \; 2>/dev/null > cve_cwe_2024.tsv
# Compter les CWE les plus fréquents en 2024
cut -f2 cve_cwe_2024.tsv | sort | uniq -c | sort -rn | head -25Output typique 2024 : la distribution suit globalement le Top 25 MITRE avec quelques inversions. La fréquence CWE observée par jq sur cvelistV5 sert à valider que le Top 25 MITRE reflète ton scope ou à détecter qu'un CWE rare dans le Top 25 général est dominant chez ton vendor.
Cas particuliers de mapping :
| Situation | Conséquence |
|---|---|
| CVE sans CWE | ~10-15 % des CVE 2024 n'ont aucun CWE attribué (CNA paresseux ou triage incomplet) |
| CVE avec 2-4 CWE | Vulnérabilité multi-classes, mapping correct |
| CWE référencé erronément | Cas observé : CWE-119 attribué à un défaut JavaScript (pas applicable) |
| Mapping NVD vs CNA divergent | Le NVD peut re-mapper à un CWE différent lors de l'enrichissement |
5. Usage en SAST et IAST - le pont CWE / outils
Les SAST (Static Application Security Testing) et IAST (Interactive AST) modernes exposent leurs findings avec un tag CWE. Stack 2026 :
| Outil | Type | CWE coverage | Particularité |
|---|---|---|---|
| Semgrep (r2c) | SAST polyglotte | ~250 CWE couverts via metadata cwe2 | Open-source, rules YAML, intégration GitHub native |
| SonarQube/SonarCloud | SAST + qualité | Top 25 + extensions OWASP/CWE/PCI | Adopté massivement en grandes entreprises |
| CodeQL (GitHub) | SAST avancé | ~150 CWE via tags requêtes | Langage de requête semantic, intégration Advanced Security |
| Snyk Code | SAST commercial | Top 25 + 100+ CWE | DeepCode (rachat Snyk 2020), intégration IDE |
| Checkmarx One | SAST entreprise | ~300 CWE | Marché grands comptes |
| Veracode | SAST SaaS | ~200 CWE | Pionnier, marché US dominant |
| GitLab Ultimate SAST | SAST intégré | Top 25 | Bundlé GitLab Ultimate |
Exemple d'une rule Semgrep avec mapping CWE explicite :
# Rule Semgrep - détection CWE-89 SQL Injection en Python (sqlite3)
rules:
- id: python-sqli-format-string
pattern: |
$CONN.execute("..." + $VAR + "...")
pattern-either:
- pattern: |
$CONN.execute(f"... {$VAR} ...")
- pattern: |
$CONN.execute("..." % $VAR)
languages: [python]
severity: ERROR
metadata:
cwe2:
- "CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')"
owasp:
- "A03:2021 - Injection"
category: security
technology: [python, sqlite, mysql, postgres]
message: |
Concaténation ou f-string dans une requête SQL → injection possible (CWE-89).
Utiliser des requêtes paramétrées : execute("SELECT * FROM users WHERE id = ?", (user_id,))Cette rule détecte les concaténations dynamiques dans execute(...) et tagge le finding CWE-89. Le tag CWE2 est le format canonique Semgrep ; il sert à filtrer / regrouper les findings dans les dashboards Semgrep AppSec et à générer des rapports PCI-DSS ou ASVS.
Position tranchée : adopter Semgrep en open-source pour 80 % du scope, garder un SAST commercial (SonarQube, Snyk Code) pour les langages complexes (Java enterprise, C/C++ legacy, Kotlin Android). Cette stratégie hybride couvre 95 % des CWE Top 25 à coût raisonnable, alors que les SAST mono-vendor entreprise coûtent typiquement 50 000 € à 500 000 € / an pour une couverture équivalente.
6. CWSS et CWRAF - les compléments de scoring
MITRE maintient deux frameworks complémentaires moins connus :
- CWSS (Common Weakness Scoring System) : score d'un CWE dans un contexte d'application donné. Combine 18 facteurs sur 3 groupes (Base Finding Group, Attack Surface Group, Environmental Group). Spec : https://cwe.mitre.org/cwss/.
- CWRAF (Common Weakness Risk Analysis Framework) : permet de définir des « vignettes » de risque (un cas d'usage : web banking, e-commerce, SCADA) qui pondèrent les CWE selon le contexte applicatif. Beaucoup utilisé en threat modeling consortium CWE.
Position tranchée : CWSS et CWRAF ont une adoption pratique très limitée en 2026. La majorité des équipes utilisent le rang dans le Top 25 comme proxy de priorité, et le CVSS de l'instance quand un CVE est trouvé. Investir du temps en CWSS n'a de sens que si tu fais du threat modeling formel (banques, défense, aérospatial) où tu dois quantifier des classes de défaut avant que des instances apparaissent.
7. CWE en threat modeling et architecture sécurisée
Au-delà du SAST/IAST, CWE sert à structurer un threat model. Démarche STRIDE-extended typique :
- Décomposer l'architecture en composants (services, datastores, frontières de confiance, flux).
- Identifier par composant les CWE-classes pertinents, ex. composant exposé Internet : CWE-79, CWE-89, CWE-352, CWE-918, CWE-22.
- Lister les CWE-base/variant correspondants à des chemins concrets de l'architecture, ex. si un module charge un fichier XML, expliciter CWE-611 (XXE).
- Évaluer la mitigation existante par CWE (control implemented yes/no), prioriser les gaps.
- Documenter les décisions et reviewer périodiquement.
Outils 2026 :
| Outil | Origine | Force | Limite |
|---|---|---|---|
| OWASP Threat Dragon | OWASP / Mike Goodwin | Open-source, simple, mapping STRIDE | Couverture CWE limitée, pas de DB CWE intégrée |
| Microsoft Threat Modeling Tool | Microsoft | Mature, mapping STRIDE auto | Windows-only, peu maintenu depuis 2023 |
| IriusRisk | IriusRisk | Couverture CWE forte, librairies par stack | Commercial, coûteux |
| PyTM | OWASP / Izar Tarandach | Threat modeling as code Python | Adoption limitée, manque de UI |
Recommandation : pour une équipe ingénieurs senior, OWASP Threat Dragon + référentiel CWE Development View (CWE-699) suffit pour 80 % des cas. Pour les organisations à compliance forte (NIS2, DORA, ISO 27001), passer à IriusRisk avec mapping CWE complet justifie son coût (typiquement 30 000-100 000 € / an selon la taille).
8. Erreurs fréquentes dans l'usage CWE
| Erreur | Symptôme | Fix |
|---|---|---|
| Confondre CWE et CVE | « Le CWE-2024-39123 » | CVE = instance + année, CWE = classe sans année |
| Mapping unique CWE-20 ou CWE-200 | Findings imprécis, dashboards inutiles | Forcer mapping CWE Base ou Variant, jamais Pillar/Class général |
| Ignorer la hiérarchie | Trier les findings par ID numérique au lieu d'utiliser la vue | Utiliser Development View (CWE-699) pour grouper par phase |
| Pas de CWE dans rapport pentest | Findings non comparables entre missions/clients | Forcer tag CWE par défaut dans le template de rapport |
| Top 25 ignoré au profit de listes maison | Couverture training partielle, biais d'expert | Aligner training secure coding sur Top 25 MITRE strict |
| Confondre CWSS et CVSS | Tentative de scoring instance avec CWSS | CWSS = classe en contexte, CVSS = instance, choisir selon question |
| Pas de mapping SAST → CWE | Findings non agrégeables, dashboards dispersés | Choisir SAST avec metadata CWE2 (Semgrep, SonarQube, CodeQL) |
9. CWE et frameworks adjacents
CWE s'inscrit dans un mapping multi-référentiels :
| Framework | Lien avec CWE |
|---|---|
| OWASP Top 10 2021 | Mapping officiel OWASP → CWE par catégorie (A01:2021 Broken Access Control = CWE-22, CWE-862, CWE-863…) |
| OWASP ASVS v4.0.3 (octobre 2023) | Chaque exigence référence le ou les CWE associés |
| OWASP MASVS / MSTG | Mobile-spécifique, mapping CWE pour iOS et Android |
| MITRE ATT&CK | Pas de mapping direct CWE/ATT&CK officiel mais des correspondances communautaires existent |
| NIST SP 800-53 r5 (2020) | Contrôles de sécurité référencent indirectement les CWE pertinents |
| PCI-DSS v4.0 (2022) | Section 6.2 (secure coding) référence OWASP qui référence CWE |
| CWE Top 25 + KEV | Croisement Top 25 (classes) + KEV (instances exploitées) → priorisation forte |
10. Pour aller plus loin
- CVE - Définition, format, processus, l'instance qui matérialise un CWE dans un produit donné.
- CVSS - Scoring vulnérabilités v3.1 vs v4.0, la métrique de sévérité associée aux CVE.
- IOC - Indicateurs de compromission, pour la couche détection en aval.
- Bootcamp DevSecOps, formation 12 semaines couvrant secure coding par CWE Top 25, SAST/IAST, threat modeling.
- Hub catégorie Glossaire cyber, autres définitions de référence Zeroday.
- Site officiel MITRE : https://cwe.mitre.org/.
- CWE Top 25 2024 : https://cwe.mitre.org/top25/.
- CWE View Development (CWE-699) : https://cwe.mitre.org/data/definitions/699.html.
- OWASP Top 10 2021 ↔ CWE mapping : https://owasp.org/Top10/.
- Semgrep public registry : https://semgrep.dev/explore.
11. Points clés à retenir
- CWE = classe abstraite de défaut, CVE = instance dans un produit, CVSS = sévérité de l'instance, trois objets distincts maintenus séparément.
- Format
CWE-NNNsans préfixe d'année. Version 4.16 (2025) répertorie environ 1 500 CWE. - Top 25 MITRE publié annuellement (édition 2024 publiée nov 2024), outil de priorisation n°1 pour secure coding.
- Top 3 2024 : CWE-79 (XSS), CWE-787 (Out-of-bounds Write), CWE-89 (SQL Injection). Couvrir Top 10 en 6 mois, Top 25 en 18 mois.
- Hiérarchie : Pillar → Class → Base → Variant. Préférer mapping vers Base ou Variant, éviter le mapping unique vers Pillar/Class générique.
- Vues : Research (CWE-1000), Development (CWE-699, recommandée), Architectural (CWE-1008), Hardware (CWE-1194), Top 25 (CWE-1387).
- Mapping CWE↔CVE dans le record CVE 5.1 sous
problemTypes[].descriptions[].cweId. ~10-15 % des CVE 2024 sans CWE. - CWE-20 et CWE-200 : utilisation comme mapping unique discouraged depuis 2023, exiger un CWE plus précis en review.
- SAST 2026 : Semgrep (open-source) couvre 250+ CWE. SonarQube, CodeQL, Snyk Code en commercial. Stack hybride recommandée.
- CWSS et CWRAF : peu adoptés. Le rang Top 25 MITRE sert de proxy de priorité dans 90 % des cas.
- Mapping multi-référentiel : OWASP Top 10 / ASVS v4.0.3 / MASVS / NIST SP 800-53 / PCI-DSS v4.0 référencent tous CWE comme taxonomie commune.
- Anti-pattern n°1 : produire des rapports pentest sans tag CWE → findings non comparables, dette d'audit ASVS/PCI à 15-40 jours-homme.




