Skip to content

Commit a808e27

Browse files
authored
sbom: Make sure sbom packages are connected to the document root. (#2021)
Currently we do not link the packages to the top level described document, so if you try to traverse the document graph you end up not reaching a lot of the nodes. This adds a describe relationship to all packages, to create the edge.
1 parent ae64dae commit a808e27

File tree

9 files changed

+82
-2
lines changed

9 files changed

+82
-2
lines changed

internal/cli/testdata/golden/sboms/sbom-aarch64.spdx.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,20 @@
151151
"relationshipType": "DESCRIBED_BY",
152152
"relatedSpdxElement": "SPDXRef-Package-pretend-baselayout.melange.yaml-8e7230fc2d8afd47a5341ca0ba9b63f93bda5491"
153153
},
154+
{
155+
"spdxElementId": "SPDXRef-Package-sha256-462b8caeb0369dd5ec14eb4f698cddd327f26ba65720561497217ffad2e96d6a",
156+
"relationshipType": "CONTAINS",
157+
"relatedSpdxElement": "SPDXRef-Package-pretend-baselayout-1.0.0-r0"
158+
},
154159
{
155160
"spdxElementId": "SPDXRef-Package-replayout-1.0.0-r0",
156161
"relationshipType": "DESCRIBED_BY",
157162
"relatedSpdxElement": "SPDXRef-Package-replayout.melange.yaml-8e7230fc2d8afd47a5341ca0ba9b63f93bda5491"
163+
},
164+
{
165+
"spdxElementId": "SPDXRef-Package-sha256-462b8caeb0369dd5ec14eb4f698cddd327f26ba65720561497217ffad2e96d6a",
166+
"relationshipType": "CONTAINS",
167+
"relatedSpdxElement": "SPDXRef-Package-replayout-1.0.0-r0"
158168
}
159169
]
160170
}

internal/cli/testdata/golden/sboms/sbom-x86_64.spdx.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,20 @@
151151
"relationshipType": "DESCRIBED_BY",
152152
"relatedSpdxElement": "SPDXRef-Package-pretend-baselayout.melange.yaml-8e7230fc2d8afd47a5341ca0ba9b63f93bda5491"
153153
},
154+
{
155+
"spdxElementId": "SPDXRef-Package-sha256-3fa87a64fb699f65953caad1adcba9f5d3f25134bfff43f92a1ed097712cd79a",
156+
"relationshipType": "CONTAINS",
157+
"relatedSpdxElement": "SPDXRef-Package-pretend-baselayout-1.0.0-r0"
158+
},
154159
{
155160
"spdxElementId": "SPDXRef-Package-replayout-1.0.0-r0",
156161
"relationshipType": "DESCRIBED_BY",
157162
"relatedSpdxElement": "SPDXRef-Package-replayout.melange.yaml-8e7230fc2d8afd47a5341ca0ba9b63f93bda5491"
163+
},
164+
{
165+
"spdxElementId": "SPDXRef-Package-sha256-3fa87a64fb699f65953caad1adcba9f5d3f25134bfff43f92a1ed097712cd79a",
166+
"relationshipType": "CONTAINS",
167+
"relatedSpdxElement": "SPDXRef-Package-replayout-1.0.0-r0"
158168
}
159169
]
160170
}

pkg/sbom/generator/spdx/spdx.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,19 @@ func (sx *SPDX) ProcessInternalApkSBOM(opts *options.Options, doc *Document, ipk
264264
return fmt.Errorf("merging LicensingInfos: %w", err)
265265
}
266266

267+
// Add CONTAINS relationships from the document root package to all top-level elements from the internal SBOM.
268+
// This ensures they are reachable from the document root for tools that traverse the SBOM graph.
269+
if len(doc.DocumentDescribes) > 0 {
270+
rootPkgID := doc.DocumentDescribes[0]
271+
for elementID := range targetElementIDs {
272+
doc.Relationships = append(doc.Relationships, Relationship{
273+
Element: rootPkgID,
274+
Type: "CONTAINS",
275+
Related: elementID,
276+
})
277+
}
278+
}
279+
267280
return nil
268281
}
269282

pkg/sbom/generator/spdx/testdata/expected_image_sboms/both-describes-methods.spdx.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@
101101
"spdxElementId": "SPDXRef-Package-test-pkg-both-1.0.0-r0",
102102
"relationshipType": "DEPENDS_ON",
103103
"relatedSpdxElement": "SPDXRef-Package-dep-from-relationship-2.0.0"
104+
},
105+
{
106+
"spdxElementId": "SPDXRef-Package-",
107+
"relationshipType": "CONTAINS",
108+
"relatedSpdxElement": "SPDXRef-Package-test-pkg-both-1.0.0-r0"
104109
}
105110
]
106111
}

pkg/sbom/generator/spdx/testdata/expected_image_sboms/custom-license.spdx.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,13 @@
6262
]
6363
}
6464
],
65-
"relationships": [],
65+
"relationships": [
66+
{
67+
"spdxElementId": "SPDXRef-Package-",
68+
"relationshipType": "CONTAINS",
69+
"relatedSpdxElement": "SPDXRef-Package-font-ubuntu-0.869-r1"
70+
}
71+
],
6672
"hasExtractedLicensingInfos": [
6773
{
6874
"licenseId": "LicenseRef-ubuntu-font",

pkg/sbom/generator/spdx/testdata/expected_image_sboms/describes-relationship.spdx.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@
124124
"spdxElementId": "SPDXRef-Package-test-pkg-describes-1.0.0-r0",
125125
"relationshipType": "DEPENDS_ON",
126126
"relatedSpdxElement": "SPDXRef-Package-npm-lodash"
127+
},
128+
{
129+
"spdxElementId": "SPDXRef-Package-",
130+
"relationshipType": "CONTAINS",
131+
"relatedSpdxElement": "SPDXRef-Package-test-pkg-describes-1.0.0-r0"
127132
}
128133
]
129134
}

pkg/sbom/generator/spdx/testdata/expected_image_sboms/no-supplier.spdx.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,11 @@
6262
]
6363
}
6464
],
65-
"relationships": []
65+
"relationships": [
66+
{
67+
"spdxElementId": "SPDXRef-Package-",
68+
"relationshipType": "CONTAINS",
69+
"relatedSpdxElement": "SPDXRef-Package-libattr1-2.5.1-r2"
70+
}
71+
]
6672
}

pkg/sbom/generator/spdx/testdata/expected_image_sboms/package-deduplicating.spdx.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@
128128
"relationshipType": "GENERATED_FROM",
129129
"relatedSpdxElement": "SPDXRef-Package-github.com-elastic-logstash-v8.15.3-8364c8e89cfb113e38ec3f966df7eb1e9abe9d33-0"
130130
},
131+
{
132+
"spdxElementId": "SPDXRef-Package-",
133+
"relationshipType": "CONTAINS",
134+
"relatedSpdxElement": "SPDXRef-Package-logstash-8-8.15.3-r4"
135+
},
131136
{
132137
"spdxElementId": "SPDXRef-Package-logstash-8-compat-8.15.3-r4",
133138
"relationshipType": "DESCRIBED_BY",
@@ -137,6 +142,11 @@
137142
"spdxElementId": "SPDXRef-Package-logstash-8-compat-8.15.3-r4",
138143
"relationshipType": "GENERATED_FROM",
139144
"relatedSpdxElement": "SPDXRef-Package-github.com-elastic-logstash-v8.15.3-8364c8e89cfb113e38ec3f966df7eb1e9abe9d33-0"
145+
},
146+
{
147+
"spdxElementId": "SPDXRef-Package-",
148+
"relationshipType": "CONTAINS",
149+
"relatedSpdxElement": "SPDXRef-Package-logstash-8-compat-8.15.3-r4"
140150
}
141151
]
142152
}

pkg/sbom/generator/spdx/testdata/expected_image_sboms/unbound-package-dedupe.spdx.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@
147147
"relationshipType": "GENERATED_FROM",
148148
"relatedSpdxElement": "SPDXRef-Package-github.com-NLnetLabs-unbound-release-1.23.0-30c13d0351abd2edc3d6dc76365f576c87b9736e-0"
149149
},
150+
{
151+
"spdxElementId": "SPDXRef-Package-",
152+
"relationshipType": "CONTAINS",
153+
"relatedSpdxElement": "SPDXRef-Package-unbound-libs-1.23.0-r0"
154+
},
150155
{
151156
"spdxElementId": "SPDXRef-Package-unbound-1.23.0-r0",
152157
"relationshipType": "DESCRIBED_BY",
@@ -157,6 +162,11 @@
157162
"relationshipType": "GENERATED_FROM",
158163
"relatedSpdxElement": "SPDXRef-Package-github.com-NLnetLabs-unbound-release-1.23.0-30c13d0351abd2edc3d6dc76365f576c87b9736e-0"
159164
},
165+
{
166+
"spdxElementId": "SPDXRef-Package-",
167+
"relationshipType": "CONTAINS",
168+
"relatedSpdxElement": "SPDXRef-Package-unbound-1.23.0-r0"
169+
},
160170
{
161171
"spdxElementId": "SPDXRef-Package-unbound-config-1.23.0-r0",
162172
"relationshipType": "DESCRIBED_BY",
@@ -166,6 +176,11 @@
166176
"spdxElementId": "SPDXRef-Package-unbound-config-1.23.0-r0",
167177
"relationshipType": "GENERATED_FROM",
168178
"relatedSpdxElement": "SPDXRef-Package-github.com-NLnetLabs-unbound-release-1.23.0-30c13d0351abd2edc3d6dc76365f576c87b9736e-0"
179+
},
180+
{
181+
"spdxElementId": "SPDXRef-Package-",
182+
"relationshipType": "CONTAINS",
183+
"relatedSpdxElement": "SPDXRef-Package-unbound-config-1.23.0-r0"
169184
}
170185
]
171186
}

0 commit comments

Comments
 (0)