Tracking only declared dependencies can miss the difference between software that is merely referenced and software that is actually loaded and reachable. That gap leads to wasted remediation effort, delayed patching, and blind spots around exposed services. Security teams need evidence of runtime use, deployment status, and reachable attack paths to avoid false confidence.
Dependency Lists Do Not Tell You What Is Actually Exposed
Tracking vulnerable third-party libraries only at the dependency list level creates a false boundary between what a codebase references and what an attacker can actually reach. A package can appear in a manifest, lockfile, or bill of materials and still never be loaded in production, while another library may be pulled in transitively and become part of the live attack surface. That distinction matters because exposure is determined by runtime use, deployment context, and reachable code paths, not by declaration alone.
When teams rely on dependency lists as the primary evidence source, they can over-prioritise dormant libraries while missing components that are active, internet-facing, or embedded in a service path. The result is not just inefficient remediation. It is a distorted view of software risk that weakens patch decisions, exception handling, and exposure management. Security teams often discover that gap only after a vulnerable component is already deployed and reachable in production rather than through the dependency process that was supposed to govern it.
How Runtime Reachability Changes the Meaning of a Vulnerability
A dependency list answers a narrow question: what did the build process record as present? It does not answer whether the library is imported, initialised, invoked, or reachable through a request path. In practice, the operational question is whether the vulnerable code can be triggered in the deployed environment. That requires runtime evidence, not just static inventory.
This is why software composition analysis, build manifests, and package inventories are useful but incomplete on their own. They can support inventory hygiene, licensing review, and broad vulnerability screening, but they do not distinguish among three materially different conditions: declared but unused, bundled but unreachable, and actively reachable. Those distinctions drive different decisions. Unused code may be eligible for removal or deferred handling. Reachable code usually requires faster remediation, compensating controls, or a documented exception with explicit expiry.
- Declared dependency only: useful for cataloguing, but not enough to judge exposure.
- Loaded at runtime: stronger evidence that the component affects the deployed system.
- Reachable attack path: strongest signal that the vulnerability may translate into impact.
For this reason, control programs should combine manifests with deployment evidence, runtime telemetry, and service mapping. That gives teams a better basis for deciding whether a vulnerability is real exposure or inventory noise. The place where this guidance breaks down is highly dynamic environments where runtime evidence is partial or short-lived, because then reachability can be under-observed rather than truly absent.
When Dependency-Only Tracking Produces the Wrong Remediation Priorities
Tighter dependency tracking often increases inventory confidence, but it also raises the risk of treating completeness as exposure analysis. The trade-off is simple: the more teams trust the list, the more likely they are to miss the actual execution path. That matters most in polyglot applications, container images, serverless deployments, and transitive dependency chains where the dependency graph can be larger than the portion of code that is ever executed.
One common edge case is a library that remains in the package tree after feature removal. Another is a transitive package that is not visible in the top-level manifest but is present in the shipped artifact. A third is environment-specific loading, where a library is dormant in one deployment tier and reachable in another. These are not academic differences. They affect patch urgency, compensating control choices, and whether a finding should be treated as exploitable or informational. The industry does not fully agree on how much runtime evidence is enough in every case, so practitioners should treat reachability as decision support, not as a substitute for code review or architectural context.
OWASP Non-Human Identity Top 10
Where organisations get into trouble is assuming that a vulnerable dependency in a list is automatically a live risk, or that an absent top-level reference means the component is irrelevant. The guidance fails when teams cannot see dynamic loading, generated code, plugin behaviour, or deployment-specific paths.
Standards & Framework Alignment
This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.
CIS Controls v8 and NIST CSF 2.0 set the governance and control requirements practitioners need to meet.
| Framework | Control / Reference | Relevance |
|---|---|---|
| CIS Controls v8 | 7 — Continuous Vulnerability Management | Dependency-only tracking fails to distinguish inventory from exploitable exposure. |
| 2 — Inventory and Control of Software Assets | Declared dependency lists are a software inventory problem when they omit runtime status. | |
| Recommendation — Use continuous vulnerability management to prioritise reachable software over declared inventory. Maintain software inventory that reflects what is deployed and in use, not just what is declared. | ||
| NIST CSF 2.0 | ID.AM — Asset Management | The issue is incomplete software asset visibility and exposure understanding. |
| RA.RA — Risk Assessment | Teams need to assess whether a vulnerability is actually reachable in context. | |
| Recommendation — Map software assets to their deployed state and update exposure decisions from runtime evidence. Assess vulnerability risk using reachability and deployment context, not package presence alone. | ||
Practitioner Guidance
What to prioritise: Treat runtime reachability as the deciding factor for triage, then use the dependency list to support inventory and remediation planning. A vulnerable package that is present but unreachable should not compete with a component that is actually loaded and exposed.
What to verify: Confirm how the library enters the shipped artifact, whether it is invoked in the deployed configuration, and whether any request, job, or plugin path can reach the vulnerable function. If the team cannot prove that sequence, the finding should remain open until it is either demonstrated as reachable or credibly bounded.
Practitioner takeaway: Dependency-level tracking is a starting point for vulnerability management, not a reliable proxy for exposure, so teams should base urgency on whether the code is deployed and reachable rather than merely listed.
Related resources from NHI Mgmt Group
- What breaks when third-party libraries in SAP stacks are not patched quickly?
- What breaks when a vulnerable third-party component still has broad network and identity access?
- What breaks when cryptographic debt is not tracked across cloud workloads and third-party dependencies?
- What breaks when security tools treat third-party libraries as black boxes?
Deepen Your Knowledge
Reviewed and updated by the NHIMG editorial team on September 7, 2026.
NHI Mgmt Group — the #1 independent authority on Non-Human Identity, IAM, and Agentic AI security. nhimg.org