Safeguard
Supply Chain•

How do you describe a forked component in a CycloneDX SBOM?

CycloneDX has a pedigree field for forks. Use ancestors for the original project, and commits or patches for what you changed. Here is what to fill in.

Safeguard Security Team
4 min read

Use the pedigree field on the component. Put the original project in ancestors, and list your changes under commits or patches. The CycloneDX schema describes ancestors as commonly used for forks, so consumers of your SBOM can see both what you ship and what it was derived from.

The problem pedigree solves

An SBOM that lists a forked library under its own name hides its origin. A buyer reading it sees an unknown component. A scanner may match it against the wrong project or none. And an engineer a year later cannot tell whether the library is an original or a fork with changes.

What the schema says

The CycloneDX 1.6 JSON reference defines pedigree as a way to document complex supply chain scenarios where components are created, distributed, modified, redistributed and combined. Within it:

FieldWhat it holds
ancestorsComponents this one is derived from. Commonly used for forks, with the original in an ancestor node
descendantsThe opposite, forks of an original
variantsRelated components where the exact relation is unknown
commitsA trail of commits describing how it deviates
patchesPatches describing how it deviates, including defect or security fixes
notesFree text commentary

The reference also marks the older modified flag as deprecated and points to pedigree instead, so use pedigree for new work.

An example shape

Written in JSON, a forked component carries its own name and version, with an ancestor entry for the original:

{
  "type": "library",
  "name": "examplelib-acme",
  "version": "2.4.1-acme.2",
  "pedigree": {
    "ancestors": [
      { "type": "library", "name": "examplelib", "version": "2.4.1" }
    ],
    "patches": [
      { "type": "backport" }
    ],
    "notes": "Backport of upstream fix for a path traversal issue."
  }
}

Check the exact patch type values and required fields against the schema version your tooling emits, since they differ between versions.

Rules of thumb

  1. Give your fork a distinct version string, such as an upstream version plus a local suffix, so it cannot be mistaken for the original.
  2. Name the ancestor with the exact upstream version you forked from.
  3. List security backports under patches so a reviewer can see them without reading the Git log.
  4. Keep the pedigree in sync with each rebase. A stale ancestor version is worse than none.
  5. Where your tooling cannot write pedigree, add the same facts in notes and an external reference to the fork's repository.

Why buyers and auditors care

Procurement teams increasingly ask for SBOMs. A pedigree turns the question "what is this odd component?" into a one line answer. It also supports vulnerability matching, because the ancestor tells a consumer which upstream advisories to check. For more on what to request in a supplier SBOM, see license fields to require in a supplier SBOM.

Where Safeguard fits

Safeguard produces and ingests SBOMs as part of its SBOM and dependency scanning. Review how a component is presented in the demo below, and try a free scan at gold.safeguard.sh/scan.

Try it yourself

Click through it at your own pace, or open it full screen. Pay attention to the name and version fields, which a fork must set honestly.

Quick check

Which field names the original project of a fork?

Ancestors, inside the pedigree. The schema describes it as commonly used to describe forks.

Should a fork keep the upstream version string unchanged?

Better not. A distinct suffix stops people and scanners from assuming it matches the original exactly.

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.