Dependency CVE triage
Twelve alerts on Monday morning are not twelve emergencies. This skill sorts them by whether the vulnerable code can run in this application.
When to use
- On the output of
composer audit,npm audit,pip-audit, or a Dependabot digest. - Before a security questionnaire that asks about open CVEs.
Input
The alert list (package, version, advisory id, severity, fixed version), the lockfile, and read access to the code (to check reachability).
Process — per alert
- What is vulnerable: from the advisory text, the function or feature, and the condition (attacker-controlled input? specific config?).
- Reachable? Is the package a direct or transitive dependency, and does the app call the vulnerable code path? Grep for the imports/functions the advisory names. Transitive + unreachable is the common case.
- Exploitable here? Does the app pass untrusted input into that path? Is the vulnerable feature enabled?
- Fix cost: is the fixed version a patch/minor (cheap) or a major (a planned upgrade)?
- Decision: fix now (reachable + exploitable, or trivial patch), schedule (reachable but not exploitable, or major bump), accept with note (unreachable; record why, revisit on next upgrade).
Rules
- Severity scores are a starting point, not a decision. A critical CVE in an unreachable path is a note; a medium one in the request path is a fix.
- Write the reachability evidence (the grep, the file) — "not used" must be checkable.
- Never recommend disabling the audit or ignoring an advisory without a written reason and a revisit date.
- Do not include exploit details beyond what the advisory states.
Output format
## 12 alerts → 2 fix now · 4 schedule · 6 accept
### Fix now
- **guzzlehttp/psr7 < 2.6.3 — header injection (GHSA-…)** · direct dep · reachable: webhook sender builds headers from user config (app/Services/Webhook.php:52) · fix: patch bump → run suite.
### Schedule
- **symfony/http-foundation — session fixation** · reachable · not exploitable: sessions regenerate on login (AuthController) · fix is minor bump; take it with next release.
### Accept (revisit 2026-10)
- **phpunit/phpunit — XML external entity** · dev-only, never runs in production.
License
MIT