· Security musings

Catégories

Tags

🔍 Licence d'Utilisation 🔍

Sauf mention contraire, le contenu de ce blog est sous licence CC BY-NC-ND 4.0.

© 2025 à 2042 Sébastien Gioria. Tous droits réservés.

⏱️
Temps de lecture estimé
~11 minutes

🎯 Nous y voilà. Après avoir décortiqué CVE, CVSS, EPSS, et KEV, il est temps de tout assembler.

Aujourd’hui, on construit la matrice de priorisation qui va vous permettre de passer de “42 000 CVE à patcher” à “42 CVE à patcher cette semaine, dans cet ordre précis” 🚀.

Plus de panique, plus de “on patche au hasard”. Juste une méthodologie claire, automatisable, et défendable devant un audit.

Rappel : Les quatre piliers

Avant de construire la matrice, rappelons ce que chaque indicateur mesure :
Indicateur Organisation Ce qu’il mesure Type
CVE MITRE / CNA Identifiant unique de la vulnérabilité ID
CVSS FIRST Sévérité technique (impact théorique) Score (0-10)
EPSS FIRST Probabilité d’exploitation (30 jours) Score (0-1)
KEV CISA Exploitation réelle confirmée Booléen (oui/non)

Le schéma complet

┌─────────────────────────────────────────────────────────────┐
│                   ÉCOSYSTÈME VULNÉRABILITÉS                 │
└─────────────────────────────────────────────────────────────┘
                               │
                     ┌─────────▼─────────┐
                     │    CVE-2026-1234  │ ← Identifiant unique
                     │   (MITRE / CNA)   │
                     └─────────┬─────────┘
                               │
              ┌────────────────┼────────────────┐
              │                │                │
    ┌─────────▼─────────┐ ┌───▼────────┐ ┌────▼──────────┐
    │   CVSS: 9.8       │ │ EPSS: 0.87 │ │ KEV: Présente │
    │ (Sévérité tech.)  │ │ (Proba 87%)│ │ (Exploitée !) │
    │   [FIRST]         │ │  [FIRST]   │ │    [CISA]     │
    └───────────────────┘ └────────────┘ └───────────────┘
              │                │                │
              └────────────────┼────────────────┘
                               │
                     ┌─────────▼─────────┐
                     │   + VOTRE CONTEXTE│
                     │   (Exposition,    │
                     │   Criticité métier│
                     │   Impact business)│
                     └─────────┬─────────┘
                               │
                     ┌─────────▼─────────┐
                     │   DÉCISION DE     │
                     │   PRIORISATION    │
                     │   (P0, P1, P2, P3)│
                     └───────────────────┘

La matrice de priorisation

Voici une grille de décision qui croise tous les indicateurs :

🔴 Niveau 1 : KEV = Priorité absolue

Règle d’or : Si une CVE est dans KEV, c’est P0 (urgence), quel que soit son CVSS ou son EPSS.

CVE CVSS EPSS KEV Exposition Priorité Délai
CVE-A 9.8 0.95 Internet P0 24-48h
CVE-B 6.5 0.88 Interne P0 3-5 jours
CVE-C 7.2 0.12 Isolé P1 1 semaine
⚡ Pourquoi ?
  • KEV = exploitation confirmée dans la nature 🔥
  • Vous n'êtes plus "à risque", vous êtes en danger 🚨
  • Le "Due Date" de KEV est une obligation (légale pour les agences US, contractuelle pour certains secteurs) ⚖️

🟠 Niveau 2 : EPSS élevé (sans KEV)

Si la CVE n’est pas (encore) dans KEV, mais que l’EPSS est élevé :

CVE CVSS EPSS KEV Exposition Priorité Délai
CVE-D 9.2 0.90+ Internet P1 1 semaine
CVE-E 7.5 0.80-0.89 Internet P1 10 jours
CVE-F 8.1 0.70-0.79 Interne P2 2 semaines
💡 Pourquoi ?
  • EPSS > 0.80 = forte probabilité d'exploitation imminente ⏰
  • Mieux vaut patcher avant que la CVE n'entre dans KEV 🛡️

🟡 Niveau 3 : CVSS élevé (EPSS faible)

Si le CVSS est élevé mais l’EPSS est faible :

CVE CVSS EPSS KEV Exposition Priorité Délai
CVE-G 9.8 0.05 Interne P2 2-3 semaines
CVE-H 9.2 0.02 Isolé P3 Cycle normal
🤔 Pourquoi ?
  • Grave techniquement, mais peu de risque d'exploitation réelle 📊
  • Peut-être un PoC complexe, ou un produit très niche 🔬

🟢 Niveau 4 : Tout le reste

CVE CVSS EPSS KEV Exposition Priorité Délai
CVE-I 6.5 0.30 Interne P3 Cycle normal
CVE-J 5.2 0.10 Isolé P4 Backlog
✅ Pourquoi ?
  • Risque faible, impact limité 😌
  • On patche dans le cadre du cycle de maintenance habituel 🔄

Le contexte : La variable manquante

CVSS, EPSS et KEV donnent des indicateurs globaux. Mais le risque réel dépend de votre contexte.

Les questions à se poser

Pour chaque CVE, demandez-vous :

1. Exposition

Niveau Description Multiplicateur
Internet 🌍 Accessible publiquement x2
DMZ 🚪 Accessible depuis Internet via VPN/bastion x1.5
Interne 🏢 Réseau interne, pas d’accès direct x1
Isolé 🔒 Air-gapped, segmenté x0.5
💡 Exemple : - CVE avec EPSS 0.60 sur un serveur Internet → **Priorité haute**. - Même CVE sur un serveur isolé → **Priorité moyenne**.

2. Criticité métier

Niveau Description Multiplicateur
Critique 🔥 Prod, revenue-generating, données sensibles x2
Important ⚠️ Services internes essentiels x1.5
Standard 📋 Services non-critiques x1
Dev/Test 🧪 Environnements non-prod x0.5
💼 Exemple : - CVE sur le CRM de prod → **Critique**. - Même CVE sur un serveur de test → **Standard**.

3. Facilité de mitigation

Difficulté Description Ajustement
Facile Patch simple, sans dépendance Aucun
Moyenne ⚙️ Patch avec tests requis +3 jours
Difficile ⚠️ Patch complexe, risque de casse +1 semaine
Impossible 🚫 Pas de patch, EOL, workaround seulement Mitigation
🛠️ Exemple : - CVE patchable en 1 clic → On y va. - CVE qui nécessite un downtime de 8h → On planifie.

Le workflow complet

🗓️ Voici le processus de A à Z pour gérer vos CVE chaque semaine.

Lundi matin (30 min)

1. Récupérer les données

import requests
import pandas as pd

# Récupérer KEV
kev_url = "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"
kev_data = requests.get(kev_url).json()
kev_df = pd.DataFrame(kev_data['vulnerabilities'])

# Récupérer EPSS pour vos CVE
cve_list = ["CVE-2024-1234", "CVE-2024-5678"]  # Depuis votre scanner
epss_scores = {}

for cve in cve_list:
    response = requests.get(f"https://api.first.org/data/v1/epss?cve={cve}")
    data = response.json()
    if data['status'] == 'OK' and len(data['data']) > 0:
        epss_scores[cve] = {
            'epss': float(data['data'][0]['epss']),
            'percentile': float(data['data'][0]['percentile'])
        }

# Croiser avec les résultats de votre scanner (Nessus, Qualys...)
# qui contient déjà CVE + CVSS + Assets

2. Identifier les P0 (KEV)

# CVE de votre scanner qui sont dans KEV
your_cves_in_kev = kev_df[kev_df['cveID'].isin(cve_list)]

if len(your_cves_in_kev) > 0:
    print("⚠️  ALERTE : CVE dans KEV détectées !")
    print(your_cves_in_kev[['cveID', 'vendorProject', 'product', 'dueDate']])
    # → Envoi d'une alerte Slack/Teams/Email

3. Trier par EPSS décroissant

# Créer une liste triée
prioritized_cves = sorted(
    epss_scores.items(),
    key=lambda x: x[1]['epss'],
    reverse=True
)

for cve, scores in prioritized_cves[:10]:  # Top 10
    print(f"{cve}: EPSS={scores['epss']:.3f} (Percentile {scores['percentile']:.1f}%)")

Mardi-Jeudi (Action)

1. P0 (KEV) : Patch immédiat

  • Mardi matin : Identification des assets vulnérables.
  • Mardi après-midi : Tests du patch en pré-prod.
  • Mercredi : Déploiement en prod (ou mitigation si pas de patch).

2. P1 (EPSS > 0.80) : Cette semaine

  • Mercredi : Tests.
  • Jeudi : Déploiement.

🟡 3. P2 (CVSS élevé, EPSS moyen) : Ce mois-ci

  • Planification pour les 2-3 semaines suivantes 📆.

🟢 4. P3 (Le reste) : Cycle normal

  • Ajout au backlog de patch management 📋.

Vendredi (Documentation)

⚠️ Crucial pour les audits.

Documentez :

  1. Quelles CVE ont été patchées ? (ID, date, assets concernés).
  2. Quelles CVE n’ont PAS été patchées, et pourquoi ? (pas de patch, risque de casse, système en EOL…).
  3. Quelles mitigations temporaires ont été mises en place ? (firewall, WAF, désactivation de fonctionnalité…).

Outils :

  • JIRA / Confluence pour le tracking.
  • Tableau Excel / Google Sheets (si vous êtes old school).
  • Dashboard de votre outil de patch management (Ivanti, ManageEngine…).

Les outils pour automatiser

Scanners de vulnérabilités (gratuits/open-source)

Outil CVSS EPSS KEV Licence Notes
Greenbone OpenVAS Open Source Scanner complet, feeds gratuits
Vuls Open Source Scanner léger, multi-OS
Trivy Open Source Spécialisé containers/IaC
Nuclei Open Source Template-based, rapide
OWASP Dependency-Track Open Source Plateforme SCA continue

Il existe pour Trivy des outils permettant de vous générer des rapports avec l’EPSS. Par exemple : Trivy - Scan2html

💡 Note : Pour récupérer EPSS et KEV, vous pouvez utiliser les APIs gratuites et croiser les données avec n'importe quel scanner.

APIs et feeds

Source URL Format Mise à jour
CISA KEV JSON Feed JSON Continu
FIRST EPSS API JSON/CSV Quotidien
NVD API JSON Continu
CIRCL CVE Search API JSON Quotidien

Les pièges à éviter (le best-of)

1. L’obsession du CVSS

🚫 Erreur : "On ne patche que les 9+ CVSS".

Problème : Une CVE à 6.5 avec EPSS 0.95 et dans KEV est infiniment plus dangereuse qu’une 9.8 avec EPSS 0.01 et hors KEV.

Solution : Arrêtez de fétichiser le CVSS. C’est UN indicateur parmi 4+.

2. Ignorer le contexte

🚫 Erreur : "EPSS dit 0.90, donc on patche".
⚠️ Problème : Si le système vulnérable est : - Air-gapped (pas de connexion Internet). - En EOL (End of Life) et prévu pour décommissioning. - Non utilisé en prod. Alors même un EPSS de 1.0 ne justifie pas forcément un patch immédiat.
✅ Solution : Toujours croiser avec votre inventaire d'assets et votre contexte métier.

3. La paralysie par l’analyse

🚫 Erreur : "Attendons de voir si EPSS monte avant de patcher".
⚠️ Problème : Si une CVE est dans KEV, elle est déjà exploitée. Attendre que EPSS confirme, c'est comme attendre que la fumée monte pour vérifier si votre maison brûle 🔥.
✅ Solution : KEV = action immédiate. EPSS = aide à la priorisation pour tout le reste.

4. Croire que KEV est exhaustif

🚫 Erreur : "Ce n'est pas dans KEV, donc ce n'est pas exploité".
⚠️ Problème : KEV ne contient que les CVE publiquement connues comme exploitées. Les APT étatiques, les zero-days non divulgués, et les exploits très ciblés n'y sont pas (encore) 🕵️.
✅ Solution : Utilisez aussi vos propres sources de CTI (threat intelligence privée, ISAC de votre secteur, partenaires).

5. Patcher sans tester

🚫 Erreur : "C'est dans KEV, on patche direct en prod !"
⚠️ Problème : Un patch qui casse la prod est pire qu'une CVE exploitable 💥.
✅ Solution :
  1. Isolez le système vulnérable (firewall, segmentation) 🔒
  2. Testez le patch en pré-prod 🧪
  3. Déployez si OK, sinon appliquez des mitigations temporaires 🛡️

6. Négliger la communication

🚫 Erreur : "On patche en silence, personne n'a besoin de savoir".
⚠️ Problème : Votre RSSI, votre DSI, vos équipes métier, et vos auditeurs ont besoin de savoir 📊.
✅ Solution :
  • Alertes 🚨 : Si une CVE dans KEV touche un système critique, informez immédiatement.
  • Reporting hebdomadaire 📊 : Dashboard des CVE patchées et en cours.
  • Documentation 📝 : Pour les audits et les certifications (ISO 27001, SOC 2...).

Cas d’usage réels

Cas 1 : La tempête parfaite

Contexte : Vous gérez l'infra d'une banque en ligne.

CVE-2024-XXXX : RCE dans nginx (utilisé pour tous vos reverse proxies).

Indicateur Valeur
CVSS 9.8
EPSS 0.92
KEV ✅ (ajouté ce matin)
Exposition Internet (tous vos serveurs web)
Criticité métier Critique (prod, transactions clients)
✅ Décision : 1. **Lundi 9h** : Alerte reçue (KEV). 2. **Lundi 10h** : Cellule de crise. 3. **Lundi 12h** : Test du patch en pré-prod. 4. **Lundi 16h** : Déploiement progressif en prod (canary deployment). 5. **Mardi 8h** : Déploiement complet. 6. **Mardi 14h** 📧 : Rapport au RSSI et à l'AMF (régulateur).
⚠️ Sans EPSS/KEV : Vous auriez peut-être vu le CVSS 9.8 et dit "on verra la semaine prochaine". Trop tard 🔥.

Cas 2 : Le faux positif

Contexte : Startup SaaS en hypercroissance.

CVE-2024-YYYY : SQLi dans un plugin WordPress obscur.

Indicateur Valeur
CVSS 8.1
EPSS 0.85
KEV
Exposition Vous n’utilisez pas WordPress
✅ Décision :
  • Priorité : P4 (ignorée) 🚫
  • Raison : Pas de WordPress dans votre stack ✅
💡 Sans contexte : Vous auriez paniqué à cause de l'EPSS 0.85.

Cas 3 : L’escalade rapide

Contexte : Université avec 500 serveurs Linux.

CVE-2024-ZZZZ : Privilege escalation dans sudo.

Indicateur Jour 1 Jour 3 Jour 7
CVSS 7.8 7.8 7.8
EPSS 0.10 0.75 0.95
KEV
✅ Décision :
  • Jour 1 : P3 (cycle normal, surveillance) 👀
  • Jour 3 : P1 (EPSS monte, un PoC est publié) ⚠️
  • Jour 7 : P0 (KEV, exploitation confirmée par ransomwares) 🔥
🎯 Leçon : Surveillez les CVE qui "montent". Un changement rapide d'EPSS est un signal d'alarme 🚨.

La checklist du lundi matin

🗓️ Voici votre routine hebdomadaire (à automatiser autant que possible) :

Étape 1 : Récupérer KEV (5 min)

curl -o kev.json https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json

Filtrez les CVE ajoutées cette semaine :

kev_df['dateAdded'] = pd.to_datetime(kev_df['dateAdded'])
recent = kev_df[kev_df['dateAdded'] >= '2026-01-15']

Étape 2 : Croiser avec vos assets (10 min)

Votre scanner de vulnérabilités vous donne une liste de CVE détectées. Croisez avec KEV :

your_cves = ['CVE-2024-1234', 'CVE-2024-5678', ...]
cves_in_kev = kev_df[kev_df['cveID'].isin(your_cves)]

if len(cves_in_kev) > 0:
    print("⚠️  URGENCE : CVE dans KEV !")
    # Envoi alerte Slack/Teams

Étape 3 : Récupérer EPSS (10 min)

Pour toutes vos CVE non présentes dans KEV, récupérez le score EPSS :

for cve in your_cves:
    epss = get_epss_score(cve)  # Fonction que vous avez créée
    print(f"{cve}: EPSS={epss}")

Étape 4 : Trier et prioriser (5 min)

Créez votre liste de priorités :

Priorité Critères Action
P0 KEV = ✅ Patch immédiat (24-48h)
P1 EPSS > 0.80 + Internet Patch cette semaine
P2 CVSS > 8.0 + EPSS > 0.50 Patch ce mois-ci
P3 Le reste Cycle normal

Étape 5 : Communiquer (5 min)

Envoyez un résumé à votre équipe et à votre RSSI :

Bonjour,

Rapport hebdomadaire des vulnérabilités (Semaine 3 - Janvier 2026) :

✅ CVE patchées la semaine dernière : 12
⚠️  CVE dans KEV détectées : 2 (CVE-2024-XXXX, CVE-2024-YYYY)
🔴 CVE prioritaires cette semaine : 5 (EPSS > 0.80)
📊 Backlog : 27 CVE

Actions en cours :
- CVE-2024-XXXX : Patch en test, déploiement mercredi.
- CVE-2024-YYYY : Mitigation temporaire appliquée (WAF), patch prévu vendredi.

Dashboard : https://grafana.company.com/vuln-management

Ce qu’il faut retenir

À retenir 📌

  • Ne regardez jamais une CVE sans croiser au moins 3 sources : CVSS (sévérité), EPSS (probabilité), KEV (exploitation).
  • KEV = P0 absolu, quel que soit le CVSS. C'est déjà exploité dans la nature.
  • EPSS > 0.80 = forte probabilité d'exploitation imminente. Patchez avant que ça n'entre dans KEV.
  • Un CVSS élevé avec EPSS faible n'est pas forcément urgent (contexte requis).
  • Toujours contextualiser avec votre exposition, votre criticité métier, et votre facilité de mitigation.
  • Automatisez la récupération de KEV et EPSS (APIs, scripts, dashboards).
  • Documentez vos décisions pour les audits (pourquoi telle CVE avant telle autre).
  • Communiquez avec votre RSSI et vos équipes. Le patch management est un sport d'équipe.

Conclusion : Le patch management en 2026

On est en 2026 . On a des IA qui génèrent du code , des containers qui s’auto-scalent , et des dashboards qui clignotent en temps réel . Mais on a aussi 50 000 CVE par an , dont des milliers marquées “Critical” .

EPSS et KEV ne sont pas des gadgets. Ce sont des outils de survie. Ils vous permettent de passer de "on est submergés" à "on sait où taper".

Et si vous ne les utilisez pas encore, sachez que vos concurrents (et vos attaquants) le font déjà .

Alors, la prochaine fois qu'un scanner vous balance 12 000 CVE à patcher, ne paniquez pas.
  1. Ouvrez KEV
  2. Triez par EPSS
  3. Contextualisez avec votre infra
  4. Attaquez dans l'ordre

Vous ne sauverez pas le monde , mais vous sauverez peut-être votre boîte .


Ressources supplémentaires

Pour réviser les bases :

Ressources officielles :