Why This Keeps Happening
- Lockfiles get committed once and rarely revisited.A dependency pinned at install time doesn't update itself - if nothing in your workflow prompts a review, it just sits there.
- Most of the risk is transitive.A CVE in a package three levels deep in your dependency tree still runs in your app, and you likely have no direct awareness it's even installed.
- Upgrade fear.Bumping a major version risks breaking changes, so teams delay - and the gap between "vulnerable" and "patched" widens.
How to Find What's Actually Vulnerable
1npm audit
2# or
3yarn audit
4# or
5pnpm auditThis surfaces known CVEs by severity, along with the vulnerable version range and (when available) the patched version to upgrade to.
A Practical Triage Process
1. Sort by severity and reachability, not just count
A hundred low-severity findings in a devDependency matter less than one critical finding in a package your production request path actually calls into.
2. Fix the minimum version bump that resolves it
1npm install some-package@^2.4.1 # the version the advisory says is fixed3. Re-test after upgrading
A version bump that fixes a CVE can still introduce a regression - run your existing test suite before shipping the update, not just the audit re-check.
4. Automate this instead of doing it quarterly
Wire a dependency scan into CI on every pull request so a new CVE in an existing dependency (or one introduced by a new package) gets caught before merge, not discovered months later during a cleanup pass.
How Scanverra Detects This
Scanverra's repo scanner parses your project's dependency manifests and lockfiles, cross-references every direct and transitive package against known CVE data, and reports each vulnerable dependency with its severity and the version that resolves it - as part of the same scan that also runs SAST, secrets detection, and code quality checks.