@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.
Files changed (157) hide show
  1. package/README.md +64 -22
  2. package/bin/audit.js +21 -7
  3. package/bin/cdxgen.js +238 -116
  4. package/bin/convert.js +28 -13
  5. package/bin/hbom.js +490 -0
  6. package/bin/repl.js +580 -29
  7. package/bin/validate.js +34 -4
  8. package/bin/verify.js +40 -5
  9. package/data/README.md +298 -25
  10. package/data/component-tags.json +6 -0
  11. package/data/crypto-oid.json +16 -0
  12. package/data/predictive-audit-allowlist.json +11 -0
  13. package/data/queries-darwin.json +12 -1
  14. package/data/queries-win.json +7 -1
  15. package/data/queries.json +39 -2
  16. package/data/rules/ai-agent-governance.yaml +16 -0
  17. package/data/rules/asar-archives.yaml +150 -0
  18. package/data/rules/chrome-extensions.yaml +8 -0
  19. package/data/rules/ci-permissions.yaml +42 -18
  20. package/data/rules/container-risk.yaml +14 -7
  21. package/data/rules/dependency-sources.yaml +11 -0
  22. package/data/rules/hbom-compliance.yaml +325 -0
  23. package/data/rules/hbom-performance.yaml +307 -0
  24. package/data/rules/hbom-security.yaml +248 -0
  25. package/data/rules/host-topology.yaml +165 -0
  26. package/data/rules/mcp-servers.yaml +18 -3
  27. package/data/rules/obom-runtime.yaml +907 -22
  28. package/data/rules/package-integrity.yaml +14 -0
  29. package/data/rules/rootfs-hardening.yaml +179 -0
  30. package/data/rules/vscode-extensions.yaml +9 -0
  31. package/lib/audit/index.js +209 -8
  32. package/lib/audit/index.poku.js +332 -0
  33. package/lib/audit/reporters.js +222 -0
  34. package/lib/audit/targets.js +146 -1
  35. package/lib/audit/targets.poku.js +186 -0
  36. package/lib/cli/asar.poku.js +328 -0
  37. package/lib/cli/index.js +506 -88
  38. package/lib/cli/index.poku.js +1352 -212
  39. package/lib/evinser/evinser.js +14 -9
  40. package/lib/helpers/analyzer.js +1406 -29
  41. package/lib/helpers/analyzer.poku.js +342 -0
  42. package/lib/helpers/analyzerScope.js +712 -0
  43. package/lib/helpers/asarutils.js +1556 -0
  44. package/lib/helpers/asarutils.poku.js +443 -0
  45. package/lib/helpers/auditCategories.js +12 -0
  46. package/lib/helpers/auditCategories.poku.js +32 -0
  47. package/lib/helpers/cbomutils.js +271 -1
  48. package/lib/helpers/cbomutils.poku.js +248 -5
  49. package/lib/helpers/display.js +291 -1
  50. package/lib/helpers/display.poku.js +149 -0
  51. package/lib/helpers/evidenceUtils.js +58 -0
  52. package/lib/helpers/evidenceUtils.poku.js +54 -0
  53. package/lib/helpers/exportUtils.js +9 -0
  54. package/lib/helpers/gtfobins.js +142 -8
  55. package/lib/helpers/gtfobins.poku.js +24 -1
  56. package/lib/helpers/hbom.js +710 -0
  57. package/lib/helpers/hbom.poku.js +496 -0
  58. package/lib/helpers/hbomAnalysis.js +268 -0
  59. package/lib/helpers/hbomAnalysis.poku.js +249 -0
  60. package/lib/helpers/hbomLoader.js +35 -0
  61. package/lib/helpers/hostTopology.js +803 -0
  62. package/lib/helpers/hostTopology.poku.js +363 -0
  63. package/lib/helpers/inventoryStats.js +69 -0
  64. package/lib/helpers/inventoryStats.poku.js +86 -0
  65. package/lib/helpers/lolbas.js +19 -1
  66. package/lib/helpers/lolbas.poku.js +23 -0
  67. package/lib/helpers/osqueryTransform.js +47 -0
  68. package/lib/helpers/osqueryTransform.poku.js +47 -0
  69. package/lib/helpers/plugins.js +349 -0
  70. package/lib/helpers/plugins.poku.js +57 -0
  71. package/lib/helpers/protobom.js +156 -45
  72. package/lib/helpers/protobom.poku.js +140 -5
  73. package/lib/helpers/remote/dependency-track.js +36 -3
  74. package/lib/helpers/remote/dependency-track.poku.js +44 -0
  75. package/lib/helpers/source.js +24 -0
  76. package/lib/helpers/source.poku.js +32 -0
  77. package/lib/helpers/utils.js +1438 -93
  78. package/lib/helpers/utils.poku.js +846 -4
  79. package/lib/managers/binary.e2e.poku.js +367 -0
  80. package/lib/managers/binary.js +2293 -353
  81. package/lib/managers/binary.poku.js +1699 -1
  82. package/lib/managers/docker.js +201 -79
  83. package/lib/managers/docker.poku.js +337 -12
  84. package/lib/server/server.js +2 -27
  85. package/lib/stages/postgen/annotator.js +38 -0
  86. package/lib/stages/postgen/annotator.poku.js +107 -1
  87. package/lib/stages/postgen/auditBom.js +121 -18
  88. package/lib/stages/postgen/auditBom.poku.js +1366 -31
  89. package/lib/stages/postgen/hostTopologyAudit.poku.js +186 -0
  90. package/lib/stages/postgen/postgen.js +192 -1
  91. package/lib/stages/postgen/postgen.poku.js +321 -0
  92. package/lib/stages/postgen/ruleEngine.js +116 -0
  93. package/lib/stages/pregen/envAudit.js +14 -3
  94. package/package.json +23 -21
  95. package/types/bin/hbom.d.ts +3 -0
  96. package/types/bin/hbom.d.ts.map +1 -0
  97. package/types/bin/repl.d.ts.map +1 -1
  98. package/types/lib/audit/index.d.ts +44 -0
  99. package/types/lib/audit/index.d.ts.map +1 -1
  100. package/types/lib/audit/reporters.d.ts +16 -0
  101. package/types/lib/audit/reporters.d.ts.map +1 -1
  102. package/types/lib/audit/targets.d.ts.map +1 -1
  103. package/types/lib/cli/index.d.ts +16 -0
  104. package/types/lib/cli/index.d.ts.map +1 -1
  105. package/types/lib/evinser/evinser.d.ts +4 -0
  106. package/types/lib/evinser/evinser.d.ts.map +1 -1
  107. package/types/lib/helpers/analyzer.d.ts +33 -0
  108. package/types/lib/helpers/analyzer.d.ts.map +1 -1
  109. package/types/lib/helpers/analyzerScope.d.ts +11 -0
  110. package/types/lib/helpers/analyzerScope.d.ts.map +1 -0
  111. package/types/lib/helpers/asarutils.d.ts +34 -0
  112. package/types/lib/helpers/asarutils.d.ts.map +1 -0
  113. package/types/lib/helpers/auditCategories.d.ts +5 -0
  114. package/types/lib/helpers/auditCategories.d.ts.map +1 -1
  115. package/types/lib/helpers/cbomutils.d.ts +3 -2
  116. package/types/lib/helpers/cbomutils.d.ts.map +1 -1
  117. package/types/lib/helpers/display.d.ts.map +1 -1
  118. package/types/lib/helpers/evidenceUtils.d.ts +8 -0
  119. package/types/lib/helpers/evidenceUtils.d.ts.map +1 -0
  120. package/types/lib/helpers/exportUtils.d.ts.map +1 -1
  121. package/types/lib/helpers/gtfobins.d.ts +8 -0
  122. package/types/lib/helpers/gtfobins.d.ts.map +1 -1
  123. package/types/lib/helpers/hbom.d.ts +49 -0
  124. package/types/lib/helpers/hbom.d.ts.map +1 -0
  125. package/types/lib/helpers/hbomAnalysis.d.ts +62 -0
  126. package/types/lib/helpers/hbomAnalysis.d.ts.map +1 -0
  127. package/types/lib/helpers/hbomLoader.d.ts +7 -0
  128. package/types/lib/helpers/hbomLoader.d.ts.map +1 -0
  129. package/types/lib/helpers/hostTopology.d.ts +12 -0
  130. package/types/lib/helpers/hostTopology.d.ts.map +1 -0
  131. package/types/lib/helpers/inventoryStats.d.ts +11 -0
  132. package/types/lib/helpers/inventoryStats.d.ts.map +1 -0
  133. package/types/lib/helpers/lolbas.d.ts.map +1 -1
  134. package/types/lib/helpers/osqueryTransform.d.ts +3 -0
  135. package/types/lib/helpers/osqueryTransform.d.ts.map +1 -1
  136. package/types/lib/helpers/plugins.d.ts +58 -0
  137. package/types/lib/helpers/plugins.d.ts.map +1 -0
  138. package/types/lib/helpers/protobom.d.ts +3 -4
  139. package/types/lib/helpers/protobom.d.ts.map +1 -1
  140. package/types/lib/helpers/remote/dependency-track.d.ts +10 -3
  141. package/types/lib/helpers/remote/dependency-track.d.ts.map +1 -1
  142. package/types/lib/helpers/source.d.ts.map +1 -1
  143. package/types/lib/helpers/utils.d.ts +45 -8
  144. package/types/lib/helpers/utils.d.ts.map +1 -1
  145. package/types/lib/managers/binary.d.ts +5 -0
  146. package/types/lib/managers/binary.d.ts.map +1 -1
  147. package/types/lib/managers/docker.d.ts.map +1 -1
  148. package/types/lib/server/server.d.ts +2 -1
  149. package/types/lib/server/server.d.ts.map +1 -1
  150. package/types/lib/stages/postgen/annotator.d.ts.map +1 -1
  151. package/types/lib/stages/postgen/auditBom.d.ts +26 -1
  152. package/types/lib/stages/postgen/auditBom.d.ts.map +1 -1
  153. package/types/lib/stages/postgen/postgen.d.ts +2 -1
  154. package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
  155. package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
  156. package/types/lib/stages/pregen/envAudit.d.ts.map +1 -1
  157. 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, TA0008]
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, TA0008]
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: [TA0003, TA0004]
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: [TA0006, TA0010]
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: [TA0001, TA0008]
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: [TA0003, TA0004, TA0006, TA0007, TA0008]
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, TA0008]
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
+ }