.avif)
SBOM vs. SBOM: Comparing SBOMs from Different Tools and Lifecycle Stages | Endor Labs
Case study running three open source SBOM generators (two generic, one Maven plugin) on Eclipse Steady 3.2.5 rest-backend at three lifecycle stages (git clone, Maven package, Docker image), yielding 8 CycloneDX SBOMs. Compares precision/recall against the mvn dependency:tree ground truth and finds the Maven-integrated tool perfect (1.0/1.0) while generic tools miss versions, groupIds and transitive dependencies. It also shows PURL qualifier differences (e.g. type=jar, apt qualifiers) make SBOMs hard to compare, test dependencies are indistinguishable, and argues for an SBOM generator benchmark.
What it is
A small Endor Labs experiment on Eclipse Steady 3.2.5 (module rest-backend, a Spring Boot app in Docker). It ran three unnamed open source SBOM generators and scored them against a Maven ground truth. The generators are anonymized as tools A and B (generic) and C (Maven plugin). The ground truth came from mvn dependency:tree -pl rest-backend: 114 compile, 2 runtime and 41 test dependencies. A component only counted as correct if its groupId, artifactId and version (GAV) all matched.
Results
| Stage | Tool A (P / R) | Tool B (P / R) | Tool C (P / R) |
|---|---|---|---|
| git clone | 0.5 / 0.06 | 0.93 / 0.75 | 1.0 / 1.0 |
after mvn package -pl rest-backend | 0.56 / 0.44 | 0.93 / 0.75 | 1.0 / 1.0 |
| Docker image (maven components only) | 0.59 / 0.55 | 0.96 / 0.91 | n/a |
- Tool A on source: it found only 20 components. It read
pom.xmlbut resolved neither transitive dependencies nor versions. It also picked up test archives fromsrc/test/resources. - Tool A after package: it found the built JAR in
target/and reported 130 components (122 unique). That count includes test dependencies, which the SBOM can no longer tell apart from runtime ones. - Tools B and C: their SBOMs did not change at all after the build, so they appear to rely only on
pom.xml. Tool B gets some versions wrong and misses dependencies for reasons the page does not explain. - Docker image: precision and recall were computed only on
pkg:mavenPURLs, because OS packages are not in the ground truth. Tool B still missed the Java runtime and one of its libraries, which tool A found.
Why SBOMs from different tools don't match
The same dependency, org.dom4j:dom4j:2.1.3, came out three ways:
A: pkg:maven/dom4j/dom4j@2.1.3 (wrong groupId)
B: pkg:maven/org.dom4j/dom4j@2.1.3
C: pkg:maven/org.dom4j/dom4j@2.1.3?type=jarB and C are both correct, but the type=jar qualifier alone breaks exact PURL matching. The same thing happens with apt PURLs for OS packages, where the tools disagree on qualifiers. Matching on name only raises overlap a lot, but the page notes that names are not enough to look up vulnerabilities on OSV or updates on Maven Central.
What to do
- Do not treat an SBOM from a generic scanner as authoritative for a Maven project. Where you can, generate it through the build tool, since the Maven-integrated plugin was the only perfect result.
- If you compare or merge SBOMs from several tools, normalize PURLs first (strip or standardize qualifiers like
type=jar) or diff will show false disagreement. - For Docker images, expect to need a generic scanner for OS-level components. Filter by PURL prefix (e.g.
pkg:maven) when scoring against a language-level ground truth. - Check whether the SBOM separates test or build dependencies from runtime ones. Tool A's output did not, so test dependencies will be treated like production ones.
Caveats
- Single project, single ecosystem (Maven/Java), and the tools are not named, so you cannot map the numbers to a product.
- Tool C could not scan Docker images, so it has no result at that stage.
- The page offers its explanation for tool C's perfect score ("supposedly" its Maven integration) as a guess. The causes of tool B's missed dependencies are unknown.
- Ground truth was only possible because Eclipse Steady is open source. The page says this check is impossible for proprietary software, and its call for a shared benchmark remains a proposal.
Organisations named here
- dependency scopes
- Eclipse Steady
- false positives
- NTIA
- precision and recall
Technologies named here
- Tool A
- Eclipse Steady v3.2.5
- Tool B
- Docker image of rest-backend on DockerHub
- Tool C
- CycloneDX
- Package URL
- OSV
- NVD
- Maven Central
- Endor Labs
- SBOM
- Maven
- Docker
- Java
Techniques named here
- Binary analysis / build-time / source-based SBOM creation
- Cited source
Related in Supply Chain


