@cyclonedx/cdxgen 12.3.3 → 12.4.1
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 +69 -25
- package/bin/audit.js +21 -7
- package/bin/cdxgen.js +270 -127
- package/bin/convert.js +34 -15
- package/bin/hbom.js +495 -0
- package/bin/repl.js +592 -37
- package/bin/validate.js +31 -4
- package/bin/verify.js +18 -5
- package/data/README.md +298 -25
- package/data/component-tags.json +6 -0
- package/data/crypto-oid.json +16 -0
- package/data/cyclonedx-2.0-bundled.schema.json +7182 -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 +210 -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 +527 -99
- package/lib/cli/index.poku.js +1469 -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/bomUtils.js +155 -1
- package/lib/helpers/bomUtils.poku.js +79 -1
- 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 +350 -0
- package/lib/helpers/plugins.poku.js +57 -0
- package/lib/helpers/protobom.js +209 -45
- package/lib/helpers/protobom.poku.js +183 -5
- package/lib/helpers/protobomLoader.js +43 -0
- package/lib/helpers/protobomLoader.poku.js +31 -0
- 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 +4 -28
- 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 +406 -8
- package/lib/stages/postgen/postgen.poku.js +484 -0
- package/lib/stages/postgen/ruleEngine.js +116 -0
- package/lib/stages/pregen/envAudit.js +14 -3
- package/lib/validator/bomValidator.js +90 -38
- package/lib/validator/bomValidator.poku.js +90 -0
- package/lib/validator/complianceRules.js +4 -2
- package/lib/validator/index.poku.js +14 -0
- 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 +1 -1
- 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/bomUtils.d.ts +10 -0
- package/types/lib/helpers/bomUtils.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 +76 -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 +5 -4
- package/types/lib/helpers/protobom.d.ts.map +1 -1
- package/types/lib/helpers/protobomLoader.d.ts +17 -0
- package/types/lib/helpers/protobomLoader.d.ts.map +1 -0
- 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/types/lib/third-party/arborist/lib/node.d.ts +23 -0
- package/types/lib/third-party/arborist/lib/node.d.ts.map +1 -1
- package/types/lib/validator/bomValidator.d.ts.map +1 -1
- package/types/lib/validator/complianceRules.d.ts.map +1 -1
- package/data/spdx-model-v3.0.1.jsonld +0 -15999
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# HBOM Security Rules
|
|
2
|
+
# Category: hbom-security
|
|
3
|
+
# Evaluates host hardware inventory for encryption, removable-media, wireless, and disclosure risks.
|
|
4
|
+
|
|
5
|
+
- id: HBS-001
|
|
6
|
+
name: "Storage component is explicitly unencrypted"
|
|
7
|
+
description: "System or attached storage reported as unencrypted increases exposure for lost, stolen, or offline-access devices."
|
|
8
|
+
severity: high
|
|
9
|
+
category: hbom-security
|
|
10
|
+
dry-run-support: full
|
|
11
|
+
standards:
|
|
12
|
+
nist-800-53:
|
|
13
|
+
- "SC-28 Protection of Information at Rest"
|
|
14
|
+
cis-controls-v8:
|
|
15
|
+
- "3.11 Encrypt Sensitive Data at Rest"
|
|
16
|
+
iso-27001:
|
|
17
|
+
- "A.8.24 Use of cryptography"
|
|
18
|
+
condition: |
|
|
19
|
+
components[
|
|
20
|
+
(
|
|
21
|
+
$prop($, 'cdx:hbom:hardwareClass') = 'storage'
|
|
22
|
+
or $prop($, 'cdx:hbom:hardwareClass') = 'storage-volume'
|
|
23
|
+
)
|
|
24
|
+
and (
|
|
25
|
+
$safeStr($prop($, 'cdx:hbom:isEncrypted')) = 'false'
|
|
26
|
+
or $safeStr($prop($, 'cdx:hbom:fileVault')) = 'false'
|
|
27
|
+
)
|
|
28
|
+
]
|
|
29
|
+
location: |
|
|
30
|
+
{
|
|
31
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
32
|
+
}
|
|
33
|
+
message: "Storage component '{{ name }}' is reported as unencrypted"
|
|
34
|
+
mitigation: "Enable full-disk or volume encryption, verify escrow/recovery procedures, and confirm the device is enrolled in the intended encryption baseline."
|
|
35
|
+
evidence: |
|
|
36
|
+
{
|
|
37
|
+
"hardwareClass": $prop($, 'cdx:hbom:hardwareClass'),
|
|
38
|
+
"isEncrypted": $prop($, 'cdx:hbom:isEncrypted'),
|
|
39
|
+
"fileVault": $prop($, 'cdx:hbom:fileVault'),
|
|
40
|
+
"volumeUuid": $prop($, 'cdx:hbom:volumeUuid'),
|
|
41
|
+
"deviceSerial": $prop($, 'cdx:hbom:deviceSerial')
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
- id: HBS-002
|
|
45
|
+
name: "Connected wireless adapter uses weak or missing link security"
|
|
46
|
+
description: "Wireless adapters connected without strong link security indicate elevated interception and unauthorized access risk."
|
|
47
|
+
severity: high
|
|
48
|
+
category: hbom-security
|
|
49
|
+
dry-run-support: full
|
|
50
|
+
standards:
|
|
51
|
+
nist-800-53:
|
|
52
|
+
- "AC-18 Wireless Access"
|
|
53
|
+
- "SC-13 Cryptographic Protection"
|
|
54
|
+
condition: |
|
|
55
|
+
components[
|
|
56
|
+
$prop($, 'cdx:hbom:hardwareClass') = 'wireless-adapter'
|
|
57
|
+
and $safeStr($prop($, 'cdx:hbom:connected')) = 'true'
|
|
58
|
+
and (
|
|
59
|
+
$safeStr($prop($, 'cdx:hbom:securityMode')) = ''
|
|
60
|
+
or $contains($lowercase($safeStr($prop($, 'cdx:hbom:securityMode'))), 'open')
|
|
61
|
+
or $contains($lowercase($safeStr($prop($, 'cdx:hbom:securityMode'))), 'wep')
|
|
62
|
+
or $contains($lowercase($safeStr($prop($, 'cdx:hbom:securityMode'))), 'none')
|
|
63
|
+
)
|
|
64
|
+
]
|
|
65
|
+
location: |
|
|
66
|
+
{
|
|
67
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
68
|
+
}
|
|
69
|
+
message: "Wireless adapter '{{ name }}' is connected with weak or missing security mode '{{ $firstNonEmpty($prop($, 'cdx:hbom:securityMode'), 'unknown') }}'"
|
|
70
|
+
mitigation: "Move the device to WPA2/WPA3-class protections, review SSID policy, and confirm that open or legacy wireless modes are not permitted for the host profile."
|
|
71
|
+
evidence: |
|
|
72
|
+
{
|
|
73
|
+
"securityMode": $prop($, 'cdx:hbom:securityMode'),
|
|
74
|
+
"channel": $prop($, 'cdx:hbom:channel'),
|
|
75
|
+
"phyMode": $prop($, 'cdx:hbom:phyMode'),
|
|
76
|
+
"countryCode": $prop($, 'cdx:hbom:countryCode'),
|
|
77
|
+
"firmwareVersion": $prop($, 'cdx:hbom:firmwareVersion')
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
- id: HBS-003
|
|
81
|
+
name: "Removable storage is attached without encryption or lock evidence"
|
|
82
|
+
description: "Attached removable storage that is explicitly unlocked or unencrypted increases data-exfiltration and malware-ingress risk."
|
|
83
|
+
severity: high
|
|
84
|
+
category: hbom-security
|
|
85
|
+
dry-run-support: full
|
|
86
|
+
standards:
|
|
87
|
+
nist-800-53:
|
|
88
|
+
- "MP-7 Media Use"
|
|
89
|
+
- "SC-28 Protection of Information at Rest"
|
|
90
|
+
cis-controls-v8:
|
|
91
|
+
- "3.9 Encrypt Data on Removable Media"
|
|
92
|
+
condition: |
|
|
93
|
+
components[
|
|
94
|
+
(
|
|
95
|
+
$prop($, 'cdx:hbom:hardwareClass') = 'storage'
|
|
96
|
+
or $prop($, 'cdx:hbom:hardwareClass') = 'storage-volume'
|
|
97
|
+
)
|
|
98
|
+
and $safeStr($prop($, 'cdx:hbom:isRemovable')) = 'true'
|
|
99
|
+
and (
|
|
100
|
+
$safeStr($prop($, 'cdx:hbom:isEncrypted')) = 'false'
|
|
101
|
+
or $safeStr($prop($, 'cdx:hbom:isLocked')) = 'false'
|
|
102
|
+
)
|
|
103
|
+
]
|
|
104
|
+
location: |
|
|
105
|
+
{
|
|
106
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
107
|
+
}
|
|
108
|
+
message: "Removable storage '{{ name }}' is attached without encryption or lock assurance"
|
|
109
|
+
mitigation: "Remove unapproved removable media, require encrypted removable devices, and verify the host's removable-media control policy."
|
|
110
|
+
evidence: |
|
|
111
|
+
{
|
|
112
|
+
"isRemovable": $prop($, 'cdx:hbom:isRemovable'),
|
|
113
|
+
"isEncrypted": $prop($, 'cdx:hbom:isEncrypted'),
|
|
114
|
+
"isLocked": $prop($, 'cdx:hbom:isLocked'),
|
|
115
|
+
"connectionType": $prop($, 'cdx:hbom:connectionType'),
|
|
116
|
+
"transport": $prop($, 'cdx:hbom:transport')
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
- id: HBS-004
|
|
120
|
+
name: "HBOM exposes raw hardware identifiers"
|
|
121
|
+
description: "Raw serial numbers, MAC addresses, or platform UUIDs in the BOM can leak asset intelligence beyond the intended audience."
|
|
122
|
+
severity: medium
|
|
123
|
+
category: hbom-security
|
|
124
|
+
dry-run-support: full
|
|
125
|
+
condition: |
|
|
126
|
+
$append(
|
|
127
|
+
metadata.component[
|
|
128
|
+
(
|
|
129
|
+
$hasProp($, 'cdx:hbom:serialNumber')
|
|
130
|
+
and $startsWith($safeStr($prop($, 'cdx:hbom:serialNumber')), 'redacted') = false
|
|
131
|
+
)
|
|
132
|
+
or (
|
|
133
|
+
$hasProp($, 'cdx:hbom:platformUuid')
|
|
134
|
+
and $startsWith($safeStr($prop($, 'cdx:hbom:platformUuid')), 'redacted') = false
|
|
135
|
+
)
|
|
136
|
+
],
|
|
137
|
+
components[
|
|
138
|
+
(
|
|
139
|
+
$hasProp($, 'cdx:hbom:serialNumber')
|
|
140
|
+
and $startsWith($safeStr($prop($, 'cdx:hbom:serialNumber')), 'redacted') = false
|
|
141
|
+
)
|
|
142
|
+
or (
|
|
143
|
+
$hasProp($, 'cdx:hbom:macAddress')
|
|
144
|
+
and $startsWith($safeStr($prop($, 'cdx:hbom:macAddress')), 'redacted') = false
|
|
145
|
+
)
|
|
146
|
+
or (
|
|
147
|
+
$hasProp($, 'cdx:hbom:deviceSerial')
|
|
148
|
+
and $startsWith($safeStr($prop($, 'cdx:hbom:deviceSerial')), 'redacted') = false
|
|
149
|
+
)
|
|
150
|
+
]
|
|
151
|
+
)
|
|
152
|
+
location: |
|
|
153
|
+
{
|
|
154
|
+
"bomRef": $firstNonEmpty($."bom-ref", metadata.component."bom-ref", bom.serialNumber)
|
|
155
|
+
}
|
|
156
|
+
message: "HBOM entry '{{ name }}' exposes raw hardware identifiers that should be reviewed before distribution"
|
|
157
|
+
mitigation: "Use redacted identifier mode for externally shared HBOMs and restrict raw identifiers to tightly controlled internal asset workflows."
|
|
158
|
+
evidence: |
|
|
159
|
+
{
|
|
160
|
+
"identifierPolicy": $firstNonEmpty($prop($, 'cdx:hbom:identifierPolicy'), $prop(metadata.component, 'cdx:hbom:identifierPolicy')),
|
|
161
|
+
"serialNumber": $prop($, 'cdx:hbom:serialNumber'),
|
|
162
|
+
"macAddress": $prop($, 'cdx:hbom:macAddress'),
|
|
163
|
+
"deviceSerial": $prop($, 'cdx:hbom:deviceSerial'),
|
|
164
|
+
"platformUuid": $prop(metadata.component, 'cdx:hbom:platformUuid')
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
- id: HBS-005
|
|
168
|
+
name: "External expansion bus reports permissive security posture"
|
|
169
|
+
description: "A Thunderbolt or USB4 path with permissive security level or disabled IOMMU protection increases the risk of DMA-style or rogue-device attack paths."
|
|
170
|
+
severity: high
|
|
171
|
+
category: hbom-security
|
|
172
|
+
dry-run-support: full
|
|
173
|
+
standards:
|
|
174
|
+
nist-800-53:
|
|
175
|
+
- "CM-8 System Component Inventory"
|
|
176
|
+
- "SC-7 Boundary Protection"
|
|
177
|
+
- "SI-16 Memory Protection"
|
|
178
|
+
condition: |
|
|
179
|
+
components[
|
|
180
|
+
(
|
|
181
|
+
$hasProp($, 'cdx:hbom:securityLevel')
|
|
182
|
+
or $hasProp($, 'cdx:hbom:iommuProtection')
|
|
183
|
+
or $hasProp($, 'cdx:hbom:policy')
|
|
184
|
+
)
|
|
185
|
+
and (
|
|
186
|
+
$contains($lowercase($safeStr($prop($, 'cdx:hbom:securityLevel'))), 'none')
|
|
187
|
+
or $contains($lowercase($safeStr($prop($, 'cdx:hbom:securityLevel'))), 'legacy')
|
|
188
|
+
or $contains($lowercase($safeStr($prop($, 'cdx:hbom:securityLevel'))), 'user')
|
|
189
|
+
or $safeStr($prop($, 'cdx:hbom:iommuProtection')) = 'false'
|
|
190
|
+
)
|
|
191
|
+
]
|
|
192
|
+
location: |
|
|
193
|
+
{
|
|
194
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
195
|
+
}
|
|
196
|
+
message: "External expansion component '{{ name }}' reports a permissive security posture or missing IOMMU protection"
|
|
197
|
+
mitigation: "Require a stronger Thunderbolt/USB4 security level, verify IOMMU protection is enabled, and review auto-authorization policy before trusting hot-plug external devices."
|
|
198
|
+
evidence: |
|
|
199
|
+
{
|
|
200
|
+
"securityLevel": $prop($, 'cdx:hbom:securityLevel'),
|
|
201
|
+
"iommuProtection": $prop($, 'cdx:hbom:iommuProtection'),
|
|
202
|
+
"policy": $prop($, 'cdx:hbom:policy'),
|
|
203
|
+
"authorized": $prop($, 'cdx:hbom:authorized'),
|
|
204
|
+
"bootAclCount": $prop($, 'cdx:hbom:bootAclCount')
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
- id: HBS-006
|
|
208
|
+
name: "HBOM exposes raw cellular or subscriber identifiers"
|
|
209
|
+
description: "Raw modem equipment identifiers, IMEIs, or subscriber numbers in the BOM can leak privacy-sensitive fleet and subscriber intelligence."
|
|
210
|
+
severity: medium
|
|
211
|
+
category: hbom-security
|
|
212
|
+
dry-run-support: full
|
|
213
|
+
condition: |
|
|
214
|
+
components[
|
|
215
|
+
(
|
|
216
|
+
$prop($, 'cdx:hbom:hardwareClass') = 'modem'
|
|
217
|
+
or $hasProp($, 'cdx:hbom:equipmentIdentifier')
|
|
218
|
+
or $hasProp($, 'cdx:hbom:imei')
|
|
219
|
+
or $hasProp($, 'cdx:hbom:ownNumbers')
|
|
220
|
+
)
|
|
221
|
+
and (
|
|
222
|
+
(
|
|
223
|
+
$hasProp($, 'cdx:hbom:equipmentIdentifier')
|
|
224
|
+
and $startsWith($lowercase($safeStr($prop($, 'cdx:hbom:equipmentIdentifier'))), 'redacted') = false
|
|
225
|
+
)
|
|
226
|
+
or (
|
|
227
|
+
$hasProp($, 'cdx:hbom:imei')
|
|
228
|
+
and $startsWith($lowercase($safeStr($prop($, 'cdx:hbom:imei'))), 'redacted') = false
|
|
229
|
+
)
|
|
230
|
+
or (
|
|
231
|
+
$hasProp($, 'cdx:hbom:ownNumbers')
|
|
232
|
+
and $startsWith($lowercase($safeStr($prop($, 'cdx:hbom:ownNumbers'))), 'redacted') = false
|
|
233
|
+
)
|
|
234
|
+
)
|
|
235
|
+
]
|
|
236
|
+
location: |
|
|
237
|
+
{
|
|
238
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
239
|
+
}
|
|
240
|
+
message: "Cellular component '{{ name }}' exposes raw modem or subscriber identifiers that should be reviewed before distribution"
|
|
241
|
+
mitigation: "Keep modem identifiers redacted in shared HBOMs and restrict raw IMEI, equipment, or subscriber number exposure to tightly controlled internal device-management workflows."
|
|
242
|
+
evidence: |
|
|
243
|
+
{
|
|
244
|
+
"equipmentIdentifier": $prop($, 'cdx:hbom:equipmentIdentifier'),
|
|
245
|
+
"imei": $prop($, 'cdx:hbom:imei'),
|
|
246
|
+
"ownNumbers": $prop($, 'cdx:hbom:ownNumbers'),
|
|
247
|
+
"identifierPolicy": $firstNonEmpty($prop($, 'cdx:hbom:identifierPolicy'), $prop(metadata.component, 'cdx:hbom:identifierPolicy'))
|
|
248
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Host Topology Rules
|
|
2
|
+
# Category: host-topology
|
|
3
|
+
# Evaluates strict, evidence-backed insights derived from merged HBOM + OBOM inventories.
|
|
4
|
+
|
|
5
|
+
- id: HMX-001
|
|
6
|
+
name: "Active wired interface with live runtime addresses is operating degraded"
|
|
7
|
+
description: "A wired interface that is actually carrying runtime addresses but is negotiated at low bandwidth or half duplex represents a higher-confidence performance issue than hardware inventory alone."
|
|
8
|
+
severity: medium
|
|
9
|
+
category: host-topology
|
|
10
|
+
dry-run-support: partial
|
|
11
|
+
condition: |
|
|
12
|
+
components[
|
|
13
|
+
$prop($, 'cdx:hbom:hardwareClass') = 'network-interface'
|
|
14
|
+
and $number($firstNonEmpty($prop($, 'cdx:hostview:interface_addresses:count'), '0')) > 0
|
|
15
|
+
and (
|
|
16
|
+
$lowercase($safeStr($prop($, 'cdx:hbom:duplex'))) = 'half'
|
|
17
|
+
or (
|
|
18
|
+
$hasProp($, 'cdx:hbom:speedMbps')
|
|
19
|
+
and $number($prop($, 'cdx:hbom:speedMbps')) > 0
|
|
20
|
+
and $number($prop($, 'cdx:hbom:speedMbps')) < 1000
|
|
21
|
+
)
|
|
22
|
+
)
|
|
23
|
+
]
|
|
24
|
+
location: |
|
|
25
|
+
{
|
|
26
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
27
|
+
}
|
|
28
|
+
message: "Interface '{{ name }}' has live runtime address evidence but negotiated degraded duplex or bandwidth characteristics"
|
|
29
|
+
mitigation: "Inspect cabling, switch policy, NIC firmware/driver, and negotiated link settings before treating the issue as application-only latency."
|
|
30
|
+
evidence: |
|
|
31
|
+
{
|
|
32
|
+
"runtimeAddressCount": $prop($, 'cdx:hostview:interface_addresses:count'),
|
|
33
|
+
"driver": $prop($, 'cdx:hbom:driver'),
|
|
34
|
+
"speedMbps": $prop($, 'cdx:hbom:speedMbps'),
|
|
35
|
+
"duplex": $prop($, 'cdx:hbom:duplex'),
|
|
36
|
+
"operState": $prop($, 'cdx:hbom:operState')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
- id: HMX-002
|
|
40
|
+
name: "Wireless interface with live runtime address uses weak or missing link security"
|
|
41
|
+
description: "Weak wireless security on an interface that also has runtime address evidence is a stronger exposure signal than hardware inventory alone."
|
|
42
|
+
severity: high
|
|
43
|
+
category: host-topology
|
|
44
|
+
dry-run-support: partial
|
|
45
|
+
condition: |
|
|
46
|
+
components[
|
|
47
|
+
(
|
|
48
|
+
$prop($, 'cdx:hbom:hardwareClass') = 'wireless-adapter'
|
|
49
|
+
or (
|
|
50
|
+
$prop($, 'cdx:hbom:hardwareClass') = 'network-interface'
|
|
51
|
+
and $hasProp($, 'cdx:hbom:securityMode')
|
|
52
|
+
)
|
|
53
|
+
)
|
|
54
|
+
and $number($firstNonEmpty($prop($, 'cdx:hostview:interface_addresses:count'), '0')) > 0
|
|
55
|
+
and (
|
|
56
|
+
$safeStr($prop($, 'cdx:hbom:securityMode')) = ''
|
|
57
|
+
or $contains($lowercase($safeStr($prop($, 'cdx:hbom:securityMode'))), 'open')
|
|
58
|
+
or $contains($lowercase($safeStr($prop($, 'cdx:hbom:securityMode'))), 'wep')
|
|
59
|
+
or $contains($lowercase($safeStr($prop($, 'cdx:hbom:securityMode'))), 'none')
|
|
60
|
+
)
|
|
61
|
+
]
|
|
62
|
+
location: |
|
|
63
|
+
{
|
|
64
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
65
|
+
}
|
|
66
|
+
message: "Wireless interface '{{ name }}' has live runtime address evidence while using weak or missing security mode '{{ $firstNonEmpty($prop($, 'cdx:hbom:securityMode'), 'unknown') }}'"
|
|
67
|
+
mitigation: "Move the interface to WPA2/WPA3-class protections, review SSID policy, and verify that actively routed wireless links meet enterprise security baselines."
|
|
68
|
+
evidence: |
|
|
69
|
+
{
|
|
70
|
+
"runtimeAddressCount": $prop($, 'cdx:hostview:interface_addresses:count'),
|
|
71
|
+
"securityMode": $prop($, 'cdx:hbom:securityMode'),
|
|
72
|
+
"channel": $prop($, 'cdx:hbom:channel'),
|
|
73
|
+
"phyMode": $prop($, 'cdx:hbom:phyMode')
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
- id: HMX-003
|
|
77
|
+
name: "Merged host inventory lacks strict hardware/runtime topology links"
|
|
78
|
+
description: "When a merged HBOM+OBOM view contains no strict cross-domain topology links, reviewers should treat combined host conclusions cautiously and inspect collection coverage."
|
|
79
|
+
severity: medium
|
|
80
|
+
category: host-topology
|
|
81
|
+
dry-run-support: partial
|
|
82
|
+
condition: |
|
|
83
|
+
metadata.component[
|
|
84
|
+
type = 'device'
|
|
85
|
+
and $prop($, 'cdx:hostview:mode') = 'hbom-obom-merged'
|
|
86
|
+
and $number($firstNonEmpty($prop($, 'cdx:hostview:topologyLinkCount'), '0')) = 0
|
|
87
|
+
]
|
|
88
|
+
location: |
|
|
89
|
+
{
|
|
90
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
91
|
+
}
|
|
92
|
+
message: "Merged host inventory for '{{ name }}' contains no strict HBOM-to-OBOM topology links"
|
|
93
|
+
mitigation: "Review collector coverage, ensure runtime categories such as interface_addresses or kernel_modules are available, and prefer exact identifier-bearing probes over heuristic joins."
|
|
94
|
+
evidence: |
|
|
95
|
+
{
|
|
96
|
+
"hostViewMode": $prop($, 'cdx:hostview:mode'),
|
|
97
|
+
"hardwareComponentCount": $prop($, 'cdx:hostview:hardwareComponentCount'),
|
|
98
|
+
"runtimeComponentCount": $prop($, 'cdx:hostview:runtimeComponentCount'),
|
|
99
|
+
"topologyLinkCount": $prop($, 'cdx:hostview:topologyLinkCount')
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
- id: HMX-004
|
|
103
|
+
name: "Mounted storage with explicit runtime evidence is reporting degraded health"
|
|
104
|
+
description: "Storage health issues become higher-confidence operational findings when the hardware component is also linked to an active runtime mount or logical drive using exact identifiers."
|
|
105
|
+
severity: high
|
|
106
|
+
category: host-topology
|
|
107
|
+
dry-run-support: partial
|
|
108
|
+
condition: |
|
|
109
|
+
components[
|
|
110
|
+
(
|
|
111
|
+
$prop($, 'cdx:hbom:hardwareClass') = 'storage'
|
|
112
|
+
or $prop($, 'cdx:hbom:hardwareClass') = 'storage-device'
|
|
113
|
+
or $prop($, 'cdx:hbom:hardwareClass') = 'storage-volume'
|
|
114
|
+
)
|
|
115
|
+
and (
|
|
116
|
+
$number($firstNonEmpty($prop($, 'cdx:hostview:mount_hardening:count'), '0')) > 0
|
|
117
|
+
or $number($firstNonEmpty($prop($, 'cdx:hostview:runtime-storage:count'), '0')) > 0
|
|
118
|
+
)
|
|
119
|
+
and (
|
|
120
|
+
$contains($lowercase($safeStr($prop($, 'cdx:hbom:smartStatus'))), 'fail')
|
|
121
|
+
or $contains($lowercase($safeStr($prop($, 'cdx:hbom:health'))), 'degrad')
|
|
122
|
+
or $number($firstNonEmpty($prop($, 'cdx:hbom:wearPercentageUsed'), '0')) >= 90
|
|
123
|
+
)
|
|
124
|
+
]
|
|
125
|
+
location: |
|
|
126
|
+
{
|
|
127
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
128
|
+
}
|
|
129
|
+
message: "Storage component '{{ name }}' is explicitly linked to a runtime mount or drive while reporting degraded health telemetry"
|
|
130
|
+
mitigation: "Prioritize remediation for the backing device because the linked runtime mount evidence shows the degraded storage is actively in use."
|
|
131
|
+
evidence: |
|
|
132
|
+
{
|
|
133
|
+
"mountCount": $prop($, 'cdx:hostview:mount_hardening:count'),
|
|
134
|
+
"runtimeStorageCount": $prop($, 'cdx:hostview:runtime-storage:count'),
|
|
135
|
+
"smartStatus": $prop($, 'cdx:hbom:smartStatus'),
|
|
136
|
+
"health": $prop($, 'cdx:hbom:health'),
|
|
137
|
+
"wearPercentageUsed": $prop($, 'cdx:hbom:wearPercentageUsed')
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
- id: HMX-005
|
|
141
|
+
name: "Explicit HBOM secure-boot trust anchor matches a revoked runtime Secure Boot certificate"
|
|
142
|
+
description: "When HBOM metadata carries an explicit Secure Boot certificate identifier that strictly links to runtime secureboot_certificates data, revoked trust anchors indicate a higher-confidence firmware trust issue."
|
|
143
|
+
severity: high
|
|
144
|
+
category: host-topology
|
|
145
|
+
dry-run-support: partial
|
|
146
|
+
condition: |
|
|
147
|
+
components[
|
|
148
|
+
$prop($, 'cdx:osquery:category') = 'secureboot_certificates'
|
|
149
|
+
and $number($firstNonEmpty($prop($, 'revoked'), '0')) > 0
|
|
150
|
+
and $number($firstNonEmpty($prop($$.metadata.component, 'cdx:hostview:secureboot_certificates:count'), '0')) > 0
|
|
151
|
+
]
|
|
152
|
+
location: |
|
|
153
|
+
{
|
|
154
|
+
"bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
|
|
155
|
+
}
|
|
156
|
+
message: "Secure Boot certificate '{{ name }}' is revoked and the host also has an explicit HBOM trust-anchor link for this Secure Boot surface"
|
|
157
|
+
mitigation: "Review firmware trust policy, remove revoked Secure Boot entries from active trust sets, and verify that the expected db/dbx anchors on the host still match the approved platform state."
|
|
158
|
+
evidence: |
|
|
159
|
+
{
|
|
160
|
+
"linkedSecureBootCertificateCount": $prop($, 'cdx:hostview:secureboot_certificates:count'),
|
|
161
|
+
"revokedCertificateCount": $count(bom.components[
|
|
162
|
+
$prop($, 'cdx:osquery:category') = 'secureboot_certificates'
|
|
163
|
+
and $number($firstNonEmpty($prop($, 'revoked'), '0')) > 0
|
|
164
|
+
])
|
|
165
|
+
}
|
|
@@ -3,13 +3,15 @@
|
|
|
3
3
|
description: "HTTP-based MCP servers that expose tools without authentication let unauthenticated clients invoke model-controlled actions directly."
|
|
4
4
|
severity: critical
|
|
5
5
|
category: mcp-server
|
|
6
|
+
dry-run-support: full
|
|
6
7
|
attack:
|
|
7
|
-
tactics: [TA0001,
|
|
8
|
+
tactics: [TA0001, TA0002]
|
|
8
9
|
techniques: [T1190, T1059]
|
|
9
10
|
standards:
|
|
10
11
|
owasp-ai-top-10:
|
|
11
12
|
- "LLM07: Insecure Plugin Design"
|
|
12
13
|
- "LLM08: Excessive Agency"
|
|
14
|
+
- "LLM06:2025 Excessive Agency"
|
|
13
15
|
nist-ai-rmf:
|
|
14
16
|
- "Map"
|
|
15
17
|
- "Manage"
|
|
@@ -44,6 +46,7 @@
|
|
|
44
46
|
description: "Streamable HTTP MCP servers should authenticate incoming requests before serving prompts, resources, or tools."
|
|
45
47
|
severity: high
|
|
46
48
|
category: mcp-server
|
|
49
|
+
dry-run-support: full
|
|
47
50
|
attack:
|
|
48
51
|
tactics: [TA0001]
|
|
49
52
|
techniques: [T1190]
|
|
@@ -81,13 +84,15 @@
|
|
|
81
84
|
description: "MCP servers built on non-official SDKs or wrappers deserve extra review before being exposed over HTTP, especially when they register tools."
|
|
82
85
|
severity: medium
|
|
83
86
|
category: mcp-server
|
|
87
|
+
dry-run-support: full
|
|
84
88
|
attack:
|
|
85
|
-
tactics: [TA0001
|
|
89
|
+
tactics: [TA0001]
|
|
86
90
|
techniques: [T1195.001]
|
|
87
91
|
standards:
|
|
88
92
|
owasp-ai-top-10:
|
|
89
93
|
- "LLM05: Supply Chain Vulnerabilities"
|
|
90
94
|
- "LLM07: Insecure Plugin Design"
|
|
95
|
+
- "LLM03:2025 Supply Chain"
|
|
91
96
|
nist-ai-rmf:
|
|
92
97
|
- "Govern"
|
|
93
98
|
- "Map"
|
|
@@ -124,6 +129,7 @@
|
|
|
124
129
|
description: "MCP services discovered only from client configuration files still need explicit authentication or OAuth posture when they resolve to network-accessible HTTP endpoints."
|
|
125
130
|
severity: high
|
|
126
131
|
category: mcp-server
|
|
132
|
+
dry-run-support: full
|
|
127
133
|
attack:
|
|
128
134
|
tactics: [TA0001]
|
|
129
135
|
techniques: [T1190]
|
|
@@ -131,6 +137,7 @@
|
|
|
131
137
|
owasp-ai-top-10:
|
|
132
138
|
- "LLM07: Insecure Plugin Design"
|
|
133
139
|
- "LLM08: Excessive Agency"
|
|
140
|
+
- "LLM06:2025 Excessive Agency"
|
|
134
141
|
nist-ai-rmf:
|
|
135
142
|
- "Map"
|
|
136
143
|
- "Manage"
|
|
@@ -163,6 +170,7 @@
|
|
|
163
170
|
description: "MCP configs that embed tokens, API keys, or other secrets directly in args, env values, or headers create immediate credential-handling and supply-chain review risk."
|
|
164
171
|
severity: critical
|
|
165
172
|
category: mcp-server
|
|
173
|
+
dry-run-support: full
|
|
166
174
|
attack:
|
|
167
175
|
tactics: [TA0006]
|
|
168
176
|
techniques: [T1552]
|
|
@@ -170,6 +178,7 @@
|
|
|
170
178
|
owasp-ai-top-10:
|
|
171
179
|
- "LLM05: Supply Chain Vulnerabilities"
|
|
172
180
|
- "LLM07: Insecure Plugin Design"
|
|
181
|
+
- "LLM03:2025 Supply Chain"
|
|
173
182
|
nist-ai-rmf:
|
|
174
183
|
- "Govern"
|
|
175
184
|
- "Manage"
|
|
@@ -201,13 +210,15 @@
|
|
|
201
210
|
description: "Dynamic client registration combined with a static configured client ID can create confused-deputy style authorization risk in MCP deployments."
|
|
202
211
|
severity: high
|
|
203
212
|
category: mcp-server
|
|
213
|
+
dry-run-support: full
|
|
204
214
|
attack:
|
|
205
|
-
tactics: [
|
|
215
|
+
tactics: [TA0006]
|
|
206
216
|
techniques: [T1528]
|
|
207
217
|
standards:
|
|
208
218
|
owasp-ai-top-10:
|
|
209
219
|
- "LLM07: Insecure Plugin Design"
|
|
210
220
|
- "LLM08: Excessive Agency"
|
|
221
|
+
- "LLM06:2025 Excessive Agency"
|
|
211
222
|
nist-ai-rmf:
|
|
212
223
|
- "Govern"
|
|
213
224
|
- "Map"
|
|
@@ -238,6 +249,7 @@
|
|
|
238
249
|
description: "Token-forwarding and passthrough settings in MCP configs deserve review because they can propagate delegated credentials across trust boundaries."
|
|
239
250
|
severity: high
|
|
240
251
|
category: mcp-server
|
|
252
|
+
dry-run-support: full
|
|
241
253
|
attack:
|
|
242
254
|
tactics: [TA0006]
|
|
243
255
|
techniques: [T1528]
|
|
@@ -245,6 +257,7 @@
|
|
|
245
257
|
owasp-ai-top-10:
|
|
246
258
|
- "LLM07: Insecure Plugin Design"
|
|
247
259
|
- "LLM08: Excessive Agency"
|
|
260
|
+
- "LLM06:2025 Excessive Agency"
|
|
248
261
|
nist-ai-rmf:
|
|
249
262
|
- "Govern"
|
|
250
263
|
- "Manage"
|
|
@@ -275,10 +288,12 @@
|
|
|
275
288
|
description: "Committed MCP client configuration files can carry trust, auth, and distribution sensitivity even when they are not actively used during the current scan."
|
|
276
289
|
severity: medium
|
|
277
290
|
category: mcp-server
|
|
291
|
+
dry-run-support: full
|
|
278
292
|
standards:
|
|
279
293
|
owasp-ai-top-10:
|
|
280
294
|
- "LLM07: Insecure Plugin Design"
|
|
281
295
|
- "LLM08: Excessive Agency"
|
|
296
|
+
- "LLM06:2025 Excessive Agency"
|
|
282
297
|
nist-ai-rmf:
|
|
283
298
|
- "Govern"
|
|
284
299
|
- "Map"
|