ossbomer
Profile-driven SBOM validation, conformance, and license policy for SPDX and CycloneDX.
Most SBOM tools answer one question. ossbomer answers three in a single pass:
- Is the document structurally valid, judged against the spec version it declares?
- Does it carry the fields a given regulation asks for, at that regulation's severity?
- Given how you ship this software, does policy allow the licenses it declares?
You pick a profile, which is one YAML file binding all three. So "does this SBOM meet the EU CRA" is one argument instead of three tool runs and a spreadsheet.
Thirteen usable profiles ship with it, covering CISA 2026, NTIA, EU CRA, BSI TR-03183, India CERT-In, OpenChain Telco, FedRAMP, AIBOM, and four license use cases.
Full documentation: https://semclone.github.io/ossbomer/
Install
Requires Python 3.9 or newer; tested through 3.13.
pip install "ossbomer[oslc]"
The oslc extra pulls in ospac, which evaluates
license policy. Every license-* profile needs it. Plain pip install ossbomer
works if you only need schema and conformance.
Upgrading from 0.1.4 is a breaking change: that release predates the profile engine, and the per-layer commands it shipped now behave differently. See the changelog.
Use
ossbomer validate --profile ntia-min-elements --file sbom.json
============================================================
Profile: NTIA Minimum Elements for an SBOM
Verdict: FAIL (4 MUST violations)
Quality score: 63 / 100
Completeness: 63
Accuracy: 41
Consistency: 75
Provenance: 68
Freshness: 70
Top issues:
1. Freshness: ntia-timestamp — rfc3339_utc: '2010-01-29T18:30:22' lacks a UTC/timezone designator [document]
2. Completeness: ntia-unique-identifier — present: field is absent or empty [components[0]:glibc@2.11.1]
3. Completeness: ntia-unique-identifier — present: field is absent or empty [components[2]:Saxon@8.8]
============================================================
--profile repeats, and each profile is evaluated on its own with its own verdict
and score. Nothing is averaged between them, because a good NTIA score tells you
nothing about CRA readiness.
Output can be console, json, or sarif. The exit code works as a CI gate: 0 if
nothing failed, 1 if a profile failed, 2 if the file could not be read. Nothing
calls the network.
Formats
| Format | Versions | JSON | XML | Tag-value | YAML |
|---|---|---|---|---|---|
| CycloneDX | 1.3 - 1.6 | yes | yes | not applicable | no such serialization |
| SPDX | 2.2, 2.3 | yes | yes | yes | yes |
| SPDX | 3.0 | structural only | no official schema | not applicable | no |
Validation follows the version the document declares, using cyclonedx-python-lib
and spdx-tools rather than vendored schemas.
Documentation
| Getting started | Install it and read a result |
| Profiles | The catalog, and writing your own |
| License policy | Use cases, SPDX expressions, overrides |
| Using it in CI | Gating a build, SARIF and code scanning |
| Verdicts and exit codes | How findings become one answer |
| CLI reference | Every command and flag |
Contributing
See CONTRIBUTING.md. Adding a profile is the most approachable place to start, since profiles are YAML rather than code.
Every change lands through a pull request with green CI. Contributors sign a CLA once, in the pull request, by replying to the bot. Participation is governed by the Code of Conduct.
Please do not open a public issue for a security vulnerability. Report it as described in SECURITY.md.
License
Apache License 2.0. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ossbomer-2.1.0.tar.gz.
File metadata
- Download URL: ossbomer-2.1.0.tar.gz
- Upload date:
- Size: 65.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71683ddf1881c8a8499778efd9b8a53286050f23cf36f3a112620ee9e2744342
|
|
| MD5 |
8932dec0ae090bd7d6c6568bc5b4624c
|
|
| BLAKE2b-256 |
84773675ca7f3ec9285a43912bb61ecf79ba49aea288b8f2c5e83ff1f483d804
|
Provenance
The following attestation bundles were made for ossbomer-2.1.0.tar.gz:
Publisher:
release.yml on SemClone/ossbomer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ossbomer-2.1.0.tar.gz -
Subject digest:
71683ddf1881c8a8499778efd9b8a53286050f23cf36f3a112620ee9e2744342 - Sigstore transparency entry: 2299007468
- Sigstore integration time:
-
Permalink:
SemClone/ossbomer@64e7244ccafdb88dabcf141a687cba826ad90958 -
Branch / Tag:
refs/tags/v2.1.0 - Owner: https://github.com/SemClone
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@64e7244ccafdb88dabcf141a687cba826ad90958 -
Trigger Event:
release
-
Statement type:
File details
Details for the file ossbomer-2.1.0-py3-none-any.whl.
File metadata
- Download URL: ossbomer-2.1.0-py3-none-any.whl
- Upload date:
- Size: 81.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2751b6ccee10473505d969a0ea5c3eb5e4447f32e321a27bb409998366cbe16
|
|
| MD5 |
0cedab9655b25d398656512ee0e8a125
|
|
| BLAKE2b-256 |
41d4fcd72882199dfea6f309fbfce02a56d034dc197a48a7b99654a54f90933e
|
Provenance
The following attestation bundles were made for ossbomer-2.1.0-py3-none-any.whl:
Publisher:
release.yml on SemClone/ossbomer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ossbomer-2.1.0-py3-none-any.whl -
Subject digest:
e2751b6ccee10473505d969a0ea5c3eb5e4447f32e321a27bb409998366cbe16 - Sigstore transparency entry: 2299007498
- Sigstore integration time:
-
Permalink:
SemClone/ossbomer@64e7244ccafdb88dabcf141a687cba826ad90958 -
Branch / Tag:
refs/tags/v2.1.0 - Owner: https://github.com/SemClone
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@64e7244ccafdb88dabcf141a687cba826ad90958 -
Trigger Event:
release
-
Statement type: