@cdxgen/cdxgen 13.5.0 → 13.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -10
- package/bin/audit.js +7 -4
- package/bin/cdxgen.js +260 -37
- package/bin/convert.js +146 -22
- package/bin/evinse.js +28 -3
- package/bin/repl.js +47 -3
- package/bin/sign.js +211 -34
- package/bin/tracebom.js +18 -6
- package/bin/validate.js +24 -3
- package/bin/verify.js +113 -5
- package/data/behavior-taxonomy.schema.json +1491 -0
- package/data/cyclonedx-2.0-bundled.schema.json +18606 -5528
- package/data/cyclonedx-2.0-cryptography-defs.schema.json +857 -0
- package/data/license-aliases.json +24 -2
- package/data/pqc-migration.json +239 -0
- package/data/remediations.json +176 -0
- package/data/rules/ai-bom.yaml +1 -1
- package/data/rules/brotli-decoder.yaml +107 -0
- package/data/rules/cbom-security.yaml +4 -3
- package/data/rules/package-integrity.yaml +28 -0
- package/data/rules/vscode-extensions.yaml +75 -0
- package/data/spdx-license-list.json +121 -7
- package/data/spdx-licenses.json +69 -0
- package/data/spdx.schema.json +845 -2
- package/lib/audit/index.js +25 -3
- package/lib/cli/bomAssembly.js +172 -4
- package/lib/cli/cliOptions.js +121 -17
- package/lib/cli/index.js +720 -902
- package/lib/cli/jsBom.js +156 -64
- package/lib/cli/jvmBom.js +602 -86
- package/lib/cli/managedBom.js +161 -19
- package/lib/cli/nativeBom.js +52 -5
- package/lib/core/boundedFile.js +344 -0
- package/lib/core/brotliProbe.js +182 -0
- package/lib/core/env.js +34 -0
- package/lib/core/fs.js +138 -3
- package/lib/core/globPatterns.js +218 -0
- package/lib/core/httpClient.js +98 -1
- package/lib/core/lockPaths.js +38 -0
- package/lib/core/paths.js +24 -1
- package/lib/core/processTree.js +100 -8
- package/lib/core/projectConfig.js +332 -25
- package/lib/core/toolRegistry.js +184 -0
- package/lib/ecosystems/cppEvidence.js +263 -106
- package/lib/ecosystems/cppIncludeResolver.js +16 -5
- package/lib/ecosystems/denoutils.js +2 -2
- package/lib/ecosystems/ecosystems.js +25 -10
- package/lib/ecosystems/gemHostProbe.js +301 -0
- package/lib/ecosystems/golem.js +3 -8
- package/lib/ecosystems/gradleutils.js +1909 -229
- package/lib/ecosystems/jsEvidence.js +90 -38
- package/lib/ecosystems/kosi.js +3 -5
- package/lib/ecosystems/npmVersionResolution.js +376 -0
- package/lib/ecosystems/parsers-bazel.js +107 -6
- package/lib/ecosystems/parsers-js.js +505 -22
- package/lib/ecosystems/parsers-misc.js +209 -20
- package/lib/ecosystems/parsers-python.js +178 -30
- package/lib/ecosystems/parsers-rust.js +117 -15
- package/lib/ecosystems/pythonutils.js +128 -2
- package/lib/ecosystems/remote/huggingface.js +22 -0
- package/lib/ecosystems/rubyutils.js +538 -31
- package/lib/ecosystems/rusi.js +2 -4
- package/lib/ecosystems/scalacliutils.js +2 -0
- package/lib/ecosystems/scalasem.js +798 -152
- package/lib/ecosystems/vendoredCode.js +237 -3
- package/lib/ecosystems/venvProbe.js +360 -0
- package/lib/evinser/evinser.js +536 -71
- package/lib/evinser/scalasem.js +5 -1
- package/lib/helpers/agenticToolutils.js +525 -94
- package/lib/helpers/bomSigner.js +43 -9
- package/lib/helpers/jssSigner.js +1276 -0
- package/lib/helpers/vsixutils.js +1574 -315
- package/lib/inventory/agentBlueprint.js +193 -0
- package/lib/inventory/agentToolNames.js +145 -0
- package/lib/inventory/aiCollector.js +153 -7
- package/lib/inventory/aiInventory.js +44 -8
- package/lib/inventory/aiProviders.js +324 -0
- package/lib/inventory/atomUtils.js +77 -0
- package/lib/inventory/bomUtils.js +8 -1
- package/lib/inventory/brotliDecoder.js +142 -0
- package/lib/inventory/buildToolRateLimit.js +1 -1
- package/lib/inventory/cbomutils.js +56 -7
- package/lib/inventory/ciParsers/githubActionsLock.js +821 -0
- package/lib/inventory/citations.js +31 -2
- package/lib/inventory/communityAiConfigParser.js +978 -80
- package/lib/inventory/cyclonedx20.js +152 -0
- package/lib/inventory/cyclonedx20Common.js +286 -0
- package/lib/inventory/cyclonedx20Derived.js +159 -0
- package/lib/inventory/cyclonedx20Parties.js +552 -0
- package/lib/inventory/cyclonedx20Read.js +768 -0
- package/lib/inventory/cyclonedx20ReadCommon.js +374 -0
- package/lib/inventory/cyclonedx20ReadComponents.js +692 -0
- package/lib/inventory/cyclonedx20ReadContext.js +380 -0
- package/lib/inventory/cyclonedx20ReadEvidence.js +466 -0
- package/lib/inventory/cyclonedx20ReadSections.js +599 -0
- package/lib/inventory/cyclonedx20Render.js +766 -0
- package/lib/inventory/cyclonedx20RenderComponents.js +716 -0
- package/lib/inventory/cyclonedx20RenderDefinitions.js +405 -0
- package/lib/inventory/cyclonedx20RenderEvidence.js +726 -0
- package/lib/inventory/cyclonedx20RenderHardware.js +203 -0
- package/lib/inventory/cyclonedx20RenderPatents.js +174 -0
- package/lib/inventory/cyclonedx20RenderRefIds.js +314 -0
- package/lib/inventory/cyclonedx20RenderSections.js +499 -0
- package/lib/inventory/cyclonedx20Tables.js +594 -0
- package/lib/inventory/deps.js +141 -13
- package/lib/inventory/dosai.js +375 -6
- package/lib/inventory/dosaiParsers.js +3 -6
- package/lib/inventory/dotnetRuntime.js +367 -0
- package/lib/inventory/ecosystemFormulationParsers.js +979 -0
- package/lib/inventory/envcontext.js +436 -48
- package/lib/inventory/evidenceUtils.js +13 -1
- package/lib/inventory/fetchBatch.js +1 -1
- package/lib/inventory/formulationParsers.js +124 -14
- package/lib/inventory/gtfobins.js +13 -0
- package/lib/inventory/hbom.js +45 -6
- package/lib/inventory/hbomLoader.js +166 -0
- package/lib/inventory/hostRuntimeProbe.js +686 -0
- package/lib/inventory/jvmLocalRepos.js +9 -2
- package/lib/inventory/jvmToolEnv.js +29 -0
- package/lib/inventory/licenseEnhancer.js +12 -0
- package/lib/inventory/mavenCentralMirror.js +534 -0
- package/lib/inventory/mcpConfigParser.js +5 -0
- package/lib/inventory/nodeBuildInfo.js +218 -0
- package/lib/inventory/nodeHostProbe.js +202 -0
- package/lib/inventory/occurrenceKey.js +90 -0
- package/lib/inventory/osPackageResolver.js +182 -0
- package/lib/inventory/phpBuildInfo.js +10 -59
- package/lib/inventory/phpHostProbe.js +32 -488
- package/lib/inventory/pqcMigration.js +426 -0
- package/lib/inventory/rubyBuildInfo.js +972 -0
- package/lib/inventory/rubyHostProbe.js +218 -0
- package/lib/inventory/rustFormulationParser.js +21 -10
- package/lib/inventory/scalaCoords.js +4 -3
- package/lib/inventory/scalaDedupe.js +440 -0
- package/lib/inventory/source.js +114 -8
- package/lib/managers/binary.js +337 -3
- package/lib/managers/docker.js +79 -0
- package/lib/parsers/huggingfaceManifest.js +9 -1
- package/lib/parsers/huggingfaceUtils.js +18 -0
- package/lib/parsers/kiroPermissions.js +166 -0
- package/lib/parsers/largeJson.js +28 -11
- package/lib/parsers/vscodeExtensionId.js +183 -0
- package/lib/server/server.js +48 -35
- package/lib/stages/postgen/postgen.js +41 -1
- package/lib/stages/postgen/ruleEngine.js +13 -5
- package/lib/stages/postgen/specVersionCompat.js +76 -0
- package/lib/stages/pregen/envAudit.js +1 -0
- package/lib/stages/pregen/pregen.js +114 -57
- package/lib/validator/bomValidator.js +14 -2
- package/lib/validator/complianceEngine.js +30 -3
- package/lib/validator/complianceRules.js +1416 -4
- package/lib/validator/generated/validate-1.6.mjs +1 -1
- package/lib/validator/generated/validate-1.7.mjs +1 -1
- package/lib/validator/generated/validate-2.0.mjs +57554 -13851
- package/lib/validator/index.js +49 -8
- package/lib/validator/reporters/json.js +6 -0
- package/package.json +11 -10
- package/types/bin/repl.d.ts.map +1 -1
- package/types/lib/audit/index.d.ts +6 -2
- package/types/lib/audit/index.d.ts.map +1 -1
- package/types/lib/cli/bomAssembly.d.ts +29 -1
- package/types/lib/cli/bomAssembly.d.ts.map +1 -1
- package/types/lib/cli/cliOptions.d.ts +6 -0
- package/types/lib/cli/cliOptions.d.ts.map +1 -1
- package/types/lib/cli/index.d.ts.map +1 -1
- package/types/lib/cli/jsBom.d.ts +3 -18
- package/types/lib/cli/jsBom.d.ts.map +1 -1
- package/types/lib/cli/jvmBom.d.ts +15 -0
- package/types/lib/cli/jvmBom.d.ts.map +1 -1
- package/types/lib/cli/managedBom.d.ts.map +1 -1
- package/types/lib/cli/nativeBom.d.ts.map +1 -1
- package/types/lib/core/boundedFile.d.ts +100 -0
- package/types/lib/core/boundedFile.d.ts.map +1 -0
- package/types/lib/core/brotliProbe.d.ts +37 -0
- package/types/lib/core/brotliProbe.d.ts.map +1 -0
- package/types/lib/core/env.d.ts +14 -0
- package/types/lib/core/env.d.ts.map +1 -1
- package/types/lib/core/fs.d.ts +4 -0
- package/types/lib/core/fs.d.ts.map +1 -1
- package/types/lib/core/globPatterns.d.ts +70 -0
- package/types/lib/core/globPatterns.d.ts.map +1 -0
- package/types/lib/core/httpClient.d.ts +24 -0
- package/types/lib/core/httpClient.d.ts.map +1 -1
- package/types/lib/core/lockPaths.d.ts +19 -0
- package/types/lib/core/lockPaths.d.ts.map +1 -0
- package/types/lib/core/paths.d.ts +9 -0
- package/types/lib/core/paths.d.ts.map +1 -1
- package/types/lib/core/processTree.d.ts +17 -4
- package/types/lib/core/processTree.d.ts.map +1 -1
- package/types/lib/core/projectConfig.d.ts +47 -8
- package/types/lib/core/projectConfig.d.ts.map +1 -1
- package/types/lib/core/toolRegistry.d.ts +36 -0
- package/types/lib/core/toolRegistry.d.ts.map +1 -0
- package/types/lib/ecosystems/cppEvidence.d.ts +40 -13
- package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -1
- package/types/lib/ecosystems/cppIncludeResolver.d.ts +2 -1
- package/types/lib/ecosystems/cppIncludeResolver.d.ts.map +1 -1
- package/types/lib/ecosystems/ecosystems.d.ts.map +1 -1
- package/types/lib/ecosystems/gemHostProbe.d.ts +28 -0
- package/types/lib/ecosystems/gemHostProbe.d.ts.map +1 -0
- package/types/lib/ecosystems/golem.d.ts.map +1 -1
- package/types/lib/ecosystems/gradleutils.d.ts +294 -20
- package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
- package/types/lib/ecosystems/jsEvidence.d.ts +14 -1
- package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -1
- package/types/lib/ecosystems/kosi.d.ts.map +1 -1
- package/types/lib/ecosystems/npmVersionResolution.d.ts +119 -0
- package/types/lib/ecosystems/npmVersionResolution.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-js.d.ts +17 -20
- package/types/lib/ecosystems/parsers-js.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-misc.d.ts +19 -0
- package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-python.d.ts +10 -0
- package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -1
- package/types/lib/ecosystems/pythonutils.d.ts +19 -1
- package/types/lib/ecosystems/pythonutils.d.ts.map +1 -1
- package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -1
- package/types/lib/ecosystems/rubyutils.d.ts +144 -12
- package/types/lib/ecosystems/rubyutils.d.ts.map +1 -1
- package/types/lib/ecosystems/rusi.d.ts.map +1 -1
- package/types/lib/ecosystems/scalacliutils.d.ts.map +1 -1
- package/types/lib/ecosystems/scalasem.d.ts +58 -16
- package/types/lib/ecosystems/scalasem.d.ts.map +1 -1
- package/types/lib/ecosystems/vendoredCode.d.ts +26 -0
- package/types/lib/ecosystems/vendoredCode.d.ts.map +1 -1
- package/types/lib/ecosystems/venvProbe.d.ts +40 -0
- package/types/lib/ecosystems/venvProbe.d.ts.map +1 -0
- package/types/lib/evinser/evinser.d.ts +120 -13
- package/types/lib/evinser/evinser.d.ts.map +1 -1
- package/types/lib/evinser/scalasem.d.ts.map +1 -1
- package/types/lib/helpers/agenticToolutils.d.ts +53 -19
- package/types/lib/helpers/agenticToolutils.d.ts.map +1 -1
- package/types/lib/helpers/bomSigner.d.ts +20 -3
- package/types/lib/helpers/bomSigner.d.ts.map +1 -1
- package/types/lib/helpers/jssSigner.d.ts +288 -0
- package/types/lib/helpers/jssSigner.d.ts.map +1 -0
- package/types/lib/helpers/vsixutils.d.ts +303 -19
- package/types/lib/helpers/vsixutils.d.ts.map +1 -1
- package/types/lib/inventory/agentBlueprint.d.ts +70 -0
- package/types/lib/inventory/agentBlueprint.d.ts.map +1 -0
- package/types/lib/inventory/agentToolNames.d.ts +51 -0
- package/types/lib/inventory/agentToolNames.d.ts.map +1 -0
- package/types/lib/inventory/aiCollector.d.ts.map +1 -1
- package/types/lib/inventory/aiInventory.d.ts.map +1 -1
- package/types/lib/inventory/aiProviders.d.ts +85 -0
- package/types/lib/inventory/aiProviders.d.ts.map +1 -0
- package/types/lib/inventory/atomUtils.d.ts +19 -0
- package/types/lib/inventory/atomUtils.d.ts.map +1 -1
- package/types/lib/inventory/bomUtils.d.ts.map +1 -1
- package/types/lib/inventory/brotliDecoder.d.ts +58 -0
- package/types/lib/inventory/brotliDecoder.d.ts.map +1 -0
- package/types/lib/inventory/cbomutils.d.ts +17 -0
- package/types/lib/inventory/cbomutils.d.ts.map +1 -1
- package/types/lib/inventory/ciParsers/githubActionsLock.d.ts +101 -0
- package/types/lib/inventory/ciParsers/githubActionsLock.d.ts.map +1 -0
- package/types/lib/inventory/citations.d.ts +5 -0
- package/types/lib/inventory/citations.d.ts.map +1 -1
- package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -1
- package/types/lib/inventory/cyclonedx20.d.ts +99 -0
- package/types/lib/inventory/cyclonedx20.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Common.d.ts +102 -0
- package/types/lib/inventory/cyclonedx20Common.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Derived.d.ts +74 -0
- package/types/lib/inventory/cyclonedx20Derived.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Parties.d.ts +91 -0
- package/types/lib/inventory/cyclonedx20Parties.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Read.d.ts +51 -0
- package/types/lib/inventory/cyclonedx20Read.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadCommon.d.ts +69 -0
- package/types/lib/inventory/cyclonedx20ReadCommon.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadComponents.d.ts +77 -0
- package/types/lib/inventory/cyclonedx20ReadComponents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadContext.d.ts +118 -0
- package/types/lib/inventory/cyclonedx20ReadContext.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts +40 -0
- package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadSections.d.ts +45 -0
- package/types/lib/inventory/cyclonedx20ReadSections.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Render.d.ts +53 -0
- package/types/lib/inventory/cyclonedx20Render.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderComponents.d.ts +73 -0
- package/types/lib/inventory/cyclonedx20RenderComponents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts +29 -0
- package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts +110 -0
- package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderHardware.d.ts +42 -0
- package/types/lib/inventory/cyclonedx20RenderHardware.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderPatents.d.ts +26 -0
- package/types/lib/inventory/cyclonedx20RenderPatents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts +55 -0
- package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderSections.d.ts +45 -0
- package/types/lib/inventory/cyclonedx20RenderSections.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Tables.d.ts +134 -0
- package/types/lib/inventory/cyclonedx20Tables.d.ts.map +1 -0
- package/types/lib/inventory/deps.d.ts +35 -2
- package/types/lib/inventory/deps.d.ts.map +1 -1
- package/types/lib/inventory/dosai.d.ts +36 -1
- package/types/lib/inventory/dosai.d.ts.map +1 -1
- package/types/lib/inventory/dosaiParsers.d.ts.map +1 -1
- package/types/lib/inventory/dotnetRuntime.d.ts +91 -0
- package/types/lib/inventory/dotnetRuntime.d.ts.map +1 -0
- package/types/lib/inventory/ecosystemFormulationParsers.d.ts +73 -0
- package/types/lib/inventory/ecosystemFormulationParsers.d.ts.map +1 -0
- package/types/lib/inventory/envcontext.d.ts +74 -12
- package/types/lib/inventory/envcontext.d.ts.map +1 -1
- package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
- package/types/lib/inventory/formulationParsers.d.ts.map +1 -1
- package/types/lib/inventory/gtfobins.d.ts.map +1 -1
- package/types/lib/inventory/hbom.d.ts +11 -0
- package/types/lib/inventory/hbom.d.ts.map +1 -1
- package/types/lib/inventory/hbomLoader.d.ts +54 -0
- package/types/lib/inventory/hbomLoader.d.ts.map +1 -1
- package/types/lib/inventory/hostRuntimeProbe.d.ts +44 -0
- package/types/lib/inventory/hostRuntimeProbe.d.ts.map +1 -0
- package/types/lib/inventory/jvmLocalRepos.d.ts +5 -1
- package/types/lib/inventory/jvmLocalRepos.d.ts.map +1 -1
- package/types/lib/inventory/jvmToolEnv.d.ts +12 -0
- package/types/lib/inventory/jvmToolEnv.d.ts.map +1 -1
- package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -1
- package/types/lib/inventory/mavenCentralMirror.d.ts +170 -0
- package/types/lib/inventory/mavenCentralMirror.d.ts.map +1 -0
- package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -1
- package/types/lib/inventory/nodeBuildInfo.d.ts +95 -0
- package/types/lib/inventory/nodeBuildInfo.d.ts.map +1 -0
- package/types/lib/inventory/nodeHostProbe.d.ts +15 -0
- package/types/lib/inventory/nodeHostProbe.d.ts.map +1 -0
- package/types/lib/inventory/occurrenceKey.d.ts +52 -0
- package/types/lib/inventory/occurrenceKey.d.ts.map +1 -0
- package/types/lib/inventory/osPackageResolver.d.ts +38 -0
- package/types/lib/inventory/osPackageResolver.d.ts.map +1 -1
- package/types/lib/inventory/phpBuildInfo.d.ts.map +1 -1
- package/types/lib/inventory/phpHostProbe.d.ts.map +1 -1
- package/types/lib/inventory/pqcMigration.d.ts +84 -0
- package/types/lib/inventory/pqcMigration.d.ts.map +1 -0
- package/types/lib/inventory/rubyBuildInfo.d.ts +271 -0
- package/types/lib/inventory/rubyBuildInfo.d.ts.map +1 -0
- package/types/lib/inventory/rubyHostProbe.d.ts +47 -0
- package/types/lib/inventory/rubyHostProbe.d.ts.map +1 -0
- package/types/lib/inventory/rustFormulationParser.d.ts +7 -2
- package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -1
- package/types/lib/inventory/scalaCoords.d.ts.map +1 -1
- package/types/lib/inventory/scalaDedupe.d.ts +43 -0
- package/types/lib/inventory/scalaDedupe.d.ts.map +1 -0
- package/types/lib/inventory/source.d.ts +25 -0
- package/types/lib/inventory/source.d.ts.map +1 -1
- package/types/lib/managers/binary.d.ts.map +1 -1
- package/types/lib/managers/docker.d.ts +12 -0
- package/types/lib/managers/docker.d.ts.map +1 -1
- package/types/lib/parsers/huggingfaceManifest.d.ts +10 -1
- package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -1
- package/types/lib/parsers/huggingfaceUtils.d.ts +12 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -1
- package/types/lib/parsers/kiroPermissions.d.ts +62 -0
- package/types/lib/parsers/kiroPermissions.d.ts.map +1 -0
- package/types/lib/parsers/largeJson.d.ts +4 -3
- package/types/lib/parsers/largeJson.d.ts.map +1 -1
- package/types/lib/parsers/vscodeExtensionId.d.ts +48 -0
- package/types/lib/parsers/vscodeExtensionId.d.ts.map +1 -0
- package/types/lib/server/server.d.ts.map +1 -1
- package/types/lib/stages/postgen/postgen.d.ts +7 -0
- package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
- package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
- package/types/lib/stages/postgen/specVersionCompat.d.ts +25 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -1
- package/types/lib/stages/pregen/envAudit.d.ts.map +1 -1
- package/types/lib/stages/pregen/pregen.d.ts +12 -8
- package/types/lib/stages/pregen/pregen.d.ts.map +1 -1
- package/types/lib/validator/bomValidator.d.ts +5 -1
- package/types/lib/validator/bomValidator.d.ts.map +1 -1
- package/types/lib/validator/complianceEngine.d.ts +4 -4
- package/types/lib/validator/complianceEngine.d.ts.map +1 -1
- package/types/lib/validator/complianceRules.d.ts +14 -2
- package/types/lib/validator/complianceRules.d.ts.map +1 -1
- package/types/lib/validator/index.d.ts +10 -0
- package/types/lib/validator/index.d.ts.map +1 -1
- package/types/lib/validator/reporters/json.d.ts.map +1 -1
|
@@ -77,6 +77,7 @@ import {
|
|
|
77
77
|
findMavenCoordinatesBySha1,
|
|
78
78
|
inferMavenCoordinatesFromPath,
|
|
79
79
|
} from "../inventory/jvmLocalRepos.js";
|
|
80
|
+
import { mavenCentralFetchUrl } from "../inventory/mavenCentralMirror.js";
|
|
80
81
|
import {
|
|
81
82
|
applyPurl,
|
|
82
83
|
genericPurl,
|
|
@@ -92,6 +93,7 @@ import {
|
|
|
92
93
|
guessLicenseId,
|
|
93
94
|
spdxLicenses,
|
|
94
95
|
} from "../inventory/spdx.js";
|
|
96
|
+
import { parseSpdxExpression } from "../inventory/spdxExpression.js";
|
|
95
97
|
import { extractLicenseText, extractRepoUrl } from "../parsers/htmlExtract.js";
|
|
96
98
|
import { xml2js } from "../parsers/xml.js";
|
|
97
99
|
import {
|
|
@@ -1050,7 +1052,8 @@ export async function getMvnMetadata(
|
|
|
1050
1052
|
}
|
|
1051
1053
|
const repos = {
|
|
1052
1054
|
MAVEN_CENTRAL_URL: withTrailingSlash(
|
|
1053
|
-
|
|
1055
|
+
mavenCentralFetchUrl() ||
|
|
1056
|
+
readEnvironmentVariable("MAVEN_CENTRAL_URL") ||
|
|
1054
1057
|
"https://repo1.maven.org/maven2/",
|
|
1055
1058
|
),
|
|
1056
1059
|
ANDROID_MAVEN_URL: withTrailingSlash(
|
|
@@ -1771,6 +1774,10 @@ export function parseBdistMetadata(mDataFile, rawMetadata = undefined) {
|
|
|
1771
1774
|
}
|
|
1772
1775
|
const lines = mData.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
|
|
1773
1776
|
let isBody = false;
|
|
1777
|
+
// PEP 639 (metadata 2.4) `License-Expression` is a validated SPDX expression
|
|
1778
|
+
// that wins over the free-text `License` field whichever header comes first.
|
|
1779
|
+
let licenseExpression;
|
|
1780
|
+
let licenseName;
|
|
1774
1781
|
for (const line of lines) {
|
|
1775
1782
|
if (line.trim() === "") {
|
|
1776
1783
|
isBody = true;
|
|
@@ -1797,17 +1804,11 @@ export function parseBdistMetadata(mDataFile, rawMetadata = undefined) {
|
|
|
1797
1804
|
pkg.author = value;
|
|
1798
1805
|
break;
|
|
1799
1806
|
case "license-expression":
|
|
1800
|
-
|
|
1801
|
-
expression: value,
|
|
1802
|
-
});
|
|
1807
|
+
licenseExpression = value;
|
|
1803
1808
|
break;
|
|
1804
1809
|
case "license":
|
|
1805
|
-
if (value !== "UNKNOWN" &&
|
|
1806
|
-
|
|
1807
|
-
license: {
|
|
1808
|
-
name: value,
|
|
1809
|
-
},
|
|
1810
|
-
});
|
|
1810
|
+
if (value !== "UNKNOWN" && licenseName === undefined) {
|
|
1811
|
+
licenseName = value;
|
|
1811
1812
|
}
|
|
1812
1813
|
break;
|
|
1813
1814
|
case "home-page":
|
|
@@ -1867,6 +1868,20 @@ export function parseBdistMetadata(mDataFile, rawMetadata = undefined) {
|
|
|
1867
1868
|
break;
|
|
1868
1869
|
}
|
|
1869
1870
|
}
|
|
1871
|
+
if (licenseExpression && parseSpdxExpression(licenseExpression).valid) {
|
|
1872
|
+
// PEP 639 guarantees a valid SPDX expression here, including `LicenseRef-`
|
|
1873
|
+
// document references, which travel as an expression and never as an id.
|
|
1874
|
+
pkg.licenses = [{ expression: licenseExpression }];
|
|
1875
|
+
} else {
|
|
1876
|
+
if (licenseExpression && DEBUG_MODE) {
|
|
1877
|
+
console.log(
|
|
1878
|
+
`License-Expression "${licenseExpression}" of ${pkg.name} is not a valid SPDX expression, so the older license fields are used`,
|
|
1879
|
+
);
|
|
1880
|
+
}
|
|
1881
|
+
if (licenseName) {
|
|
1882
|
+
pkg.licenses = [{ license: { name: licenseName } }];
|
|
1883
|
+
}
|
|
1884
|
+
}
|
|
1870
1885
|
if (mDataFile) {
|
|
1871
1886
|
pkg.evidence = {
|
|
1872
1887
|
identity: {
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
// Bounded, read-only inventory of the gems installed on a live host, for
|
|
2
|
+
// `-t os` / obom. osquery has no table for RubyGems, so without this an OBOM
|
|
3
|
+
// lists no gems at all: neither the default gems that ship with each Ruby
|
|
4
|
+
// (resolv, net-http, uri, ...), nor what `gem install` and the distro's
|
|
5
|
+
// ruby-* packages put in the system gem homes, nor the gems of the version
|
|
6
|
+
// manager installs.
|
|
7
|
+
//
|
|
8
|
+
// Gem homes are found in fixed places, one wildcard level at a time: a
|
|
9
|
+
// directory holding a `specifications` directory is a gem home. Only the
|
|
10
|
+
// `*.gemspec` files under specifications/ and specifications/default/ are
|
|
11
|
+
// read, statically; nothing is executed. A gemspec a package database lists is
|
|
12
|
+
// marked with `cdx:os:installedBy`, so a consumer judges it by that package,
|
|
13
|
+
// which may carry backported fixes under the same gem version.
|
|
14
|
+
|
|
15
|
+
import { readdirSync, statSync } from "node:fs";
|
|
16
|
+
import { join, posix, relative, sep, win32 } from "node:path";
|
|
17
|
+
import process from "node:process";
|
|
18
|
+
|
|
19
|
+
import { isDryRun, recordActivity } from "../core/activity.js";
|
|
20
|
+
import { readRegularTextFile } from "../core/boundedFile.js";
|
|
21
|
+
import { safeExistsSync } from "../core/fs.js";
|
|
22
|
+
import { thoughtLog } from "../core/logger.js";
|
|
23
|
+
import { findHostPathOwners } from "../inventory/hostRuntimeProbe.js";
|
|
24
|
+
import {
|
|
25
|
+
expandDirectories,
|
|
26
|
+
homeDirectories,
|
|
27
|
+
windowsRubyRoots,
|
|
28
|
+
} from "../inventory/rubyHostProbe.js";
|
|
29
|
+
import { parseGemspecData } from "./rubyutils.js";
|
|
30
|
+
|
|
31
|
+
const MAX_GEM_HOMES = 128;
|
|
32
|
+
const MAX_GEMSPECS = 8192;
|
|
33
|
+
const MAX_GEMSPEC_BYTES = 1024 * 1024;
|
|
34
|
+
|
|
35
|
+
// Gem homes relative to the root.
|
|
36
|
+
const ROOT_GEM_HOMES = {
|
|
37
|
+
linux: [
|
|
38
|
+
"usr/lib/ruby/gems/*",
|
|
39
|
+
"usr/lib64/ruby/gems/*",
|
|
40
|
+
"usr/share/gems",
|
|
41
|
+
// Debian and Ubuntu ruby-* packages register their gems here
|
|
42
|
+
"usr/share/rubygems-integration/*",
|
|
43
|
+
"usr/lib/*/rubygems-integration/*",
|
|
44
|
+
"usr/local/share/gems",
|
|
45
|
+
"var/lib/gems/*",
|
|
46
|
+
"usr/local/lib/ruby/gems/*",
|
|
47
|
+
"usr/local/bundle",
|
|
48
|
+
"opt/*/lib/ruby/gems/*",
|
|
49
|
+
"opt/rubies/*/lib/ruby/gems/*",
|
|
50
|
+
"opt/hostedtoolcache/Ruby/*/*/lib/ruby/gems/*",
|
|
51
|
+
"usr/local/rbenv/versions/*/lib/ruby/gems/*",
|
|
52
|
+
"usr/local/rvm/rubies/*/lib/ruby/gems/*",
|
|
53
|
+
"usr/local/rvm/gems/*",
|
|
54
|
+
],
|
|
55
|
+
darwin: [
|
|
56
|
+
"Library/Ruby/Gems/*",
|
|
57
|
+
"usr/local/lib/ruby/gems/*",
|
|
58
|
+
"opt/homebrew/lib/ruby/gems/*",
|
|
59
|
+
"opt/*/lib/ruby/gems/*",
|
|
60
|
+
"opt/rubies/*/lib/ruby/gems/*",
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// Gem homes relative to a home directory.
|
|
65
|
+
const USER_GEM_HOMES = [
|
|
66
|
+
".gem/ruby/*",
|
|
67
|
+
".local/share/gem/ruby/*",
|
|
68
|
+
".rbenv/versions/*/lib/ruby/gems/*",
|
|
69
|
+
".rvm/rubies/*/lib/ruby/gems/*",
|
|
70
|
+
".rvm/gems/*",
|
|
71
|
+
".asdf/installs/ruby/*/lib/ruby/gems/*",
|
|
72
|
+
".local/share/mise/installs/ruby/*/lib/ruby/gems/*",
|
|
73
|
+
".rubies/*/lib/ruby/gems/*",
|
|
74
|
+
".frum/versions/*/lib/ruby/gems/*",
|
|
75
|
+
".local/share/rv/rubies/*/lib/ruby/gems/*",
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
function listGemspecs(directory) {
|
|
79
|
+
try {
|
|
80
|
+
return readdirSync(directory)
|
|
81
|
+
.filter((name) => name.endsWith(".gemspec"))
|
|
82
|
+
.sort();
|
|
83
|
+
} catch {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function isDirectory(path) {
|
|
89
|
+
try {
|
|
90
|
+
return statSync(path).isDirectory();
|
|
91
|
+
} catch {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The gem homes of a host, each a directory with a `specifications` directory.
|
|
98
|
+
*
|
|
99
|
+
* @param {string} rootPath root directory
|
|
100
|
+
* @param {string} platform `linux`, `darwin` or `win32`
|
|
101
|
+
* @returns {string[]} absolute gem home directories
|
|
102
|
+
*/
|
|
103
|
+
export function findGemHomes(rootPath, platform) {
|
|
104
|
+
const context = { rootPath, platform };
|
|
105
|
+
const candidates = [];
|
|
106
|
+
if (platform === "win32") {
|
|
107
|
+
for (const root of windowsRubyRoots(context)) {
|
|
108
|
+
candidates.push(...expandDirectories(root, "lib/ruby/gems/*"));
|
|
109
|
+
}
|
|
110
|
+
} else {
|
|
111
|
+
for (const pattern of ROOT_GEM_HOMES[platform] || []) {
|
|
112
|
+
candidates.push(...expandDirectories(rootPath, pattern));
|
|
113
|
+
}
|
|
114
|
+
for (const home of homeDirectories(context)) {
|
|
115
|
+
for (const pattern of USER_GEM_HOMES) {
|
|
116
|
+
candidates.push(...expandDirectories(home, pattern));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const homes = [];
|
|
121
|
+
const seen = new Set();
|
|
122
|
+
for (const candidate of candidates) {
|
|
123
|
+
if (
|
|
124
|
+
seen.has(candidate) ||
|
|
125
|
+
!isDirectory(join(candidate, "specifications"))
|
|
126
|
+
) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
seen.add(candidate);
|
|
130
|
+
homes.push(candidate);
|
|
131
|
+
if (homes.length >= MAX_GEM_HOMES) {
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return homes;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// The path as the host names it, for the package databases and evidence.
|
|
139
|
+
function logicalPath(rootPath, platform, absolutePath) {
|
|
140
|
+
const parts = relative(rootPath, absolutePath).split(sep);
|
|
141
|
+
if (platform === "win32") {
|
|
142
|
+
return win32.join(rootPath, ...parts);
|
|
143
|
+
}
|
|
144
|
+
return posix.join("/", ...parts);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Inventory the gems of a host's gem homes. One component per distinct gem
|
|
149
|
+
* and version, with an occurrence for each gemspec it was read from, so no
|
|
150
|
+
* host path reaches a purl.
|
|
151
|
+
*
|
|
152
|
+
* @param {Object} [options] options
|
|
153
|
+
* @param {string} [options.rootPath="/"] root directory; tests point it at a built tree
|
|
154
|
+
* @param {string} [options.platform] `linux`, `darwin` or `win32`
|
|
155
|
+
* @param {function(string): (Object[]|undefined)} [options.executeOsQuery] runs
|
|
156
|
+
* an osquery query, for rpm ownership
|
|
157
|
+
* @param {Object[]} [options.packageComponents] the OS packages the scan has
|
|
158
|
+
* inventoried, which name the owners
|
|
159
|
+
* @param {Object} [options.packageDatabases] where the package databases are
|
|
160
|
+
* @returns {Promise<Object[]>} gem components
|
|
161
|
+
*/
|
|
162
|
+
export async function probeHostRubyGems(options = {}) {
|
|
163
|
+
const platform = options.platform || process.platform;
|
|
164
|
+
const rootPath =
|
|
165
|
+
options.rootPath ||
|
|
166
|
+
(platform === "win32" ? `${process.env.SystemDrive || "C:"}\\` : "/");
|
|
167
|
+
if (isDryRun) {
|
|
168
|
+
recordActivity({
|
|
169
|
+
capability: "ruby-gem-probe",
|
|
170
|
+
kind: "read",
|
|
171
|
+
reason:
|
|
172
|
+
"Dry run mode blocks the RubyGems probe, which reads gem specifications outside the project.",
|
|
173
|
+
status: "blocked",
|
|
174
|
+
target: rootPath,
|
|
175
|
+
});
|
|
176
|
+
return [];
|
|
177
|
+
}
|
|
178
|
+
if (!safeExistsSync(rootPath)) {
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
181
|
+
const homes = findGemHomes(rootPath, platform);
|
|
182
|
+
const gemspecs = [];
|
|
183
|
+
for (const home of homes) {
|
|
184
|
+
for (const subdir of [
|
|
185
|
+
"specifications",
|
|
186
|
+
join("specifications", "default"),
|
|
187
|
+
]) {
|
|
188
|
+
const directory = join(home, subdir);
|
|
189
|
+
for (const name of listGemspecs(directory)) {
|
|
190
|
+
if (gemspecs.length >= MAX_GEMSPECS) {
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
const absolutePath = join(directory, name);
|
|
194
|
+
gemspecs.push({
|
|
195
|
+
absolutePath,
|
|
196
|
+
logical: logicalPath(rootPath, platform, absolutePath),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (!gemspecs.length) {
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
const { owners, unreadable } = findHostPathOwners(
|
|
205
|
+
{ ...options, platform, rootPath },
|
|
206
|
+
gemspecs.map((gemspec) => gemspec.logical),
|
|
207
|
+
);
|
|
208
|
+
// An OBOM names a package once; its purl says how the distro named it.
|
|
209
|
+
const packagePurls = new Map();
|
|
210
|
+
for (const component of options.packageComponents || []) {
|
|
211
|
+
if (
|
|
212
|
+
component?.name &&
|
|
213
|
+
typeof component.purl === "string" &&
|
|
214
|
+
/^pkg:(deb|rpm|apk)\//.test(component.purl) &&
|
|
215
|
+
!packagePurls.has(component.name)
|
|
216
|
+
) {
|
|
217
|
+
packagePurls.set(component.name, decodeURIComponent(component.purl));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const byRef = new Map();
|
|
221
|
+
for (const gemspec of gemspecs) {
|
|
222
|
+
// Only a regular file under the root, within the cap: any user can leave
|
|
223
|
+
// `~/.gem/ruby/*/specifications/x.gemspec -> /dev/zero` for a root scan.
|
|
224
|
+
const text = readRegularTextFile(
|
|
225
|
+
gemspec.absolutePath,
|
|
226
|
+
MAX_GEMSPEC_BYTES,
|
|
227
|
+
rootPath,
|
|
228
|
+
);
|
|
229
|
+
if (typeof text !== "string") {
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
// The gemspec files RubyGems writes on install are Ruby source, read here
|
|
233
|
+
// without evaluating them. Thousands of them are no reason to ask the
|
|
234
|
+
// registry about each.
|
|
235
|
+
const [pkg] = await parseGemspecData(text, gemspec.logical, {
|
|
236
|
+
noFetch: true,
|
|
237
|
+
});
|
|
238
|
+
if (!pkg?.name || !pkg.version || !pkg["bom-ref"]) {
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
const owner = owners.get(gemspec.logical);
|
|
242
|
+
// cdx:os:installedBy holds a purl, as everywhere else; an owner the
|
|
243
|
+
// OBOM did not list cannot be named by one.
|
|
244
|
+
const ownerRef = owner ? packagePurls.get(owner.packageName) : undefined;
|
|
245
|
+
let component = byRef.get(pkg["bom-ref"]);
|
|
246
|
+
if (!component) {
|
|
247
|
+
component = pkg;
|
|
248
|
+
component.evidence = {
|
|
249
|
+
...(component.evidence || {}),
|
|
250
|
+
occurrences: [],
|
|
251
|
+
};
|
|
252
|
+
byRef.set(pkg["bom-ref"], component);
|
|
253
|
+
}
|
|
254
|
+
component.properties = component.properties || [];
|
|
255
|
+
if (
|
|
256
|
+
ownerRef &&
|
|
257
|
+
!component.properties.some(
|
|
258
|
+
(prop) => prop.name === "cdx:os:installedBy" && prop.value === ownerRef,
|
|
259
|
+
)
|
|
260
|
+
) {
|
|
261
|
+
component.properties.push({
|
|
262
|
+
name: "cdx:os:installedBy",
|
|
263
|
+
value: ownerRef,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
if (
|
|
267
|
+
!component.evidence.occurrences.some(
|
|
268
|
+
(occurrence) => occurrence.location === gemspec.logical,
|
|
269
|
+
)
|
|
270
|
+
) {
|
|
271
|
+
component.evidence.occurrences.push({ location: gemspec.logical });
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// A gem a package owns in one gem home and `gem install` put in another is
|
|
275
|
+
// not wholly that package's, so it keeps no owner.
|
|
276
|
+
for (const component of byRef.values()) {
|
|
277
|
+
const owned = component.evidence.occurrences.every((occurrence) =>
|
|
278
|
+
owners.has(occurrence.location),
|
|
279
|
+
);
|
|
280
|
+
if (!owned) {
|
|
281
|
+
component.properties = component.properties.filter(
|
|
282
|
+
(prop) => prop.name !== "cdx:os:installedBy",
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
recordActivity({
|
|
287
|
+
capability: "ruby-gem-probe",
|
|
288
|
+
kind: "read",
|
|
289
|
+
reason: `Read ${gemspecs.length} gemspec(s) from ${homes.length} gem home(s) in the fixed places${unreadable.length ? `; the ${unreadable.join(", ")} database could not be read in full, so gem ownership is incomplete` : ""}.`,
|
|
290
|
+
status: "completed",
|
|
291
|
+
target: rootPath,
|
|
292
|
+
});
|
|
293
|
+
if (byRef.size) {
|
|
294
|
+
thoughtLog(
|
|
295
|
+
`I found ${byRef.size} gem(s) in ${homes.length} gem home(s) on this host.`,
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
return Array.from(byRef.values()).sort((a, b) =>
|
|
299
|
+
a["bom-ref"] < b["bom-ref"] ? -1 : a["bom-ref"] > b["bom-ref"] ? 1 : 0,
|
|
300
|
+
);
|
|
301
|
+
}
|
package/lib/ecosystems/golem.js
CHANGED
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
hasInlineCredential,
|
|
21
21
|
sanitizeBomUrl,
|
|
22
22
|
} from "../core/propertySanitizer.js";
|
|
23
|
+
import { occurrenceLocationKey } from "../inventory/occurrenceKey.js";
|
|
23
24
|
import { resolvePluginBinary } from "../inventory/plugins.js";
|
|
24
25
|
import { canonicalPurlFromLooseString } from "../inventory/purl.js";
|
|
25
26
|
|
|
@@ -93,20 +94,14 @@ function rangeLocation(range) {
|
|
|
93
94
|
if (!start?.filename) {
|
|
94
95
|
return undefined;
|
|
95
96
|
}
|
|
96
|
-
|
|
97
|
-
return `${start.filename}#${start.line}`;
|
|
98
|
-
}
|
|
99
|
-
return start.filename;
|
|
97
|
+
return occurrenceLocationKey(start.filename, start.line);
|
|
100
98
|
}
|
|
101
99
|
|
|
102
100
|
function positionLocation(position) {
|
|
103
101
|
if (!position?.filename) {
|
|
104
102
|
return undefined;
|
|
105
103
|
}
|
|
106
|
-
|
|
107
|
-
return `${position.filename}#${position.line}`;
|
|
108
|
-
}
|
|
109
|
-
return position.filename;
|
|
104
|
+
return occurrenceLocationKey(position.filename, position.line);
|
|
110
105
|
}
|
|
111
106
|
|
|
112
107
|
function purlWithoutVersion(purl) {
|