EPSS - Exploit Prediction Scoring System
EPSS (Exploit Prediction Scoring System) ist ein datengetriebenes Modell von FIRST (Forum of Incident Response and Security Teams) das die Wahrscheinlichkeit berechnet, dass eine CVE innerhalb der nächsten 30 Tage aktiv in der freien Wildbahn ausgenutzt wird. EPSS ergänzt CVSS (das nur Schwere bewertet) um eine Ausnutzungswahrscheinlichkeit und ermöglicht risikoorientierte Priorisierung.
EPSS löst das größte Problem im Vulnerability Management: Priorität. Ein Unternehmen mit 5.000 offenen CVEs kann nicht alle gleichzeitig patchen. CVSS 10.0 bedeutet “maximale Schwere” - aber nicht “wird gerade aktiv ausgenutzt”. EPSS beantwortet genau diese Frage: Welche CVEs werden JETZT, diese Woche, aktiv ausgenutzt?
EPSS vs. CVSS
CVSS (Common Vulnerability Scoring System):
- Misst: technische Schwere der Schwachstelle
- Frage: “Wie schlimm wäre es WENN ausgenutzt?”
- Keine Information über Ausnutzungswahrscheinlichkeit
- Kritik: fast alle Critical CVEs haben CVSS 9.0-10.0 → keine Differenzierung
EPSS:
- Misst: Wahrscheinlichkeit der aktiven Ausnutzung in den nächsten 30 Tagen
- Frage: “Wird diese CVE WAHRSCHEINLICH ausgenutzt?”
- Skala: 0.0-1.0 (0% bis 100% Wahrscheinlichkeit)
- Täglich aktualisiert (neue Exploit-Daten fließen ein)
- Erstellt durch: FIRST (Forum of Incident Response and Security Teams)
Kombinierter Ansatz (CTEM-Standard): Priorisierung = CVSS + EPSS + Erreichbarkeit + Business Impact
| CVSS | EPSS | Exposition | Empfehlung |
|---|---|---|---|
| Hoch | Hoch | Internet-facing | SOFORT patchen! |
| Hoch | Niedrig | Intern | Regulärer Patch-Zyklus |
| Niedrig | Hoch | Internet-facing | Bald patchen (wird ausgenutzt!) |
| Niedrig | Niedrig | Intern | Niedrige Priorität |
Schlüsselstatistik: Nur 4% aller CVEs werden je aktiv ausgenutzt (FIRST-Daten) - 96% der nach CVSS priorisierten Patches wären nie nötig gewesen. EPSS identifiziert die relevanten 4% frühzeitig.
EPSS-Modell und Datenquellen
Datenquellen (Inputs):
- CVE-Metadaten (Schwere, Typ, Alter, Angreifer-Komplexität)
- Exploit-Code: ExploitDB, Metasploit, GitHub Security Advisories
- Scanningaktivität: Shodan, Shadowserver (observierte Scans)
- Darknet-Aktivität: Exploit-Verkauf, Nutzungssignale
- Security Vendor Feeds: Vendor-Meldungen über aktive Ausnutzung
ML-Modell:
- Gradient Boosting (XGBoost-ähnlich)
- ~1.500 Features pro CVE
- Training: historische Exploit-Daten (was wurde tatsächlich ausgenutzt?)
- Tägliche Neuberechnung: neue Exploits → sofortiger Score-Anstieg
- Validierung: Recall, Precision, F1-Score
EPSS Score-Interpretation:
| Score | Bedeutung |
|---|---|
| > 0.90 (90 %) | Sehr hohe Wahrscheinlichkeit - wird diese Woche genutzt! |
| 0.50-0.90 | Hohe Wahrscheinlichkeit - prioritär behandeln |
| 0.10-0.50 | Moderate Wahrscheinlichkeit - in Patch-Zyklen aufnehmen |
| 0.01-0.10 | Geringe Wahrscheinlichkeit - Standard-Priorisierung |
| < 0.01 (1 %) | Sehr geringe Wahrscheinlichkeit - niedrige Priorität |
Bekannte Beispiele:
- CVE-2021-44228 (Log4Shell): EPSS kurz nach Veröffentlichung: 0.97 (97 %) → sofort höchste Priorität - korrekte Einschätzung
- CVE-2023-22515 (Atlassian Confluence RCE): EPSS: 0.96 (96 %) nach Patch-Veröffentlichung → aktiv ausgenutzt bevor viele gepatcht hatten
EPSS-API nutzen
FIRST EPSS API (kostenlos, keine Authentifizierung):
# Einzelne CVE abfragen:
curl "https://api.first.org/data/v1/epss?cve=CVE-2021-44228"
# Mehrere CVEs gleichzeitig:
curl "https://api.first.org/data/v1/epss?cve=CVE-2021-44228,CVE-2023-22515"
# Top-100 CVEs nach EPSS-Score (!epss = absteigende Sortierung):
curl "https://api.first.org/data/v1/epss?order=!epss&limit=100"
# CVEs mit EPSS > 0.5 (50%+ Ausnutzungswahrscheinlichkeit):
curl "https://api.first.org/data/v1/epss?epss-gt=0.5"
# Historischen Score abrufen:
curl "https://api.first.org/data/v1/epss?cve=CVE-2021-44228&date=2021-12-15"
Integration in Python:
import requests
def get_epss(cve_id: str) -> dict:
r = requests.get(
f"https://api.first.org/data/v1/epss?cve={cve_id}"
)
data = r.json()["data"]
if data:
return {
"cve": cve_id,
"epss": float(data[0]["epss"]),
"percentile": float(data[0]["percentile"])
}
return {"cve": cve_id, "epss": 0.0, "percentile": 0.0}
# Vulnerability-Scan-Output anreichern:
vulnerabilities = [
{"cve": "CVE-2021-44228", "cvss": 10.0},
{"cve": "CVE-2023-1234", "cvss": 7.5},
]
for vuln in vulnerabilities:
epss_data = get_epss(vuln["cve"])
vuln["epss"] = epss_data["epss"]
vuln["priority"] = vuln["cvss"] * (1 + epss_data["epss"]) # Kombinierter Score
# Nach kombiniertem Score sortieren:
sorted_vulns = sorted(vulnerabilities, key=lambda x: x["priority"], reverse=True)
SIEM-Integration (Sentinel KQL):
SecurityAlert
| where AlertName contains "CVE"
| extend cve_id = extract("CVE-[0-9]+-[0-9]+", 0, AlertName)
| externaldata (cve: string, epss: real)
[@"https://api.first.org/data/v1/epss"] with (format="json")
| lookup (SecurityCVEs | where epss > 0.5) on cve_id
| where isnotnull(epss)
| order by epss desc
EPSS in der Praxis
Tenable.io EPSS-Integration:
- Seit 2023: EPSS-Score direkt in Tenable-UI
- Filter: “Show only CVEs with EPSS > 0.50”
- VPR (Vulnerability Priority Rating): kombiniert CVSS + EPSS + Asset-Kontext
Qualys TruRisk:
- “Exploit Maturity” basiert auf EPSS und KEV
- QDS (Qualys Detection Score): CVSS + EPSS + KEV kombiniert
Rapid7 InsightVM:
- “Real Risk Score”: integriert EPSS
- Dashboard: “Top Remediation” basierend auf EPSS + Erreichbarkeit
CISA KEV + EPSS = Goldstandard
KEV (Known Exploited Vulnerabilities) ist die Liste der CVEs die CISA als aktiv ausgenutzt bestätigt hat (“Confirmed exploitation in the wild”) - Pflicht-Patch für US-Behörden.
| Kombination | Empfehlung |
|---|---|
| KEV-listed + EPSS > 0.5 | SOFORT (heute patchen!) |
| KEV-listed + EPSS < 0.5 | Innerhalb 24h (KEV ist Pflicht!) |
| EPSS > 0.5 (kein KEV) | Innerhalb 7 Tage |
| EPSS 0.1-0.5 | Normaler Patch-Zyklus (30 Tage) |
| EPSS < 0.1 | Laut Schwere priorisieren |
# CISA KEV herunterladen:
curl https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json \
| jq '.vulnerabilities[] | {cveID, product, dateAdded}'
EPSS-Limitierungen:
- Kein Kontext: EPSS kennt nicht ob Ihr System exponiert ist
- Latenz: neuer CVE braucht Tage bis EPSS-Daten existieren
- Kein Zero-Day: nicht bekannte CVEs haben keinen EPSS-Score
- Kein Business Impact: $100k-System vs. Test-System werden gleichbehandelt
- Lösung: EPSS + Asset-Kontext + Business Impact = vollständige Priorisierung