You didn't write the vulnerable code, but you shipped it anyway - a known CVE sitting in a dependency (often one you never installed directly) is one of the most common ways production applications actually get breached.
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
This 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
3. 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.