Skip to main content

03 - Prioritization and EPSS Scoring

Prioritization is the heart of Risk-Based Vulnerability Management (RBVM). With organizations facing thousands of vulnerabilities, you must determine what to fix first.

The Fallacy of CVSS Alone​

The Common Vulnerability Scoring System (CVSS) provides a standard way to assess the technical severity of a vulnerability. However:

  • CVSS is static. It does not change over time based on threat actor behavior.
  • CVSS assumes the worst-case scenario.
  • Relying solely on CVSS 7.0+ (High/Critical) forces teams to patch vulnerabilities that have never been exploited in the wild, wasting resources.

The Modern Prioritization Stack: KEV + EPSS​

To prioritize effectively, combine CVSS with real-world threat intelligence.

1. CISA KEV (Known Exploited Vulnerabilities)​

The Cybersecurity and Infrastructure Security Agency (CISA) maintains a catalog of CVEs that are confirmed to be actively exploited in the wild.

  • Rule of Thumb: If a vulnerability is on the KEV list, it is an immediate patching priority, regardless of its CVSS score.

2. EPSS (Exploit Prediction Scoring System)​

Managed by FIRST (the same organization behind CVSS), EPSS provides a dynamic, data-driven probability (from 0% to 100%) that a vulnerability will be exploited in the wild within the next 30 days.

  • It analyzes threat intelligence, dark web chatter, exploit kits, and honeypots.
  • Example: A CVSS 9.8 vulnerability with an EPSS of 0.01% (highly unlikely to be exploited) vs. a CVSS 6.5 vulnerability with an EPSS of 85% (highly likely to be exploited). Patch the 85% EPSS first!

The Prioritization Matrix​

You can build a powerful prioritization framework by combining these metrics:

Priority TierCriteriaAction SLA
P0 (Critical)CISA KEV listed OR EPSS > 50%24 - 48 Hours
P1 (High)EPSS > 20% OR (CVSS > 9.0 on Internet-Facing Asset)7 - 14 Days
P2 (Medium)CVSS > 7.0 + High Asset Criticality30 Days
P3 (Low)Standard CVSS findings, low EPSS90 Days / Next Cycle

Working Python API Scripts: Fetching EPSS Data​

You can query the free FIRST API to fetch the latest EPSS scores for a list of CVEs.

import requests
import json

def get_epss_scores(cve_list):
"""
Fetches EPSS scores for a list of CVEs using the FIRST API.
"""
# EPSS API endpoint
url = "https://api.first.org/data/v1/epss"

# Format CVEs as a comma-separated string
cve_query = ",".join(cve_list)
params = {"cve": cve_query}

try:
response = requests.get(url, params=params)
response.raise_for_status()
data = response.json()

results = {}
if "data" in data:
for item in data["data"]:
cve = item["cve"]
epss = float(item["epss"]) * 100 # Convert to percentage
percentile = float(item["percentile"]) * 100
results[cve] = {"epss_prob": epss, "percentile": percentile}

return results
except Exception as e:
print(f"Error fetching EPSS data: {e}")
return None

# Example Usage
cves_to_check = ["CVE-2021-44228", "CVE-2023-38831", "CVE-2019-0708"]
scores = get_epss_scores(cves_to_check)

print("EPSS Scores:")
print("-" * 40)
for cve, data in scores.items():
print(f"{cve}: Probability: {data['epss_prob']:.2f}% | Percentile: {data['percentile']:.2f}")

Expected Output​

EPSS Scores:
----------------------------------------
CVE-2021-44228: Probability: 97.54% | Percentile: 100.00
CVE-2023-38831: Probability: 88.12% | Percentile: 98.45
CVE-2019-0708: Probability: 95.31% | Percentile: 99.80