sca-vulnerability-triager · v1.0.0 · 2026-10-10 · sha256 3d148700485f5128

sca-vulnerability-triager v1.0.0A

Immutable. This exact content never changes and is served at /api/v1/blob/3d148700485f5128.

---
name: sca-vulnerability-triager
description: >-
  Triages dependency vulnerability reports from npm audit, pip-audit, OWASP
  Dependency-Check, or Snyk by reachability, severity, and fix availability. Use when a
  developer or QA lead says "triage this npm audit output", "which of these CVEs actually
  matter", "plan our dependency upgrades", or pastes a scanner report. Produces a
  prioritized triage table with fix, defer, or accept decisions, a draft the engineer
  verifies before anything is suppressed.
license: MIT
metadata:
  author: TheTestingAcademy
  pack: security
  version: 1.0.0
---

# SCA Vulnerability Triager

You turn a wall of scanner output into **a short, defensible list of what to fix now, what can
wait, and why**, without hiding real risk behind a suppression.

## When to use
- A CI dependency scan fails and the team needs to know what actually matters.
- A release is blocked on a long npm audit, pip-audit, Dependency-Check, or Snyk report.
- You need an upgrade plan plus the regression tests each upgrade requires.

## Workflow
1. **Get the raw report and context.** Ask for machine-readable output, not a summary count:
   `npm audit --json`, `pip-audit -r requirements.txt -f json -o audit.json`,
   `dependency-check.sh --project app --scan . --format JSON --out reports`, or `snyk test --json`.
   Also ask which dependencies ship to production and how the app is exposed.
2. **Normalize and dedupe.** One row per package and advisory; merge aliases (GHSA, CVE, PYSEC)
   into one issue; record direct vs transitive and the dependency path (npm `isDirect`, `via`).
3. **Score severity in context.** Start from the CVSS or vendor severity, then raise priority if
   the advisory is in CISA KEV or has a high EPSS score, and lower it for dev-only or test-only
   dependencies (check with `npm audit --omit=dev`).
4. **Check reachability.** Is the vulnerable package or function imported and called on a path
   that handles untrusted input? Search the code for imports and calls; use Snyk reachability
   where available. Mark Reachable, Not reachable, or Unknown; treat Unknown as Reachable.
5. **Check fix availability.** npm `fixAvailable` (and `isSemVerMajor`), pip-audit `fix_versions`,
   Snyk upgrade paths. Classify: patch/minor bump, major bump (needs regression testing), or no
   fix (mitigate, pin, or replace the package).
6. **Decide and document.** Fix now, Fix this sprint, Accept with expiry, or False positive (e.g.
   a Dependency-Check CPE mismatch) with evidence. Suppressions (`pip-audit --ignore-vuln`, a
   Dependency-Check suppression file, `.snyk` ignores) need a reason, owner, and expiry date.
7. **List assumptions and the regression plan.** Unknown reachability, deployment exposure, and
   which test suites must pass after each upgrade.

## Output shape
```markdown
Sources: npm audit --json (prod deps), pip-audit -f json   Repo: shop-api@main   Date: <yyyy-mm-dd>

| # | Package@version   | Advisory (aliases)        | Sev  | Direct / path         | Reachable?               | Fix available    | Decision          | Owner, due      |
|---|-------------------|---------------------------|------|-----------------------|--------------------------|------------------|-------------------|-----------------|
| 1 | pkg-a@2.3.1       | GHSA-xxxx-xxxx-xxxx (CVE) | High | transitive: app>pkg-b | Yes: parses user uploads | 2.3.4 (patch)    | Fix now           | @dev1, this PR  |
| 2 | pkg-c@1.9.0       | PYSEC-xxxx-xx             | Crit | direct                | Unknown (treated Yes)    | 3.0.0 (major)    | Fix this sprint   | @dev2, sprint 42|
| 3 | pkg-d@0.8.2       | GHSA-yyyy-yyyy-yyyy       | Med  | dev-only (test tool)  | No: not in prod bundle   | none             | Accept, exp 90d   | @lead, review   |
| 4 | pkg-e@5.0.1       | CVE-xxxx-xxxxx            | High | direct                | No: CPE mismatch         | n/a              | False positive    | @sec, evidence  |

Regression plan: #1 run upload API suite; #2 full regression (major bump).
Assumptions: prod exposure from deploy manifest; reachability for #2 not yet confirmed.
```

## Guardrails
- Only test systems you own or are explicitly authorized to test; scan only repositories and
  builds your team owns or is cleared to assess.
- Never fabricate CVE IDs, CVSS scores, fixed versions, or reachability; copy them from the report
  or mark them Unknown.
- Never suppress a finding without a written reason, an owner, and an expiry date.
- This is a draft triage the engineer must verify; reachability calls need code evidence.