@cdxgen/cdxgen 0.0.1 → 13.0.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 +921 -87
- package/bin/audit.js +239 -0
- package/bin/cdxgen.js +2335 -0
- package/bin/convert.js +220 -0
- package/bin/evinse.js +353 -0
- package/bin/hbom.js +504 -0
- package/bin/repl.js +2224 -0
- package/bin/sign.js +195 -0
- package/bin/tracebom.js +303 -0
- package/bin/validate.js +268 -0
- package/bin/verify.js +189 -0
- package/data/README.md +307 -0
- package/data/bom-1.4.schema.json +1605 -0
- package/data/bom-1.5.schema.json +3660 -0
- package/data/bom-1.6.schema.json +5511 -0
- package/data/bom-1.7.schema.json +6700 -0
- package/data/cbomosdb-queries.json +68 -0
- package/data/component-tags.json +339 -0
- package/data/container-knowledge-index.json +125 -0
- package/data/cosdb-queries.json +17 -0
- package/data/crypto-oid.json +1998 -0
- package/data/cryptography-defs.json +3793 -0
- package/data/cryptography-defs.schema.json +576 -0
- package/data/cyclonedx-2.0-bundled.schema.json +7182 -0
- package/data/frameworks-list.json +219 -0
- package/data/glibc-stdlib.json +117 -0
- package/data/gtfobins-index.json +6296 -0
- package/data/helpers/init.gradle +71 -0
- package/data/jsf-0.82.schema.json +211 -0
- package/data/known-licenses.json +82 -0
- package/data/lic-mapping.json +338 -0
- package/data/license-aliases.json +6624 -0
- package/data/license-db.json +39059 -0
- package/data/license-deprecations.json +302 -0
- package/data/lolbas-index.json +150 -0
- package/data/predictive-audit-allowlist.json +11 -0
- package/data/pypi-pkg-aliases.json +1199 -0
- package/data/python-stdlib.json +308 -0
- package/data/queries-darwin.json +193 -0
- package/data/queries-win.json +257 -0
- package/data/queries.json +268 -0
- package/data/ruby-known-modules.json +281 -0
- package/data/rules/ai-agent-governance.yaml +323 -0
- package/data/rules/ai-bom.yaml +268 -0
- package/data/rules/ai-oversight.yaml +186 -0
- package/data/rules/ai-provenance.yaml +92 -0
- package/data/rules/asar-archives.yaml +150 -0
- package/data/rules/cbom-security.yaml +165 -0
- package/data/rules/chrome-extensions.yaml +248 -0
- package/data/rules/ci-permissions.yaml +802 -0
- package/data/rules/container-risk.yaml +353 -0
- package/data/rules/dependency-sources.yaml +236 -0
- package/data/rules/golem-go.yaml +229 -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 +388 -0
- package/data/rules/obom-runtime.yaml +1776 -0
- package/data/rules/package-integrity.yaml +364 -0
- package/data/rules/rootfs-hardening.yaml +179 -0
- package/data/rules/vscode-extensions.yaml +237 -0
- package/data/spdx-export.schema.json +6794 -0
- package/data/spdx-license-list.json +7449 -0
- package/data/spdx-licenses.json +759 -0
- package/data/spdx.schema.json +819 -0
- package/data/templates/README.md +3 -0
- package/data/templates/asvs-4.0.3.cdx.json +2943 -0
- package/data/templates/asvs-5.0.cdx.json +3046 -0
- package/data/templates/bsimm-v13.cdx.json +1008 -0
- package/data/templates/masvs-2.0.0.cdx.json +225 -0
- package/data/templates/nist-ssdf-1.1.cdx.json +828 -0
- package/data/templates/pcissc-secure-slc-1.1.cdx.json +1027 -0
- package/data/templates/scvs-1.0.0.cdx.json +813 -0
- package/data/templates/ssaf-DRAFT-2023-11.cdx.json +127 -0
- package/data/vendor-alias.json +41967 -0
- package/data/wrapdb-releases.json +4227 -0
- package/index.cjs +15 -0
- package/lib/audit/index.js +2800 -0
- package/lib/audit/progress.js +114 -0
- package/lib/audit/reporters.js +937 -0
- package/lib/audit/scoring.js +560 -0
- package/lib/audit/targets.js +798 -0
- package/lib/cli/bomAssembly.js +1882 -0
- package/lib/cli/cliOptions.js +543 -0
- package/lib/cli/index.js +2759 -0
- package/lib/cli/jsBom.js +2087 -0
- package/lib/cli/jvmBom.js +1858 -0
- package/lib/cli/managedBom.js +2083 -0
- package/lib/cli/nativeBom.js +2125 -0
- package/lib/core/activity.js +1087 -0
- package/lib/core/env.js +719 -0
- package/lib/core/fs.js +1058 -0
- package/lib/core/httpClient.js +730 -0
- package/lib/core/logger.js +280 -0
- package/lib/core/parallel.js +323 -0
- package/lib/core/paths.js +70 -0
- package/lib/core/projectConfig.js +122 -0
- package/lib/core/propertySanitizer.js +174 -0
- package/lib/core/spdx.js +5 -0
- package/lib/core/state.js +59 -0
- package/lib/core/text.js +207 -0
- package/lib/core/ui.js +920 -0
- package/lib/core/urls.js +84 -0
- package/lib/ecosystems/asarutils.js +1636 -0
- package/lib/ecosystems/bunutils.js +402 -0
- package/lib/ecosystems/caxa.js +77 -0
- package/lib/ecosystems/chromextutils.js +1174 -0
- package/lib/ecosystems/cmakeResolver.js +587 -0
- package/lib/ecosystems/cppEvidence.js +305 -0
- package/lib/ecosystems/denoutils.js +1094 -0
- package/lib/ecosystems/dotnetutils.js +132 -0
- package/lib/ecosystems/ecosystems.js +2772 -0
- package/lib/ecosystems/golem.js +1807 -0
- package/lib/ecosystems/gradleutils.js +1048 -0
- package/lib/ecosystems/jsEvidence.js +317 -0
- package/lib/ecosystems/npmutils.js +586 -0
- package/lib/ecosystems/parsers-bazel.js +875 -0
- package/lib/ecosystems/parsers-dotnet.js +1430 -0
- package/lib/ecosystems/parsers-gleam.js +302 -0
- package/lib/ecosystems/parsers-go.js +818 -0
- package/lib/ecosystems/parsers-js.js +4222 -0
- package/lib/ecosystems/parsers-jvm.js +948 -0
- package/lib/ecosystems/parsers-misc.js +3191 -0
- package/lib/ecosystems/parsers-python.js +2070 -0
- package/lib/ecosystems/parsers-rust.js +1294 -0
- package/lib/ecosystems/parsers-zig.js +861 -0
- package/lib/ecosystems/pep770.js +341 -0
- package/lib/ecosystems/pylockutils.js +427 -0
- package/lib/ecosystems/pythonutils.js +1281 -0
- package/lib/ecosystems/registryProvenance.js +1003 -0
- package/lib/ecosystems/remote/huggingface.js +1343 -0
- package/lib/ecosystems/rubyutils.js +1629 -0
- package/lib/ecosystems/rusi.js +820 -0
- package/lib/ecosystems/sbtutils.js +972 -0
- package/lib/ecosystems/tea.js +607 -0
- package/lib/ecosystems/utils.js +583 -0
- package/lib/ecosystems/zigResolver.js +410 -0
- package/lib/evinser/db.js +145 -0
- package/lib/evinser/evinser.js +2362 -0
- package/lib/evinser/scalasem.js +65 -0
- package/lib/evinser/swiftsem.js +767 -0
- package/lib/helpers/annotationFormatter.js +84 -0
- package/lib/helpers/bomSigner.js +312 -0
- package/lib/helpers/exportUtils.js +160 -0
- package/lib/helpers/remote/dependency-track.js +117 -0
- package/lib/helpers/versutils.js +202 -0
- package/lib/helpers/vsixutils.js +1069 -0
- package/lib/inventory/agentFormulationParser.js +322 -0
- package/lib/inventory/aiCollector.js +2140 -0
- package/lib/inventory/aiInventory.js +414 -0
- package/lib/inventory/aiModelVariants.js +121 -0
- package/lib/inventory/aiOversightCollector.js +661 -0
- package/lib/inventory/aiProvenanceCollector.js +822 -0
- package/lib/inventory/analyzer.js +6089 -0
- package/lib/inventory/analyzerScope.js +807 -0
- package/lib/inventory/astWorker.js +20 -0
- package/lib/inventory/atomUtils.js +1092 -0
- package/lib/inventory/auditCategories.js +192 -0
- package/lib/inventory/bomUtils.js +369 -0
- package/lib/inventory/cacheCommands.js +182 -0
- package/lib/inventory/cacheDir.js +104 -0
- package/lib/inventory/cbomutils.js +590 -0
- package/lib/inventory/cdxrs.js +434 -0
- package/lib/inventory/ciParsers/azurePipelines.js +295 -0
- package/lib/inventory/ciParsers/circleCi.js +286 -0
- package/lib/inventory/ciParsers/common.js +24 -0
- package/lib/inventory/ciParsers/githubActions.js +2434 -0
- package/lib/inventory/ciParsers/gitlabCi.js +213 -0
- package/lib/inventory/ciParsers/jenkins.js +180 -0
- package/lib/inventory/citations.js +234 -0
- package/lib/inventory/communityAiConfigParser.js +756 -0
- package/lib/inventory/containerRisk.js +204 -0
- package/lib/inventory/cryptoAlgorithmFamily.js +258 -0
- package/lib/inventory/deps.js +807 -0
- package/lib/inventory/depsUtils.js +588 -0
- package/lib/inventory/display.js +2128 -0
- package/lib/inventory/dosai.js +601 -0
- package/lib/inventory/dosaiParsers.js +154 -0
- package/lib/inventory/dynamic.js +145 -0
- package/lib/inventory/envcontext.js +1793 -0
- package/lib/inventory/evidenceUtils.js +774 -0
- package/lib/inventory/fetchBatch.js +779 -0
- package/lib/inventory/fetchRate.js +255 -0
- package/lib/inventory/forgeEnricher.js +300 -0
- package/lib/inventory/formulationParsers.js +422 -0
- package/lib/inventory/gtfobins.js +339 -0
- package/lib/inventory/hbom.js +719 -0
- package/lib/inventory/hbomAnalysis.js +310 -0
- package/lib/inventory/hbomLoader.js +35 -0
- package/lib/inventory/hostTopology.js +835 -0
- package/lib/inventory/inventoryStats.js +100 -0
- package/lib/inventory/jsonLike.js +121 -0
- package/lib/inventory/licenseEnhancer.js +918 -0
- package/lib/inventory/lolbas.js +285 -0
- package/lib/inventory/mcp.js +253 -0
- package/lib/inventory/mcpConfigParser.js +683 -0
- package/lib/inventory/mcpDiscovery.js +112 -0
- package/lib/inventory/mcpPinning.js +209 -0
- package/lib/inventory/osPackageResolver.js +493 -0
- package/lib/inventory/osinfo.js +383 -0
- package/lib/inventory/osqueryTransform.js +274 -0
- package/lib/inventory/plugins.js +466 -0
- package/lib/inventory/protobom.js +231 -0
- package/lib/inventory/protobomLoader.js +43 -0
- package/lib/inventory/provenanceUtils.js +224 -0
- package/lib/inventory/purl.js +749 -0
- package/lib/inventory/rustFormulationParser.js +339 -0
- package/lib/inventory/sbomDocument.js +340 -0
- package/lib/inventory/source.js +1488 -0
- package/lib/inventory/spdx.js +361 -0
- package/lib/inventory/spdxExpression.js +512 -0
- package/lib/inventory/spdxUtils.js +107 -0
- package/lib/inventory/table.js +267 -0
- package/lib/inventory/traceRunner.js +439 -0
- package/lib/inventory/unicodeScan.js +147 -0
- package/lib/managers/binary.js +3459 -0
- package/lib/managers/containerutils.js +125 -0
- package/lib/managers/docker.js +2145 -0
- package/lib/managers/dockerConnection.js +162 -0
- package/lib/managers/oci.js +704 -0
- package/lib/managers/piptree.js +267 -0
- package/lib/parsers/cmakeCache.js +199 -0
- package/lib/parsers/gguf.js +492 -0
- package/lib/parsers/gitAiNotes.js +233 -0
- package/lib/parsers/gitmodules.js +239 -0
- package/lib/parsers/htmlExtract.js +610 -0
- package/lib/parsers/huggingfaceManifest.js +551 -0
- package/lib/parsers/huggingfaceUtils.js +506 -0
- package/lib/parsers/iri.js +618 -0
- package/lib/parsers/npmrc.js +99 -0
- package/lib/parsers/ollama.js +101 -0
- package/lib/parsers/xml.js +841 -0
- package/lib/server/openapi.yaml +433 -0
- package/lib/server/server.js +616 -0
- package/lib/stages/postgen/annotator.js +977 -0
- package/lib/stages/postgen/auditBom.js +468 -0
- package/lib/stages/postgen/postgen.js +1239 -0
- package/lib/stages/postgen/ruleEngine.js +731 -0
- package/lib/stages/postgen/sortBom.js +195 -0
- package/lib/stages/postgen/spdxConverter.js +796 -0
- package/lib/stages/postgen/specVersionCompat.js +703 -0
- package/lib/stages/pregen/envAudit.js +388 -0
- package/lib/stages/pregen/pregen.js +637 -0
- package/lib/third-party/README.md +9 -0
- package/lib/third-party/arborist/CHANGELOG.md +1109 -0
- package/lib/third-party/arborist/LICENSE.md +20 -0
- package/lib/third-party/arborist/README.md +315 -0
- package/lib/third-party/arborist/lib/arborist/index.js +258 -0
- package/lib/third-party/arborist/lib/arborist/load-actual.js +605 -0
- package/lib/third-party/arborist/lib/arborist/load-virtual.js +300 -0
- package/lib/third-party/arborist/lib/bin-links.js +120 -0
- package/lib/third-party/arborist/lib/calc-dep-flags.js +130 -0
- package/lib/third-party/arborist/lib/case-insensitive-map.js +51 -0
- package/lib/third-party/arborist/lib/consistent-resolve.js +42 -0
- package/lib/third-party/arborist/lib/debug.js +50 -0
- package/lib/third-party/arborist/lib/dep-valid.js +190 -0
- package/lib/third-party/arborist/lib/edge.js +417 -0
- package/lib/third-party/arborist/lib/from-path.js +36 -0
- package/lib/third-party/arborist/lib/gather-dep-set.js +43 -0
- package/lib/third-party/arborist/lib/index.js +22 -0
- package/lib/third-party/arborist/lib/inventory.js +138 -0
- package/lib/third-party/arborist/lib/link.js +169 -0
- package/lib/third-party/arborist/lib/node.js +1673 -0
- package/lib/third-party/arborist/lib/npm-extension.js +45 -0
- package/lib/third-party/arborist/lib/override-resolves.js +11 -0
- package/lib/third-party/arborist/lib/override-set.js +319 -0
- package/lib/third-party/arborist/lib/package-extensions.js +289 -0
- package/lib/third-party/arborist/lib/printable.js +210 -0
- package/lib/third-party/arborist/lib/proc-log.js +30 -0
- package/lib/third-party/arborist/lib/realpath.js +100 -0
- package/lib/third-party/arborist/lib/relpath.js +4 -0
- package/lib/third-party/arborist/lib/shrinkwrap.js +1291 -0
- package/lib/third-party/arborist/lib/spec-from-lock.js +34 -0
- package/lib/third-party/arborist/lib/tree-check.js +165 -0
- package/lib/third-party/arborist/lib/validate-npm-package-name.js +107 -0
- package/lib/third-party/arborist/lib/version-from-tgz.js +51 -0
- package/lib/third-party/arborist/lib/yarn-lock.js +397 -0
- package/lib/validator/bomValidator.js +985 -0
- package/lib/validator/complianceEngine.js +241 -0
- package/lib/validator/complianceRules.js +1680 -0
- package/lib/validator/generated/runtime.mjs +17 -0
- package/lib/validator/generated/validate-1.6.mjs +21258 -0
- package/lib/validator/generated/validate-1.7.mjs +24803 -0
- package/lib/validator/generated/validate-2.0.mjs +22931 -0
- package/lib/validator/index.js +246 -0
- package/lib/validator/reporters/annotations.js +142 -0
- package/lib/validator/reporters/console.js +160 -0
- package/lib/validator/reporters/index.js +41 -0
- package/lib/validator/reporters/json.js +37 -0
- package/lib/validator/reporters/sarif.js +184 -0
- package/package.json +209 -26
- package/types/bin/audit.d.ts +3 -0
- package/types/bin/audit.d.ts.map +1 -0
- package/types/bin/cdxgen.d.ts +3 -0
- package/types/bin/cdxgen.d.ts.map +1 -0
- package/types/bin/convert.d.ts +3 -0
- package/types/bin/convert.d.ts.map +1 -0
- package/types/bin/evinse.d.ts +3 -0
- package/types/bin/evinse.d.ts.map +1 -0
- package/types/bin/hbom.d.ts +3 -0
- package/types/bin/hbom.d.ts.map +1 -0
- package/types/bin/repl.d.ts +3 -0
- package/types/bin/repl.d.ts.map +1 -0
- package/types/bin/sign.d.ts +3 -0
- package/types/bin/sign.d.ts.map +1 -0
- package/types/bin/tracebom.d.ts +3 -0
- package/types/bin/tracebom.d.ts.map +1 -0
- package/types/bin/validate.d.ts +14 -0
- package/types/bin/validate.d.ts.map +1 -0
- package/types/bin/verify.d.ts +3 -0
- package/types/bin/verify.d.ts.map +1 -0
- package/types/lib/audit/index.d.ts +153 -0
- package/types/lib/audit/index.d.ts.map +1 -0
- package/types/lib/audit/progress.d.ts +31 -0
- package/types/lib/audit/progress.d.ts.map +1 -0
- package/types/lib/audit/reporters.d.ts +62 -0
- package/types/lib/audit/reporters.d.ts.map +1 -0
- package/types/lib/audit/scoring.d.ts +36 -0
- package/types/lib/audit/scoring.d.ts.map +1 -0
- package/types/lib/audit/targets.d.ts +77 -0
- package/types/lib/audit/targets.d.ts.map +1 -0
- package/types/lib/cli/bomAssembly.d.ts +329 -0
- package/types/lib/cli/bomAssembly.d.ts.map +1 -0
- package/types/lib/cli/cliOptions.d.ts +156 -0
- package/types/lib/cli/cliOptions.d.ts.map +1 -0
- package/types/lib/cli/index.d.ts +107 -0
- package/types/lib/cli/index.d.ts.map +1 -0
- package/types/lib/cli/jsBom.d.ts +94 -0
- package/types/lib/cli/jsBom.d.ts.map +1 -0
- package/types/lib/cli/jvmBom.d.ts +54 -0
- package/types/lib/cli/jvmBom.d.ts.map +1 -0
- package/types/lib/cli/managedBom.d.ts +105 -0
- package/types/lib/cli/managedBom.d.ts.map +1 -0
- package/types/lib/cli/nativeBom.d.ts +143 -0
- package/types/lib/cli/nativeBom.d.ts.map +1 -0
- package/types/lib/core/activity.d.ts +178 -0
- package/types/lib/core/activity.d.ts.map +1 -0
- package/types/lib/core/env.d.ts +192 -0
- package/types/lib/core/env.d.ts.map +1 -0
- package/types/lib/core/fs.d.ts +158 -0
- package/types/lib/core/fs.d.ts.map +1 -0
- package/types/lib/core/httpClient.d.ts +149 -0
- package/types/lib/core/httpClient.d.ts.map +1 -0
- package/types/lib/core/logger.d.ts +50 -0
- package/types/lib/core/logger.d.ts.map +1 -0
- package/types/lib/core/parallel.d.ts +95 -0
- package/types/lib/core/parallel.d.ts.map +1 -0
- package/types/lib/core/paths.d.ts +36 -0
- package/types/lib/core/paths.d.ts.map +1 -0
- package/types/lib/core/projectConfig.d.ts +23 -0
- package/types/lib/core/projectConfig.d.ts.map +1 -0
- package/types/lib/core/propertySanitizer.d.ts +23 -0
- package/types/lib/core/propertySanitizer.d.ts.map +1 -0
- package/types/lib/core/spdx.d.ts +5 -0
- package/types/lib/core/spdx.d.ts.map +1 -0
- package/types/lib/core/state.d.ts +20 -0
- package/types/lib/core/state.d.ts.map +1 -0
- package/types/lib/core/text.d.ts +78 -0
- package/types/lib/core/text.d.ts.map +1 -0
- package/types/lib/core/ui.d.ts +87 -0
- package/types/lib/core/ui.d.ts.map +1 -0
- package/types/lib/core/urls.d.ts +43 -0
- package/types/lib/core/urls.d.ts.map +1 -0
- package/types/lib/ecosystems/asarutils.d.ts +71 -0
- package/types/lib/ecosystems/asarutils.d.ts.map +1 -0
- package/types/lib/ecosystems/bunutils.d.ts +38 -0
- package/types/lib/ecosystems/bunutils.d.ts.map +1 -0
- package/types/lib/ecosystems/caxa.d.ts +8 -0
- package/types/lib/ecosystems/caxa.d.ts.map +1 -0
- package/types/lib/ecosystems/chromextutils.d.ts +97 -0
- package/types/lib/ecosystems/chromextutils.d.ts.map +1 -0
- package/types/lib/ecosystems/cmakeResolver.d.ts +176 -0
- package/types/lib/ecosystems/cmakeResolver.d.ts.map +1 -0
- package/types/lib/ecosystems/cppEvidence.d.ts +35 -0
- package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -0
- package/types/lib/ecosystems/denoutils.d.ts +76 -0
- package/types/lib/ecosystems/denoutils.d.ts.map +1 -0
- package/types/lib/ecosystems/dotnetutils.d.ts +45 -0
- package/types/lib/ecosystems/dotnetutils.d.ts.map +1 -0
- package/types/lib/ecosystems/ecosystems.d.ts +279 -0
- package/types/lib/ecosystems/ecosystems.d.ts.map +1 -0
- package/types/lib/ecosystems/golem.d.ts +60 -0
- package/types/lib/ecosystems/golem.d.ts.map +1 -0
- package/types/lib/ecosystems/gradleutils.d.ts +139 -0
- package/types/lib/ecosystems/gradleutils.d.ts.map +1 -0
- package/types/lib/ecosystems/jsEvidence.d.ts +17 -0
- package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -0
- package/types/lib/ecosystems/npmutils.d.ts +183 -0
- package/types/lib/ecosystems/npmutils.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts +36 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-dotnet.d.ts +116 -0
- package/types/lib/ecosystems/parsers-dotnet.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-gleam.d.ts +33 -0
- package/types/lib/ecosystems/parsers-gleam.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-go.d.ts +92 -0
- package/types/lib/ecosystems/parsers-go.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-js.d.ts +242 -0
- package/types/lib/ecosystems/parsers-js.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-jvm.d.ts +100 -0
- package/types/lib/ecosystems/parsers-jvm.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-misc.d.ts +450 -0
- package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-python.d.ts +145 -0
- package/types/lib/ecosystems/parsers-python.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-rust.d.ts +56 -0
- package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-zig.d.ts +83 -0
- package/types/lib/ecosystems/parsers-zig.d.ts.map +1 -0
- package/types/lib/ecosystems/pep770.d.ts +38 -0
- package/types/lib/ecosystems/pep770.d.ts.map +1 -0
- package/types/lib/ecosystems/pylockutils.d.ts +68 -0
- package/types/lib/ecosystems/pylockutils.d.ts.map +1 -0
- package/types/lib/ecosystems/pythonutils.d.ts +70 -0
- package/types/lib/ecosystems/pythonutils.d.ts.map +1 -0
- package/types/lib/ecosystems/registryProvenance.d.ts +26 -0
- package/types/lib/ecosystems/registryProvenance.d.ts.map +1 -0
- package/types/lib/ecosystems/remote/huggingface.d.ts +31 -0
- package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -0
- package/types/lib/ecosystems/rubyutils.d.ts +182 -0
- package/types/lib/ecosystems/rubyutils.d.ts.map +1 -0
- package/types/lib/ecosystems/rusi.d.ts +40 -0
- package/types/lib/ecosystems/rusi.d.ts.map +1 -0
- package/types/lib/ecosystems/sbtutils.d.ts +179 -0
- package/types/lib/ecosystems/sbtutils.d.ts.map +1 -0
- package/types/lib/ecosystems/tea.d.ts +180 -0
- package/types/lib/ecosystems/tea.d.ts.map +1 -0
- package/types/lib/ecosystems/utils.d.ts +41 -0
- package/types/lib/ecosystems/utils.d.ts.map +1 -0
- package/types/lib/ecosystems/zigResolver.d.ts +70 -0
- package/types/lib/ecosystems/zigResolver.d.ts.map +1 -0
- package/types/lib/evinser/db.d.ts +17 -0
- package/types/lib/evinser/db.d.ts.map +1 -0
- package/types/lib/evinser/evinser.d.ts +354 -0
- package/types/lib/evinser/evinser.d.ts.map +1 -0
- package/types/lib/evinser/scalasem.d.ts +15 -0
- package/types/lib/evinser/scalasem.d.ts.map +1 -0
- package/types/lib/evinser/swiftsem.d.ts +103 -0
- package/types/lib/evinser/swiftsem.d.ts.map +1 -0
- package/types/lib/helpers/annotationFormatter.d.ts +23 -0
- package/types/lib/helpers/annotationFormatter.d.ts.map +1 -0
- package/types/lib/helpers/bomSigner.d.ts +28 -0
- package/types/lib/helpers/bomSigner.d.ts.map +1 -0
- package/types/lib/helpers/exportUtils.d.ts +52 -0
- package/types/lib/helpers/exportUtils.d.ts.map +1 -0
- package/types/lib/helpers/remote/dependency-track.d.ts +23 -0
- package/types/lib/helpers/remote/dependency-track.d.ts.map +1 -0
- package/types/lib/helpers/versutils.d.ts +8 -0
- package/types/lib/helpers/versutils.d.ts.map +1 -0
- package/types/lib/helpers/vsixutils.d.ts +130 -0
- package/types/lib/helpers/vsixutils.d.ts.map +1 -0
- package/types/lib/inventory/agentFormulationParser.d.ts +21 -0
- package/types/lib/inventory/agentFormulationParser.d.ts.map +1 -0
- package/types/lib/inventory/aiCollector.d.ts +61 -0
- package/types/lib/inventory/aiCollector.d.ts.map +1 -0
- package/types/lib/inventory/aiInventory.d.ts +103 -0
- package/types/lib/inventory/aiInventory.d.ts.map +1 -0
- package/types/lib/inventory/aiModelVariants.d.ts +31 -0
- package/types/lib/inventory/aiModelVariants.d.ts.map +1 -0
- package/types/lib/inventory/aiOversightCollector.d.ts +28 -0
- package/types/lib/inventory/aiOversightCollector.d.ts.map +1 -0
- package/types/lib/inventory/aiProvenanceCollector.d.ts +13 -0
- package/types/lib/inventory/aiProvenanceCollector.d.ts.map +1 -0
- package/types/lib/inventory/analyzer.d.ts +157 -0
- package/types/lib/inventory/analyzer.d.ts.map +1 -0
- package/types/lib/inventory/analyzerScope.d.ts +106 -0
- package/types/lib/inventory/analyzerScope.d.ts.map +1 -0
- package/types/lib/inventory/astWorker.d.ts +9 -0
- package/types/lib/inventory/astWorker.d.ts.map +1 -0
- package/types/lib/inventory/atomUtils.d.ts +159 -0
- package/types/lib/inventory/atomUtils.d.ts.map +1 -0
- package/types/lib/inventory/auditCategories.d.ts +80 -0
- package/types/lib/inventory/auditCategories.d.ts.map +1 -0
- package/types/lib/inventory/bomUtils.d.ts +145 -0
- package/types/lib/inventory/bomUtils.d.ts.map +1 -0
- package/types/lib/inventory/cacheCommands.d.ts +28 -0
- package/types/lib/inventory/cacheCommands.d.ts.map +1 -0
- package/types/lib/inventory/cacheDir.d.ts +55 -0
- package/types/lib/inventory/cacheDir.d.ts.map +1 -0
- package/types/lib/inventory/cbomutils.d.ts +37 -0
- package/types/lib/inventory/cbomutils.d.ts.map +1 -0
- package/types/lib/inventory/cdxrs.d.ts +90 -0
- package/types/lib/inventory/cdxrs.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/azurePipelines.d.ts +27 -0
- package/types/lib/inventory/ciParsers/azurePipelines.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/circleCi.d.ts +27 -0
- package/types/lib/inventory/ciParsers/circleCi.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/common.d.ts +11 -0
- package/types/lib/inventory/ciParsers/common.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/githubActions.d.ts +38 -0
- package/types/lib/inventory/ciParsers/githubActions.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/gitlabCi.d.ts +26 -0
- package/types/lib/inventory/ciParsers/gitlabCi.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/jenkins.d.ts +26 -0
- package/types/lib/inventory/ciParsers/jenkins.d.ts.map +1 -0
- package/types/lib/inventory/citations.d.ts +90 -0
- package/types/lib/inventory/citations.d.ts.map +1 -0
- package/types/lib/inventory/communityAiConfigParser.d.ts +14 -0
- package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -0
- package/types/lib/inventory/containerRisk.d.ts +20 -0
- package/types/lib/inventory/containerRisk.d.ts.map +1 -0
- package/types/lib/inventory/cryptoAlgorithmFamily.d.ts +37 -0
- package/types/lib/inventory/cryptoAlgorithmFamily.d.ts.map +1 -0
- package/types/lib/inventory/deps.d.ts +140 -0
- package/types/lib/inventory/deps.d.ts.map +1 -0
- package/types/lib/inventory/depsUtils.d.ts +74 -0
- package/types/lib/inventory/depsUtils.d.ts.map +1 -0
- package/types/lib/inventory/display.d.ts +227 -0
- package/types/lib/inventory/display.d.ts.map +1 -0
- package/types/lib/inventory/dosai.d.ts +130 -0
- package/types/lib/inventory/dosai.d.ts.map +1 -0
- package/types/lib/inventory/dosaiParsers.d.ts +59 -0
- package/types/lib/inventory/dosaiParsers.d.ts.map +1 -0
- package/types/lib/inventory/dynamic.d.ts +25 -0
- package/types/lib/inventory/dynamic.d.ts.map +1 -0
- package/types/lib/inventory/envcontext.d.ts +377 -0
- package/types/lib/inventory/envcontext.d.ts.map +1 -0
- package/types/lib/inventory/evidenceUtils.d.ts +74 -0
- package/types/lib/inventory/evidenceUtils.d.ts.map +1 -0
- package/types/lib/inventory/fetchBatch.d.ts +127 -0
- package/types/lib/inventory/fetchBatch.d.ts.map +1 -0
- package/types/lib/inventory/fetchRate.d.ts +118 -0
- package/types/lib/inventory/fetchRate.d.ts.map +1 -0
- package/types/lib/inventory/forgeEnricher.d.ts +31 -0
- package/types/lib/inventory/forgeEnricher.d.ts.map +1 -0
- package/types/lib/inventory/formulationParsers.d.ts +50 -0
- package/types/lib/inventory/formulationParsers.d.ts.map +1 -0
- package/types/lib/inventory/gtfobins.d.ts +27 -0
- package/types/lib/inventory/gtfobins.d.ts.map +1 -0
- package/types/lib/inventory/hbom.d.ts +58 -0
- package/types/lib/inventory/hbom.d.ts.map +1 -0
- package/types/lib/inventory/hbomAnalysis.d.ts +56 -0
- package/types/lib/inventory/hbomAnalysis.d.ts.map +1 -0
- package/types/lib/inventory/hbomLoader.d.ts +7 -0
- package/types/lib/inventory/hbomLoader.d.ts.map +1 -0
- package/types/lib/inventory/hostTopology.d.ts +47 -0
- package/types/lib/inventory/hostTopology.d.ts.map +1 -0
- package/types/lib/inventory/inventoryStats.d.ts +42 -0
- package/types/lib/inventory/inventoryStats.d.ts.map +1 -0
- package/types/lib/inventory/jsonLike.d.ts +23 -0
- package/types/lib/inventory/jsonLike.d.ts.map +1 -0
- package/types/lib/inventory/licenseEnhancer.d.ts +70 -0
- package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -0
- package/types/lib/inventory/lolbas.d.ts +16 -0
- package/types/lib/inventory/lolbas.d.ts.map +1 -0
- package/types/lib/inventory/mcp.d.ts +29 -0
- package/types/lib/inventory/mcp.d.ts.map +1 -0
- package/types/lib/inventory/mcpConfigParser.d.ts +20 -0
- package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -0
- package/types/lib/inventory/mcpDiscovery.d.ts +33 -0
- package/types/lib/inventory/mcpDiscovery.d.ts.map +1 -0
- package/types/lib/inventory/mcpPinning.d.ts +11 -0
- package/types/lib/inventory/mcpPinning.d.ts.map +1 -0
- package/types/lib/inventory/osPackageResolver.d.ts +49 -0
- package/types/lib/inventory/osPackageResolver.d.ts.map +1 -0
- package/types/lib/inventory/osinfo.d.ts +201 -0
- package/types/lib/inventory/osinfo.d.ts.map +1 -0
- package/types/lib/inventory/osqueryTransform.d.ts +84 -0
- package/types/lib/inventory/osqueryTransform.d.ts.map +1 -0
- package/types/lib/inventory/plugins.d.ts +58 -0
- package/types/lib/inventory/plugins.d.ts.map +1 -0
- package/types/lib/inventory/protobom.d.ts +71 -0
- package/types/lib/inventory/protobom.d.ts.map +1 -0
- package/types/lib/inventory/protobomLoader.d.ts +17 -0
- package/types/lib/inventory/protobomLoader.d.ts.map +1 -0
- package/types/lib/inventory/provenanceUtils.d.ts +98 -0
- package/types/lib/inventory/provenanceUtils.d.ts.map +1 -0
- package/types/lib/inventory/purl.d.ts +313 -0
- package/types/lib/inventory/purl.d.ts.map +1 -0
- package/types/lib/inventory/rustFormulationParser.d.ts +17 -0
- package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -0
- package/types/lib/inventory/sbomDocument.d.ts +59 -0
- package/types/lib/inventory/sbomDocument.d.ts.map +1 -0
- package/types/lib/inventory/source.d.ts +163 -0
- package/types/lib/inventory/source.d.ts.map +1 -0
- package/types/lib/inventory/spdx.d.ts +66 -0
- package/types/lib/inventory/spdx.d.ts.map +1 -0
- package/types/lib/inventory/spdxExpression.d.ts +58 -0
- package/types/lib/inventory/spdxExpression.d.ts.map +1 -0
- package/types/lib/inventory/spdxUtils.d.ts +12 -0
- package/types/lib/inventory/spdxUtils.d.ts.map +1 -0
- package/types/lib/inventory/table.d.ts +22 -0
- package/types/lib/inventory/table.d.ts.map +1 -0
- package/types/lib/inventory/traceRunner.d.ts +80 -0
- package/types/lib/inventory/traceRunner.d.ts.map +1 -0
- package/types/lib/inventory/unicodeScan.d.ts +46 -0
- package/types/lib/inventory/unicodeScan.d.ts.map +1 -0
- package/types/lib/managers/binary.d.ts +147 -0
- package/types/lib/managers/binary.d.ts.map +1 -0
- package/types/lib/managers/containerutils.d.ts +30 -0
- package/types/lib/managers/containerutils.d.ts.map +1 -0
- package/types/lib/managers/docker.d.ts +157 -0
- package/types/lib/managers/docker.d.ts.map +1 -0
- package/types/lib/managers/dockerConnection.d.ts +42 -0
- package/types/lib/managers/dockerConnection.d.ts.map +1 -0
- package/types/lib/managers/oci.d.ts +21 -0
- package/types/lib/managers/oci.d.ts.map +1 -0
- package/types/lib/managers/piptree.d.ts +13 -0
- package/types/lib/managers/piptree.d.ts.map +1 -0
- package/types/lib/parsers/cmakeCache.d.ts +70 -0
- package/types/lib/parsers/cmakeCache.d.ts.map +1 -0
- package/types/lib/parsers/gguf.d.ts +39 -0
- package/types/lib/parsers/gguf.d.ts.map +1 -0
- package/types/lib/parsers/gitAiNotes.d.ts +15 -0
- package/types/lib/parsers/gitAiNotes.d.ts.map +1 -0
- package/types/lib/parsers/gitmodules.d.ts +88 -0
- package/types/lib/parsers/gitmodules.d.ts.map +1 -0
- package/types/lib/parsers/htmlExtract.d.ts +34 -0
- package/types/lib/parsers/htmlExtract.d.ts.map +1 -0
- package/types/lib/parsers/huggingfaceManifest.d.ts +153 -0
- package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts +155 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -0
- package/types/lib/parsers/iri.d.ts +68 -0
- package/types/lib/parsers/iri.d.ts.map +1 -0
- package/types/lib/parsers/npmrc.d.ts +33 -0
- package/types/lib/parsers/npmrc.d.ts.map +1 -0
- package/types/lib/parsers/ollama.d.ts +22 -0
- package/types/lib/parsers/ollama.d.ts.map +1 -0
- package/types/lib/parsers/xml.d.ts +47 -0
- package/types/lib/parsers/xml.d.ts.map +1 -0
- package/types/lib/server/server.d.ts +51 -0
- package/types/lib/server/server.d.ts.map +1 -0
- package/types/lib/stages/postgen/annotator.d.ts +36 -0
- package/types/lib/stages/postgen/annotator.d.ts.map +1 -0
- package/types/lib/stages/postgen/auditBom.d.ts +92 -0
- package/types/lib/stages/postgen/auditBom.d.ts.map +1 -0
- package/types/lib/stages/postgen/postgen.d.ts +59 -0
- package/types/lib/stages/postgen/postgen.d.ts.map +1 -0
- package/types/lib/stages/postgen/ruleEngine.d.ts +18 -0
- package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -0
- package/types/lib/stages/postgen/sortBom.d.ts +34 -0
- package/types/lib/stages/postgen/sortBom.d.ts.map +1 -0
- package/types/lib/stages/postgen/spdxConverter.d.ts +11 -0
- package/types/lib/stages/postgen/spdxConverter.d.ts.map +1 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts +71 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -0
- package/types/lib/stages/pregen/envAudit.d.ts +14 -0
- package/types/lib/stages/pregen/envAudit.d.ts.map +1 -0
- package/types/lib/stages/pregen/pregen.d.ts +59 -0
- package/types/lib/stages/pregen/pregen.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/index.d.ts +47 -0
- package/types/lib/third-party/arborist/lib/arborist/index.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts +4 -0
- package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts +4 -0
- package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/bin-links.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/bin-links.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts +9 -0
- package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/debug.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/debug.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/dep-valid.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/dep-valid.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/edge.d.ts +46 -0
- package/types/lib/third-party/arborist/lib/edge.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/from-path.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/from-path.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/index.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/index.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/inventory.d.ts +14 -0
- package/types/lib/third-party/arborist/lib/inventory.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/link.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/link.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/node.d.ts +112 -0
- package/types/lib/third-party/arborist/lib/node.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/npm-extension.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/npm-extension.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/override-resolves.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/override-resolves.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/override-set.d.ts +27 -0
- package/types/lib/third-party/arborist/lib/override-set.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/package-extensions.d.ts +36 -0
- package/types/lib/third-party/arborist/lib/package-extensions.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/printable.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/printable.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/proc-log.d.ts +20 -0
- package/types/lib/third-party/arborist/lib/proc-log.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/realpath.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/realpath.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/relpath.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/relpath.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts +54 -0
- package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/tree-check.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/tree-check.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts +13 -0
- package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts +6 -0
- package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/yarn-lock.d.ts +35 -0
- package/types/lib/third-party/arborist/lib/yarn-lock.d.ts.map +1 -0
- package/types/lib/validator/bomValidator.d.ts +40 -0
- package/types/lib/validator/bomValidator.d.ts.map +1 -0
- package/types/lib/validator/complianceEngine.d.ts +72 -0
- package/types/lib/validator/complianceEngine.d.ts.map +1 -0
- package/types/lib/validator/complianceRules.d.ts +61 -0
- package/types/lib/validator/complianceRules.d.ts.map +1 -0
- package/types/lib/validator/index.d.ts +101 -0
- package/types/lib/validator/index.d.ts.map +1 -0
- package/types/lib/validator/reporters/annotations.d.ts +37 -0
- package/types/lib/validator/reporters/annotations.d.ts.map +1 -0
- package/types/lib/validator/reporters/console.d.ts +34 -0
- package/types/lib/validator/reporters/console.d.ts.map +1 -0
- package/types/lib/validator/reporters/index.d.ts +30 -0
- package/types/lib/validator/reporters/index.d.ts.map +1 -0
- package/types/lib/validator/reporters/json.d.ts +11 -0
- package/types/lib/validator/reporters/json.d.ts.map +1 -0
- package/types/lib/validator/reporters/sarif.d.ts +22 -0
- package/types/lib/validator/reporters/sarif.d.ts.map +1 -0
- package/mod.d.ts +0 -7
- package/mod.js +0 -22
|
@@ -0,0 +1,802 @@
|
|
|
1
|
+
# CI/CD Permission Security Rules
|
|
2
|
+
# Category: ci-permission
|
|
3
|
+
# Evaluates GitHub Actions, GitLab CI, Azure Pipelines, etc. for privilege risks
|
|
4
|
+
|
|
5
|
+
- id: CI-001
|
|
6
|
+
name: "Unpinned action in write-permission workflow"
|
|
7
|
+
description: "GitHub Actions referenced by tag/branch in workflows with write permissions pose supply chain risk"
|
|
8
|
+
severity: high
|
|
9
|
+
category: ci-permission
|
|
10
|
+
dry-run-support: full
|
|
11
|
+
attack:
|
|
12
|
+
tactics: [TA0001]
|
|
13
|
+
techniques: [T1195.001]
|
|
14
|
+
condition: |
|
|
15
|
+
$auditComponents($)[
|
|
16
|
+
$prop($, 'cdx:github:action:isShaPinned') = 'false'
|
|
17
|
+
and (
|
|
18
|
+
$prop($, 'cdx:github:workflow:hasWritePermissions') = 'true'
|
|
19
|
+
or $prop($, 'cdx:github:job:hasWritePermissions') = 'true'
|
|
20
|
+
)
|
|
21
|
+
]
|
|
22
|
+
location: |
|
|
23
|
+
{
|
|
24
|
+
"bomRef": $."bom-ref",
|
|
25
|
+
"purl": purl,
|
|
26
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
27
|
+
}
|
|
28
|
+
message: "Unpinned GitHub Action '{{ $prop($, 'cdx:github:action:uses') }}' in workflow with write permissions"
|
|
29
|
+
mitigation: "Pin action to full SHA: actions/setup-node@abc123def456..."
|
|
30
|
+
evidence: |
|
|
31
|
+
{
|
|
32
|
+
"pinningType": $prop($, 'cdx:github:action:versionPinningType'),
|
|
33
|
+
"workflowTriggers": $prop($, 'cdx:github:workflow:triggers'),
|
|
34
|
+
"jobName": $prop($, 'cdx:github:job:name')
|
|
35
|
+
}
|
|
36
|
+
- id: CI-002
|
|
37
|
+
name: "OIDC token issuance to non-official action"
|
|
38
|
+
description: "Workflows or jobs granting id-token:write to third-party actions may enable token exfiltration"
|
|
39
|
+
severity: high
|
|
40
|
+
category: ci-permission
|
|
41
|
+
dry-run-support: full
|
|
42
|
+
attack:
|
|
43
|
+
tactics: [TA0006]
|
|
44
|
+
techniques: [T1528]
|
|
45
|
+
condition: |
|
|
46
|
+
$auditComponents($)[
|
|
47
|
+
(
|
|
48
|
+
$prop($, 'cdx:github:workflow:hasIdTokenWrite') = 'true'
|
|
49
|
+
or $prop($, 'cdx:github:job:hasIdTokenWrite') = 'true'
|
|
50
|
+
)
|
|
51
|
+
and $prop($, 'cdx:actions:isOfficial') = 'false'
|
|
52
|
+
]
|
|
53
|
+
location: |
|
|
54
|
+
{
|
|
55
|
+
"bomRef": $."bom-ref",
|
|
56
|
+
"purl": purl,
|
|
57
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
58
|
+
}
|
|
59
|
+
message: "Workflow grants OIDC token access to non-official action '{{ $prop($, 'cdx:github:action:uses') }}'"
|
|
60
|
+
mitigation: "Restrict id-token scope or use only verified/official actions for OIDC operations"
|
|
61
|
+
evidence: |
|
|
62
|
+
{
|
|
63
|
+
"isVerified": $prop($, 'cdx:actions:isVerified'),
|
|
64
|
+
"actionGroup": group,
|
|
65
|
+
"jobHasIdTokenWrite": $prop($, 'cdx:github:job:hasIdTokenWrite'),
|
|
66
|
+
"workflowHasIdTokenWrite": $prop($, 'cdx:github:workflow:hasIdTokenWrite')
|
|
67
|
+
}
|
|
68
|
+
- id: CI-003
|
|
69
|
+
name: "Action pinned to mutable tag"
|
|
70
|
+
description: "GitHub Actions pinned to tags (vs SHA) can change behavior unexpectedly if tag is moved"
|
|
71
|
+
severity: medium
|
|
72
|
+
category: ci-permission
|
|
73
|
+
dry-run-support: full
|
|
74
|
+
attack:
|
|
75
|
+
tactics: [TA0001]
|
|
76
|
+
techniques: [T1195.001]
|
|
77
|
+
condition: |
|
|
78
|
+
$auditComponents($)[
|
|
79
|
+
$prop($, 'cdx:github:action:versionPinningType') = 'tag'
|
|
80
|
+
]
|
|
81
|
+
location: |
|
|
82
|
+
{ "bomRef": $."bom-ref", "purl": purl }
|
|
83
|
+
message: "GitHub Action '{{ $prop($, 'cdx:github:action:uses') }}' pinned to mutable tag (not SHA)"
|
|
84
|
+
mitigation: "Consider pinning to full commit SHA for immutability: actions/setup-node@<full-sha>"
|
|
85
|
+
evidence: |
|
|
86
|
+
{
|
|
87
|
+
"currentVersion": version,
|
|
88
|
+
"isOfficial": $prop($, 'cdx:actions:isOfficial')
|
|
89
|
+
}
|
|
90
|
+
- id: CI-004
|
|
91
|
+
name: "Workflow uses pull_request_target trigger"
|
|
92
|
+
description: "pull_request_target can execute code in the context of the base branch, risking secret exposure"
|
|
93
|
+
severity: medium
|
|
94
|
+
category: ci-permission
|
|
95
|
+
dry-run-support: full
|
|
96
|
+
attack:
|
|
97
|
+
tactics: [TA0001, TA0004]
|
|
98
|
+
condition: |
|
|
99
|
+
$auditWorkflows($)[
|
|
100
|
+
$prop($, 'cdx:github:workflow:hasPullRequestTargetTrigger') = 'true'
|
|
101
|
+
]
|
|
102
|
+
location: |
|
|
103
|
+
{
|
|
104
|
+
"bomRef": $."bom-ref",
|
|
105
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
106
|
+
}
|
|
107
|
+
message: "Workflow '{{ $prop($, 'cdx:github:workflow:name') }}' uses pull_request_target trigger"
|
|
108
|
+
mitigation: "Ensure workflow does not checkout or run code from the PR head; use pull_request with careful permissions"
|
|
109
|
+
evidence: |
|
|
110
|
+
{
|
|
111
|
+
"triggers": $prop($, 'cdx:github:workflow:triggers'),
|
|
112
|
+
"hasWritePermissions": $prop($, 'cdx:github:workflow:hasWritePermissions')
|
|
113
|
+
}
|
|
114
|
+
- id: CI-005
|
|
115
|
+
name: "Checkout step persists credentials unnecessarily"
|
|
116
|
+
description: "actions/checkout with persist-credentials=true (default) exposes GITHUB_TOKEN to subsequent steps"
|
|
117
|
+
severity: medium
|
|
118
|
+
category: ci-permission
|
|
119
|
+
dry-run-support: full
|
|
120
|
+
attack:
|
|
121
|
+
tactics: [TA0006]
|
|
122
|
+
techniques: [T1552]
|
|
123
|
+
condition: |
|
|
124
|
+
$auditComponents($)[
|
|
125
|
+
$contains($nullSafeProp($, 'cdx:github:action:uses'), 'actions/checkout')
|
|
126
|
+
and $propBool($, 'cdx:github:checkout:persistCredentials') != false
|
|
127
|
+
and (
|
|
128
|
+
$propBool($, 'cdx:github:workflow:hasWritePermissions') = true
|
|
129
|
+
or $propBool($, 'cdx:github:job:hasWritePermissions') = true
|
|
130
|
+
)
|
|
131
|
+
]
|
|
132
|
+
location: |
|
|
133
|
+
{
|
|
134
|
+
"bomRef": $."bom-ref",
|
|
135
|
+
"purl": purl,
|
|
136
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
137
|
+
}
|
|
138
|
+
message: "Checkout step uses persist-credentials=true in privileged workflow; consider persist-credentials: false;"
|
|
139
|
+
mitigation: "Add persist-credentials: false to checkout steps that don't require git push operations"
|
|
140
|
+
evidence: |
|
|
141
|
+
{
|
|
142
|
+
"persistCredentials": $prop($, 'cdx:github:checkout:persistCredentials'),
|
|
143
|
+
"workflowPermissions": $prop($, 'cdx:github:workflow:hasWritePermissions')
|
|
144
|
+
}
|
|
145
|
+
- id: CI-006
|
|
146
|
+
name: "Cache usage in untrusted trigger context"
|
|
147
|
+
description: "GitHub Actions cache can be poisoned when used in workflows triggered by untrusted input (e.g., pull_request from forks)"
|
|
148
|
+
severity: high
|
|
149
|
+
category: ci-permission
|
|
150
|
+
dry-run-support: full
|
|
151
|
+
attack:
|
|
152
|
+
tactics: [TA0001]
|
|
153
|
+
techniques: [T1195.001]
|
|
154
|
+
condition: |
|
|
155
|
+
$auditComponents($)[
|
|
156
|
+
$nullSafeProp($, 'cdx:github:action:uses') ~> $contains('actions/cache')
|
|
157
|
+
and (
|
|
158
|
+
$prop($, 'cdx:github:workflow:hasPullRequestTrigger') = 'true'
|
|
159
|
+
or $prop($, 'cdx:github:workflow:hasPullRequestTargetTrigger') = 'true'
|
|
160
|
+
)
|
|
161
|
+
and (
|
|
162
|
+
$propBool($, 'cdx:github:workflow:hasWritePermissions') = true
|
|
163
|
+
or $propBool($, 'cdx:github:job:hasWritePermissions') = true
|
|
164
|
+
or $prop($, 'cdx:github:cache:hasRestoreKeys') = 'true'
|
|
165
|
+
or $prop($, 'cdx:github:cache:keyUsesHashFiles') != 'true'
|
|
166
|
+
)
|
|
167
|
+
]
|
|
168
|
+
location: |
|
|
169
|
+
{
|
|
170
|
+
"bomRef": $."bom-ref",
|
|
171
|
+
"purl": purl,
|
|
172
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
173
|
+
}
|
|
174
|
+
message: "Cache action used in pull-request-reachable workflow; cache key '{{ $prop($, 'cdx:github:cache:key') }}' may be writable by untrusted code"
|
|
175
|
+
mitigation: "Scope cache keys to PR-specific values, validate restored cache contents, or avoid caching in untrusted workflows"
|
|
176
|
+
evidence: |
|
|
177
|
+
{
|
|
178
|
+
"cacheKey": $prop($, 'cdx:github:cache:key'),
|
|
179
|
+
"hasRestoreKeys": $prop($, 'cdx:github:cache:hasRestoreKeys'),
|
|
180
|
+
"keyUsesHashFiles": $prop($, 'cdx:github:cache:keyUsesHashFiles'),
|
|
181
|
+
"cachePath": $prop($, 'cdx:github:cache:path'),
|
|
182
|
+
"triggers": $prop($, 'cdx:github:workflow:triggers')
|
|
183
|
+
}
|
|
184
|
+
- id: CI-007
|
|
185
|
+
name: "Script injection via untrusted context interpolation"
|
|
186
|
+
description: "Direct interpolation of github.event.* or inputs.* into run: blocks enables command injection"
|
|
187
|
+
severity: critical
|
|
188
|
+
category: ci-permission
|
|
189
|
+
dry-run-support: full
|
|
190
|
+
attack:
|
|
191
|
+
tactics: [TA0002]
|
|
192
|
+
techniques: [T1059]
|
|
193
|
+
condition: |
|
|
194
|
+
$auditComponents($)[
|
|
195
|
+
$prop($, 'cdx:github:step:hasUntrustedInterpolation') = 'true'
|
|
196
|
+
and $prop($, 'cdx:github:step:type') = 'run'
|
|
197
|
+
]
|
|
198
|
+
location: |
|
|
199
|
+
{
|
|
200
|
+
"bomRef": $."bom-ref",
|
|
201
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
202
|
+
}
|
|
203
|
+
message: "Untrusted input interpolated into shell command: variables '{{ $prop($, 'cdx:github:step:interpolatedVars') }}'"
|
|
204
|
+
mitigation: "Use intermediate environment variables: env: TITLE: ${{ github.event.pull_request.title }} then reference $TITLE in run:"
|
|
205
|
+
evidence: |
|
|
206
|
+
{
|
|
207
|
+
"interpolatedVars": $prop($, 'cdx:github:step:interpolatedVars'),
|
|
208
|
+
"stepCommand": $prop($, 'cdx:github:step:command')
|
|
209
|
+
}
|
|
210
|
+
- id: CI-008
|
|
211
|
+
name: "High-risk trigger with write permissions"
|
|
212
|
+
description: "Triggers like pull_request_target, issue_comment, or workflow_run combined with write permissions enable privilege escalation"
|
|
213
|
+
severity: high
|
|
214
|
+
category: ci-permission
|
|
215
|
+
dry-run-support: full
|
|
216
|
+
attack:
|
|
217
|
+
tactics: [TA0001, TA0004]
|
|
218
|
+
condition: |
|
|
219
|
+
$auditWorkflows($)[
|
|
220
|
+
(
|
|
221
|
+
$prop($, 'cdx:github:workflow:hasPullRequestTargetTrigger') = 'true'
|
|
222
|
+
or $prop($, 'cdx:github:workflow:hasIssueCommentTrigger') = 'true'
|
|
223
|
+
or $prop($, 'cdx:github:workflow:hasWorkflowRunTrigger') = 'true'
|
|
224
|
+
)
|
|
225
|
+
and $prop($, 'cdx:github:workflow:hasWritePermissions') = 'true'
|
|
226
|
+
]
|
|
227
|
+
location: |
|
|
228
|
+
{
|
|
229
|
+
"bomRef": $."bom-ref",
|
|
230
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
231
|
+
}
|
|
232
|
+
message: "Workflow '{{ $prop($, 'cdx:github:workflow:name') }}' uses high-risk trigger with write permissions"
|
|
233
|
+
mitigation: "Use pull_request instead of pull_request_target; require manual approval for issue_comment triggers; restrict permissions per job"
|
|
234
|
+
evidence: |
|
|
235
|
+
{
|
|
236
|
+
"triggers": $prop($, 'cdx:github:workflow:triggers'),
|
|
237
|
+
"hasWritePermissions": $prop($, 'cdx:github:workflow:hasWritePermissions')
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
- id: CI-009
|
|
241
|
+
name: "Workflow file contains hidden Unicode characters"
|
|
242
|
+
description: "Hidden Unicode in workflow files can disguise malicious logic, comments, or diffs and should be reviewed before merge"
|
|
243
|
+
severity: medium
|
|
244
|
+
category: ci-permission
|
|
245
|
+
dry-run-support: full
|
|
246
|
+
attack:
|
|
247
|
+
tactics: [TA0005]
|
|
248
|
+
techniques: [T1027]
|
|
249
|
+
condition: |
|
|
250
|
+
$auditWorkflows($)[
|
|
251
|
+
$prop($, 'cdx:github:workflow:hasHiddenUnicode') = 'true'
|
|
252
|
+
]
|
|
253
|
+
location: |
|
|
254
|
+
{
|
|
255
|
+
"bomRef": $."bom-ref",
|
|
256
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
257
|
+
}
|
|
258
|
+
message: "Workflow '{{ $prop($, 'cdx:github:workflow:name') }}' contains hidden Unicode characters"
|
|
259
|
+
mitigation: "Review the file in an editor that reveals bidirectional, zero-width, and control characters; remove suspicious hidden Unicode before merge"
|
|
260
|
+
evidence: |
|
|
261
|
+
{
|
|
262
|
+
"codePoints": $prop($, 'cdx:github:workflow:hiddenUnicodeCodePoints'),
|
|
263
|
+
"lineNumbers": $prop($, 'cdx:github:workflow:hiddenUnicodeLineNumbers'),
|
|
264
|
+
"inComments": $prop($, 'cdx:github:workflow:hiddenUnicodeInComments')
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
- id: CI-010
|
|
268
|
+
name: "Legacy token-based package publishing step"
|
|
269
|
+
description: "npm and PyPI publishing should prefer trusted publishing or OIDC-backed flows instead of long-lived token secrets or explicit --token arguments"
|
|
270
|
+
severity: medium
|
|
271
|
+
category: ci-permission
|
|
272
|
+
dry-run-support: full
|
|
273
|
+
attack:
|
|
274
|
+
tactics: [TA0006]
|
|
275
|
+
techniques: [T1528]
|
|
276
|
+
condition: |
|
|
277
|
+
$auditComponents($)[
|
|
278
|
+
$prop($, 'cdx:github:step:isPublishCommand') = 'true'
|
|
279
|
+
and $prop($, 'cdx:github:step:usesLegacyPublishToken') = 'true'
|
|
280
|
+
]
|
|
281
|
+
location: |
|
|
282
|
+
{
|
|
283
|
+
"bomRef": $."bom-ref",
|
|
284
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
285
|
+
}
|
|
286
|
+
message: "Workflow publish step '{{ name }}' uses legacy {{ $prop($, 'cdx:github:step:publishEcosystem') }} token-based publishing"
|
|
287
|
+
mitigation: "Prefer trusted publishing or short-lived OIDC-backed release flows instead of persistent package tokens or explicit --token arguments"
|
|
288
|
+
evidence: |
|
|
289
|
+
{
|
|
290
|
+
"ecosystem": $prop($, 'cdx:github:step:publishEcosystem'),
|
|
291
|
+
"tokenSources": $prop($, 'cdx:github:step:legacyPublishTokenSources'),
|
|
292
|
+
"stepCommand": $prop($, 'cdx:github:step:command')
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
- id: CI-011
|
|
296
|
+
name: "External reusable workflow inherits caller secrets"
|
|
297
|
+
description: "Reusable workflows invoked from external repositories with secrets: inherit expand the trust boundary and can expose repository credentials"
|
|
298
|
+
severity: high
|
|
299
|
+
category: ci-permission
|
|
300
|
+
dry-run-support: full
|
|
301
|
+
attack:
|
|
302
|
+
tactics: [TA0006]
|
|
303
|
+
techniques: [T1528, T1552]
|
|
304
|
+
condition: |
|
|
305
|
+
$auditComponents($)[
|
|
306
|
+
$prop($, 'cdx:github:reusableWorkflow:isExternal') = 'true'
|
|
307
|
+
and $prop($, 'cdx:github:reusableWorkflow:secretsInherit') = 'true'
|
|
308
|
+
]
|
|
309
|
+
location: |
|
|
310
|
+
{
|
|
311
|
+
"bomRef": $."bom-ref",
|
|
312
|
+
"purl": purl,
|
|
313
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
314
|
+
}
|
|
315
|
+
message: "Reusable workflow '{{ $prop($, 'cdx:github:reusableWorkflow:uses') }}' inherits caller secrets from an external repository"
|
|
316
|
+
mitigation: "Avoid secrets: inherit for external reusable workflows; pass only the minimum explicit secrets and pin the reusable workflow to a full SHA"
|
|
317
|
+
evidence: |
|
|
318
|
+
{
|
|
319
|
+
"uses": $prop($, 'cdx:github:reusableWorkflow:uses'),
|
|
320
|
+
"isShaPinned": $prop($, 'cdx:github:reusableWorkflow:isShaPinned'),
|
|
321
|
+
"withKeys": $prop($, 'cdx:github:reusableWorkflow:withKeys')
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
- id: CI-012
|
|
325
|
+
name: "External reusable workflow pinned to mutable ref"
|
|
326
|
+
description: "Reusable workflows referenced by tag or branch can change behavior without review and should be pinned to immutable SHAs"
|
|
327
|
+
severity: medium
|
|
328
|
+
category: ci-permission
|
|
329
|
+
dry-run-support: full
|
|
330
|
+
attack:
|
|
331
|
+
tactics: [TA0001]
|
|
332
|
+
techniques: [T1195.001]
|
|
333
|
+
condition: |
|
|
334
|
+
$auditComponents($)[
|
|
335
|
+
$prop($, 'cdx:github:reusableWorkflow:isExternal') = 'true'
|
|
336
|
+
and $prop($, 'cdx:github:reusableWorkflow:isShaPinned') = 'false'
|
|
337
|
+
]
|
|
338
|
+
location: |
|
|
339
|
+
{
|
|
340
|
+
"bomRef": $."bom-ref",
|
|
341
|
+
"purl": purl,
|
|
342
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
343
|
+
}
|
|
344
|
+
message: "External reusable workflow '{{ $prop($, 'cdx:github:reusableWorkflow:uses') }}' is pinned to a mutable ref"
|
|
345
|
+
mitigation: "Pin reusable workflows to full SHAs and review updates through a normal change-management process"
|
|
346
|
+
evidence: |
|
|
347
|
+
{
|
|
348
|
+
"pinningType": $prop($, 'cdx:github:reusableWorkflow:versionPinningType'),
|
|
349
|
+
"ref": $prop($, 'cdx:github:reusableWorkflow:ref')
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
- id: CI-013
|
|
353
|
+
name: "High-risk trigger reaches a self-hosted runner"
|
|
354
|
+
description: "High-risk triggers executing on self-hosted runners can expose internal network access, credentials, and long-lived runner state"
|
|
355
|
+
severity: high
|
|
356
|
+
category: ci-permission
|
|
357
|
+
dry-run-support: full
|
|
358
|
+
attack:
|
|
359
|
+
tactics: [TA0004, TA0008]
|
|
360
|
+
condition: |
|
|
361
|
+
$auditComponents($)[
|
|
362
|
+
(
|
|
363
|
+
$prop($, 'cdx:github:workflow:hasPullRequestTargetTrigger') = 'true'
|
|
364
|
+
or $prop($, 'cdx:github:workflow:hasIssueCommentTrigger') = 'true'
|
|
365
|
+
or $prop($, 'cdx:github:workflow:hasWorkflowRunTrigger') = 'true'
|
|
366
|
+
)
|
|
367
|
+
and $prop($, 'cdx:github:job:isSelfHosted') = 'true'
|
|
368
|
+
]
|
|
369
|
+
location: |
|
|
370
|
+
{
|
|
371
|
+
"bomRef": $."bom-ref",
|
|
372
|
+
"purl": purl,
|
|
373
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
374
|
+
}
|
|
375
|
+
message: "High-risk workflow trigger reaches self-hosted runner in job '{{ $prop($, 'cdx:github:job:name') }}'"
|
|
376
|
+
mitigation: "Restrict self-hosted runners to trusted workflows only, isolate runner credentials, and gate high-risk triggers with manual approval"
|
|
377
|
+
evidence: |
|
|
378
|
+
{
|
|
379
|
+
"triggers": $prop($, 'cdx:github:workflow:triggers'),
|
|
380
|
+
"jobRunner": $prop($, 'cdx:github:job:runner'),
|
|
381
|
+
"jobName": $prop($, 'cdx:github:job:name')
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
- id: CI-014
|
|
385
|
+
name: "Privileged workflow mutates downstream runner state"
|
|
386
|
+
description: "Writing to GITHUB_ENV, GITHUB_PATH, or GITHUB_OUTPUT in privileged workflows can persist attacker-controlled state across later steps and jobs"
|
|
387
|
+
severity: high
|
|
388
|
+
category: ci-permission
|
|
389
|
+
dry-run-support: full
|
|
390
|
+
attack:
|
|
391
|
+
tactics: [TA0002]
|
|
392
|
+
techniques: [T1059]
|
|
393
|
+
condition: |
|
|
394
|
+
$auditComponents($)[
|
|
395
|
+
$prop($, 'cdx:github:step:type') = 'run'
|
|
396
|
+
and $prop($, 'cdx:github:step:mutatesRunnerState') = 'true'
|
|
397
|
+
and (
|
|
398
|
+
$prop($, 'cdx:github:workflow:hasWritePermissions') = 'true'
|
|
399
|
+
or $prop($, 'cdx:github:job:hasWritePermissions') = 'true'
|
|
400
|
+
or $prop($, 'cdx:github:workflow:hasIdTokenWrite') = 'true'
|
|
401
|
+
or $prop($, 'cdx:github:job:hasIdTokenWrite') = 'true'
|
|
402
|
+
)
|
|
403
|
+
]
|
|
404
|
+
location: |
|
|
405
|
+
{
|
|
406
|
+
"bomRef": $."bom-ref",
|
|
407
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
408
|
+
}
|
|
409
|
+
message: "Privileged workflow step '{{ name }}' mutates runner state via '{{ $prop($, 'cdx:github:step:runnerStateTargets') }}'"
|
|
410
|
+
mitigation: "Avoid mutating shared runner state in privileged jobs; prefer tightly-scoped step outputs and review all GITHUB_ENV/GITHUB_PATH/GITHUB_OUTPUT writes"
|
|
411
|
+
evidence: |
|
|
412
|
+
{
|
|
413
|
+
"runnerStateTargets": $prop($, 'cdx:github:step:runnerStateTargets'),
|
|
414
|
+
"stepCommand": $prop($, 'cdx:github:step:command'),
|
|
415
|
+
"jobName": $prop($, 'cdx:github:job:name')
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
- id: CI-015
|
|
419
|
+
name: "Outbound network command references sensitive context"
|
|
420
|
+
description: "Run steps that invoke outbound network tools while transmitting secrets, github.token, or OIDC request context are strong exfiltration indicators"
|
|
421
|
+
severity: high
|
|
422
|
+
category: ci-permission
|
|
423
|
+
dry-run-support: full
|
|
424
|
+
attack:
|
|
425
|
+
tactics: [TA0010]
|
|
426
|
+
techniques: [T1048]
|
|
427
|
+
condition: |
|
|
428
|
+
$auditComponents($)[
|
|
429
|
+
$prop($, 'cdx:github:step:type') = 'run'
|
|
430
|
+
and $prop($, 'cdx:github:step:hasOutboundNetworkCommand') = 'true'
|
|
431
|
+
and $prop($, 'cdx:github:step:referencesSensitiveContext') = 'true'
|
|
432
|
+
and $prop($, 'cdx:github:step:likelyExfiltration') = 'true'
|
|
433
|
+
]
|
|
434
|
+
location: |
|
|
435
|
+
{
|
|
436
|
+
"bomRef": $."bom-ref",
|
|
437
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
438
|
+
}
|
|
439
|
+
message: "Outbound command in step '{{ name }}' references sensitive context '{{ $prop($, 'cdx:github:step:sensitiveContextRefs') }}'"
|
|
440
|
+
mitigation: "Review outbound network steps for secret or token use, disable unnecessary network egress, and move sensitive values into least-privileged isolated jobs"
|
|
441
|
+
evidence: |
|
|
442
|
+
{
|
|
443
|
+
"networkTools": $prop($, 'cdx:github:step:outboundNetworkTools'),
|
|
444
|
+
"sensitiveContextRefs": $prop($, 'cdx:github:step:sensitiveContextRefs'),
|
|
445
|
+
"exfiltrationIndicators": $prop($, 'cdx:github:step:exfiltrationIndicators'),
|
|
446
|
+
"stepCommand": $prop($, 'cdx:github:step:command')
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
- id: CI-016
|
|
450
|
+
name: "Privileged reusable workflow accepts caller secrets"
|
|
451
|
+
description: "workflow_call producers that request caller-provided secrets while also holding write or OIDC permissions expand the blast radius across repositories and workflows"
|
|
452
|
+
severity: high
|
|
453
|
+
category: ci-permission
|
|
454
|
+
dry-run-support: full
|
|
455
|
+
attack:
|
|
456
|
+
tactics: [TA0006]
|
|
457
|
+
techniques: [T1528, T1552]
|
|
458
|
+
condition: |
|
|
459
|
+
$auditWorkflows($)[
|
|
460
|
+
$prop($, 'cdx:github:workflow:isWorkflowCallProducer') = 'true'
|
|
461
|
+
and $safeStr($prop($, 'cdx:github:workflow:workflowCallSecrets')) != ''
|
|
462
|
+
and (
|
|
463
|
+
$propBool($, 'cdx:github:workflow:hasWritePermissions') = true
|
|
464
|
+
or $propBool($, 'cdx:github:workflow:hasIdTokenWrite') = true
|
|
465
|
+
)
|
|
466
|
+
]
|
|
467
|
+
location: |
|
|
468
|
+
{
|
|
469
|
+
"bomRef": $."bom-ref",
|
|
470
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
471
|
+
}
|
|
472
|
+
message: "Reusable workflow '{{ $prop($, 'cdx:github:workflow:name') }}' accepts caller secrets while running with privileged permissions"
|
|
473
|
+
mitigation: "Avoid broad secret interfaces on reusable workflows with write or OIDC permissions; split privileged work into a narrowly scoped follow-up job and require only explicit minimal secrets"
|
|
474
|
+
evidence: |
|
|
475
|
+
{
|
|
476
|
+
"workflowCallSecrets": $prop($, 'cdx:github:workflow:workflowCallSecrets'),
|
|
477
|
+
"writeScopes": $prop($, 'cdx:github:workflow:writeScopes'),
|
|
478
|
+
"hasWritePermissions": $prop($, 'cdx:github:workflow:hasWritePermissions'),
|
|
479
|
+
"hasIdTokenWrite": $prop($, 'cdx:github:workflow:hasIdTokenWrite')
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
- id: CI-017
|
|
483
|
+
name: "Privileged reusable workflow exports caller-influenced outputs"
|
|
484
|
+
description: "workflow_call producers that both accept caller-controlled inputs and emit outputs from privileged execution contexts can propagate unsafe values into downstream trusted jobs"
|
|
485
|
+
severity: medium
|
|
486
|
+
category: ci-permission
|
|
487
|
+
dry-run-support: full
|
|
488
|
+
attack:
|
|
489
|
+
tactics: [TA0003, TA0004]
|
|
490
|
+
condition: |
|
|
491
|
+
$auditWorkflows($)[
|
|
492
|
+
$prop($, 'cdx:github:workflow:isWorkflowCallProducer') = 'true'
|
|
493
|
+
and $safeStr($prop($, 'cdx:github:workflow:workflowCallInputs')) != ''
|
|
494
|
+
and $safeStr($prop($, 'cdx:github:workflow:workflowCallOutputs')) != ''
|
|
495
|
+
and (
|
|
496
|
+
$propBool($, 'cdx:github:workflow:hasWritePermissions') = true
|
|
497
|
+
or $propBool($, 'cdx:github:workflow:hasIdTokenWrite') = true
|
|
498
|
+
)
|
|
499
|
+
]
|
|
500
|
+
location: |
|
|
501
|
+
{
|
|
502
|
+
"bomRef": $."bom-ref",
|
|
503
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
504
|
+
}
|
|
505
|
+
message: "Reusable workflow '{{ $prop($, 'cdx:github:workflow:name') }}' exports outputs from a privileged workflow_call interface that also accepts caller inputs"
|
|
506
|
+
mitigation: "Review workflow_call outputs for trust-boundary crossings, sanitize caller-controlled data before emitting outputs, and avoid combining privileged permissions with broad producer interfaces"
|
|
507
|
+
evidence: |
|
|
508
|
+
{
|
|
509
|
+
"workflowCallInputs": $prop($, 'cdx:github:workflow:workflowCallInputs'),
|
|
510
|
+
"workflowCallOutputs": $prop($, 'cdx:github:workflow:workflowCallOutputs'),
|
|
511
|
+
"hasWritePermissions": $prop($, 'cdx:github:workflow:hasWritePermissions'),
|
|
512
|
+
"hasIdTokenWrite": $prop($, 'cdx:github:workflow:hasIdTokenWrite')
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
- id: CI-018
|
|
516
|
+
name: "Fork-reachable workflow dispatches downstream workflow or repository events"
|
|
517
|
+
description: "Dispatching workflow_dispatch or repository_dispatch from fork-reachable or privileged jobs can create a lateral-movement path into downstream workflows with broader credentials"
|
|
518
|
+
severity: high
|
|
519
|
+
category: ci-permission
|
|
520
|
+
dry-run-support: full
|
|
521
|
+
attack:
|
|
522
|
+
tactics: [TA0006]
|
|
523
|
+
techniques: [T1528]
|
|
524
|
+
condition: |
|
|
525
|
+
$auditComponents($)[
|
|
526
|
+
$prop($, 'cdx:github:step:dispatchesWorkflow') = 'true'
|
|
527
|
+
and $prop($, 'cdx:github:step:referencesSensitiveContext') = 'true'
|
|
528
|
+
and (
|
|
529
|
+
$propBool($, 'cdx:github:workflow:hasPullRequestTrigger') = true
|
|
530
|
+
or $propBool($, 'cdx:github:workflow:hasPullRequestTargetTrigger') = true
|
|
531
|
+
or $propBool($, 'cdx:github:workflow:hasIssueCommentTrigger') = true
|
|
532
|
+
or $propBool($, 'cdx:github:workflow:hasWorkflowRunTrigger') = true
|
|
533
|
+
or $propBool($, 'cdx:github:workflow:hasWritePermissions') = true
|
|
534
|
+
or $propBool($, 'cdx:github:job:hasWritePermissions') = true
|
|
535
|
+
or $propBool($, 'cdx:github:workflow:hasIdTokenWrite') = true
|
|
536
|
+
or $propBool($, 'cdx:github:job:hasIdTokenWrite') = true
|
|
537
|
+
)
|
|
538
|
+
]
|
|
539
|
+
location: |
|
|
540
|
+
{
|
|
541
|
+
"bomRef": $."bom-ref",
|
|
542
|
+
"purl": purl,
|
|
543
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
544
|
+
}
|
|
545
|
+
message: "Workflow step '{{ name }}' dispatches '{{ $prop($, 'cdx:github:step:dispatchKinds') }}' toward '{{ $prop($, 'cdx:github:step:dispatchTargets') }}' from a fork-reachable or privileged context"
|
|
546
|
+
mitigation: "Avoid chaining downstream workflow_dispatch or repository_dispatch calls from pull-request/fork-reachable jobs; isolate release dispatchers into trusted workflows with narrowly scoped credentials"
|
|
547
|
+
evidence: |
|
|
548
|
+
{
|
|
549
|
+
"dispatchKinds": $prop($, 'cdx:github:step:dispatchKinds'),
|
|
550
|
+
"dispatchMechanisms": $prop($, 'cdx:github:step:dispatchMechanisms'),
|
|
551
|
+
"dispatchTargets": $prop($, 'cdx:github:step:dispatchTargets'),
|
|
552
|
+
"localReceiverWorkflowFiles": $prop($, 'cdx:github:step:dispatchReceiverWorkflowFiles'),
|
|
553
|
+
"localReceiverWorkflowNames": $prop($, 'cdx:github:step:dispatchReceiverWorkflowNames'),
|
|
554
|
+
"sensitiveContextRefs": $prop($, 'cdx:github:step:sensitiveContextRefs'),
|
|
555
|
+
"workflowTriggers": $prop($, 'cdx:github:workflow:triggers'),
|
|
556
|
+
"writeScopes": $prop($, 'cdx:github:workflow:writeScopes')
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
- id: CI-019
|
|
560
|
+
name: "Workflow dispatch step references explicit fork context"
|
|
561
|
+
description: "Dispatch chains that inspect pull_request head-repository or fork context before invoking downstream workflows are strong signals of fork-to-privileged lateral movement"
|
|
562
|
+
severity: critical
|
|
563
|
+
category: ci-permission
|
|
564
|
+
dry-run-support: full
|
|
565
|
+
attack:
|
|
566
|
+
tactics: [TA0006]
|
|
567
|
+
techniques: [T1528, T1552]
|
|
568
|
+
condition: |
|
|
569
|
+
$auditComponents($)[
|
|
570
|
+
$prop($, 'cdx:github:step:dispatchesWorkflow') = 'true'
|
|
571
|
+
and $prop($, 'cdx:github:step:referencesForkContext') = 'true'
|
|
572
|
+
and $prop($, 'cdx:github:step:referencesSensitiveContext') = 'true'
|
|
573
|
+
and (
|
|
574
|
+
$prop($, 'cdx:github:step:hasLocalDispatchReceiver') = 'true'
|
|
575
|
+
or $safeStr($prop($, 'cdx:github:step:hasLocalDispatchReceiver')) = ''
|
|
576
|
+
)
|
|
577
|
+
]
|
|
578
|
+
location: |
|
|
579
|
+
{
|
|
580
|
+
"bomRef": $."bom-ref",
|
|
581
|
+
"purl": purl,
|
|
582
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
583
|
+
}
|
|
584
|
+
message: "Workflow step '{{ name }}' combines explicit fork/head-repository context with downstream dispatch '{{ $safeStr($prop($, 'cdx:github:step:dispatchReceiverWorkflowNames')) != '' ? $prop($, 'cdx:github:step:dispatchReceiverWorkflowNames') : $prop($, 'cdx:github:step:dispatchTargets') }}'"
|
|
585
|
+
mitigation: "Do not route fork-derived context into workflow_dispatch or repository_dispatch calls. Split privileged follow-up workflows behind trusted branch-only triggers and avoid sharing long-lived tokens into fork-reachable jobs"
|
|
586
|
+
evidence: |
|
|
587
|
+
{
|
|
588
|
+
"forkContextRefs": $prop($, 'cdx:github:step:forkContextRefs'),
|
|
589
|
+
"dispatchKinds": $prop($, 'cdx:github:step:dispatchKinds'),
|
|
590
|
+
"dispatchTargets": $prop($, 'cdx:github:step:dispatchTargets'),
|
|
591
|
+
"hasLocalDispatchReceiver": $prop($, 'cdx:github:step:hasLocalDispatchReceiver'),
|
|
592
|
+
"localReceiverWorkflowFiles": $prop($, 'cdx:github:step:dispatchReceiverWorkflowFiles'),
|
|
593
|
+
"localReceiverWorkflowNames": $prop($, 'cdx:github:step:dispatchReceiverWorkflowNames'),
|
|
594
|
+
"localReceiverMatchBasis": $prop($, 'cdx:github:step:dispatchReceiverMatchBasis'),
|
|
595
|
+
"sensitiveContextRefs": $prop($, 'cdx:github:step:sensitiveContextRefs')
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
- id: CI-020
|
|
599
|
+
name: "pull_request_target checks out PR head or fork context"
|
|
600
|
+
description: "Checking out github.event.pull_request.head.* repository or ref inside pull_request_target executes untrusted fork code with base-repository privileges"
|
|
601
|
+
severity: critical
|
|
602
|
+
category: ci-permission
|
|
603
|
+
dry-run-support: full
|
|
604
|
+
attack:
|
|
605
|
+
tactics: [TA0001, TA0006]
|
|
606
|
+
techniques: [T1195.001, T1552]
|
|
607
|
+
condition: |
|
|
608
|
+
$auditComponents($)[
|
|
609
|
+
$contains($nullSafeProp($, 'cdx:github:action:uses'), 'actions/checkout')
|
|
610
|
+
and $prop($, 'cdx:github:workflow:hasPullRequestTargetTrigger') = 'true'
|
|
611
|
+
and (
|
|
612
|
+
$prop($, 'cdx:github:checkout:checksOutUntrustedRef') = 'true'
|
|
613
|
+
or $prop($, 'cdx:github:checkout:referencesForkContext') = 'true'
|
|
614
|
+
)
|
|
615
|
+
]
|
|
616
|
+
location: |
|
|
617
|
+
{
|
|
618
|
+
"bomRef": $."bom-ref",
|
|
619
|
+
"purl": purl,
|
|
620
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
621
|
+
}
|
|
622
|
+
message: "Checkout step '{{ $prop($, 'cdx:github:action:uses') }}' pulls PR head or fork context inside pull_request_target"
|
|
623
|
+
mitigation: "Do not checkout github.event.pull_request.head.* in pull_request_target workflows. Prefer pull_request with read-only permissions or split trusted follow-up work into a separate branch-only workflow"
|
|
624
|
+
evidence: |
|
|
625
|
+
{
|
|
626
|
+
"checkoutRef": $prop($, 'cdx:github:checkout:ref'),
|
|
627
|
+
"checkoutRepository": $prop($, 'cdx:github:checkout:repository'),
|
|
628
|
+
"untrustedRefContexts": $prop($, 'cdx:github:checkout:untrustedRefContexts'),
|
|
629
|
+
"forkContextRefs": $prop($, 'cdx:github:checkout:forkContextRefs'),
|
|
630
|
+
"persistCredentials": $prop($, 'cdx:github:checkout:persistCredentials'),
|
|
631
|
+
"workflowHasWritePermissions": $prop($, 'cdx:github:workflow:hasWritePermissions')
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
- id: CI-021
|
|
635
|
+
name: "Heuristic: high-risk trigger with implicit permissions and sensitive operations"
|
|
636
|
+
description: "High-risk GitHub Actions workflows that omit explicit permissions blocks while still performing sensitive operations may rely on repository-default token scopes. This is a review heuristic, not proof of write access."
|
|
637
|
+
severity: medium
|
|
638
|
+
category: ci-permission
|
|
639
|
+
dry-run-support: full
|
|
640
|
+
attack:
|
|
641
|
+
tactics: [TA0006]
|
|
642
|
+
techniques: [T1528, T1552]
|
|
643
|
+
condition: |
|
|
644
|
+
$auditComponents($)[
|
|
645
|
+
$prop($, 'cdx:github:workflow:hasHighRiskTrigger') = 'true'
|
|
646
|
+
and $prop($, 'cdx:github:workflow:hasAnyExplicitPermissionsBlock') = 'false'
|
|
647
|
+
and $prop($, 'cdx:github:step:hasSensitiveOperations') = 'true'
|
|
648
|
+
]
|
|
649
|
+
location: |
|
|
650
|
+
{
|
|
651
|
+
"bomRef": $."bom-ref",
|
|
652
|
+
"purl": purl,
|
|
653
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
654
|
+
}
|
|
655
|
+
message: "Heuristic review: workflow '{{ $prop($, 'cdx:github:workflow:name') }}' uses a high-risk trigger without an explicit permissions block while step '{{ $safeStr($prop($, 'cdx:github:step:name')) != '' ? $prop($, 'cdx:github:step:name') : name }}' performs sensitive operation(s) '{{ $prop($, 'cdx:github:step:sensitiveOperations') }}'"
|
|
656
|
+
mitigation: "Add an explicit top-level permissions: block (for example permissions: {}) and re-grant only the minimum per-job scopes needed for the sensitive step"
|
|
657
|
+
evidence: |
|
|
658
|
+
{
|
|
659
|
+
"workflowTriggers": $prop($, 'cdx:github:workflow:triggers'),
|
|
660
|
+
"workflowHasExplicitPermissionsBlock": $prop($, 'cdx:github:workflow:hasExplicitPermissionsBlock'),
|
|
661
|
+
"workflowHasAnyExplicitPermissionsBlock": $prop($, 'cdx:github:workflow:hasAnyExplicitPermissionsBlock'),
|
|
662
|
+
"jobHasExplicitPermissionsBlock": $prop($, 'cdx:github:job:hasExplicitPermissionsBlock'),
|
|
663
|
+
"sensitiveOperations": $prop($, 'cdx:github:step:sensitiveOperations'),
|
|
664
|
+
"sensitiveContextRefs": $prop($, 'cdx:github:step:sensitiveContextRefs'),
|
|
665
|
+
"dispatchKinds": $prop($, 'cdx:github:step:dispatchKinds')
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
- id: CI-022
|
|
669
|
+
name: "npm setup action disables build cache despite resolved package distributions"
|
|
670
|
+
description: "Explicitly disabling setup-node caching reduces tamper resistance and reviewability when npm dependencies are resolved from remote package distributions"
|
|
671
|
+
severity: medium
|
|
672
|
+
category: ci-permission
|
|
673
|
+
dry-run-support: full
|
|
674
|
+
attack:
|
|
675
|
+
tactics: [TA0001]
|
|
676
|
+
techniques: [T1195.001]
|
|
677
|
+
condition: |
|
|
678
|
+
$auditComponents($)[
|
|
679
|
+
$prop($, 'cdx:github:action:disablesBuildCache') = 'true'
|
|
680
|
+
and $prop($, 'cdx:github:action:buildCacheEcosystem') = 'npm'
|
|
681
|
+
and $count($$.components[
|
|
682
|
+
$startsWith(purl, 'pkg:npm/')
|
|
683
|
+
and (
|
|
684
|
+
$contains($lowercase($nullSafeProp($, 'cdx:npm:manifestSourceType')), 'git')
|
|
685
|
+
or $contains($lowercase($nullSafeProp($, 'cdx:npm:manifestSourceType')), 'url')
|
|
686
|
+
)
|
|
687
|
+
and $count(externalReferences[
|
|
688
|
+
type = 'distribution'
|
|
689
|
+
and (
|
|
690
|
+
$startsWith($lowercase(url), 'git+')
|
|
691
|
+
or $startsWith($lowercase(url), 'http://')
|
|
692
|
+
or $startsWith($lowercase(url), 'https://')
|
|
693
|
+
)
|
|
694
|
+
]) > 0
|
|
695
|
+
]) > 0
|
|
696
|
+
]
|
|
697
|
+
location: |
|
|
698
|
+
{
|
|
699
|
+
"bomRef": $."bom-ref",
|
|
700
|
+
"purl": purl,
|
|
701
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
702
|
+
}
|
|
703
|
+
message: "GitHub Action '{{ $prop($, 'cdx:github:action:uses') }}' explicitly disables npm build caching while resolved npm package distributions are present in the BOM"
|
|
704
|
+
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"
|
|
705
|
+
evidence: |
|
|
706
|
+
{
|
|
707
|
+
"cacheDisableInput": $prop($, 'cdx:github:action:buildCacheDisableInput'),
|
|
708
|
+
"cacheDisableValue": $prop($, 'cdx:github:action:buildCacheDisableValue'),
|
|
709
|
+
"matchingPackages": $$.components[
|
|
710
|
+
$startsWith(purl, 'pkg:npm/')
|
|
711
|
+
and (
|
|
712
|
+
$contains($lowercase($nullSafeProp($, 'cdx:npm:manifestSourceType')), 'git')
|
|
713
|
+
or $contains($lowercase($nullSafeProp($, 'cdx:npm:manifestSourceType')), 'url')
|
|
714
|
+
)
|
|
715
|
+
and $count(externalReferences[
|
|
716
|
+
type = 'distribution'
|
|
717
|
+
and (
|
|
718
|
+
$startsWith($lowercase(url), 'git+')
|
|
719
|
+
or $startsWith($lowercase(url), 'http://')
|
|
720
|
+
or $startsWith($lowercase(url), 'https://')
|
|
721
|
+
)
|
|
722
|
+
]) > 0
|
|
723
|
+
].purl
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
- id: CI-023
|
|
727
|
+
name: "Python setup action disables build cache despite resolved package distributions"
|
|
728
|
+
description: "Explicitly disabling setup-python caching reduces tamper resistance and reviewability when PyPI dependencies are resolved from remote archives or VCS sources"
|
|
729
|
+
severity: medium
|
|
730
|
+
category: ci-permission
|
|
731
|
+
dry-run-support: full
|
|
732
|
+
attack:
|
|
733
|
+
tactics: [TA0001]
|
|
734
|
+
techniques: [T1195.001]
|
|
735
|
+
condition: |
|
|
736
|
+
$auditComponents($)[
|
|
737
|
+
$prop($, 'cdx:github:action:disablesBuildCache') = 'true'
|
|
738
|
+
and $prop($, 'cdx:github:action:buildCacheEcosystem') = 'pypi'
|
|
739
|
+
and $count($$.components[
|
|
740
|
+
$startsWith(purl, 'pkg:pypi/')
|
|
741
|
+
and (
|
|
742
|
+
$contains($lowercase($nullSafeProp($, 'cdx:pypi:manifestSourceType')), 'git')
|
|
743
|
+
or $contains($lowercase($nullSafeProp($, 'cdx:pypi:manifestSourceType')), 'url')
|
|
744
|
+
)
|
|
745
|
+
]) > 0
|
|
746
|
+
]
|
|
747
|
+
location: |
|
|
748
|
+
{
|
|
749
|
+
"bomRef": $."bom-ref",
|
|
750
|
+
"purl": purl,
|
|
751
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
752
|
+
}
|
|
753
|
+
message: "GitHub Action '{{ $prop($, 'cdx:github:action:uses') }}' explicitly disables Python build caching while resolved PyPI package distributions are present in the BOM"
|
|
754
|
+
mitigation: "Keep setup-python caching enabled when lockfiles resolve remote archives or VCS sources unless you have a reviewed exception"
|
|
755
|
+
evidence: |
|
|
756
|
+
{
|
|
757
|
+
"cacheDisableInput": $prop($, 'cdx:github:action:buildCacheDisableInput'),
|
|
758
|
+
"cacheDisableValue": $prop($, 'cdx:github:action:buildCacheDisableValue'),
|
|
759
|
+
"matchingPackages": $$.components[
|
|
760
|
+
$startsWith(purl, 'pkg:pypi/')
|
|
761
|
+
and (
|
|
762
|
+
$contains($lowercase($nullSafeProp($, 'cdx:pypi:manifestSourceType')), 'git')
|
|
763
|
+
or $contains($lowercase($nullSafeProp($, 'cdx:pypi:manifestSourceType')), 'url')
|
|
764
|
+
)
|
|
765
|
+
].purl
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
- id: CI-024
|
|
769
|
+
name: "Cargo setup action disables build cache despite manifest-declared git dependencies"
|
|
770
|
+
description: "Explicitly disabling Cargo setup caching reduces tamper resistance and reviewability when Cargo manifests rely on git dependencies"
|
|
771
|
+
severity: medium
|
|
772
|
+
category: ci-permission
|
|
773
|
+
dry-run-support: full
|
|
774
|
+
attack:
|
|
775
|
+
tactics: [TA0001]
|
|
776
|
+
techniques: [T1195.001]
|
|
777
|
+
condition: |
|
|
778
|
+
$auditComponents($)[
|
|
779
|
+
$prop($, 'cdx:github:action:disablesBuildCache') = 'true'
|
|
780
|
+
and $prop($, 'cdx:github:action:buildCacheEcosystem') = 'cargo'
|
|
781
|
+
and $count($$.components[
|
|
782
|
+
$startsWith(purl, 'pkg:cargo/')
|
|
783
|
+
and $hasProp($, 'cdx:cargo:git')
|
|
784
|
+
]) > 0
|
|
785
|
+
]
|
|
786
|
+
location: |
|
|
787
|
+
{
|
|
788
|
+
"bomRef": $."bom-ref",
|
|
789
|
+
"purl": purl,
|
|
790
|
+
"file": $prop($, 'cdx:github:workflow:file')
|
|
791
|
+
}
|
|
792
|
+
message: "GitHub Action '{{ $prop($, 'cdx:github:action:uses') }}' explicitly disables Cargo build caching while manifest-declared Cargo git dependencies are present in the BOM"
|
|
793
|
+
mitigation: "Keep Cargo setup caching enabled when manifests rely on git dependencies unless you have a reviewed exception"
|
|
794
|
+
evidence: |
|
|
795
|
+
{
|
|
796
|
+
"cacheDisableInput": $prop($, 'cdx:github:action:buildCacheDisableInput'),
|
|
797
|
+
"cacheDisableValue": $prop($, 'cdx:github:action:buildCacheDisableValue'),
|
|
798
|
+
"matchingPackages": $$.components[
|
|
799
|
+
$startsWith(purl, 'pkg:cargo/')
|
|
800
|
+
and $hasProp($, 'cdx:cargo:git')
|
|
801
|
+
].purl
|
|
802
|
+
}
|