Vulnerability Management

Complete

Overview

Vulnerability management is a critical pillar of proactive security operations. While the Alerts and Incidents modules handle real-time threat response, the Vulnerability Management module addresses the underlying attack surface — the known weaknesses in infrastructure, applications, and endpoints that adversaries can exploit before they do.

This module provides a full vulnerability lifecycle management system: asset inventory tracking, multi-scanner ingestion (Tenable, Qualys, Rapid7), risk-based prioritization using CVSS + EPSS scores with CISA Known Exploited Vulnerabilities (KEV) correlation, remediation SLA tracking with per-severity deadlines, a severity-vs-exploitability risk matrix heatmap, and trending velocity metrics (discovery rate, remediation rate, MTTR by week).

What Was Proposed

What's Built

Asset registration and inventory (hostname, IP, OS, criticality, owner, dept, tags)✓ Complete
List assets with department and criticality filters✓ Complete
Get asset by ID with associated vulnerabilities✓ Complete
Vulnerability CRUD (create via scan import, read, update status)✓ Complete
Vulnerability list with severity, status, asset_id, and CVE filters✓ Complete
Risk-based prioritization endpoint (sorted by composite risk score)✓ Complete
Severity vs exploitability risk matrix endpoint✓ Complete
Dashboard statistics endpoint (total, critical open, high open, avg risk, SLA compliance)✓ Complete
Remediation SLA compliance endpoint (per-severity tier)✓ Complete
Trending endpoint (discovery velocity, remediation velocity, MTTR by week)✓ Complete
CISA KEV status check endpoint (by CVE ID)✓ Complete
CISA KEV catalog sync (live HTTP fetch from CISA endpoint)✓ Complete
Multi-scanner import: Tenable, Qualys, Rapid7 normalization✓ Complete
CSV bulk asset import✓ Complete
Pre-loaded demo data (8 vulnerabilities, 8 assets) for dashboard display✓ Complete
Frontend: 5-column stats bar (total, critical open, high open, avg risk, SLA compliance)✓ Complete
Frontend: severity vs exploitability heatmap table✓ Complete
Frontend: SLA compliance progress bars per severity tier✓ Complete
Frontend: prioritized vulnerabilities table with CVE search, severity/status filters, sortable columns✓ Complete
Frontend: asset inventory table with drill-down to asset detail + associated vulns✓ Complete
Frontend: three mini bar chart trend sparklines (discovery, remediation, MTTR)✓ Complete

Architecture

Backend Service: VulnerabilityManager

File: app/services/vulnerability_mgmt.py — The VulnerabilityManager class is instantiated as a singleton (vuln_manager) at module import time. It holds two in-memory dictionaries (assets and vulnerabilities) and a KEV catalog dict that is populated via async HTTP fetch from CISA. Demo data is loaded in __init__ via _load_demo_data().

Key Methods

MethodDescription
register_asset(asset)Adds an asset to the in-memory dict and logs registration
list_assets(department, criticality)Returns filtered list of all assets
get_asset(asset_id)Returns a single Asset or None
import_assets_from_csv(csv_data)Bulk import from CSV text with expected columns: hostname, ip, os, criticality, owner, department, tags
list_vulnerabilities(severity, status, asset_id, cve_id)Filtered list of Vulnerability objects
get_vulnerability(vuln_id)Single vulnerability by ID or None
update_status(vuln_id, status, notes, assigned_to)Updates status, appends note, sets assigned_to, updates timestamps
prioritize_vulnerabilities()Returns open/in-progress vulns sorted by composite risk_score descending
get_risk_matrix()Builds severity x exploitability count matrix for heatmap
get_vuln_stats()Dashboard stats: total, critical_open, high_open, avg_risk_score, sla_compliance
get_sla_compliance()Per-severity SLA compliance percentage and overdue count based on SLA_DAYS thresholds
get_trending()Weekly discovery velocity, remediation velocity, and MTTR trend data
ingest_scan_results(scanner_type, results)Normalizes and ingests results from Tenable, Qualys, or Rapid7 scan outputs
check_kev_status(cve_id)Returns KEV catalog entry if present, or a "not found" dict
sync_kev_catalog()Async HTTP GET to CISA KEV JSON feed, populates kev_catalog dict, returns sync result

Remediation SLA Thresholds

SLA_DAYS = {
    "critical": 15,   # Must remediate within 15 days of discovery
    "high":     30,   # Must remediate within 30 days
    "medium":   90,   # Must remediate within 90 days
    "low":      180,  # Must remediate within 180 days
}

CISA KEV Integration

The KEV (Known Exploited Vulnerabilities) catalog is fetched from https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json using httpx.AsyncClient. The catalog is stored in vuln_manager.kev_catalog as a dict keyed by CVE ID. Vulnerabilities with cisa_kev=True receive an elevated risk priority in the prioritization sort. The catalog sync records a timestamp in kev_last_sync.

Scanner Normalization

The ingest_scan_results method accepts three scanner types and maps their field names to the internal Vulnerability dataclass. This allows raw scan output from different tools to be stored in a unified schema:

ScannerCVE FieldCVSS FieldDescription Field
Tenableplugin_name / CVEcvss_base_scoresynopsis
QualysQID / CVE_IDCVSS_SCORETITLE
Rapid7cve_id / titlecvss_scoredescription

API Endpoints

All endpoints are defined in app/routers/vulnerability.py under the prefix /api/v1.

Vulnerability Endpoints

GET  /api/v1/vulnerabilities
     # List all vulns with optional filters
     # Query params: severity, status, asset_id, cve_id, skip=0, limit=100

GET  /api/v1/vulnerabilities/prioritized?limit=50
     # Active vulns sorted by risk_score descending

GET  /api/v1/vulnerabilities/risk-matrix
     # Severity vs exploitability count matrix for heatmap

GET  /api/v1/vulnerabilities/stats
     # Dashboard stats: total_vulns, critical_open, high_open, avg_risk_score, sla_compliance

GET  /api/v1/vulnerabilities/sla
     # Remediation SLA compliance per severity tier (15/30/90/180 day thresholds)

GET  /api/v1/vulnerabilities/trending
     # Weekly discovery_velocity, remediation_velocity, mttr_trend data points

GET  /api/v1/vulnerabilities/kev/{cve_id}
     # Check if a CVE ID is in the CISA KEV catalog (case-insensitive, normalized to uppercase)

GET  /api/v1/vulnerabilities/{vuln_id}
     # Get a single vulnerability by ID (404 if not found)

PATCH /api/v1/vulnerabilities/{vuln_id}
     # Update status, notes, assigned_to
     # Body: VulnStatusUpdate { status, notes?, assigned_to? }
     # Valid statuses: open | in_progress | remediated | accepted | risk_accepted
     # 400 on invalid status, 404 if not found

Scanner Integration

POST /api/v1/vulnerabilities/scan/import
     # Import and normalize scan results
     # Body: ScanImport { scanner_type: "tenable|qualys|rapid7", results: [...] }
     # Returns: { status, scanner, vulnerabilities_processed, total_tracked }

POST /api/v1/vulnerabilities/kev/sync
     # Sync CISA KEV catalog (async HTTP fetch from CISA)
     # Returns: { synced: bool, count: int, last_sync: ISO timestamp }

Asset Endpoints

POST /api/v1/assets                             (HTTP 201)
     # Register a new asset
     # Body: AssetCreate { hostname, ip, os?, criticality?, owner?, department?, tags? }

GET  /api/v1/assets
     # List all assets with optional filters
     # Query params: department, criticality, skip=0, limit=100

GET  /api/v1/assets/{asset_id}
     # Get asset with associated vulnerability list
     # Returns: Asset fields + vulnerability_count + vulnerabilities: [...]
     # 404 if not found

Routing

LayerPathDescription
/vulnerabilitiesFrontend route (Next.js App Router)Main vulnerability management page
/vulnerabilities/[id]Frontend route (Next.js App Router)Individual vulnerability detail page
/vulnerabilities/remediationFrontend route (Next.js App Router)Remediation tracking sub-page
/vulnerabilities/scannersFrontend route (Next.js App Router)Scanner integration management sub-page
/api/v1/vulnerabilitiesAPI prefix (FastAPI router)All vulnerability endpoints
/api/v1/assetsAPI prefix (FastAPI router)Asset inventory endpoints

Data Model

The Vulnerability Management module uses in-memory Python dataclasses. No SQLAlchemy ORM tables are used for this module. Data is pre-seeded with realistic demo entries on startup.

Asset Dataclass

FieldTypeDescription
idstrAuto-generated: asset-{8 hex chars}
hostnamestrAsset hostname (e.g. "WEB-PROD-01")
ipstrIP address (e.g. "10.1.2.15")
osstrOperating system string (e.g. "Ubuntu 22.04")
criticalitystrlow / medium / high / critical
ownerstrResponsible user or team (default: "unassigned")
departmentstrDepartment name (default: "IT")
tagslist[str]Descriptive tags for categorization
last_scanstr or NoneISO 8601 timestamp of last vulnerability scan

Vulnerability Dataclass

FieldTypeDescription
idstrAuto-generated UUID prefix (e.g. "vuln-abc12345")
cve_idstrCVE identifier (e.g. "CVE-2026-0217")
titlestrHuman-readable vulnerability title
descriptionstrTechnical description of the vulnerability
cvss_scorefloatCVSS v3 base score (0.0-10.0)
epss_scorefloatEPSS exploitability probability score (0.0-1.0)
cisa_kevboolWhether this CVE is in the CISA Known Exploited Vulnerabilities catalog
affected_assetslist[str]List of asset IDs affected by this vulnerability
severitystrcritical / high / medium / low (derived from CVSS)
statusstropen / in_progress / remediated / accepted / risk_accepted
remediation_deadlinestr or NoneISO 8601 deadline based on SLA_DAYS thresholds from discovery date
assigned_tostr or NoneUsername or team assigned for remediation
discovered_atstr or NoneISO 8601 timestamp when vulnerability was first discovered
remediated_atstr or NoneISO 8601 timestamp when remediation was confirmed
noteslist[dict]Audit log of status changes with timestamps and notes text
risk_scorefloatComposite risk score (0-100) used for prioritization sort. Combines CVSS (weight 40%), EPSS (weight 35%), KEV flag (weight 25%).

Demo Data (pre-loaded)

CVE IDTitleCVSSEPSSKEVRisk
CVE-2026-0217RCE in Apache Struts9.80.94Yes98
CVE-2026-1034SQL Injection in Custom Web App9.10.72No92
CVE-2025-48271Priv Esc in Windows Print Spooler8.80.88Yes89
CVE-2026-0089OpenSSL Buffer Overflow8.60.65Yes85
CVE-2026-0445Auth Bypass in Fortinet FortiOS9.30.91Yes96
CVE-2025-51122XSS in Confluence Server7.50.41No72
CVE-2025-49901DoS in Nginx6.50.22No48
CVE-2026-0812Info Disclosure in Exchange Server7.10.53No68

Prerequisites

UI Layout

Page Sections (top to bottom)