Safeguard
Supply Chain•

Where should you scan private packages: proxy, build or pull request?

Private packages need the same scanning plus a name collision defence. Route all installs through one proxy and scan at build and pull request as usual.

Safeguard Security Team
3 min read

Scan private packages at the same stages as public ones, and add a control that stops names colliding with public packages. Route all installs through one registry proxy that serves internal packages first, then scan on the pull request and at build. A proxy is the best place for the naming defence.

Definitions

A private package is one your organisation publishes to an internal registry. Dependency confusion is a name collision problem: if an internal package name is also available on a public registry, a misconfigured client may fetch the public one. The defence is a configuration question, not a scanning one.

Two separate jobs

People often bundle these together. Keep them apart.

JobQuestionBest stage
Vulnerability scanDoes this package, or what it depends on, have known issues?Pull request, build, scheduled
Source of truthDid this name come from the registry I intended?Proxy or client config

Private packages also have dependencies. An internal library often pulls in many public ones, which is where known vulnerabilities enter. So scanning applies, even though no public advisory exists for the internal code itself.

Where each stage helps

Proxy. One entry point that knows which names are internal. Configure it so internal names never resolve against the public registry, and so the same rule applies on laptops and in CI.

Pull request. The diff shows when a private package updates and what it brings with it. A scanner must be able to read private manifests, which often means giving it access to the internal registry.

Build. Scans the full tree, internal and public, together, and is the natural place to generate an SBOM that labels which components are internal.

Scheduled. Internal packages that are not touched for months still depend on public packages that gain advisories.

Steps

  1. List your internal package names and scopes. Where the ecosystem supports namespaces or scopes, use them consistently.
  2. Reserve those names on the public registry where practical, or configure clients so scoped names only resolve from your registry.
  3. Point every client and runner at a single proxy. Block direct access to the public registry from build runners.
  4. Give your scanner read access to private registries, with least privilege credentials.
  5. Include internal packages in your SBOM and mark them as internal.
  6. Add internal packages to your scheduled scans and assign each an owning team.

A common gap

Internal packages with no owner. When an advisory affects a public dependency of an internal library, nobody knows whom to tell. Keep an owner field in your inventory.

Where Safeguard fits

Safeguard provides dependency scanning, SBOM generation and asset discovery to help build an inventory of what you run, with gates for pull requests. Try the free scan at gold.safeguard.sh/scan. Also see blocking malicious packages at a repository proxy.

Quick check

Does scanning prevent dependency confusion?

No. It is a resolution problem, fixed by client and proxy configuration. Scanning helps find the vulnerable public dependencies of private packages.

Do private packages need an SBOM?

Yes, include them, labelled as internal, so the inventory is complete.

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.