It's Tuesday morning. CISA publishes CVE-2025-XXXXX, a critical vulnerability in a widely-used logging library. Your phone starts buzzing.
Question: "Are we affected by this vulnerability, and if so, how bad is it?"
Old approach (6 hours):
- Check NVD for details
- Search your infrastructure for the affected package
- SSH into servers and grep logs for library versions
- Check deployment manifests for the package
- Manually estimate blast radius
- Escalate to five different teams for patch verification
- Hope you didn't miss any services
New approach with SBOM (under 10 minutes):
- Check CISA KEV — is this actively exploited? (2 min)
- Query your SBOM inventory — which services contain this library? (3 min)
- Map SBOMs to deployed artifacts — which production pods are affected? (3 min)
- Decide: targeted patch vs. full rollback (2 min)
- Execute remediation
This is not theoretical. This is how security teams that have achieved SBOM coverage operate.
The 10-Minute Triage Workflow
Step 1: CISA KEV Check (2 minutes)
When a CVE is announced, your first action is: "Is this on CISA's Known Exploited Vulnerabilities list?"
{/* TODO: refresh KEV count quarterly — last verified 1,587 as of 2026-05-04 via https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json */} As of May 2026, CISA's KEV catalog contains 1,587 confirmed exploited vulnerabilities.
# Download the latest KEV catalog
curl -s "https://www.cisa.gov/sites/default/files/json/known_exploited_vulnerabilities.json" \
| jq '.vulnerabilities[] | select(.cveID == "CVE-2025-XXXXX")' \
> kev_entry.json
# If result is empty, it's not actively exploited (yet)
# If result has data, CISA has confirmed active exploitation
cat kev_entry.json | jq '.'
# {
# "cveID": "CVE-2025-XXXXX",
# "vendor": "LogCorp",
# "product": "LogService",
# "vulnerabilityName": "Remote Code Execution in Log Parsing",
# "dateAdded": "2026-04-28",
# "requiredAction": "Apply updates per vendor instructions.",
# "dueDate": "2026-05-12",
# "notes": "Active exploitation confirmed as of April 27, 2026."
# }
Signal: CISA lists it. Due date: 14 days (May 12), per CISA BOD 22-01 — FCEB internet-facing systems get 15 days, all other FCEB systems get 25 days. This is CRITICAL — escalate to immediate response.
If CISA does NOT list it, reassess: Is it in your SBOM? Is it production-facing? Only then do you escalate.
Step 2: SBOM Query — Find Affected Services (3 minutes)
Your organisation has generated SBOMs for every service during build time. Now query them against the CVE:
# Query all SBOMs for the affected package and version range
sbom-query-tool \
--sbom-dir /sboms/production/ \
--package-name "logging-lib" \
--version-range "2.0.0:2.31.0" \
--output json > affected_services.json
cat affected_services.json
# [
# {
# "service": "payment-api",
# "image": "gcr.io/myorg/payment-api:v1.24.3",
# "sbom_digest": "sha256:abc123...",
# "package_version": "[email protected]",
# "risk_level": "CRITICAL"
# },
# {
# "service": "analytics-service",
# "image": "gcr.io/myorg/analytics:v3.2.1",
# "sbom_digest": "sha256:def456...",
# "package_version": "[email protected]",
# "risk_level": "CRITICAL"
# },
# {
# "service": "internal-logs",
# "image": "gcr.io/myorg/internal-logs:v0.9.2",
# "sbom_digest": "sha256:xyz789...",
# "package_version": "[email protected]",
# "risk_level": "LOW"
# }
# ]
Key insight: Three services are affected. Two are critical. One is low-risk (older version, not listed in CVE range).
Step 3: Map to Production Deployments (3 minutes)
You know which services are affected. Now find where they're running:
# Query your deployment tracking system or Kubernetes
kubectl get deployments -A \
-o jsonpath='{range .items[*]}{.spec.selector.matchLabels.app}{"\t"}{.spec.template.spec.containers[*].image}{"\n"}{end}' \
| grep -E "payment-api|analytics-service|internal-logs"
# payment-api gcr.io/myorg/payment-api:v1.24.3 (1 replicas, production)
# analytics-service gcr.io/myorg/analytics:v3.2.1 (5 replicas, production)
# internal-logs gcr.io/myorg/internal-logs:v0.9.2 (2 replicas, staging only)
# Count affected pods
kubectl count pods -A -l "app in (payment-api, analytics-service)" \
-n production
# 6 pods running production-critical services
Blast radius: 6 production pods, 2 services. Payment processing and analytics are at risk.
Step 4: Remediation Decision (2 minutes)
Options:
Option A: Targeted Patch
- Patch the affected libraries in place
- Rebuild affected services
- Canary deploy new versions
- Verification time: 20–30 minutes
Option B: Immediate Rollback
- Revert to previous known-good version
- Zero verification time
- Risk: Old version might have other issues
Decision logic:
IF (CVE on CISA KEV) AND (actively exploited) AND (6+ prod pods) THEN
→ OPTION B: Immediate rollback (faster)
ELSE IF (affects 1-2 pods) AND (not on KEV) THEN
→ OPTION A: Targeted patch (safer)
ELSE
→ Consult on-call security + engineering
For this case: Option B. This is on CISA KEV with active exploitation. Revert payment-api and analytics-service to previous known-good version.
Step 5: Execute and Verify (automated)
# Rollback payment-api
kubectl rollout undo deployment/payment-api -n production
kubectl rollout status deployment/payment-api -n production
# Rollback analytics-service
kubectl rollout undo deployment/analytics-service -n production
kubectl rollout status deployment/analytics-service -n production
# Verify: confirm old versions are running
kubectl get pods -n production \
-l "app in (payment-api, analytics-service)" \
-o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
# Confirm no CVE-2025-XXXXX in running artifacts
sbom-query-tool \
--running-pods \
--package-name "logging-lib" \
--version-range "2.0.0:2.31.0" \
--output json
# If empty result: vulnerable packages are removed ✓
Total time: 10 minutes from CISA alert to remediation complete.
Tooling Requirements
This workflow requires:
-
SBOM generation at build time
- Syft, cdxgen, or OWASP Dependency-Track
- Generate CycloneDX format
- Store SBOM digest alongside artifact
-
SBOM inventory query tool
- Examples: Dependency-Track API, custom Python script, or commercial SBOM management
- Must support fast queries across hundreds of SBOMs
-
Deployment tracking integration
- Kubernetes native queries (kubectl), or
- Custom deployment database, or
- Observability platform (Datadog, New Relic) with inventory APIs
-
Rollback capability
- GitOps (ArgoCD, Flux): revert commit, auto-redeploy
- Manual:
kubectl rollout undo, re-run deployment job - Must be testable (use staging for fire drills)
Common Pitfalls
Pitfall 1: SBOM Not Updated with Agent-Authored Changes
If an autonomous AI agent adds a new dependency without updating the SBOM, your CVE query will miss it.
Mitigations:
- Regenerate SBOMs on every commit (not just releases)
- Use lock files (package-lock.json, Cargo.lock, requirements.txt)
- SBOM generation should be mandatory CI step, not optional
Pitfall 2: Running Artifacts Drift from Deployed Artifacts
You patched and redeployed, but the old pod is still running because rollout got stuck.
Mitigations:
- Automated pod eviction after successful rollout (kubectl delete)
- Healthcheck gates: don't mark rollout complete until pods are confirmed healthy
- Monitor for drift: compare deployed image vs. running image continuously
Pitfall 3: Transitive Dependency Not in SBOM
The CVE affects [email protected], but your service's SBOM lists it as a transitive dependency of another package. Query misses it.
Mitigations:
- Use full-recursion SBOM generation (not just direct dependencies)
- Include all transitive dependencies with their own versions
- SBOM tools like Syft and cdxgen handle this correctly if configured
Pitfall 4: Multiple Versions of the Same Package
Your monorepo has three services, each with different versions of the same library (2.28.5, 2.31.0, 2.20.0). You only patch one version.
Mitigations:
- SBOM query must specify version ranges, not exact matches
- Decision: "patch all versions" vs. "patch only affected range"
- For CISA KEV, typically "patch all versions" is correct
Measuring Success
Track these metrics:
- Time to understand scope: From CVE alert to "we know which pods are affected" (target: 5 minutes)
- Time to remediate: From decision to rollback/patch complete (target: 10 minutes)
- False alarm rate: SBOM queries that identify services as affected but aren't (target: <5%)
- Coverage: % of production artifacts with SBOMs (target: 100%)
Sonatype 2024 research shows that organisations with SBOM practices achieve 264-day reduction in MTTR for vulnerability response. The 10-minute triage process is how that metric becomes real.