ADR-014 — Score composite : dépendance à EPSS et plancher KEV¶
- Statut : accepté le 07/10/2026 — options A + B + C (décision de Godwill FOKA)
- Date : 2026-10-04
- Concerne : ADR-001 (formule du score),
illwatch/modules/cve_tracker/scoring.py
Constat sur données réelles¶
Calcul déterministe sur les 1 733 CVE du catalogue KEV, CVSS issu des flux NVD réels, sans EPSS (bilan M7 lot 2, § 4) :
| Priorité | CVE |
|---|---|
| P0 | 0 |
| P1 | 617 |
| P2 | 1 100 |
| P3 | 16 |
Sans EPSS, R = CVSS×3 + KEV×25 + Exploit×10 + Ransomware×10 plafonne à 75 : aucune CVE
n'atteint P0 (≥ 80), pas même Log4Shell (75). Avec son EPSS (≈ 0,94), elle passerait à ≈ 98.
Une panne de l'API FIRST suffit donc à faire disparaître toutes les P0.
16 CVE exploitées (KEV) sont classées P3, c'est-à-dire en « maintenance standard ».
Options¶
| # | Option | Effet | Coût |
|---|---|---|---|
| A | Statu quo + signal (fait en M7 lot 3 : cve.epss_stale, illwatch status) |
panne visible | P0 toujours absentes pendant la panne |
| B | Plancher KEV ⇒ au moins P1 | plus aucune CVE exploitée en P2/P3 ; aligné sur les délais de la directive CISA BOD 22-01 | priorité qui ne découle plus seulement de la formule (règle à documenter) |
| C | EPSS manquant remplacé par la dernière valeur connue, puis par le percentile médian | score stable pendant une panne courte | valeur potentiellement périmée |
| D | Repondérer la formule (ex. KEV × 35) | P0 atteignable sans EPSS | rupture de la comparabilité avec l'historique, contredit ADR-001 |
Recommandation (à valider)¶
A + B + C, et rejet de D. B corrige une incohérence métier (une vulnérabilité exploitée ne peut pas être en maintenance standard) sans toucher à la formule ; C rend le score robuste à une panne de quelques jours ; A est déjà en place. Confiance : élevée sur le diagnostic, moyenne sur C (dépend de la volatilité réelle d'EPSS, à mesurer sur 30 jours de données).
Si accepté¶
scoring.py: plancher appliqué après le calcul, raison historisée (floor_kev).sync_cves: conservation de la dernière valeur EPSS connue, horodatée.- Tests sur le jeu réel des 1 733 CVE KEV : 0 CVE KEV en P2/P3.
Décision (07/10/2026)¶
A + B + C retenues, D rejetée, après chiffrage sur la base réelle du poste Kali (26 416 CVE) :
| Priorité | CVE | dont KEV | sans EPSS |
|---|---|---|---|
| P0 | 495 | 495 | 0 |
| P1 | 627 | 627 | 0 |
| P2 | 638 | 602 | 0 |
| P3 | 24 656 | 10 | 109 |
612 CVE exploitées (KEV) sur 1 734 étaient en P2 ou P3. Effet attendu de B : P1 passe de 627 à 1 239 ; plus aucune CVE KEV sous P1.
Mise en œuvre¶
- B — plancher KEV :
compute_risk_breakdownrelève la priorité à P1 pour une CVE KEV que la formule classe P2 ou P3. Le score n'est pas modifié (formule de l'ADR-001 intacte, historique comparable) ;RiskBreakdown.kev_floorle signale, l'API l'expose (breakdown.kev_floor) etillwatch cves showl'affiche. Chaque changement de priorité dû au plancher est historisé avec le motif suffixé+floor_kev(ex.kev+floor_kev). - Reclassement de l'existant :
illwatch cves rescorerecalcule toutes les priorités une fois, sans alerte (le score ne change pas, aucun seuil ne peut être franchi). - C — dernière valeur EPSS connue : la synchronisation n'efface jamais un score EPSS ; une
panne de l'API FIRST laisse donc les scores et les P0 en place. Ce comportement est désormais
verrouillé par un test (
test_panne_epss_ne_fait_pas_tomber_les_p0). L'âge de la donnée est suivi globalement (collector_stateepss, alertecve.epss_stale,illwatch status) : un horodatage par CVE n'apporterait pas d'information utile au SOC. - C, second volet (percentile médian pour une CVE jamais notée) : non retenu. L'EPSS
médian est très faible (bien en dessous de 0,01), soit moins de 0,25 point de score : la règle
compliquerait la formule sans effet mesurable (à vérifier sur la base : médiane de
epss_score). Les 109 CVE sans EPSS sont toutes hors KEV et en P3.