Software composition analysis (SCA) inventories the open-source and third-party dependencies inside an application and matches them against known vulnerabilities and licence obligations. It answers a narrow, valuable question: what external code is being shipped, and is any of it known to be flawed?
Developers learn quickly that most of an application security queue is not exploitable, and the rational response to a low-precision signal is to deprioritize all of it, including the findings that matter. More scanners or more urgency makes that worse, because it raises volume without raising precision.
The second problem is the shape of the request. A raw finding hands a developer an investigation rather than a task: which version resolves the advisory, does that version break anything downstream, what else depends on this package, and when is there a testing window. That investigation is the real cost, and it lands on an engineering budget rather than a security one, which is why counts of findings closed correlate so poorly with reduction in risk.
Four questions sit outside the scope of a composition scan, and all four determine whether a finding deserves attention. Whether the vulnerable function is called from application code. Whether attacker-controlled data can reach the vulnerable parameter. Whether the upgrade required to resolve the advisory will break the build or the runtime. And which team owns the repository, which decides whether anything happens at all. These are the boundary of the technique rather than defects in it: composition analysis reads dependency metadata, while the remaining questions need call graph analysis, data flow analysis, build verification and ownership attribution.
Bumping NumPy to 2.0 is an application binary interface break that kills pandas, SciPy and scikit-learn builds compiled against the 1.x series. A bot proposes the single version bump, every check in the pipeline goes green because nothing in the test matrix exercises the compiled path at import time, and the application dies on start-up in the next environment. The same shape recurs constantly, from urllib3 2.0 against a pinned botocore to hundreds of quieter equivalents in every ecosystem.
The correct fix is almost never the single package named in the advisory. It is the coordinated set of versions that satisfies both the advisory and the compatibility constraints of everything depending on it. A finding naming one package and one target version understates the work by an order of magnitude.
Inventory output is normally expressed in SPDX, standardized as ISO/IEC 5962, or CycloneDX, an OWASP specification designed with security use cases foremost. Advisory data flows from the CVE Program, national vulnerability databases and ecosystem-specific sources, increasingly exchanged through the OpenVEX and CSAF formats, which exist to communicate that a present component is not affected. NIST Special Publication 800-218 is the usual reference for where composition analysis sits in a development lifecycle.
Is SCA the same as SAST? No. Static application security testing analyses code written in-house. Software composition analysis inventories the third-party code pulled in as dependencies. Most organizations need both.
Why are there so many SCA findings? Transitive dependencies. A handful of chosen packages each bring their own, and a flaw deep in the tree flags in every application that resolves it.
Does reachability mean unreachable findings can be ignored? It means they are not urgent. They should stay in the record, because a change in how the code is called can make a previously unreachable finding reachable.
Can SCA find vulnerabilities in code that was not declared as a dependency? Only if it inspects built artifacts. Vendored source, shaded jars and copied files do not appear in a manifest, so manifest-only analysis will miss them.