Safeguard
Supply Chain•

How do you list internal packages in an SBOM with no public registry?

Internal packages belong in an SBOM. Use a clear identifier, name yourself as supplier, and avoid names a public registry could match by accident.

Safeguard Security Team
4 min read

List internal packages like any other component: a name, an exact version, a supplier of your own organisation, and a package URL that points to your private repository through a qualifier. Do not hide them, and do not let a vulnerability matcher confuse them with a public package that shares the name.

Why internal packages cause trouble

Most SBOM tooling assumes every component can be found in a public registry. Internal packages break that assumption in two ways.

  1. They may be unknown to the tool. With no public record, a scanner may skip them or list them with empty fields.
  2. They may collide with a public name. If your internal package is called "billing-utils" and a public package has the same name, a matcher can attach the public package's advisories to your code. That produces false alarms, or worse, a false sense that a name has been checked.

The second point is also a security issue. Substituting a public package for an internal name is a known attack pattern, so an SBOM that is clear about where each package comes from helps reviewers spot it.

Use the identifier to say where it came from

The Package URL specification defines seven parts: scheme, type, namespace, name, version, qualifiers and subpath. Qualifiers carry extra data such as the operating system, architecture or repository. Namespaces are type specific, for example a Maven group id.

For an internal package, aim for these properties:

FieldWhat to putWhy
NameYour real package nameHumans can find it
VersionThe exact released versionNeeded to reason about fixes
NamespaceYour organisation or group idReduces collision with public names
QualifierThe private repository location, where the type allows itShows it did not come from the public index
SupplierYour organisationMarks it as first party
HashA digest of the artifactLets a reader verify it

Not every package type defines a repository qualifier, so check what the specification says for your type rather than assuming.

A checklist for your own tooling

  1. Inventory your private registries and list which package types they host.
  2. Generate an SBOM and filter for components whose source is a private registry.
  3. Confirm each one has a version, a supplier and an identifier that cannot be read as a public package.
  4. Check that no advisory has been attached to an internal component by name alone.
  5. Check that your build is configured so that internal names resolve to the private registry first, or only there.

Should you share internal component names?

Sometimes an internal name reveals more than you want to disclose, such as a project code name. If you share an SBOM externally, decide in advance whether to keep real names, use stable aliases, or group internal code under one parent component. Whatever you choose, say so in the document or a cover note so the reader does not mistake the omission for an error.

Where Safeguard fits

Safeguard's dependency scanning and SBOM views separate first party and third party components so internal packages are not lost in the list. Try the free scan at gold.safeguard.sh/scan on a repository that uses a private registry to see how your internal packages appear.

Quick check

Should internal packages be in a customer SBOM?

Usually yes, at least as first party components. If names are sensitive, agree an aliasing approach and document it.

What is the main risk with internal package names?

A matcher or a build resolving the name against a public registry, which can attach the wrong advisories or pull the wrong code.

Sources

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.