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.

🎯 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 :