@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.
- package/README.md +6 -0
- package/bin/cdxgen.js +1 -2
- package/data/rules/ai-agent-governance.yaml +43 -0
- package/data/rules/ci-permissions.yaml +132 -0
- package/data/rules/dependency-sources.yaml +65 -5
- package/data/rules/mcp-servers.yaml +36 -2
- package/data/rules/package-integrity.yaml +22 -0
- package/lib/cli/index.js +436 -56
- package/lib/cli/index.poku.js +875 -2
- package/lib/helpers/agentFormulationParser.js +10 -3
- package/lib/helpers/agentFormulationParser.poku.js +42 -0
- package/lib/helpers/aiInventory.js +262 -0
- package/lib/helpers/aiInventory.poku.js +111 -0
- package/lib/helpers/analyzer.js +413 -54
- package/lib/helpers/analyzer.poku.js +117 -0
- package/lib/helpers/auditCategories.js +76 -0
- package/lib/helpers/chromextutils.js +25 -3
- package/lib/helpers/chromextutils.poku.js +68 -0
- package/lib/helpers/ciParsers/githubActions.js +79 -0
- package/lib/helpers/ciParsers/githubActions.poku.js +103 -0
- package/lib/helpers/communityAiConfigParser.js +15 -5
- package/lib/helpers/communityAiConfigParser.poku.js +71 -0
- package/lib/helpers/depsUtils.js +5 -0
- package/lib/helpers/depsUtils.poku.js +55 -0
- package/lib/helpers/display.js +50 -24
- package/lib/helpers/display.poku.js +70 -58
- package/lib/helpers/formulationParsers.js +26 -6
- package/lib/helpers/jsonLike.js +21 -20
- package/lib/helpers/jsonLike.poku.js +34 -0
- package/lib/helpers/mcpConfigParser.js +32 -16
- package/lib/helpers/mcpConfigParser.poku.js +104 -0
- package/lib/helpers/mcpDiscovery.js +13 -23
- package/lib/helpers/mcpDiscovery.poku.js +21 -0
- package/lib/helpers/propertySanitizer.js +121 -0
- package/lib/helpers/utils.js +953 -41
- package/lib/helpers/utils.poku.js +901 -1
- package/lib/managers/binary.js +16 -0
- package/lib/managers/binary.poku.js +1 -0
- package/lib/managers/docker.js +240 -16
- package/lib/managers/docker.poku.js +1142 -2
- package/lib/server/server.js +7 -4
- package/lib/server/server.poku.js +36 -1
- package/lib/stages/postgen/annotator.js +2 -1
- package/lib/stages/postgen/annotator.poku.js +15 -0
- package/lib/stages/postgen/auditBom.js +12 -6
- package/lib/stages/postgen/auditBom.poku.js +755 -6
- package/lib/stages/postgen/postgen.js +229 -6
- package/lib/stages/postgen/postgen.poku.js +180 -0
- package/package.json +2 -1
- package/types/lib/cli/index.d.ts +1 -0
- package/types/lib/cli/index.d.ts.map +1 -1
- package/types/lib/helpers/agentFormulationParser.d.ts +19 -0
- package/types/lib/helpers/agentFormulationParser.d.ts.map +1 -0
- package/types/lib/helpers/aiInventory.d.ts +23 -0
- package/types/lib/helpers/aiInventory.d.ts.map +1 -0
- package/types/lib/helpers/analyzer.d.ts +5 -0
- package/types/lib/helpers/analyzer.d.ts.map +1 -1
- package/types/lib/helpers/auditCategories.d.ts +12 -0
- package/types/lib/helpers/auditCategories.d.ts.map +1 -0
- package/types/lib/helpers/chromextutils.d.ts.map +1 -1
- package/types/lib/helpers/ciParsers/githubActions.d.ts.map +1 -1
- package/types/lib/helpers/communityAiConfigParser.d.ts +29 -0
- package/types/lib/helpers/communityAiConfigParser.d.ts.map +1 -0
- package/types/lib/helpers/depsUtils.d.ts.map +1 -1
- package/types/lib/helpers/display.d.ts +1 -0
- package/types/lib/helpers/display.d.ts.map +1 -1
- package/types/lib/helpers/formulationParsers.d.ts.map +1 -1
- package/types/lib/helpers/jsonLike.d.ts +4 -0
- package/types/lib/helpers/jsonLike.d.ts.map +1 -0
- package/types/lib/helpers/mcp.d.ts +29 -0
- package/types/lib/helpers/mcp.d.ts.map +1 -0
- package/types/lib/helpers/mcpConfigParser.d.ts +30 -0
- package/types/lib/helpers/mcpConfigParser.d.ts.map +1 -0
- package/types/lib/helpers/mcpDiscovery.d.ts +5 -0
- package/types/lib/helpers/mcpDiscovery.d.ts.map +1 -0
- package/types/lib/helpers/propertySanitizer.d.ts +3 -0
- package/types/lib/helpers/propertySanitizer.d.ts.map +1 -0
- package/types/lib/helpers/utils.d.ts +31 -0
- package/types/lib/helpers/utils.d.ts.map +1 -1
- package/types/lib/managers/binary.d.ts.map +1 -1
- package/types/lib/managers/docker.d.ts +3 -0
- package/types/lib/managers/docker.d.ts.map +1 -1
- package/types/lib/server/server.d.ts +1 -0
- 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.map +1 -1
- 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
|
-
|
|
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
|
|
6
|
-
description: "npm packages with install scripts from git
|
|
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 $
|
|
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
|
|
17
|
-
mitigation: "Avoid git
|
|
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
|
-
"
|
|
195
|
-
"
|
|
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
|
+
}
|