@cyclonedx/cdxgen 12.3.3 → 12.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -22
- package/bin/audit.js +21 -7
- package/bin/cdxgen.js +238 -116
- package/bin/convert.js +28 -13
- package/bin/hbom.js +490 -0
- package/bin/repl.js +580 -29
- package/bin/validate.js +34 -4
- package/bin/verify.js +40 -5
- package/data/README.md +298 -25
- package/data/component-tags.json +6 -0
- package/data/crypto-oid.json +16 -0
- package/data/predictive-audit-allowlist.json +11 -0
- package/data/queries-darwin.json +12 -1
- package/data/queries-win.json +7 -1
- package/data/queries.json +39 -2
- package/data/rules/ai-agent-governance.yaml +16 -0
- package/data/rules/asar-archives.yaml +150 -0
- package/data/rules/chrome-extensions.yaml +8 -0
- package/data/rules/ci-permissions.yaml +42 -18
- package/data/rules/container-risk.yaml +14 -7
- package/data/rules/dependency-sources.yaml +11 -0
- package/data/rules/hbom-compliance.yaml +325 -0
- package/data/rules/hbom-performance.yaml +307 -0
- package/data/rules/hbom-security.yaml +248 -0
- package/data/rules/host-topology.yaml +165 -0
- package/data/rules/mcp-servers.yaml +18 -3
- package/data/rules/obom-runtime.yaml +907 -22
- package/data/rules/package-integrity.yaml +14 -0
- package/data/rules/rootfs-hardening.yaml +179 -0
- package/data/rules/vscode-extensions.yaml +9 -0
- package/lib/audit/index.js +209 -8
- package/lib/audit/index.poku.js +332 -0
- package/lib/audit/reporters.js +222 -0
- package/lib/audit/targets.js +146 -1
- package/lib/audit/targets.poku.js +186 -0
- package/lib/cli/asar.poku.js +328 -0
- package/lib/cli/index.js +506 -88
- package/lib/cli/index.poku.js +1352 -212
- package/lib/evinser/evinser.js +14 -9
- package/lib/helpers/analyzer.js +1406 -29
- package/lib/helpers/analyzer.poku.js +342 -0
- package/lib/helpers/analyzerScope.js +712 -0
- package/lib/helpers/asarutils.js +1556 -0
- package/lib/helpers/asarutils.poku.js +443 -0
- package/lib/helpers/auditCategories.js +12 -0
- package/lib/helpers/auditCategories.poku.js +32 -0
- package/lib/helpers/cbomutils.js +271 -1
- package/lib/helpers/cbomutils.poku.js +248 -5
- package/lib/helpers/display.js +291 -1
- package/lib/helpers/display.poku.js +149 -0
- package/lib/helpers/evidenceUtils.js +58 -0
- package/lib/helpers/evidenceUtils.poku.js +54 -0
- package/lib/helpers/exportUtils.js +9 -0
- package/lib/helpers/gtfobins.js +142 -8
- package/lib/helpers/gtfobins.poku.js +24 -1
- package/lib/helpers/hbom.js +710 -0
- package/lib/helpers/hbom.poku.js +496 -0
- package/lib/helpers/hbomAnalysis.js +268 -0
- package/lib/helpers/hbomAnalysis.poku.js +249 -0
- package/lib/helpers/hbomLoader.js +35 -0
- package/lib/helpers/hostTopology.js +803 -0
- package/lib/helpers/hostTopology.poku.js +363 -0
- package/lib/helpers/inventoryStats.js +69 -0
- package/lib/helpers/inventoryStats.poku.js +86 -0
- package/lib/helpers/lolbas.js +19 -1
- package/lib/helpers/lolbas.poku.js +23 -0
- package/lib/helpers/osqueryTransform.js +47 -0
- package/lib/helpers/osqueryTransform.poku.js +47 -0
- package/lib/helpers/plugins.js +349 -0
- package/lib/helpers/plugins.poku.js +57 -0
- package/lib/helpers/protobom.js +156 -45
- package/lib/helpers/protobom.poku.js +140 -5
- package/lib/helpers/remote/dependency-track.js +36 -3
- package/lib/helpers/remote/dependency-track.poku.js +44 -0
- package/lib/helpers/source.js +24 -0
- package/lib/helpers/source.poku.js +32 -0
- package/lib/helpers/utils.js +1438 -93
- package/lib/helpers/utils.poku.js +846 -4
- package/lib/managers/binary.e2e.poku.js +367 -0
- package/lib/managers/binary.js +2293 -353
- package/lib/managers/binary.poku.js +1699 -1
- package/lib/managers/docker.js +201 -79
- package/lib/managers/docker.poku.js +337 -12
- package/lib/server/server.js +2 -27
- package/lib/stages/postgen/annotator.js +38 -0
- package/lib/stages/postgen/annotator.poku.js +107 -1
- package/lib/stages/postgen/auditBom.js +121 -18
- package/lib/stages/postgen/auditBom.poku.js +1366 -31
- package/lib/stages/postgen/hostTopologyAudit.poku.js +186 -0
- package/lib/stages/postgen/postgen.js +192 -1
- package/lib/stages/postgen/postgen.poku.js +321 -0
- package/lib/stages/postgen/ruleEngine.js +116 -0
- package/lib/stages/pregen/envAudit.js +14 -3
- package/package.json +23 -21
- package/types/bin/hbom.d.ts +3 -0
- package/types/bin/hbom.d.ts.map +1 -0
- package/types/bin/repl.d.ts.map +1 -1
- package/types/lib/audit/index.d.ts +44 -0
- package/types/lib/audit/index.d.ts.map +1 -1
- package/types/lib/audit/reporters.d.ts +16 -0
- package/types/lib/audit/reporters.d.ts.map +1 -1
- package/types/lib/audit/targets.d.ts.map +1 -1
- package/types/lib/cli/index.d.ts +16 -0
- package/types/lib/cli/index.d.ts.map +1 -1
- package/types/lib/evinser/evinser.d.ts +4 -0
- package/types/lib/evinser/evinser.d.ts.map +1 -1
- package/types/lib/helpers/analyzer.d.ts +33 -0
- package/types/lib/helpers/analyzer.d.ts.map +1 -1
- package/types/lib/helpers/analyzerScope.d.ts +11 -0
- package/types/lib/helpers/analyzerScope.d.ts.map +1 -0
- package/types/lib/helpers/asarutils.d.ts +34 -0
- package/types/lib/helpers/asarutils.d.ts.map +1 -0
- package/types/lib/helpers/auditCategories.d.ts +5 -0
- package/types/lib/helpers/auditCategories.d.ts.map +1 -1
- package/types/lib/helpers/cbomutils.d.ts +3 -2
- package/types/lib/helpers/cbomutils.d.ts.map +1 -1
- package/types/lib/helpers/display.d.ts.map +1 -1
- package/types/lib/helpers/evidenceUtils.d.ts +8 -0
- package/types/lib/helpers/evidenceUtils.d.ts.map +1 -0
- package/types/lib/helpers/exportUtils.d.ts.map +1 -1
- package/types/lib/helpers/gtfobins.d.ts +8 -0
- package/types/lib/helpers/gtfobins.d.ts.map +1 -1
- package/types/lib/helpers/hbom.d.ts +49 -0
- package/types/lib/helpers/hbom.d.ts.map +1 -0
- package/types/lib/helpers/hbomAnalysis.d.ts +62 -0
- package/types/lib/helpers/hbomAnalysis.d.ts.map +1 -0
- package/types/lib/helpers/hbomLoader.d.ts +7 -0
- package/types/lib/helpers/hbomLoader.d.ts.map +1 -0
- package/types/lib/helpers/hostTopology.d.ts +12 -0
- package/types/lib/helpers/hostTopology.d.ts.map +1 -0
- package/types/lib/helpers/inventoryStats.d.ts +11 -0
- package/types/lib/helpers/inventoryStats.d.ts.map +1 -0
- package/types/lib/helpers/lolbas.d.ts.map +1 -1
- package/types/lib/helpers/osqueryTransform.d.ts +3 -0
- package/types/lib/helpers/osqueryTransform.d.ts.map +1 -1
- package/types/lib/helpers/plugins.d.ts +58 -0
- package/types/lib/helpers/plugins.d.ts.map +1 -0
- package/types/lib/helpers/protobom.d.ts +3 -4
- package/types/lib/helpers/protobom.d.ts.map +1 -1
- package/types/lib/helpers/remote/dependency-track.d.ts +10 -3
- package/types/lib/helpers/remote/dependency-track.d.ts.map +1 -1
- package/types/lib/helpers/source.d.ts.map +1 -1
- package/types/lib/helpers/utils.d.ts +45 -8
- package/types/lib/helpers/utils.d.ts.map +1 -1
- package/types/lib/managers/binary.d.ts +5 -0
- package/types/lib/managers/binary.d.ts.map +1 -1
- package/types/lib/managers/docker.d.ts.map +1 -1
- package/types/lib/server/server.d.ts +2 -1
- package/types/lib/server/server.d.ts.map +1 -1
- package/types/lib/stages/postgen/annotator.d.ts.map +1 -1
- package/types/lib/stages/postgen/auditBom.d.ts +26 -1
- package/types/lib/stages/postgen/auditBom.d.ts.map +1 -1
- package/types/lib/stages/postgen/postgen.d.ts +2 -1
- package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
- package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
- package/types/lib/stages/pregen/envAudit.d.ts.map +1 -1
- package/data/spdx-model-v3.0.1.jsonld +0 -15999
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
description: "Known GTFOBins execution helpers become materially riskier when the image keeps the binary setuid or setgid."
|
|
4
4
|
severity: critical
|
|
5
5
|
category: container-risk
|
|
6
|
+
dry-run-support: full
|
|
6
7
|
condition: |
|
|
7
8
|
components[
|
|
8
9
|
$prop($, 'cdx:gtfobins:matched') = 'true'
|
|
@@ -26,7 +27,7 @@
|
|
|
26
27
|
message: "Executable '{{ name }}' at '{{ $prop($, 'SrcFile') }}' combines GTFOBins execution features with setuid/setgid permissions"
|
|
27
28
|
mitigation: "Remove the setuid/setgid bit, replace the image with a slimmer base, and keep container privilege boundaries strict (no host mounts, no privileged mode, no extra capabilities)."
|
|
28
29
|
attack:
|
|
29
|
-
tactics: [TA0004
|
|
30
|
+
tactics: [TA0004]
|
|
30
31
|
techniques: [T1548, T1611]
|
|
31
32
|
evidence: |
|
|
32
33
|
{
|
|
@@ -43,6 +44,7 @@
|
|
|
43
44
|
description: "Container runtime or namespace-management helpers that are already classified as GTFOBins can accelerate container breakout when runtime isolation is weakened."
|
|
44
45
|
severity: critical
|
|
45
46
|
category: container-risk
|
|
47
|
+
dry-run-support: full
|
|
46
48
|
condition: |
|
|
47
49
|
components[
|
|
48
50
|
$prop($, 'cdx:gtfobins:matched') = 'true'
|
|
@@ -62,7 +64,7 @@
|
|
|
62
64
|
message: "Container-escape helper '{{ name }}' is present at '{{ $prop($, 'SrcFile') }}' with elevated execution semantics"
|
|
63
65
|
mitigation: "Remove container runtime and namespace-management tooling from application images, avoid CAP_SYS_ADMIN-like capability grants, and block access to the Docker/containerd sockets."
|
|
64
66
|
attack:
|
|
65
|
-
tactics: [TA0004
|
|
67
|
+
tactics: [TA0004]
|
|
66
68
|
techniques: [T1611]
|
|
67
69
|
evidence: |
|
|
68
70
|
{
|
|
@@ -77,6 +79,7 @@
|
|
|
77
79
|
description: "GTFOBins entries that can load attacker-controlled shared libraries or directly escalate privileges are strong hardening failures in container images."
|
|
78
80
|
severity: high
|
|
79
81
|
category: container-risk
|
|
82
|
+
dry-run-support: full
|
|
80
83
|
condition: |
|
|
81
84
|
components[
|
|
82
85
|
$prop($, 'cdx:gtfobins:matched') = 'true'
|
|
@@ -101,7 +104,7 @@
|
|
|
101
104
|
message: "Binary '{{ name }}' exposes GTFOBins privilege-escalation or library-load behavior in a privileged execution context"
|
|
102
105
|
mitigation: "Remove the helper from the image where possible, strip privileged bits/capabilities, and keep writable mounts away from privileged processes."
|
|
103
106
|
attack:
|
|
104
|
-
tactics: [
|
|
107
|
+
tactics: [TA0002, TA0004, TA0005]
|
|
105
108
|
techniques: [T1574, T1548]
|
|
106
109
|
evidence: |
|
|
107
110
|
{
|
|
@@ -116,6 +119,7 @@
|
|
|
116
119
|
description: "A GTFOBins helper that can read local files or upload data becomes especially dangerous when it also runs with setuid/setgid or other elevated contexts."
|
|
117
120
|
severity: high
|
|
118
121
|
category: container-risk
|
|
122
|
+
dry-run-support: full
|
|
119
123
|
condition: |
|
|
120
124
|
components[
|
|
121
125
|
$prop($, 'cdx:gtfobins:matched') = 'true'
|
|
@@ -140,7 +144,7 @@
|
|
|
140
144
|
message: "Binary '{{ name }}' can read or exfiltrate local data from a privileged execution path"
|
|
141
145
|
mitigation: "Drop privileged bits, keep secrets off the image filesystem, and remove unnecessary upload/file-read helpers from runtime images."
|
|
142
146
|
attack:
|
|
143
|
-
tactics: [
|
|
147
|
+
tactics: [TA0009, TA0010]
|
|
144
148
|
techniques: [T1005, T1041]
|
|
145
149
|
evidence: |
|
|
146
150
|
{
|
|
@@ -155,6 +159,7 @@
|
|
|
155
159
|
description: "Remote-execution-capable GTFOBins helpers under mutable or non-standard image paths often indicate an avoidable attack toolkit or image tampering."
|
|
156
160
|
severity: medium
|
|
157
161
|
category: container-risk
|
|
162
|
+
dry-run-support: full
|
|
158
163
|
condition: |
|
|
159
164
|
components[
|
|
160
165
|
$prop($, 'cdx:gtfobins:matched') = 'true'
|
|
@@ -191,7 +196,7 @@
|
|
|
191
196
|
message: "GTFOBins remote-execution helper '{{ name }}' is present in mutable image path '{{ $prop($, 'SrcFile') }}'"
|
|
192
197
|
mitigation: "Keep runtime images immutable and minimal, move administrative tooling to separate debug images, and investigate how the helper entered the image."
|
|
193
198
|
attack:
|
|
194
|
-
tactics: [
|
|
199
|
+
tactics: [TA0008, TA0011]
|
|
195
200
|
techniques: [T1105, T1570]
|
|
196
201
|
evidence: |
|
|
197
202
|
{
|
|
@@ -206,6 +211,7 @@
|
|
|
206
211
|
description: "Dedicated container or Kubernetes intrusion toolkits such as Peirates, CDK, or DEEPCE should not ship inside production runtime images."
|
|
207
212
|
severity: high
|
|
208
213
|
category: container-risk
|
|
214
|
+
dry-run-support: full
|
|
209
215
|
condition: |
|
|
210
216
|
components[
|
|
211
217
|
$prop($, 'cdx:container:matched') = 'true'
|
|
@@ -220,7 +226,7 @@
|
|
|
220
226
|
message: "Dedicated offensive toolkit '{{ name }}' is present at '{{ $prop($, 'SrcFile') }}'"
|
|
221
227
|
mitigation: "Remove offensive testing binaries from runtime images, rebuild from a minimal trusted base, and keep container debugging or red-team tooling in separate break-glass images."
|
|
222
228
|
attack:
|
|
223
|
-
tactics: [
|
|
229
|
+
tactics: [TA0002, TA0004, TA0006, TA0007]
|
|
224
230
|
techniques: [T1552.007, T1609, T1611, T1613]
|
|
225
231
|
evidence: |
|
|
226
232
|
{
|
|
@@ -237,6 +243,7 @@
|
|
|
237
243
|
description: "Helpers that rely on syscalls blocked by Docker's default seccomp profile become materially riskier when operators use `seccomp=unconfined` or permissive custom profiles."
|
|
238
244
|
severity: medium
|
|
239
245
|
category: container-risk
|
|
246
|
+
dry-run-support: full
|
|
240
247
|
condition: |
|
|
241
248
|
components[
|
|
242
249
|
$prop($, 'cdx:container:matched') = 'true'
|
|
@@ -256,7 +263,7 @@
|
|
|
256
263
|
message: "Seccomp-sensitive escape helper '{{ name }}' is present at '{{ $prop($, 'SrcFile') }}' and depends on syscalls blocked by the Docker default seccomp profile"
|
|
257
264
|
mitigation: "Keep Docker or OCI runtimes on the default seccomp profile, never use `seccomp=unconfined` for app workloads, and review custom profiles so they do not allow namespace or host-escape syscalls without a clear need."
|
|
258
265
|
attack:
|
|
259
|
-
tactics: [TA0004
|
|
266
|
+
tactics: [TA0004]
|
|
260
267
|
techniques: [T1611]
|
|
261
268
|
evidence: |
|
|
262
269
|
{
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
description: "npm packages with install scripts declared from git, URL, or local path sources in the manifest increase supply chain attack surface"
|
|
7
7
|
severity: high
|
|
8
8
|
category: dependency-source
|
|
9
|
+
dry-run-support: full
|
|
9
10
|
condition: |
|
|
10
11
|
components[
|
|
11
12
|
$prop($, 'cdx:npm:hasInstallScript') = 'true'
|
|
@@ -28,6 +29,7 @@
|
|
|
28
29
|
description: "Go modules with local_dir replacements are non-hermetic and may not be reproducible"
|
|
29
30
|
severity: high
|
|
30
31
|
category: dependency-source
|
|
32
|
+
dry-run-support: full
|
|
31
33
|
condition: |
|
|
32
34
|
components[
|
|
33
35
|
$hasProp($, 'cdx:go:local_dir')
|
|
@@ -46,6 +48,7 @@
|
|
|
46
48
|
description: "Swift packages with localCheckoutPath indicate developer-only dependencies not suitable for release"
|
|
47
49
|
severity: high
|
|
48
50
|
category: dependency-source
|
|
51
|
+
dry-run-support: full
|
|
49
52
|
condition: |
|
|
50
53
|
components[
|
|
51
54
|
$hasProp($, 'cdx:swift:localCheckoutPath')
|
|
@@ -64,6 +67,7 @@
|
|
|
64
67
|
description: "Nix dependencies without revision or nar_hash cannot be verified for content integrity"
|
|
65
68
|
severity: high
|
|
66
69
|
category: dependency-source
|
|
70
|
+
dry-run-support: full
|
|
67
71
|
condition: |
|
|
68
72
|
components[
|
|
69
73
|
$startsWith(purl, 'pkg:nix/')
|
|
@@ -88,6 +92,7 @@
|
|
|
88
92
|
description: "Ruby gems sourced from git branches (without revision pin) can change unexpectedly"
|
|
89
93
|
severity: medium
|
|
90
94
|
category: dependency-source
|
|
95
|
+
dry-run-support: full
|
|
91
96
|
condition: |
|
|
92
97
|
components[
|
|
93
98
|
$hasProp($, 'cdx:gem:remoteBranch')
|
|
@@ -108,6 +113,7 @@
|
|
|
108
113
|
description: "PyPI packages from unapproved registries may introduce unvetted code"
|
|
109
114
|
severity: low
|
|
110
115
|
category: dependency-source
|
|
116
|
+
dry-run-support: full
|
|
111
117
|
condition: |
|
|
112
118
|
components[
|
|
113
119
|
$hasProp($, 'cdx:pypi:registry')
|
|
@@ -128,6 +134,7 @@
|
|
|
128
134
|
description: "Cargo git dependencies without revision or tag pinning can change unexpectedly and reduce build reproducibility"
|
|
129
135
|
severity: high
|
|
130
136
|
category: dependency-source
|
|
137
|
+
dry-run-support: full
|
|
131
138
|
condition: |
|
|
132
139
|
components[
|
|
133
140
|
$hasProp($, 'cdx:cargo:git')
|
|
@@ -150,6 +157,7 @@
|
|
|
150
157
|
description: "Cargo path dependencies are local source references that reduce release reproducibility and may bypass registry review controls"
|
|
151
158
|
severity: high
|
|
152
159
|
category: dependency-source
|
|
160
|
+
dry-run-support: full
|
|
153
161
|
condition: |
|
|
154
162
|
components[
|
|
155
163
|
$hasProp($, 'cdx:cargo:path')
|
|
@@ -169,6 +177,7 @@
|
|
|
169
177
|
description: "Collider lock entries that resolve from HTTP origins can be observed or modified in transit before wrap-hash verification occurs"
|
|
170
178
|
severity: medium
|
|
171
179
|
category: dependency-source
|
|
180
|
+
dry-run-support: full
|
|
172
181
|
condition: |
|
|
173
182
|
components[
|
|
174
183
|
$prop($, 'cdx:collider:originScheme') = 'http'
|
|
@@ -188,6 +197,7 @@
|
|
|
188
197
|
description: "Collider lock origin URLs should not carry credentials, query strings, or fragments because those values may embed secrets or unstable signed URLs"
|
|
189
198
|
severity: low
|
|
190
199
|
category: dependency-source
|
|
200
|
+
dry-run-support: full
|
|
191
201
|
condition: |
|
|
192
202
|
components[
|
|
193
203
|
$prop($, 'cdx:collider:originSanitized') = 'true'
|
|
@@ -207,6 +217,7 @@
|
|
|
207
217
|
description: "Python dependencies declared via git, direct URL, or local path in requirements or pyproject files bypass normal registry version mediation"
|
|
208
218
|
severity: high
|
|
209
219
|
category: dependency-source
|
|
220
|
+
dry-run-support: full
|
|
210
221
|
condition: |
|
|
211
222
|
components[
|
|
212
223
|
$hasProp($, 'cdx:pypi:manifestSourceType')
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
# HBOM Compliance and Governance Rules
|
|
2
|
+
# Category: hbom-compliance
|
|
3
|
+
# Evaluates hardware inventory completeness, redaction posture, and governance-ready evidence.
|
|
4
|
+
|
|
5
|
+
- id: HBC-001
|
|
6
|
+
name: "HBOM inventory lacks firmware or board provenance"
|
|
7
|
+
description: "Incomplete firmware or board provenance weakens auditability for hardware refresh, attestation, and patch-governance workflows."
|
|
8
|
+
severity: medium
|
|
9
|
+
category: hbom-compliance
|
|
10
|
+
dry-run-support: full
|
|
11
|
+
standards:
|
|
12
|
+
nist-800-53:
|
|
13
|
+
- "CM-8 System Component Inventory"
|
|
14
|
+
- "SI-7 Software, Firmware, and Information Integrity"
|
|
15
|
+
cis-controls-v8:
|
|
16
|
+
- "1.1 Establish and Maintain Detailed Enterprise Asset Inventory"
|
|
17
|
+
condition: |
|
|
18
|
+
metadata.component[
|
|
19
|
+
$safeStr($prop($, 'cdx:hbom:platform')) = 'linux'
|
|
20
|
+
and $count(
|
|
21
|
+
$$.components[
|
|
22
|
+
$prop($, 'cdx:hbom:hardwareClass') = 'board'
|
|
23
|
+
and (
|
|
24
|
+
$hasProp($, 'cdx:hbom:boardVendor')
|
|
25
|
+
or $hasProp($, 'cdx:hbom:boardName')
|
|
26
|
+
or $hasProp($, 'cdx:hbom:biosVendor')
|
|
27
|
+
or $hasProp($, 'cdx:hbom:biosVersion')
|
|
28
|
+
or $hasProp($, 'cdx:hbom:firmwareDate')
|
|
29
|
+
)
|
|
30
|
+
]
|
|
31
|
+
) = 0
|
|
32
|
+
]
|
|
33
|
+
location: |
|
|
34
|
+
{
|
|
35
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
36
|
+
}
|
|
37
|
+
message: "HBOM for '{{ name }}' lacks board or firmware provenance fields needed for governance review"
|
|
38
|
+
mitigation: "Enable richer firmware/board collection on supported Linux hosts, validate SMBIOS access, and ensure the inventory captures board vendor, board name, BIOS vendor, BIOS version, and firmware date where available."
|
|
39
|
+
evidence: |
|
|
40
|
+
{
|
|
41
|
+
"platform": $prop($, 'cdx:hbom:platform'),
|
|
42
|
+
"architecture": $prop($, 'cdx:hbom:architecture'),
|
|
43
|
+
"collectorProfile": $prop(bom, 'cdx:hbom:collectorProfile'),
|
|
44
|
+
"boardComponentCount": $count($$.components[$prop($, 'cdx:hbom:hardwareClass') = 'board'])
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
- id: HBC-002
|
|
48
|
+
name: "Managed asset identity is incomplete"
|
|
49
|
+
description: "HBOMs used for fleet governance should capture stable host identity fields such as model, platform, and serial or asset identifiers."
|
|
50
|
+
severity: medium
|
|
51
|
+
category: hbom-compliance
|
|
52
|
+
dry-run-support: full
|
|
53
|
+
standards:
|
|
54
|
+
nist-800-53:
|
|
55
|
+
- "CM-8 System Component Inventory"
|
|
56
|
+
cis-controls-v8:
|
|
57
|
+
- "1.1 Establish and Maintain Detailed Enterprise Asset Inventory"
|
|
58
|
+
iso-27001:
|
|
59
|
+
- "A.5.9 Inventory of information and other associated assets"
|
|
60
|
+
condition: |
|
|
61
|
+
metadata.component[
|
|
62
|
+
type = 'device'
|
|
63
|
+
and (
|
|
64
|
+
$hasProp($, 'cdx:hbom:platform') = false
|
|
65
|
+
or $hasProp($, 'cdx:hbom:architecture') = false
|
|
66
|
+
or (
|
|
67
|
+
$hasProp($, 'cdx:hbom:serialNumber') = false
|
|
68
|
+
and $hasProp($, 'cdx:hbom:platformUuid') = false
|
|
69
|
+
and $hasProp($, 'cdx:hbom:assetTag') = false
|
|
70
|
+
)
|
|
71
|
+
)
|
|
72
|
+
]
|
|
73
|
+
location: |
|
|
74
|
+
{
|
|
75
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
76
|
+
}
|
|
77
|
+
message: "HBOM metadata for '{{ name }}' is missing stable asset identity fields required for governance workflows"
|
|
78
|
+
mitigation: "Capture platform, architecture, and at least one durable host identifier (serial, platform UUID, or asset tag) so the device can be reconciled with CMDB and lifecycle systems."
|
|
79
|
+
evidence: |
|
|
80
|
+
{
|
|
81
|
+
"platform": $prop($, 'cdx:hbom:platform'),
|
|
82
|
+
"architecture": $prop($, 'cdx:hbom:architecture'),
|
|
83
|
+
"serialNumber": $prop($, 'cdx:hbom:serialNumber'),
|
|
84
|
+
"platformUuid": $prop($, 'cdx:hbom:platformUuid'),
|
|
85
|
+
"assetTag": $prop($, 'cdx:hbom:assetTag')
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
- id: HBC-003
|
|
89
|
+
name: "HBOM collector evidence is incomplete"
|
|
90
|
+
description: "Governance review is weaker when the BOM omits the collector command evidence used to derive the hardware inventory."
|
|
91
|
+
severity: medium
|
|
92
|
+
category: hbom-compliance
|
|
93
|
+
dry-run-support: full
|
|
94
|
+
condition: |
|
|
95
|
+
metadata.component[
|
|
96
|
+
type = 'device'
|
|
97
|
+
and (
|
|
98
|
+
$hasProp($$, 'cdx:hbom:evidence:commandCount') = false
|
|
99
|
+
or $number($firstNonEmpty($prop($$, 'cdx:hbom:evidence:commandCount'), '0')) = 0
|
|
100
|
+
or $hasProp($$, 'cdx:hbom:evidence:command') = false
|
|
101
|
+
)
|
|
102
|
+
]
|
|
103
|
+
location: |
|
|
104
|
+
{
|
|
105
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
106
|
+
}
|
|
107
|
+
message: "HBOM for '{{ name }}' is missing collector command evidence needed for reproducible review"
|
|
108
|
+
mitigation: "Retain command-evidence metadata in the distributed BOM, or attach equivalent collection provenance so reviewers can understand how the hardware inventory was derived."
|
|
109
|
+
evidence: |
|
|
110
|
+
{
|
|
111
|
+
"collectorProfile": $prop(bom, 'cdx:hbom:collectorProfile'),
|
|
112
|
+
"commandCount": $prop(bom, 'cdx:hbom:evidence:commandCount'),
|
|
113
|
+
"commandEvidence": $prop(bom, 'cdx:hbom:evidence:command')
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
- id: HBC-004
|
|
117
|
+
name: "Storage inventory lacks encryption posture evidence"
|
|
118
|
+
description: "Storage volumes without explicit encryption posture make it difficult to prove compliance with device and media protection requirements."
|
|
119
|
+
severity: medium
|
|
120
|
+
category: hbom-compliance
|
|
121
|
+
dry-run-support: full
|
|
122
|
+
standards:
|
|
123
|
+
nist-800-53:
|
|
124
|
+
- "SC-28 Protection of Information at Rest"
|
|
125
|
+
- "CM-8 System Component Inventory"
|
|
126
|
+
condition: |
|
|
127
|
+
metadata.component[
|
|
128
|
+
type = 'device'
|
|
129
|
+
and $count($$.components[$prop($, 'cdx:hbom:hardwareClass') = 'storage-volume']) > 0
|
|
130
|
+
and $count(
|
|
131
|
+
$$.components[
|
|
132
|
+
$prop($, 'cdx:hbom:hardwareClass') = 'storage-volume'
|
|
133
|
+
and (
|
|
134
|
+
$hasProp($, 'cdx:hbom:isEncrypted')
|
|
135
|
+
or $hasProp($, 'cdx:hbom:fileVault')
|
|
136
|
+
)
|
|
137
|
+
]
|
|
138
|
+
) = 0
|
|
139
|
+
]
|
|
140
|
+
location: |
|
|
141
|
+
{
|
|
142
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
143
|
+
}
|
|
144
|
+
message: "HBOM for '{{ name }}' includes storage volumes but no explicit encryption posture evidence"
|
|
145
|
+
mitigation: "Enable volume-level enrichment on supported platforms or pair the HBOM with equivalent host controls evidence so encryption compliance can be verified."
|
|
146
|
+
evidence: |
|
|
147
|
+
{
|
|
148
|
+
"storageVolumeCount": $count($$.components[$prop($, 'cdx:hbom:hardwareClass') = 'storage-volume']),
|
|
149
|
+
"collectorProfile": $prop(bom, 'cdx:hbom:collectorProfile'),
|
|
150
|
+
"platform": $prop($, 'cdx:hbom:platform')
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
- id: HBC-005
|
|
154
|
+
name: "HBOM uses non-redacted identifier policy"
|
|
155
|
+
description: "HBOMs intended for broad distribution should avoid a non-redacted identifier policy unless raw identifiers are explicitly required by the receiving workflow."
|
|
156
|
+
severity: medium
|
|
157
|
+
category: hbom-compliance
|
|
158
|
+
dry-run-support: full
|
|
159
|
+
condition: |
|
|
160
|
+
metadata.component[
|
|
161
|
+
type = 'device'
|
|
162
|
+
and $hasProp($, 'cdx:hbom:identifierPolicy')
|
|
163
|
+
and $not($startsWith($lowercase($safeStr($prop($, 'cdx:hbom:identifierPolicy'))), 'redacted'))
|
|
164
|
+
]
|
|
165
|
+
location: |
|
|
166
|
+
{
|
|
167
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
168
|
+
}
|
|
169
|
+
message: "HBOM for '{{ name }}' uses identifier policy '{{ $prop($, 'cdx:hbom:identifierPolicy') }}' instead of a redacted posture"
|
|
170
|
+
mitigation: "Default distributed HBOMs to redacted identifiers and keep raw hardware identity values confined to internal asset-governance workflows with a documented need-to-know."
|
|
171
|
+
evidence: |
|
|
172
|
+
{
|
|
173
|
+
"identifierPolicy": $prop($, 'cdx:hbom:identifierPolicy'),
|
|
174
|
+
"serialNumber": $prop($, 'cdx:hbom:serialNumber'),
|
|
175
|
+
"platformUuid": $prop($, 'cdx:hbom:platformUuid')
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
- id: HBC-006
|
|
179
|
+
name: "HBOM collector is missing optional enrichment commands"
|
|
180
|
+
description: "Missing native utilities reduce the hardware evidence available to governance, assurance, and troubleshooting workflows."
|
|
181
|
+
severity: medium
|
|
182
|
+
category: hbom-compliance
|
|
183
|
+
dry-run-support: full
|
|
184
|
+
condition: |
|
|
185
|
+
metadata.component[
|
|
186
|
+
type = 'device'
|
|
187
|
+
and $number($firstNonEmpty($prop($$, 'cdx:hbom:analysis:missingCommandCount'), '0')) > 0
|
|
188
|
+
]
|
|
189
|
+
location: |
|
|
190
|
+
{
|
|
191
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
192
|
+
}
|
|
193
|
+
message: "HBOM for '{{ name }}' reported missing native enrichment commands"
|
|
194
|
+
mitigation: "Install the reported utilities on the target host and rerun the HBOM collection so the inventory includes the richer structured hardware evidence those commands provide."
|
|
195
|
+
evidence: |
|
|
196
|
+
{
|
|
197
|
+
"collectorProfile": $prop(bom, 'cdx:hbom:collectorProfile'),
|
|
198
|
+
"missingCommandCount": $prop(bom, 'cdx:hbom:analysis:missingCommandCount'),
|
|
199
|
+
"missingCommands": $propList(bom, 'cdx:hbom:analysis:missingCommands'),
|
|
200
|
+
"diagnosticIssues": $propList(bom, 'cdx:hbom:analysis:diagnosticIssues')
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
- id: HBC-007
|
|
204
|
+
name: "HBOM collector hit permission-denied enrichments"
|
|
205
|
+
description: "Permission-sensitive enrichments that fail during collection often leave firmware, graphics, or SMBIOS evidence incomplete until the host is rerun with the documented privileged mode."
|
|
206
|
+
severity: medium
|
|
207
|
+
category: hbom-compliance
|
|
208
|
+
dry-run-support: full
|
|
209
|
+
standards:
|
|
210
|
+
nist-800-53:
|
|
211
|
+
- "CM-8 System Component Inventory"
|
|
212
|
+
- "SI-7 Software, Firmware, and Information Integrity"
|
|
213
|
+
condition: |
|
|
214
|
+
metadata.component[
|
|
215
|
+
type = 'device'
|
|
216
|
+
and $number($firstNonEmpty($prop($$, 'cdx:hbom:analysis:permissionDeniedCount'), '0')) > 0
|
|
217
|
+
]
|
|
218
|
+
location: |
|
|
219
|
+
{
|
|
220
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
221
|
+
}
|
|
222
|
+
message: "HBOM for '{{ name }}' hit permission-denied enrichments that likely require a rerun with --privileged"
|
|
223
|
+
mitigation: "Where policy allows, rerun HBOM collection with --privileged so cdx-hbom can use the documented non-interactive sudo path for permission-sensitive Linux enrichments."
|
|
224
|
+
evidence: |
|
|
225
|
+
{
|
|
226
|
+
"collectorProfile": $prop(bom, 'cdx:hbom:collectorProfile'),
|
|
227
|
+
"permissionDeniedCount": $prop(bom, 'cdx:hbom:analysis:permissionDeniedCount'),
|
|
228
|
+
"permissionDeniedCommands": $propList(bom, 'cdx:hbom:analysis:permissionDeniedCommands'),
|
|
229
|
+
"requiresPrivileged": $prop(bom, 'cdx:hbom:analysis:requiresPrivileged')
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
- id: HBC-008
|
|
233
|
+
name: "HBOM collector is missing firmware-management enrichment"
|
|
234
|
+
description: "Without fwupd-derived metadata, governance teams lose update-protocol, firmware GUID, and device lifecycle context that is useful for firmware assurance and remediation planning."
|
|
235
|
+
severity: medium
|
|
236
|
+
category: hbom-compliance
|
|
237
|
+
dry-run-support: full
|
|
238
|
+
standards:
|
|
239
|
+
nist-800-53:
|
|
240
|
+
- "CM-8 System Component Inventory"
|
|
241
|
+
- "SI-7 Software, Firmware, and Information Integrity"
|
|
242
|
+
condition: |
|
|
243
|
+
metadata.component[
|
|
244
|
+
$safeStr($prop($, 'cdx:hbom:platform')) = 'linux'
|
|
245
|
+
and $listContains($propList($$, 'cdx:hbom:analysis:missingCommandIds'), 'fwupdmgr-devices-json')
|
|
246
|
+
]
|
|
247
|
+
location: |
|
|
248
|
+
{
|
|
249
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
250
|
+
}
|
|
251
|
+
message: "HBOM for '{{ name }}' is missing firmware-management enrichment because fwupdmgr was unavailable"
|
|
252
|
+
mitigation: "Install fwupd on the target host and rerun the collection so the BOM can capture protocol, flags, GUIDs, and related firmware-management properties where supported."
|
|
253
|
+
evidence: |
|
|
254
|
+
{
|
|
255
|
+
"collectorProfile": $prop(bom, 'cdx:hbom:collectorProfile'),
|
|
256
|
+
"missingCommandIds": $propList(bom, 'cdx:hbom:analysis:missingCommandIds'),
|
|
257
|
+
"missingCommands": $propList(bom, 'cdx:hbom:analysis:missingCommands'),
|
|
258
|
+
"installHintCount": $prop(bom, 'cdx:hbom:analysis:installHintCount')
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
- id: HBC-009
|
|
262
|
+
name: "HBOM board and BIOS provenance was blocked by permissions"
|
|
263
|
+
description: "When dmidecode-backed firmware and board enrichment is blocked, the HBOM may miss board-vendor, board-name, BIOS-version, and related governance evidence."
|
|
264
|
+
severity: medium
|
|
265
|
+
category: hbom-compliance
|
|
266
|
+
dry-run-support: full
|
|
267
|
+
standards:
|
|
268
|
+
nist-800-53:
|
|
269
|
+
- "CM-8 System Component Inventory"
|
|
270
|
+
- "SI-7 Software, Firmware, and Information Integrity"
|
|
271
|
+
condition: |
|
|
272
|
+
metadata.component[
|
|
273
|
+
$safeStr($prop($, 'cdx:hbom:platform')) = 'linux'
|
|
274
|
+
and $listContains($propList($$, 'cdx:hbom:analysis:permissionDeniedIds'), 'dmidecode-firmware-board')
|
|
275
|
+
]
|
|
276
|
+
location: |
|
|
277
|
+
{
|
|
278
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
279
|
+
}
|
|
280
|
+
message: "HBOM for '{{ name }}' could not capture full board and BIOS provenance because dmidecode enrichment was blocked"
|
|
281
|
+
mitigation: "Where policy allows, rerun with --privileged or equivalent access so the collector can gather firmware vendor, BIOS version, board vendor, and board name data."
|
|
282
|
+
evidence: |
|
|
283
|
+
{
|
|
284
|
+
"collectorProfile": $prop(bom, 'cdx:hbom:collectorProfile'),
|
|
285
|
+
"permissionDeniedIds": $propList(bom, 'cdx:hbom:analysis:permissionDeniedIds'),
|
|
286
|
+
"permissionDeniedCommands": $propList(bom, 'cdx:hbom:analysis:permissionDeniedCommands'),
|
|
287
|
+
"boardComponentCount": $count($$.components[$prop($, 'cdx:hbom:hardwareClass') = 'board'])
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
- id: HBC-010
|
|
291
|
+
name: "HBOM display and DRM evidence is incomplete"
|
|
292
|
+
description: "Missing EDID decoding or blocked DRM enrichment reduces the fidelity of display, connector, and content-protection metadata used during workstation and kiosk governance reviews."
|
|
293
|
+
severity: medium
|
|
294
|
+
category: hbom-compliance
|
|
295
|
+
dry-run-support: full
|
|
296
|
+
condition: |
|
|
297
|
+
metadata.component[
|
|
298
|
+
$count(
|
|
299
|
+
$$.components[
|
|
300
|
+
$prop($, 'cdx:hbom:hardwareClass') = 'display-connector'
|
|
301
|
+
or $prop($, 'cdx:hbom:hardwareClass') = 'display-adapter'
|
|
302
|
+
]
|
|
303
|
+
) > 0
|
|
304
|
+
and (
|
|
305
|
+
$listContains($propList($$, 'cdx:hbom:analysis:missingCommandIds'), 'edid-decode')
|
|
306
|
+
or $listContains($propList($$, 'cdx:hbom:analysis:permissionDeniedIds'), 'drm-info-json')
|
|
307
|
+
)
|
|
308
|
+
]
|
|
309
|
+
location: |
|
|
310
|
+
{
|
|
311
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
312
|
+
}
|
|
313
|
+
message: "HBOM for '{{ name }}' includes display hardware but the richer DRM or EDID evidence is incomplete"
|
|
314
|
+
mitigation: "Install edid-decode where available and, if policy permits, rerun with --privileged so the collector can capture connector, mode, and content-protection metadata for Linux displays."
|
|
315
|
+
evidence: |
|
|
316
|
+
{
|
|
317
|
+
"displayComponentCount": $count(
|
|
318
|
+
$$.components[
|
|
319
|
+
$prop($, 'cdx:hbom:hardwareClass') = 'display-connector'
|
|
320
|
+
or $prop($, 'cdx:hbom:hardwareClass') = 'display-adapter'
|
|
321
|
+
]
|
|
322
|
+
),
|
|
323
|
+
"missingCommandIds": $propList(bom, 'cdx:hbom:analysis:missingCommandIds'),
|
|
324
|
+
"permissionDeniedIds": $propList(bom, 'cdx:hbom:analysis:permissionDeniedIds')
|
|
325
|
+
}
|