Software Composition Analysis: A Complete Guide to Dependency Scanning
The average modern application is mostly other people's code - a typical package.json pulls in dozens of direct dependencies, which in turn pull in hundreds more you never explicitly chose. Software Composition Analysis is the practice of actually knowing what's in that pile.
What SCA Actually Checks
- Known vulnerabilities (CVEs) in every direct and transitive dependency, matched against public vulnerability databases.
- License compliance - flagging dependencies under licenses incompatible with how you intend to distribute your software.
- Outdated versions, even absent a known CVE, since older versions accumulate unpatched issues over time.
- Dependency provenance in more advanced tooling - detecting typosquatted package names or suspicious recent maintainer changes.
Why Transitive Dependencies Are the Real Risk Surface
You reviewed the handful of packages you added directly. You almost certainly didn't review the hundred-plus packages those packages depend on - yet a CVE in any of them ships in your bundle and runs in your application exactly the same way. This is the specific gap SCA tooling closes: it walks the full dependency tree, not just your explicit package.json entries.
A Practical Remediation Workflow
1. Run an audit and sort by severity and reachability
Not every CVE in your tree is equally urgent - a critical vulnerability in a package your request path actually executes matters more than a hundred low-severity findings in a build-time tool that never runs in production.
2. Fix the minimum version bump that resolves it
Target the specific patched version the advisory names rather than jumping straight to the latest major release, which can introduce unrelated breaking changes you now have to absorb at the same time.
3. Re-run your test suite, not just the audit
A version bump that resolves a CVE can still regress functionality - the audit passing isn't the same signal as the application still working correctly.
4. Automate it in CI, not as a quarterly cleanup task
A dependency scan wired into every pull request catches a new CVE (or a newly-added vulnerable package) before merge, rather than discovering a pile of them months later during a dedicated cleanup pass - by which point the fix is a much larger, riskier batch of changes.
What to Do When There's No Fixed Version Yet
First check whether the vulnerable code path is actually reachable given how you use the package - some CVEs apply only to specific functions or configurations. If it is reachable and genuinely unpatched, evaluate an actively maintained fork or an alternative package rather than shipping with a known, unaddressed vulnerability indefinitely.
SCA Is One Layer, Not the Whole Picture
SCA covers what you depend on; it says nothing about vulnerabilities in the code you actually wrote yourself (that's SAST's job), or misconfigurations in how the application is deployed. A complete repo scan combines dependency scanning with static analysis, secrets detection, and infrastructure-as-code checks - each catching a different category of risk.
Related reading
How to Fix Outdated & Vulnerable Dependencies
Why a dependency with a known CVE sitting in package.json is one of the most common ways production apps get breached, and a practical process for triaging and updating safely.
Scanverra vs. Snyk
A developer-security platform scanning open-source dependencies, source code, containers, and IaC, priced per contributing developer with a capped free tier.
Automate this in your next PR
Run a free repo scan and see outdated dependencies, CVEs, and code quality issues before they ship.
Run a free repo scan