A common mistake is relying on manifest parsing alone. That approach can miss actual build-time dependencies, transitive packages, version resolution, and ecosystem-specific metadata. Teams also underestimate risky components such as typosquats, dependency confusion, suspicious scripts, and unscoped internal modules. Effective scanning needs language-aware analysis so the disclosure reflects what is really present in the application.
What teams miss when they scan only manifests
Manifest-only checks answer a narrow question, not the one disclosure usually needs. A repo can declare one dependency set while the build, lockfiles, package managers, generated code, and environment-specific resolution pull in something different. That gap matters because open source exposure often lives in the resolved graph, not just the declared one.
Teams also miss that dependency risk is not limited to the top-level package list. Typosquats, dependency confusion, suspicious post-install scripts, and unscoped internal modules can all change what is actually present or executable. A scan that does not understand the language and ecosystem will underreport both the attack surface and the remediation work.
When the disclosure is meant to be accurate, the question is not “what is declared?” but “what will actually be built, installed, and run?” That distinction is why language-aware analysis, lockfile awareness, and build-context inspection belong in the process. For a deeper lifecycle view of how scanning, visibility, and inventory fit together, see NHI Lifecycle Management Guide.
Why the dependency graph is usually larger than the manifest
Open source disclosure often fails when teams assume the manifest is the source of truth. In practice, package managers may resolve different versions than the file suggests, transitive dependencies may bring in unexpected code, and build tooling may generate or fetch artefacts outside the declared list. That is especially true in ecosystems where metadata, scripts, or workspace conventions influence the final artifact.
There is also a practical supply-chain issue: the risk is not just malicious code, but ambiguity. A dependency can be legitimate in one context and risky in another because of registry choice, namespace controls, or install-time behavior. The scan therefore needs to trace what enters the build pipeline, not just what was committed to source control. Open source security guidance from OpenSSF is useful here because it frames dependency hygiene as a supply-chain problem, not a naming problem.
A good disclosure process also distinguishes between direct dependencies, transitive packages, and code that becomes present only after resolution. Without that separation, teams overstate confidence in the bill of materials and understate the chance of hidden exposure. That is the core blind spot: manifest parsing is a starting point, not a complete inventory method.
How to make disclosure accurate enough to trust
The right approach is to scan the resolved dependency set in the same way the application will consume it. That means using language-aware parsers, capturing lockfiles and package metadata, and checking build scripts, package hooks, and registry resolution paths. It also means treating suspicious names and provenance anomalies as disclosure findings, not edge cases to be ignored.
Practitioners should also verify whether internal modules are properly scoped and whether private package sources are explicitly pinned. If those controls are loose, the scan may look clean while the build remains vulnerable to dependency confusion or substitution. For vulnerability confirmation and ecosystem lookup, the NIST National Vulnerability Database and the CVE Program help teams tie a resolved package back to known issues where identifiers exist.
Teams should also keep disclosure scoped to what can be evidenced. If the scan cannot distinguish a declared dependency from a resolved one, the report should say so rather than imply certainty. That discipline is what makes the output useful to engineering, legal, and security reviewers.
Risk and Threat Considerations
Incomplete dependency scanning creates a false sense of control. The main risk is undisclosed exposure: a package that never appears in the manifest can still ship in the build, carry known vulnerabilities, or introduce attacker-controlled behavior through install-time scripts or namespace tricks.
Failure mechanism: Teams rely on static manifest parsing, so transitive resolution, lockfile drift, generated dependencies, and registry ambiguity remain invisible. That lets malicious or unexpected components enter the release without being reflected in the disclosure.
Impact: The organisation may publish an inaccurate software inventory, miss remediation work, and overlook a supply-chain path that can be abused before or after disclosure. In the worst case, a trusted package update or substitution becomes the entry point for broader compromise.
Standards & Framework Alignment
This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.
OWASP Non-Human Identity Top 10 address the attack and risk surface, while CIS Controls v8 set the governance and control requirements practitioners need to meet.
| Framework | Control / Reference | Relevance |
|---|---|---|
| CIS Controls v8 | CIS Control 16 — Application Software Security | Covers validating third-party code and supply-chain exposure in software builds. |
| CIS Control 4 — Secure Configuration of Enterprise Assets and Software | Maps to controlling package sources, lockfiles, and build-time configuration that shape dependency resolution. | |
| Recommendation — Apply Control 16 to verify resolved dependencies, scripts, and package provenance before disclosure. Use Control 4 to pin trusted registries and enforce consistent dependency resolution in builds. | ||
| OWASP Non-Human Identity Top 10 | NHI-01 — Secrets and Credential Management | Relevant where dependency scanning must surface packages that expose secrets or credential material in the build chain. |
| Recommendation — Use NHI-01 to detect and remediate dependency paths that surface or transport secrets. | ||
Practitioner Guidance
What to verify: Compare the declared dependency list with the resolved build output, the lockfile, and the final artifact contents. If those three views do not match, treat the disclosure as incomplete until the discrepancy is explained.
Common mistake: Teams often stop at the package manifest because it is easy to automate. That is fine for triage, but not for disclosure quality, because automation that ignores build resolution can miss the very component that matters most.
What good looks like: The team can explain where every shipped package came from, why it was selected, and whether it was direct, transitive, generated, or introduced by tooling. The disclosure should reflect that resolved reality, not a best guess.
Practitioner takeaway: If your scan cannot reconstruct the same dependency graph the build system produces, it is reporting intent, not exposure.
Related resources from NHI Mgmt Group
- What do security teams get wrong about supply chain scanning for open source package threats?
- What do teams get wrong about reviewing suspicious open source packages before they reach developers?
- What do teams get wrong about spotting malicious Python packages in open-source dependencies?
- What do teams get wrong about open-source LLM gateways?