Key Takeaways
- Spreadsheets break down past ~50 vulnerabilities — use DefectDojo or Jira for tracking
- Group vulnerabilities by remediation action, not by CVE (100 NGINX CVEs = 3 patch actions)
- Define SLA deadlines: Critical 48hr, High 7d, Medium 30d, Low 90d
- Always re-scan after patching to verify the fix — never close findings on trust alone
- Assign every finding an owner — unowned vulnerabilities never get fixed
Why Spreadsheets Break Down
The Problem at Scale
Here's what typically goes wrong when teams outgrow spreadsheets:
| Problem | What Happens | Impact |
|---|---|---|
| No SLA tracking | Critical vulns sit for months with no escalation | Audit failures, breach risk |
| No deduplication | Same CVE appears 50 times across scan imports | Inflated counts, wasted effort |
| No owner assignment | Findings exist but nobody is accountable | Vulns never get fixed |
| No re-scan verification | Admin says "done" but the vuln persists | False sense of security |
| Manual data entry | Copy-paste errors, stale data, version conflicts | Decisions based on bad data |
Free Tools for Vulnerability Tracking
DefectDojo (Recommended)
Quick Setup
# Clone and start with Docker Compose
git clone https://github.com/DefectDojo/django-DefectDojo.git
cd django-DefectDojo
# Start DefectDojo (first run takes ~5 min)
docker compose up -d
# Access at http://localhost:8080
# Default credentials: admin / admin
# CHANGE THE PASSWORD IMMEDIATELY
Why DefectDojo Wins
- Auto-import: Upload Nessus, Qualys, Burp, OWASP ZAP, Trivy, Nuclei, and 150+ other formats
- Deduplication: Merges duplicate findings across multiple scans automatically
- Owner assignment: Assign findings to teams or individuals with due dates
- SLA enforcement: Configure per-severity deadlines with escalation alerts
- Re-scan verification: Re-import a scan and DefectDojo auto-closes verified fixes
- API-first: Full REST API for CI/CD integration
# Import scan results via API
curl -X POST "http://localhost:8080/api/v2/import-scan/" \
-H "Authorization: Token YOUR_API_TOKEN" \
-F "scan_type=Nessus Scan" \
-F "file=@nessus_results.csv" \
-F "engagement=1" \
-F "verified=false"
Jira / ServiceNow Integration
If your org already uses Jira or ServiceNow, pipe scan results into your existing ticketing system instead of building a separate workflow.
Jira Approach
# Create Jira tickets from scan findings (Python example)
from jira import JIRA
jira = JIRA(server="https://yourorg.atlassian.net",
basic_auth=("email", "api_token"))
for finding in critical_findings:
jira.create_issue(
project="VULN",
summary=f"[{finding['severity']}] {finding['title']}",
description=f"Asset: {finding['host']}\n"
f"CVE: {finding['cve']}\n"
f"Remediation: {finding['fix']}",
issuetype={"name": "Bug"},
priority={"name": "Highest"},
assignee={"accountId": finding['owner_id']},
)
OWASP Dependency-Track
For software composition analysis (SCA) specifically, Dependency-Track monitors your SBOM for new CVEs and tracks remediation status per component.
# Run Dependency-Track with Docker
docker compose up -d
# Upload SBOM via API
curl -X PUT "http://localhost:8081/api/v1/bom" \
-H "X-Api-Key: YOUR_KEY" \
-H "Content-Type: application/vnd.cyclonedx+json" \
-d @sbom.json
- Monitors CycloneDX and SPDX SBOMs continuously
- Alerts when new CVEs affect your dependencies
- Policy engine for auto-flagging based on severity, CVSS, license
- Pairs well with DefectDojo for a complete vulnerability management stack
Group by Remediation Action, Not CVE
The "100 CVEs = 3 Actions" Insight
Example: NGINX Vulnerability Report
| Remediation Action | CVEs Fixed | Owner | Effort |
|---|---|---|---|
| Update NGINX to 1.27.x | 72 CVEs | Infra Team | 1 change window |
| Update OpenSSL to 3.2.x | 23 CVEs | Infra Team | Same window |
| Disable SSLv3 / weak ciphers | 5 CVEs | Security Team | Config change |
When you hand an admin a spreadsheet with 100 rows of CVE-XXXX-XXXXX, they freeze. When you hand them 3 actionable tasks with clear owners, things get done.
How to Group Findings
# Group Nessus findings by solution (Python pseudocode)
from collections import defaultdict
groups = defaultdict(list)
for finding in scan_results:
# Use the "solution" or "fix" field as the grouping key
action = finding.get("solution", "Manual review needed")
groups[action].append(finding)
for action, findings in groups.items():
print(f"ACTION: {action}")
print(f" Fixes {len(findings)} CVEs")
print(f" Highest severity: {max(f['cvss'] for f in findings)}")
print()
The Remediation Workflow
7-Step Lifecycle
- Discover — Run scheduled scans (Nessus, Qualys, Trivy, etc.) and import results into your tracker
- Prioritize — Rank by CVSS + asset criticality + exploitability (CISA KEV, EPSS score)
- Assign — Every finding gets an owner and an SLA deadline. No owner = no accountability = no fix
- Remediate — Owner applies the patch, config change, or compensating control
- Re-scan — Run the same scanner against the same target to confirm the fix
- Verify — Compare re-scan results. Finding gone = verified. Still present = reopen
- Close — Mark as resolved with evidence (scan diff, change ticket, deployment record)
SLA Framework
Remediation Deadlines by Severity
| Severity | CVSS Range | SLA Deadline | Escalation |
|---|---|---|---|
| Critical | 9.0 – 10.0 | 48 hours | CISO after 24hr |
| High | 7.0 – 8.9 | 7 days | Director after 5d |
| Medium | 4.0 – 6.9 | 30 days | Manager after 21d |
| Low | 0.1 – 3.9 | 90 days | Quarterly review |
Exception Handling
Not every vuln can be fixed on time. Document exceptions formally:
- Risk acceptance: Business owner signs off that the risk is acceptable (with justification)
- Compensating control: WAF rule, network segmentation, or monitoring mitigates the risk
- Vendor dependency: Patch not yet available — track vendor advisory for release date
- End of life: System can't be patched — create migration plan with timeline
Remediation Lifecycle Checklist
Track Your Progress
Phase 1: Setup & Tooling
Phase 2: Discovery & Import
Phase 3: Prioritization & Assignment
Phase 4: Remediation
Phase 5: Verification & Closure
Frequently Asked Questions
What is the best free tool for tracking vulnerability remediation?
DefectDojo is the leading open-source vulnerability management platform. It imports scan results from 150+ tools, assigns owners, tracks SLA deadlines, deduplicates findings, and auto-verifies fixes on re-scan. It replaces spreadsheets for teams of any size.
How do I manage 100+ vulnerabilities without losing track?
Group vulnerabilities by remediation action instead of tracking each CVE individually. For example, 100 NGINX CVEs may only require 3 patch actions (update NGINX, update OpenSSL, change a config). This reduces your tracking workload by 90% and gives admins clear, actionable tasks.
What SLA timeframes should I use for vulnerability remediation?
A common SLA framework is: Critical severity within 48 hours, High within 7 days, Medium within 30 days, and Low within 90 days. Adjust based on your organization's risk tolerance, but document the policy and enforce it consistently with automated tracking.
Related Resources
FixTheVuln Store
Patch Tuesday Sprint Kit
Fillable PDF study planners with domain trackers, weekly schedules, and progress tracking. Available in Standard, ADHD-Friendly, Dark Mode, and 4-Format Bundle.
Try Free Templates5 fillable templates for vulnerability management — $4.99/mo