@cyclonedx/cdxgen 12.3.1 → 12.3.3

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 (87) hide show
  1. package/README.md +6 -0
  2. package/bin/cdxgen.js +1 -2
  3. package/data/rules/ai-agent-governance.yaml +43 -0
  4. package/data/rules/ci-permissions.yaml +132 -0
  5. package/data/rules/dependency-sources.yaml +65 -5
  6. package/data/rules/mcp-servers.yaml +36 -2
  7. package/data/rules/package-integrity.yaml +22 -0
  8. package/lib/cli/index.js +436 -56
  9. package/lib/cli/index.poku.js +875 -2
  10. package/lib/helpers/agentFormulationParser.js +10 -3
  11. package/lib/helpers/agentFormulationParser.poku.js +42 -0
  12. package/lib/helpers/aiInventory.js +262 -0
  13. package/lib/helpers/aiInventory.poku.js +111 -0
  14. package/lib/helpers/analyzer.js +413 -54
  15. package/lib/helpers/analyzer.poku.js +117 -0
  16. package/lib/helpers/auditCategories.js +76 -0
  17. package/lib/helpers/chromextutils.js +25 -3
  18. package/lib/helpers/chromextutils.poku.js +68 -0
  19. package/lib/helpers/ciParsers/githubActions.js +79 -0
  20. package/lib/helpers/ciParsers/githubActions.poku.js +103 -0
  21. package/lib/helpers/communityAiConfigParser.js +15 -5
  22. package/lib/helpers/communityAiConfigParser.poku.js +71 -0
  23. package/lib/helpers/depsUtils.js +5 -0
  24. package/lib/helpers/depsUtils.poku.js +55 -0
  25. package/lib/helpers/display.js +50 -24
  26. package/lib/helpers/display.poku.js +70 -58
  27. package/lib/helpers/formulationParsers.js +26 -6
  28. package/lib/helpers/jsonLike.js +21 -20
  29. package/lib/helpers/jsonLike.poku.js +34 -0
  30. package/lib/helpers/mcpConfigParser.js +32 -16
  31. package/lib/helpers/mcpConfigParser.poku.js +104 -0
  32. package/lib/helpers/mcpDiscovery.js +13 -23
  33. package/lib/helpers/mcpDiscovery.poku.js +21 -0
  34. package/lib/helpers/propertySanitizer.js +121 -0
  35. package/lib/helpers/utils.js +953 -41
  36. package/lib/helpers/utils.poku.js +901 -1
  37. package/lib/managers/binary.js +16 -0
  38. package/lib/managers/binary.poku.js +1 -0
  39. package/lib/managers/docker.js +240 -16
  40. package/lib/managers/docker.poku.js +1142 -2
  41. package/lib/server/server.js +7 -4
  42. package/lib/server/server.poku.js +36 -1
  43. package/lib/stages/postgen/annotator.js +2 -1
  44. package/lib/stages/postgen/annotator.poku.js +15 -0
  45. package/lib/stages/postgen/auditBom.js +12 -6
  46. package/lib/stages/postgen/auditBom.poku.js +755 -6
  47. package/lib/stages/postgen/postgen.js +229 -6
  48. package/lib/stages/postgen/postgen.poku.js +180 -0
  49. package/package.json +2 -1
  50. package/types/lib/cli/index.d.ts +1 -0
  51. package/types/lib/cli/index.d.ts.map +1 -1
  52. package/types/lib/helpers/agentFormulationParser.d.ts +19 -0
  53. package/types/lib/helpers/agentFormulationParser.d.ts.map +1 -0
  54. package/types/lib/helpers/aiInventory.d.ts +23 -0
  55. package/types/lib/helpers/aiInventory.d.ts.map +1 -0
  56. package/types/lib/helpers/analyzer.d.ts +5 -0
  57. package/types/lib/helpers/analyzer.d.ts.map +1 -1
  58. package/types/lib/helpers/auditCategories.d.ts +12 -0
  59. package/types/lib/helpers/auditCategories.d.ts.map +1 -0
  60. package/types/lib/helpers/chromextutils.d.ts.map +1 -1
  61. package/types/lib/helpers/ciParsers/githubActions.d.ts.map +1 -1
  62. package/types/lib/helpers/communityAiConfigParser.d.ts +29 -0
  63. package/types/lib/helpers/communityAiConfigParser.d.ts.map +1 -0
  64. package/types/lib/helpers/depsUtils.d.ts.map +1 -1
  65. package/types/lib/helpers/display.d.ts +1 -0
  66. package/types/lib/helpers/display.d.ts.map +1 -1
  67. package/types/lib/helpers/formulationParsers.d.ts.map +1 -1
  68. package/types/lib/helpers/jsonLike.d.ts +4 -0
  69. package/types/lib/helpers/jsonLike.d.ts.map +1 -0
  70. package/types/lib/helpers/mcp.d.ts +29 -0
  71. package/types/lib/helpers/mcp.d.ts.map +1 -0
  72. package/types/lib/helpers/mcpConfigParser.d.ts +30 -0
  73. package/types/lib/helpers/mcpConfigParser.d.ts.map +1 -0
  74. package/types/lib/helpers/mcpDiscovery.d.ts +5 -0
  75. package/types/lib/helpers/mcpDiscovery.d.ts.map +1 -0
  76. package/types/lib/helpers/propertySanitizer.d.ts +3 -0
  77. package/types/lib/helpers/propertySanitizer.d.ts.map +1 -0
  78. package/types/lib/helpers/utils.d.ts +31 -0
  79. package/types/lib/helpers/utils.d.ts.map +1 -1
  80. package/types/lib/managers/binary.d.ts.map +1 -1
  81. package/types/lib/managers/docker.d.ts +3 -0
  82. package/types/lib/managers/docker.d.ts.map +1 -1
  83. package/types/lib/server/server.d.ts +1 -0
  84. package/types/lib/server/server.d.ts.map +1 -1
  85. package/types/lib/stages/postgen/annotator.d.ts.map +1 -1
  86. package/types/lib/stages/postgen/auditBom.d.ts.map +1 -1
  87. package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
package/README.md CHANGED
@@ -523,6 +523,12 @@ You can also pass `-t docker` with repository names. Only the `latest` tag would
523
523
  cdxgen shiftleft/scan-slim -o /tmp/bom.json -t docker
524
524
  ```
525
525
 
526
+ For offline or staged scans, point cdxgen at a locally reconstructed root filesystem directory. The container pipeline accepts `-t docker`, `-t rootfs`, or `-t oci-dir` for this mode.
527
+
528
+ ```shell
529
+ cdxgen /tmp/remote_target -o /tmp/bom.json -t rootfs
530
+ ```
531
+
526
532
  You can also pass the .tar file of a container image.
527
533
 
528
534
  ```shell
package/bin/cdxgen.js CHANGED
@@ -462,9 +462,8 @@ const args = _yargs
462
462
  })
463
463
  .option("tlp-classification", {
464
464
  description:
465
- 'Traffic Light Protocol (TLP) is a classification system for identifying the potential risk associated with artefact, including whether it is subject to certain types of legal, financial, or technical threats. Refer to [https://www.first.org/tlp/](https://www.first.org/tlp/) for further information.\nThe default classification is "CLEAR"',
465
+ "Traffic Light Protocol (TLP) is a classification system for identifying the potential risk associated with an artefact, including whether it is subject to certain types of legal, financial, or technical threats. Refer to [https://www.first.org/tlp/](https://www.first.org/tlp/) for further information.",
466
466
  choices: ["CLEAR", "GREEN", "AMBER", "AMBER_AND_STRICT", "RED"],
467
- default: "CLEAR",
468
467
  hidden: true,
469
468
  })
470
469
  .option("env-audit", {
@@ -204,3 +204,46 @@
204
204
  "hiddenMcpUrls": $prop($, 'cdx:agent:hiddenMcpUrls'),
205
205
  "providerNames": $prop($, 'cdx:agent:providerNames')
206
206
  }
207
+
208
+ - id: AGT-007
209
+ name: "AI agent or skill file is included in a build or post-build SBOM"
210
+ description: "Shipped AI instruction and skill files deserve explicit review because they can alter developer tooling, release-time automation, and downstream runtime behavior."
211
+ severity: medium
212
+ category: ai-agent
213
+ standards:
214
+ owasp-ai-top-10:
215
+ - "LLM05: Supply Chain Vulnerabilities"
216
+ - "LLM08: Excessive Agency"
217
+ nist-ai-rmf:
218
+ - "Govern"
219
+ - "Map"
220
+ nist-ssdf:
221
+ - "Review build and release instructions before distribution"
222
+ condition: |
223
+ components[
224
+ (
225
+ $prop($, 'cdx:agent:inventorySource') = 'agent-file'
226
+ or $prop($, 'cdx:agent:inventorySource') = 'community-config'
227
+ )
228
+ and (
229
+ $prop($, 'cdx:file:kind') = 'skill-file'
230
+ or $prop($, 'cdx:file:kind') = 'agent-instructions'
231
+ or $prop($, 'cdx:file:kind') = 'copilot-instructions'
232
+ or $prop($, 'cdx:file:kind') = 'copilot-setup-workflow'
233
+ or $prop($, 'cdx:file:kind') = 'ai-agent-file'
234
+ )
235
+ and $count($$.metadata.lifecycles[phase = 'build' or phase = 'post-build']) > 0
236
+ ]
237
+ location: |
238
+ {
239
+ "bomRef": $."bom-ref",
240
+ "file": $prop($, 'SrcFile')
241
+ }
242
+ message: "AI instruction or skill file '{{ name }}' is included in a build/post-build SBOM"
243
+ mitigation: "If the file must ship, keep the BOM review-friendly with '--bom-audit --bom-audit-categories ai-agent' and consider '--tlp-classification AMBER'. If you want a package-only BOM, rerun with '--exclude-type ai-skill'."
244
+ evidence: |
245
+ {
246
+ "inventorySource": $prop($, 'cdx:agent:inventorySource'),
247
+ "fileKind": $prop($, 'cdx:file:kind'),
248
+ "providerNames": $prop($, 'cdx:agent:providerNames')
249
+ }
@@ -642,5 +642,137 @@
642
642
  "sensitiveOperations": $prop($, 'cdx:github:step:sensitiveOperations'),
643
643
  "sensitiveContextRefs": $prop($, 'cdx:github:step:sensitiveContextRefs'),
644
644
  "dispatchKinds": $prop($, 'cdx:github:step:dispatchKinds')
645
+ }
646
+
647
+ - id: CI-022
648
+ name: "npm setup action disables build cache despite resolved package distributions"
649
+ description: "Explicitly disabling setup-node caching reduces tamper resistance and reviewability when npm dependencies are resolved from remote package distributions"
650
+ severity: medium
651
+ category: ci-permission
652
+ attack:
653
+ tactics: [TA0005]
654
+ techniques: [T1195.001]
655
+ condition: |
656
+ $auditComponents($)[
657
+ $prop($, 'cdx:github:action:disablesBuildCache') = 'true'
658
+ and $prop($, 'cdx:github:action:buildCacheEcosystem') = 'npm'
659
+ and $count($$.components[
660
+ $startsWith(purl, 'pkg:npm/')
661
+ and (
662
+ $contains($lowercase($nullSafeProp($, 'cdx:npm:manifestSourceType')), 'git')
663
+ or $contains($lowercase($nullSafeProp($, 'cdx:npm:manifestSourceType')), 'url')
664
+ )
665
+ and $count(externalReferences[
666
+ type = 'distribution'
667
+ and (
668
+ $startsWith($lowercase(url), 'git+')
669
+ or $startsWith($lowercase(url), 'http://')
670
+ or $startsWith($lowercase(url), 'https://')
671
+ )
672
+ ]) > 0
673
+ ]) > 0
674
+ ]
675
+ location: |
676
+ {
677
+ "bomRef": $."bom-ref",
678
+ "purl": purl,
679
+ "file": $prop($, 'cdx:github:workflow:file')
680
+ }
681
+ message: "GitHub Action '{{ $prop($, 'cdx:github:action:uses') }}' explicitly disables npm build caching while resolved npm package distributions are present in the BOM"
682
+ mitigation: "Keep setup-node caching enabled unless you have a reviewed exception; disabling cache can weaken integrity checks and provenance review for resolved npm artifacts"
683
+ evidence: |
684
+ {
685
+ "cacheDisableInput": $prop($, 'cdx:github:action:buildCacheDisableInput'),
686
+ "cacheDisableValue": $prop($, 'cdx:github:action:buildCacheDisableValue'),
687
+ "matchingPackages": $$.components[
688
+ $startsWith(purl, 'pkg:npm/')
689
+ and (
690
+ $contains($lowercase($nullSafeProp($, 'cdx:npm:manifestSourceType')), 'git')
691
+ or $contains($lowercase($nullSafeProp($, 'cdx:npm:manifestSourceType')), 'url')
692
+ )
693
+ and $count(externalReferences[
694
+ type = 'distribution'
695
+ and (
696
+ $startsWith($lowercase(url), 'git+')
697
+ or $startsWith($lowercase(url), 'http://')
698
+ or $startsWith($lowercase(url), 'https://')
699
+ )
700
+ ]) > 0
701
+ ].purl
702
+ }
703
+
704
+ - id: CI-023
705
+ name: "Python setup action disables build cache despite resolved package distributions"
706
+ description: "Explicitly disabling setup-python caching reduces tamper resistance and reviewability when PyPI dependencies are resolved from remote archives or VCS sources"
707
+ severity: medium
708
+ category: ci-permission
709
+ attack:
710
+ tactics: [TA0005]
711
+ techniques: [T1195.001]
712
+ condition: |
713
+ $auditComponents($)[
714
+ $prop($, 'cdx:github:action:disablesBuildCache') = 'true'
715
+ and $prop($, 'cdx:github:action:buildCacheEcosystem') = 'pypi'
716
+ and $count($$.components[
717
+ $startsWith(purl, 'pkg:pypi/')
718
+ and (
719
+ $contains($lowercase($nullSafeProp($, 'cdx:pypi:manifestSourceType')), 'git')
720
+ or $contains($lowercase($nullSafeProp($, 'cdx:pypi:manifestSourceType')), 'url')
721
+ )
722
+ ]) > 0
723
+ ]
724
+ location: |
725
+ {
726
+ "bomRef": $."bom-ref",
727
+ "purl": purl,
728
+ "file": $prop($, 'cdx:github:workflow:file')
729
+ }
730
+ message: "GitHub Action '{{ $prop($, 'cdx:github:action:uses') }}' explicitly disables Python build caching while resolved PyPI package distributions are present in the BOM"
731
+ mitigation: "Keep setup-python caching enabled when lockfiles resolve remote archives or VCS sources unless you have a reviewed exception"
732
+ evidence: |
733
+ {
734
+ "cacheDisableInput": $prop($, 'cdx:github:action:buildCacheDisableInput'),
735
+ "cacheDisableValue": $prop($, 'cdx:github:action:buildCacheDisableValue'),
736
+ "matchingPackages": $$.components[
737
+ $startsWith(purl, 'pkg:pypi/')
738
+ and (
739
+ $contains($lowercase($nullSafeProp($, 'cdx:pypi:manifestSourceType')), 'git')
740
+ or $contains($lowercase($nullSafeProp($, 'cdx:pypi:manifestSourceType')), 'url')
741
+ )
742
+ ].purl
645
743
  }
646
744
 
745
+ - id: CI-024
746
+ name: "Cargo setup action disables build cache despite manifest-declared git dependencies"
747
+ description: "Explicitly disabling Cargo setup caching reduces tamper resistance and reviewability when Cargo manifests rely on git dependencies"
748
+ severity: medium
749
+ category: ci-permission
750
+ attack:
751
+ tactics: [TA0005]
752
+ techniques: [T1195.001]
753
+ condition: |
754
+ $auditComponents($)[
755
+ $prop($, 'cdx:github:action:disablesBuildCache') = 'true'
756
+ and $prop($, 'cdx:github:action:buildCacheEcosystem') = 'cargo'
757
+ and $count($$.components[
758
+ $startsWith(purl, 'pkg:cargo/')
759
+ and $hasProp($, 'cdx:cargo:git')
760
+ ]) > 0
761
+ ]
762
+ location: |
763
+ {
764
+ "bomRef": $."bom-ref",
765
+ "purl": purl,
766
+ "file": $prop($, 'cdx:github:workflow:file')
767
+ }
768
+ message: "GitHub Action '{{ $prop($, 'cdx:github:action:uses') }}' explicitly disables Cargo build caching while manifest-declared Cargo git dependencies are present in the BOM"
769
+ mitigation: "Keep Cargo setup caching enabled when manifests rely on git dependencies unless you have a reviewed exception"
770
+ evidence: |
771
+ {
772
+ "cacheDisableInput": $prop($, 'cdx:github:action:buildCacheDisableInput'),
773
+ "cacheDisableValue": $prop($, 'cdx:github:action:buildCacheDisableValue'),
774
+ "matchingPackages": $$.components[
775
+ $startsWith(purl, 'pkg:cargo/')
776
+ and $hasProp($, 'cdx:cargo:git')
777
+ ].purl
778
+ }
@@ -2,21 +2,23 @@
2
2
  # Category: dependency-source
3
3
  # Evaluates package manager data for non-registry, local, or mutable sources
4
4
  - id: PKG-001
5
- name: "Install script from non-registry source"
6
- description: "npm packages with install scripts from git/file/local sources increase supply chain attack surface"
5
+ name: "Install script from direct manifest source"
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
9
  condition: |
10
10
  components[
11
11
  $prop($, 'cdx:npm:hasInstallScript') = 'true'
12
- and $prop($, 'cdx:npm:isRegistryDependency') = 'false'
12
+ and $hasProp($, 'cdx:npm:manifestSourceType')
13
13
  ]
14
14
  location: |
15
15
  { "bomRef": $."bom-ref", "purl": purl }
16
- message: "npm package '{{ name }}@{{ version }}' executes install script from non-registry source"
17
- mitigation: "Avoid git/file dependencies with lifecycle hooks; use registry dependencies or vendor explicitly"
16
+ message: "npm package '{{ name }}@{{ version }}' executes install script from manifest-declared source type(s): {{ $prop($, 'cdx:npm:manifestSourceType') }}"
17
+ mitigation: "Avoid git, URL, or local-path dependencies with lifecycle hooks; use registry-published dependencies or vendor explicitly"
18
18
  evidence: |
19
19
  {
20
+ "manifestSourceType": $prop($, 'cdx:npm:manifestSourceType'),
21
+ "manifestSource": $prop($, 'cdx:npm:manifestSource'),
20
22
  "riskyScripts": $prop($, 'cdx:npm:risky_scripts'),
21
23
  "resolvedPath": $prop($, 'cdx:npm:resolvedPath'),
22
24
  "isLink": $prop($, 'cdx:npm:isLink')
@@ -162,3 +164,61 @@
162
164
  "dependencyKind": $prop($, 'cdx:cargo:dependencyKind'),
163
165
  "target": $prop($, 'cdx:cargo:target')
164
166
  }
167
+ - id: PKG-009
168
+ name: "Collider package resolved from insecure HTTP origin"
169
+ description: "Collider lock entries that resolve from HTTP origins can be observed or modified in transit before wrap-hash verification occurs"
170
+ severity: medium
171
+ category: dependency-source
172
+ condition: |
173
+ components[
174
+ $prop($, 'cdx:collider:originScheme') = 'http'
175
+ ]
176
+ location: |
177
+ { "bomRef": $."bom-ref", "purl": purl }
178
+ message: "Collider package '{{ name }}@{{ version }}' resolves from insecure origin '{{ $prop($, 'cdx:collider:origin') }}'"
179
+ mitigation: "Prefer HTTPS, trusted file:// repositories, or an authenticated internal mirror for Collider package origins"
180
+ evidence: |
181
+ {
182
+ "origin": $prop($, 'cdx:collider:origin'),
183
+ "originHost": $prop($, 'cdx:collider:originHost'),
184
+ "dependencyKind": $prop($, 'cdx:collider:dependencyKind')
185
+ }
186
+ - id: PKG-010
187
+ name: "Collider origin required sanitization before BOM emission"
188
+ description: "Collider lock origin URLs should not carry credentials, query strings, or fragments because those values may embed secrets or unstable signed URLs"
189
+ severity: low
190
+ category: dependency-source
191
+ condition: |
192
+ components[
193
+ $prop($, 'cdx:collider:originSanitized') = 'true'
194
+ ]
195
+ location: |
196
+ { "bomRef": $."bom-ref", "purl": purl }
197
+ message: "Collider package '{{ name }}@{{ version }}' had sensitive origin fields stripped before BOM emission"
198
+ mitigation: "Avoid embedding credentials or signed query parameters in Collider repository origin URLs; prefer stable repository base URLs"
199
+ evidence: |
200
+ {
201
+ "origin": $prop($, 'cdx:collider:origin'),
202
+ "originHost": $prop($, 'cdx:collider:originHost'),
203
+ "dependencyKind": $prop($, 'cdx:collider:dependencyKind')
204
+ }
205
+ - id: PKG-011
206
+ name: "Python dependency uses direct manifest source"
207
+ description: "Python dependencies declared via git, direct URL, or local path in requirements or pyproject files bypass normal registry version mediation"
208
+ severity: high
209
+ category: dependency-source
210
+ condition: |
211
+ components[
212
+ $hasProp($, 'cdx:pypi:manifestSourceType')
213
+ ]
214
+ location: |
215
+ { "bomRef": $."bom-ref", "purl": purl }
216
+ message: "Python package '{{ name }}@{{ version }}' is declared from manifest {{ $prop($, 'cdx:pypi:manifestSourceType') }} source '{{ $prop($, 'cdx:pypi:manifestSource') }}'"
217
+ mitigation: "Prefer registry-published releases for production builds, or pin and review direct git/URL/path sources explicitly"
218
+ evidence: |
219
+ {
220
+ "manifestSourceType": $prop($, 'cdx:pypi:manifestSourceType'),
221
+ "manifestSource": $prop($, 'cdx:pypi:manifestSource'),
222
+ "registry": $prop($, 'cdx:pypi:registry'),
223
+ "resolvedFrom": $prop($, 'cdx:pypi:resolved_from')
224
+ }
@@ -191,8 +191,9 @@
191
191
  {
192
192
  "configFormat": $prop($, 'cdx:mcp:configFormat'),
193
193
  "configKey": $prop($, 'cdx:mcp:configKey'),
194
- "credentialExposureFields": $prop($, 'cdx:mcp:credentialExposureFields'),
195
- "credentialRiskIndicators": $prop($, 'cdx:mcp:credentialRiskIndicators')
194
+ "credentialExposureFieldCount": $prop($, 'cdx:mcp:credentialExposureFieldCount'),
195
+ "credentialIndicatorCount": $prop($, 'cdx:mcp:credentialIndicatorCount'),
196
+ "credentialReferenceCount": $prop($, 'cdx:mcp:credentialReferenceCount')
196
197
  }
197
198
 
198
199
  - id: MCP-006
@@ -268,3 +269,36 @@
268
269
  "trustProfile": $prop($, 'cdx:mcp:trustProfile'),
269
270
  "authPosture": $prop($, 'cdx:mcp:authPosture')
270
271
  }
272
+
273
+ - id: MCP-008
274
+ name: "MCP configuration file is included in a build or post-build SBOM"
275
+ 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
+ severity: medium
277
+ category: mcp-server
278
+ standards:
279
+ owasp-ai-top-10:
280
+ - "LLM07: Insecure Plugin Design"
281
+ - "LLM08: Excessive Agency"
282
+ nist-ai-rmf:
283
+ - "Govern"
284
+ - "Map"
285
+ nist-ssdf:
286
+ - "Review configured AI control surfaces before release"
287
+ condition: |
288
+ components[
289
+ $prop($, 'cdx:file:kind') = 'mcp-config'
290
+ and $count($$.metadata.lifecycles[phase = 'build' or phase = 'post-build']) > 0
291
+ ]
292
+ location: |
293
+ {
294
+ "bomRef": $."bom-ref",
295
+ "file": $prop($, 'SrcFile')
296
+ }
297
+ message: "MCP config file '{{ name }}' is included in a build/post-build SBOM"
298
+ mitigation: "Review the config with '--bom-audit --bom-audit-categories mcp-server', consider '--tlp-classification AMBER' before sharing the BOM broadly, or rerun with '--exclude-type mcp' if config artifacts should be omitted."
299
+ evidence: |
300
+ {
301
+ "configFormat": $prop($, 'cdx:mcp:configFormat'),
302
+ "configuredServiceCount": $prop($, 'cdx:mcp:configuredServiceCount'),
303
+ "configuredServiceNames": $prop($, 'cdx:mcp:configuredServiceNames')
304
+ }
@@ -305,3 +305,25 @@
305
305
  )
306
306
  ].$prop($, 'cdx:github:step:command')
307
307
  }
308
+
309
+ - id: INT-014
310
+ name: "Collider package missing valid wrap hash pin"
311
+ description: "Collider lock entries should carry a SHA-256 wrap_hash so the selected wrap file remains integrity-pinned and reproducible"
312
+ severity: high
313
+ category: package-integrity
314
+ condition: |
315
+ components[
316
+ $hasProp($, 'cdx:collider:dependencyKind')
317
+ and $prop($, 'cdx:collider:hasWrapHash') = 'false'
318
+ ]
319
+ location: |
320
+ { "bomRef": $."bom-ref", "purl": purl }
321
+ message: "Collider package '{{ name }}@{{ version }}' is missing a valid wrap hash integrity pin"
322
+ mitigation: "Recreate collider.lock with valid wrap_hash values and verify the lockfile against the repository before release"
323
+ evidence: |
324
+ {
325
+ "wrapHash": $prop($, 'cdx:collider:wrapHash'),
326
+ "wrapHashInvalid": $prop($, 'cdx:collider:wrapHashInvalid'),
327
+ "origin": $prop($, 'cdx:collider:origin'),
328
+ "dependencyKind": $prop($, 'cdx:collider:dependencyKind')
329
+ }