@cdxgen/cdxgen 0.0.1 → 13.0.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 +921 -87
- package/bin/audit.js +239 -0
- package/bin/cdxgen.js +2324 -0
- package/bin/convert.js +213 -0
- package/bin/evinse.js +353 -0
- package/bin/hbom.js +495 -0
- package/bin/repl.js +2224 -0
- package/bin/sign.js +195 -0
- package/bin/tracebom.js +295 -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 +1833 -0
- package/lib/cli/cliOptions.js +513 -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 +142 -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 +876 -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 +575 -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 +1789 -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 +277 -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 +263 -0
- package/lib/inventory/traceRunner.js +439 -0
- package/lib/inventory/unicodeScan.js +147 -0
- package/lib/managers/binary.js +3307 -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 +315 -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 +28 -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 +120 -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 +19 -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 +76 -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,1776 @@
|
|
|
1
|
+
# OBOM Runtime Security & Compliance Rules
|
|
2
|
+
# Category: obom-runtime
|
|
3
|
+
# Detects host posture, persistence, and runtime indicators from osquery-derived OBOM components
|
|
4
|
+
|
|
5
|
+
- id: OBOM-LNX-001
|
|
6
|
+
name: "Linux systemd unit sourced from temporary path"
|
|
7
|
+
description: "Systemd units loaded from /tmp or /var/tmp can indicate unauthorized persistence."
|
|
8
|
+
severity: high
|
|
9
|
+
category: obom-runtime
|
|
10
|
+
dry-run-support: full
|
|
11
|
+
condition: |
|
|
12
|
+
components[
|
|
13
|
+
$prop($, 'cdx:osquery:category') = 'systemd_units'
|
|
14
|
+
and (
|
|
15
|
+
$contains($nullSafeProp($, 'fragment_path'), '/tmp/')
|
|
16
|
+
or $contains($nullSafeProp($, 'fragment_path'), '/var/tmp/')
|
|
17
|
+
or $contains($nullSafeProp($, 'source_path'), '/tmp/')
|
|
18
|
+
or $contains($nullSafeProp($, 'source_path'), '/var/tmp/')
|
|
19
|
+
)
|
|
20
|
+
]
|
|
21
|
+
location: |
|
|
22
|
+
{
|
|
23
|
+
"bomRef": $."bom-ref",
|
|
24
|
+
"purl": purl
|
|
25
|
+
}
|
|
26
|
+
message: "Systemd unit '{{ name }}' loads from unit path '{{ $firstNonEmpty($prop($, 'fragment_path'), $prop($, 'source_path'), name) }}' with temporary-backed source '{{ $firstNonEmpty($prop($, 'source_path'), $prop($, 'fragment_path')) }}'"
|
|
27
|
+
mitigation: "Review the unit file and any generated source/drop-in together, move them to trusted system paths, validate ownership/permissions, and re-enable only approved services."
|
|
28
|
+
evidence: |
|
|
29
|
+
{
|
|
30
|
+
"activeState": $prop($, 'active_state'),
|
|
31
|
+
"unitFileState": $prop($, 'unit_file_state'),
|
|
32
|
+
"fragmentPath": $prop($, 'fragment_path'),
|
|
33
|
+
"sourcePath": $prop($, 'source_path')
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
- id: OBOM-LNX-002
|
|
37
|
+
name: "Linux sudoers broad privilege rule"
|
|
38
|
+
description: "Sudoers entries allowing unrestricted command execution increase lateral movement and privilege escalation risk."
|
|
39
|
+
severity: high
|
|
40
|
+
category: obom-runtime
|
|
41
|
+
dry-run-support: full
|
|
42
|
+
condition: |
|
|
43
|
+
components[
|
|
44
|
+
$prop($, 'cdx:osquery:category') = 'sudoers_snapshot'
|
|
45
|
+
and (
|
|
46
|
+
$contains(description, 'NOPASSWD:ALL')
|
|
47
|
+
or $contains(description, 'ALL=(ALL) ALL')
|
|
48
|
+
)
|
|
49
|
+
]
|
|
50
|
+
location: |
|
|
51
|
+
{
|
|
52
|
+
"bomRef": $."bom-ref",
|
|
53
|
+
"purl": purl
|
|
54
|
+
}
|
|
55
|
+
message: "Sudo policy '{{ name }}' contains broad privilege grant: {{ description }}"
|
|
56
|
+
mitigation: "Replace broad grants with command-specific allowlists and enforce MFA/approval workflows for privileged operations."
|
|
57
|
+
evidence: |
|
|
58
|
+
{
|
|
59
|
+
"sourceFile": $prop($, 'path'),
|
|
60
|
+
"ruleDetails": description
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
- id: OBOM-LNX-003
|
|
64
|
+
name: "Root authorized_keys entry without restrictions"
|
|
65
|
+
description: "Root SSH keys without command/from/no-agent-forwarding restrictions weaken access controls and traceability."
|
|
66
|
+
severity: medium
|
|
67
|
+
category: obom-runtime
|
|
68
|
+
dry-run-support: full
|
|
69
|
+
condition: |
|
|
70
|
+
components[
|
|
71
|
+
$prop($, 'cdx:osquery:category') = 'authorized_keys_snapshot'
|
|
72
|
+
and name = 'root'
|
|
73
|
+
and $hasProp($, 'options')
|
|
74
|
+
and $safeStr($prop($, 'options')) = ''
|
|
75
|
+
]
|
|
76
|
+
location: |
|
|
77
|
+
{
|
|
78
|
+
"bomRef": $."bom-ref",
|
|
79
|
+
"purl": purl
|
|
80
|
+
}
|
|
81
|
+
message: "Root authorized_keys entry in '{{ $prop($, 'key_file') }}' lacks restrictive key options"
|
|
82
|
+
mitigation: "Apply restrictive key options (from=, command=, no-agent-forwarding, no-port-forwarding) and rotate unmanaged keys."
|
|
83
|
+
evidence: |
|
|
84
|
+
{
|
|
85
|
+
"account": name,
|
|
86
|
+
"algorithm": version,
|
|
87
|
+
"keyFile": $prop($, 'key_file'),
|
|
88
|
+
"options": $prop($, 'options')
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
- id: OBOM-WIN-001
|
|
92
|
+
name: "Windows drive without BitLocker protection"
|
|
93
|
+
description: "Drives with disabled BitLocker protection can violate endpoint encryption requirements and increase data exposure risk."
|
|
94
|
+
severity: high
|
|
95
|
+
category: obom-runtime
|
|
96
|
+
dry-run-support: full
|
|
97
|
+
condition: |
|
|
98
|
+
components[
|
|
99
|
+
$prop($, 'cdx:osquery:category') = 'windows_bitlocker_info'
|
|
100
|
+
and $safeStr($prop($, 'protection_status')) != '1'
|
|
101
|
+
]
|
|
102
|
+
location: |
|
|
103
|
+
{
|
|
104
|
+
"bomRef": $."bom-ref",
|
|
105
|
+
"purl": purl
|
|
106
|
+
}
|
|
107
|
+
message: "BitLocker protection is not enabled for drive '{{ version }}' (device '{{ name }}')"
|
|
108
|
+
mitigation: "Enable BitLocker with approved encryption policy and escrow recovery keys in managed KMS/AD."
|
|
109
|
+
evidence: |
|
|
110
|
+
{
|
|
111
|
+
"deviceId": name,
|
|
112
|
+
"driveLetter": version,
|
|
113
|
+
"protectionStatus": $prop($, 'protection_status'),
|
|
114
|
+
"encryptionMethod": $prop($, 'encryption_method'),
|
|
115
|
+
"percentageEncrypted": $prop($, 'percentage_encrypted')
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
- id: OBOM-WIN-002
|
|
119
|
+
name: "Windows Security Center unhealthy state"
|
|
120
|
+
description: "Poor Security Center health indicates one or more key endpoint protections are disabled or degraded."
|
|
121
|
+
severity: high
|
|
122
|
+
category: obom-runtime
|
|
123
|
+
dry-run-support: full
|
|
124
|
+
condition: |
|
|
125
|
+
components[
|
|
126
|
+
$prop($, 'cdx:osquery:category') = 'windows_security_center'
|
|
127
|
+
and (
|
|
128
|
+
name = 'Poor'
|
|
129
|
+
or version = 'Poor'
|
|
130
|
+
or description = 'Poor'
|
|
131
|
+
or $prop($, 'internet_settings') = 'Poor'
|
|
132
|
+
or $prop($, 'windows_security_center_service') = 'Poor'
|
|
133
|
+
or $prop($, 'user_account_control') = 'Poor'
|
|
134
|
+
)
|
|
135
|
+
]
|
|
136
|
+
location: |
|
|
137
|
+
{
|
|
138
|
+
"bomRef": $."bom-ref",
|
|
139
|
+
"purl": purl
|
|
140
|
+
}
|
|
141
|
+
message: "Windows Security Center reports degraded protection posture (antivirus={{ name }}, firewall={{ version }}, autoupdate={{ description }})"
|
|
142
|
+
mitigation: "Restore endpoint protection controls and enforce policy baselines for AV, firewall, updates, and UAC."
|
|
143
|
+
evidence: |
|
|
144
|
+
{
|
|
145
|
+
"antivirus": name,
|
|
146
|
+
"firewall": version,
|
|
147
|
+
"autoupdate": description,
|
|
148
|
+
"internetSettings": $prop($, 'internet_settings'),
|
|
149
|
+
"securityCenterService": $prop($, 'windows_security_center_service'),
|
|
150
|
+
"uac": $prop($, 'user_account_control')
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
- id: OBOM-WIN-003
|
|
154
|
+
name: "Windows Run key references temporary/script execution path"
|
|
155
|
+
description: "Run/RunOnce entries launching from temp or encoded script commands are common persistence techniques."
|
|
156
|
+
severity: critical
|
|
157
|
+
category: obom-runtime
|
|
158
|
+
dry-run-support: full
|
|
159
|
+
condition: |
|
|
160
|
+
components[
|
|
161
|
+
$prop($, 'cdx:osquery:category') = 'windows_run_keys'
|
|
162
|
+
and (
|
|
163
|
+
$contains($lowercase($safeStr(description)), '\\appdata\\local\\temp\\')
|
|
164
|
+
or $contains($lowercase($safeStr(description)), '\\temp\\')
|
|
165
|
+
or $contains($lowercase($safeStr(description)), '-enc ')
|
|
166
|
+
)
|
|
167
|
+
]
|
|
168
|
+
location: |
|
|
169
|
+
{
|
|
170
|
+
"bomRef": $."bom-ref",
|
|
171
|
+
"purl": purl
|
|
172
|
+
}
|
|
173
|
+
message: "Run key '{{ name }}' launches potentially suspicious command/path: {{ description }}"
|
|
174
|
+
mitigation: "Validate publisher and hash of the referenced executable/script, remove unauthorized entries, and investigate parent change events."
|
|
175
|
+
evidence: |
|
|
176
|
+
{
|
|
177
|
+
"registryPath": name,
|
|
178
|
+
"command": description,
|
|
179
|
+
"registryKey": $prop($, 'key'),
|
|
180
|
+
"mtime": version
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
- id: OBOM-MAC-001
|
|
184
|
+
name: "macOS firewall disabled or stealth mode off"
|
|
185
|
+
description: "ALF misconfiguration can expose endpoints to unsolicited inbound traffic and weakens host hardening baselines."
|
|
186
|
+
severity: high
|
|
187
|
+
category: obom-runtime
|
|
188
|
+
dry-run-support: full
|
|
189
|
+
condition: |
|
|
190
|
+
components[
|
|
191
|
+
$prop($, 'cdx:osquery:category') = 'alf'
|
|
192
|
+
and (
|
|
193
|
+
$safeStr(version) = '0'
|
|
194
|
+
or $safeStr($prop($, 'stealth_enabled')) = '0'
|
|
195
|
+
)
|
|
196
|
+
]
|
|
197
|
+
location: |
|
|
198
|
+
{
|
|
199
|
+
"bomRef": $."bom-ref",
|
|
200
|
+
"purl": purl
|
|
201
|
+
}
|
|
202
|
+
message: "macOS ALF posture is weak (global_state={{ version }}, stealth_enabled={{ $prop($, 'stealth_enabled') }})"
|
|
203
|
+
mitigation: "Enable ALF and stealth mode via managed profile or MDM baseline."
|
|
204
|
+
evidence: |
|
|
205
|
+
{
|
|
206
|
+
"globalState": version,
|
|
207
|
+
"stealthEnabled": $prop($, 'stealth_enabled'),
|
|
208
|
+
"allowSignedEnabled": $prop($, 'allow_signed_enabled'),
|
|
209
|
+
"loggingEnabled": $prop($, 'logging_enabled')
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
- id: OBOM-MAC-002
|
|
213
|
+
name: "macOS launchd item from user-writable temporary path"
|
|
214
|
+
description: "Launchd agents/daemons sourced from temporary paths are a strong persistence and execution abuse signal."
|
|
215
|
+
severity: critical
|
|
216
|
+
category: obom-runtime
|
|
217
|
+
dry-run-support: full
|
|
218
|
+
condition: |
|
|
219
|
+
components[
|
|
220
|
+
$prop($, 'cdx:osquery:category') = 'launchd_services'
|
|
221
|
+
and (
|
|
222
|
+
$contains($nullSafeProp($, 'path'), '/tmp/')
|
|
223
|
+
or $contains($nullSafeProp($, 'path'), '/var/tmp/')
|
|
224
|
+
or $contains($nullSafeProp($, 'program'), '/tmp/')
|
|
225
|
+
or $contains($nullSafeProp($, 'program'), '/var/tmp/')
|
|
226
|
+
)
|
|
227
|
+
and (
|
|
228
|
+
$safeStr($prop($, 'run_at_load')) = 'true'
|
|
229
|
+
or $safeStr($prop($, 'run_at_load')) = '1'
|
|
230
|
+
or $safeStr($prop($, 'keep_alive')) = 'true'
|
|
231
|
+
or $safeStr($prop($, 'keep_alive')) = '1'
|
|
232
|
+
)
|
|
233
|
+
]
|
|
234
|
+
location: |
|
|
235
|
+
{
|
|
236
|
+
"bomRef": $."bom-ref",
|
|
237
|
+
"purl": purl
|
|
238
|
+
}
|
|
239
|
+
message: "Launchd item '{{ $firstNonEmpty($prop($, 'label'), name) }}' uses plist '{{ $firstNonEmpty($prop($, 'path'), name) }}' and target '{{ $firstNonEmpty($prop($, 'program'), $prop($, 'program_arguments'), name) }}' from a temporary path with persistence enabled"
|
|
240
|
+
mitigation: "Review the launchd plist and target executable together, remove unauthorized entries, relocate approved binaries to trusted paths, and enforce signed launchd payloads."
|
|
241
|
+
evidence: |
|
|
242
|
+
{
|
|
243
|
+
"label": $prop($, 'label'),
|
|
244
|
+
"plistPath": $prop($, 'path'),
|
|
245
|
+
"targetPath": $firstNonEmpty($prop($, 'program'), $prop($, 'program_arguments')),
|
|
246
|
+
"program": $prop($, 'program'),
|
|
247
|
+
"programArguments": $prop($, 'program_arguments'),
|
|
248
|
+
"runAtLoad": $prop($, 'run_at_load'),
|
|
249
|
+
"keepAlive": $prop($, 'keep_alive')
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
- id: OBOM-MAC-003
|
|
253
|
+
name: "macOS firewall exception for binary in untrusted user path"
|
|
254
|
+
description: "ALF exceptions for binaries in user Downloads/Desktop/tmp increase risk of untrusted inbound network exposure."
|
|
255
|
+
severity: medium
|
|
256
|
+
category: obom-runtime
|
|
257
|
+
dry-run-support: full
|
|
258
|
+
condition: |
|
|
259
|
+
components[
|
|
260
|
+
$prop($, 'cdx:osquery:category') = 'alf_exceptions'
|
|
261
|
+
and (
|
|
262
|
+
$contains($safeStr(name), '/Users/')
|
|
263
|
+
and (
|
|
264
|
+
$contains($safeStr(name), '/Downloads/')
|
|
265
|
+
or $contains($safeStr(name), '/Desktop/')
|
|
266
|
+
or $contains($safeStr(name), '/tmp/')
|
|
267
|
+
)
|
|
268
|
+
)
|
|
269
|
+
]
|
|
270
|
+
location: |
|
|
271
|
+
{
|
|
272
|
+
"bomRef": $."bom-ref",
|
|
273
|
+
"purl": purl
|
|
274
|
+
}
|
|
275
|
+
message: "ALF exception allows inbound access for risky path '{{ name }}'"
|
|
276
|
+
mitigation: "Restrict exceptions to signed, managed applications in trusted system paths."
|
|
277
|
+
evidence: |
|
|
278
|
+
{
|
|
279
|
+
"path": name,
|
|
280
|
+
"state": version
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
- id: OBOM-LNX-004
|
|
284
|
+
name: "Linux shell history contains suspicious download-execute pattern"
|
|
285
|
+
description: "Shell history with direct download-and-execute commands may indicate malware staging or hands-on-keyboard activity."
|
|
286
|
+
severity: high
|
|
287
|
+
category: obom-runtime
|
|
288
|
+
dry-run-support: full
|
|
289
|
+
condition: |
|
|
290
|
+
components[
|
|
291
|
+
$prop($, 'cdx:osquery:category') = 'shell_history_snapshot'
|
|
292
|
+
and (
|
|
293
|
+
($contains($lowercase(description), 'curl ') and $contains($lowercase(description), '| sh'))
|
|
294
|
+
or ($contains($lowercase(description), 'wget ') and $contains($lowercase(description), '| bash'))
|
|
295
|
+
or $contains($lowercase(description), 'base64 -d')
|
|
296
|
+
or $contains($lowercase(description), 'nc -e ')
|
|
297
|
+
)
|
|
298
|
+
]
|
|
299
|
+
location: |
|
|
300
|
+
{
|
|
301
|
+
"bomRef": $."bom-ref",
|
|
302
|
+
"purl": purl
|
|
303
|
+
}
|
|
304
|
+
message: "Suspicious shell history entry for user '{{ name }}': {{ description }}"
|
|
305
|
+
mitigation: "Correlate with process/network telemetry, validate command intent, and isolate host if command lineage is untrusted."
|
|
306
|
+
evidence: |
|
|
307
|
+
{
|
|
308
|
+
"account": name,
|
|
309
|
+
"command": description,
|
|
310
|
+
"historyFile": $prop($, 'history_file'),
|
|
311
|
+
"timestamp": $prop($, 'time')
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
- id: OBOM-LNX-005
|
|
315
|
+
name: "Docker API exposed over unauthenticated TCP port"
|
|
316
|
+
description: "Dockerd listening on TCP 2375 enables remote daemon control if not protected by network controls and TLS."
|
|
317
|
+
severity: critical
|
|
318
|
+
category: obom-runtime
|
|
319
|
+
dry-run-support: full
|
|
320
|
+
condition: |
|
|
321
|
+
components[
|
|
322
|
+
$prop($, 'cdx:osquery:category') = 'listening_ports'
|
|
323
|
+
and $safeStr($prop($, 'port')) = '2375'
|
|
324
|
+
and (
|
|
325
|
+
$safeStr($prop($, 'address')) = '0.0.0.0'
|
|
326
|
+
or $safeStr($prop($, 'address')) = '::'
|
|
327
|
+
)
|
|
328
|
+
]
|
|
329
|
+
location: |
|
|
330
|
+
{
|
|
331
|
+
"bomRef": $."bom-ref",
|
|
332
|
+
"purl": purl
|
|
333
|
+
}
|
|
334
|
+
message: "Potentially insecure Docker API exposure detected on {{ $prop($, 'address') }}:{{ $prop($, 'port') }} for process '{{ name }}'"
|
|
335
|
+
mitigation: "Disable insecure TCP listener, enforce TLS/mTLS, and restrict daemon access to trusted local interfaces."
|
|
336
|
+
evidence: |
|
|
337
|
+
{
|
|
338
|
+
"process": name,
|
|
339
|
+
"pid": $prop($, 'pid'),
|
|
340
|
+
"address": $prop($, 'address'),
|
|
341
|
+
"port": $prop($, 'port'),
|
|
342
|
+
"protocol": $prop($, 'protocol')
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
- id: OBOM-LNX-006
|
|
346
|
+
name: "Privileged Linux listener exposed on a non-local interface"
|
|
347
|
+
description: "Root or service-account listeners bound to all interfaces expand attack surface and should be reviewed even when they appear to come from managed system paths."
|
|
348
|
+
severity: medium
|
|
349
|
+
category: obom-runtime
|
|
350
|
+
dry-run-support: full
|
|
351
|
+
condition: |
|
|
352
|
+
components[
|
|
353
|
+
$prop($, 'cdx:osquery:category') = 'privileged_listening_ports'
|
|
354
|
+
and (
|
|
355
|
+
$safeStr($prop($, 'address')) = '0.0.0.0'
|
|
356
|
+
or $safeStr($prop($, 'address')) = '::'
|
|
357
|
+
)
|
|
358
|
+
and $safeStr($prop($, 'port')) != '22'
|
|
359
|
+
and $safeStr($prop($, 'port')) != '53'
|
|
360
|
+
and $safeStr(name) != 'systemd-resolved'
|
|
361
|
+
and $safeStr(name) != 'avahi-daemon'
|
|
362
|
+
and $safeStr(name) != 'cupsd'
|
|
363
|
+
and $safeStr($prop($, 'package_source_hint')) != 'user-writable-path'
|
|
364
|
+
and $safeStr($prop($, 'package_source_hint')) != 'unclassified-path'
|
|
365
|
+
and $not($contains($lowercase($nullSafeProp($, 'path')), '/tmp/'))
|
|
366
|
+
and $not($contains($lowercase($nullSafeProp($, 'path')), '/var/tmp/'))
|
|
367
|
+
and $not($contains($lowercase($nullSafeProp($, 'path')), '/dev/shm/'))
|
|
368
|
+
and $not($contains($lowercase($nullSafeProp($, 'path')), '/home/'))
|
|
369
|
+
and $not($contains($lowercase($nullSafeProp($, 'path')), '/run/user/'))
|
|
370
|
+
]
|
|
371
|
+
location: |
|
|
372
|
+
{
|
|
373
|
+
"bomRef": $."bom-ref",
|
|
374
|
+
"purl": purl
|
|
375
|
+
}
|
|
376
|
+
message: "Privileged listener '{{ name }}' from '{{ $firstNonEmpty($prop($, 'path'), name) }}' is reachable on {{ $prop($, 'address') }}:{{ $prop($, 'port') }} and should be validated against approved exposure"
|
|
377
|
+
mitigation: "Restrict privileged services to local interfaces where possible, front them with authenticated proxies, and validate the listener path and service ownership against approved admin-surface inventory."
|
|
378
|
+
evidence: |
|
|
379
|
+
{
|
|
380
|
+
"account": $prop($, 'account'),
|
|
381
|
+
"pid": $prop($, 'pid'),
|
|
382
|
+
"address": $prop($, 'address'),
|
|
383
|
+
"port": $prop($, 'port'),
|
|
384
|
+
"path": $prop($, 'path'),
|
|
385
|
+
"serviceUnit": $prop($, 'service_unit'),
|
|
386
|
+
"packageSourceHint": $prop($, 'package_source_hint'),
|
|
387
|
+
"parentCmdline": $prop($, 'parent_cmdline')
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
- id: OBOM-LNX-007
|
|
391
|
+
name: "Administrative Linux surface running with elevated privileges"
|
|
392
|
+
description: "Cockpit, PackageKit, pkexec, and related admin surfaces running with elevated privileges should be continuously monitored for exposure and drift."
|
|
393
|
+
severity: high
|
|
394
|
+
category: obom-runtime
|
|
395
|
+
dry-run-support: full
|
|
396
|
+
condition: |
|
|
397
|
+
components[
|
|
398
|
+
(
|
|
399
|
+
$prop($, 'cdx:osquery:category') = 'elevated_processes'
|
|
400
|
+
or $prop($, 'cdx:osquery:category') = 'privileged_listening_ports'
|
|
401
|
+
or $prop($, 'cdx:osquery:category') = 'sudo_executions'
|
|
402
|
+
or $prop($, 'cdx:osquery:category') = 'privilege_transitions'
|
|
403
|
+
)
|
|
404
|
+
and (
|
|
405
|
+
$contains($lowercase($safeStr(name)), 'cockpit')
|
|
406
|
+
or $contains($lowercase($nullSafeProp($, 'path')), 'cockpit')
|
|
407
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'cockpit')
|
|
408
|
+
or $contains($lowercase($safeStr(name)), 'packagekit')
|
|
409
|
+
or $contains($lowercase($nullSafeProp($, 'path')), 'packagekit')
|
|
410
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'packagekit')
|
|
411
|
+
or $contains($lowercase($safeStr(name)), 'pkexec')
|
|
412
|
+
or $contains($lowercase($nullSafeProp($, 'path')), 'pkexec')
|
|
413
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'pkexec')
|
|
414
|
+
or $contains($lowercase($safeStr(name)), 'pkcon')
|
|
415
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'pkcon')
|
|
416
|
+
)
|
|
417
|
+
and (
|
|
418
|
+
$safeStr($prop($, 'uid')) = '0'
|
|
419
|
+
or $safeStr($prop($, 'euid')) = '0'
|
|
420
|
+
or $safeStr($prop($, 'account')) = 'root'
|
|
421
|
+
or $safeStr($prop($, 'effective_user')) = 'root'
|
|
422
|
+
)
|
|
423
|
+
]
|
|
424
|
+
location: |
|
|
425
|
+
{
|
|
426
|
+
"bomRef": $."bom-ref",
|
|
427
|
+
"purl": purl
|
|
428
|
+
}
|
|
429
|
+
message: "Administrative surface '{{ name }}' is active with elevated privileges and should be reviewed for exposure"
|
|
430
|
+
mitigation: "Review network reachability, patch cadence, and whether the administrative package is still needed on this host."
|
|
431
|
+
evidence: |
|
|
432
|
+
{
|
|
433
|
+
"category": $prop($, 'cdx:osquery:category'),
|
|
434
|
+
"path": $prop($, 'path'),
|
|
435
|
+
"cmdline": $prop($, 'cmdline'),
|
|
436
|
+
"account": $prop($, 'account'),
|
|
437
|
+
"effectiveUser": $prop($, 'effective_user'),
|
|
438
|
+
"serviceUnit": $prop($, 'service_unit'),
|
|
439
|
+
"address": $prop($, 'address'),
|
|
440
|
+
"port": $prop($, 'port'),
|
|
441
|
+
"packageSourceHint": $prop($, 'package_source_hint')
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
- id: OBOM-LNX-008
|
|
445
|
+
name: "Interactive sudo chain touched sensitive administrative binary"
|
|
446
|
+
description: "Interactive sudo or pkexec invocations against package-management and admin-control binaries can indicate privileged changes worth auditing."
|
|
447
|
+
severity: high
|
|
448
|
+
category: obom-runtime
|
|
449
|
+
dry-run-support: full
|
|
450
|
+
condition: |
|
|
451
|
+
components[
|
|
452
|
+
$prop($, 'cdx:osquery:category') = 'sudo_executions'
|
|
453
|
+
and $safeStr($prop($, 'auid')) != ''
|
|
454
|
+
and $safeStr($prop($, 'auid')) != '0'
|
|
455
|
+
and (
|
|
456
|
+
$safeStr($prop($, 'euid')) = '0'
|
|
457
|
+
or $safeStr($prop($, 'effective_user')) = 'root'
|
|
458
|
+
)
|
|
459
|
+
and (
|
|
460
|
+
$contains($lowercase($nullSafeProp($, 'path')), 'pkexec')
|
|
461
|
+
or $contains($lowercase($nullSafeProp($, 'path')), 'pkcon')
|
|
462
|
+
or $contains($lowercase($nullSafeProp($, 'path')), 'packagekit')
|
|
463
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'pkexec')
|
|
464
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'pkcon')
|
|
465
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'packagekit')
|
|
466
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'cockpit')
|
|
467
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'systemctl')
|
|
468
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'service ')
|
|
469
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' apt ')
|
|
470
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' apt-get ')
|
|
471
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' dnf ')
|
|
472
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' yum ')
|
|
473
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' zypper ')
|
|
474
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' rpm ')
|
|
475
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' dpkg ')
|
|
476
|
+
)
|
|
477
|
+
]
|
|
478
|
+
location: |
|
|
479
|
+
{
|
|
480
|
+
"bomRef": $."bom-ref",
|
|
481
|
+
"purl": purl
|
|
482
|
+
}
|
|
483
|
+
message: "Interactive privileged execution by '{{ $prop($, 'login_user') }}' touched sensitive administrative command '{{ $prop($, 'path') }}'"
|
|
484
|
+
mitigation: "Review whether the command was expected, tie it to change records, and investigate unexpected package-management or control-plane activity."
|
|
485
|
+
evidence: |
|
|
486
|
+
{
|
|
487
|
+
"loginUser": $prop($, 'login_user'),
|
|
488
|
+
"effectiveUser": $prop($, 'effective_user'),
|
|
489
|
+
"path": $prop($, 'path'),
|
|
490
|
+
"cmdline": $prop($, 'cmdline'),
|
|
491
|
+
"parentCmdline": $prop($, 'parent_cmdline'),
|
|
492
|
+
"serviceUnit": $prop($, 'service_unit'),
|
|
493
|
+
"packageSourceHint": $prop($, 'package_source_hint'),
|
|
494
|
+
"timestamp": $prop($, 'time')
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
- id: OBOM-LNX-009
|
|
498
|
+
name: "Unexpected Linux privilege transition for non-allowlisted executable"
|
|
499
|
+
description: "Setuid/setgid transitions outside a small baseline of expected tools can indicate risky privilege-bound packages or exploit activity."
|
|
500
|
+
severity: high
|
|
501
|
+
category: obom-runtime
|
|
502
|
+
dry-run-support: full
|
|
503
|
+
condition: |
|
|
504
|
+
components[
|
|
505
|
+
$prop($, 'cdx:osquery:category') = 'privilege_transitions'
|
|
506
|
+
and $safeStr($prop($, 'auid')) != ''
|
|
507
|
+
and $safeStr($prop($, 'auid')) != '0'
|
|
508
|
+
and (
|
|
509
|
+
$safeStr($prop($, 'euid')) = '0'
|
|
510
|
+
or $safeStr($prop($, 'egid')) = '0'
|
|
511
|
+
)
|
|
512
|
+
and $safeStr($prop($, 'path')) != '/usr/bin/sudo'
|
|
513
|
+
and $safeStr($prop($, 'path')) != '/bin/su'
|
|
514
|
+
and $safeStr($prop($, 'path')) != '/usr/bin/su'
|
|
515
|
+
and $safeStr($prop($, 'path')) != '/usr/bin/doas'
|
|
516
|
+
and $safeStr($prop($, 'path')) != '/usr/bin/passwd'
|
|
517
|
+
and $safeStr($prop($, 'path')) != '/usr/bin/chsh'
|
|
518
|
+
and $safeStr($prop($, 'path')) != '/usr/bin/chfn'
|
|
519
|
+
and $safeStr($prop($, 'path')) != '/usr/bin/gpasswd'
|
|
520
|
+
and $safeStr($prop($, 'path')) != '/usr/bin/newgrp'
|
|
521
|
+
and $safeStr($prop($, 'path')) != '/usr/bin/mount'
|
|
522
|
+
and $safeStr($prop($, 'path')) != '/usr/bin/umount'
|
|
523
|
+
]
|
|
524
|
+
location: |
|
|
525
|
+
{
|
|
526
|
+
"bomRef": $."bom-ref",
|
|
527
|
+
"purl": purl
|
|
528
|
+
}
|
|
529
|
+
message: "Unexpected privilege transition detected for '{{ $prop($, 'path') }}' (auid={{ $prop($, 'auid') }}, euid={{ $prop($, 'euid') }})"
|
|
530
|
+
mitigation: "Validate binary provenance, file permissions, and recent package changes; treat unfamiliar setuid/setgid paths as high-priority review items."
|
|
531
|
+
evidence: |
|
|
532
|
+
{
|
|
533
|
+
"loginUser": $prop($, 'login_user'),
|
|
534
|
+
"path": $prop($, 'path'),
|
|
535
|
+
"cmdline": $prop($, 'cmdline'),
|
|
536
|
+
"parentCmdline": $prop($, 'parent_cmdline'),
|
|
537
|
+
"auid": $prop($, 'auid'),
|
|
538
|
+
"uid": $prop($, 'uid'),
|
|
539
|
+
"euid": $prop($, 'euid'),
|
|
540
|
+
"gid": $prop($, 'gid'),
|
|
541
|
+
"egid": $prop($, 'egid'),
|
|
542
|
+
"packageSourceHint": $prop($, 'package_source_hint')
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
- id: OBOM-LNX-010
|
|
546
|
+
name: "Elevated Linux process launched from user-writable or temporary path"
|
|
547
|
+
description: "Root processes executing from explicit user-controlled, temporary, or per-user runtime paths are a strong signal for persistence or package drift."
|
|
548
|
+
severity: critical
|
|
549
|
+
category: obom-runtime
|
|
550
|
+
dry-run-support: full
|
|
551
|
+
condition: |
|
|
552
|
+
components[
|
|
553
|
+
$prop($, 'cdx:osquery:category') = 'elevated_processes'
|
|
554
|
+
and $safeStr($prop($, 'uid')) = '0'
|
|
555
|
+
and (
|
|
556
|
+
$contains($nullSafeProp($, 'path'), '/tmp/')
|
|
557
|
+
or $contains($nullSafeProp($, 'path'), '/var/tmp/')
|
|
558
|
+
or $contains($nullSafeProp($, 'path'), '/dev/shm/')
|
|
559
|
+
or $contains($nullSafeProp($, 'path'), '/home/')
|
|
560
|
+
or $contains($nullSafeProp($, 'path'), '/run/user/')
|
|
561
|
+
or $contains($nullSafeProp($, 'cmdline'), '/tmp/')
|
|
562
|
+
or $contains($nullSafeProp($, 'cmdline'), '/var/tmp/')
|
|
563
|
+
or $contains($nullSafeProp($, 'cmdline'), '/dev/shm/')
|
|
564
|
+
or $contains($nullSafeProp($, 'cmdline'), '/home/')
|
|
565
|
+
or $contains($nullSafeProp($, 'cmdline'), '/run/user/')
|
|
566
|
+
or $safeStr($prop($, 'package_source_hint')) = 'user-writable-path'
|
|
567
|
+
)
|
|
568
|
+
and $safeStr(name) != 'systemd'
|
|
569
|
+
and $safeStr(name) != 'init'
|
|
570
|
+
]
|
|
571
|
+
location: |
|
|
572
|
+
{
|
|
573
|
+
"bomRef": $."bom-ref",
|
|
574
|
+
"purl": purl
|
|
575
|
+
}
|
|
576
|
+
message: "Elevated process '{{ name }}' executes from a risky path or command: {{ $firstNonEmpty($prop($, 'path'), $prop($, 'cmdline'), name) }}"
|
|
577
|
+
mitigation: "Validate the executable path and full command line, move approved binaries into trusted system locations, and investigate any root process sourced from writable directories or per-user runtime paths."
|
|
578
|
+
evidence: |
|
|
579
|
+
{
|
|
580
|
+
"account": $prop($, 'account'),
|
|
581
|
+
"path": $prop($, 'path'),
|
|
582
|
+
"cmdline": $prop($, 'cmdline'),
|
|
583
|
+
"serviceUnit": $prop($, 'service_unit'),
|
|
584
|
+
"parentPath": $prop($, 'parent_path'),
|
|
585
|
+
"parentCmdline": $prop($, 'parent_cmdline'),
|
|
586
|
+
"startTime": $prop($, 'start_time'),
|
|
587
|
+
"packageSourceHint": $prop($, 'package_source_hint')
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
- id: OBOM-LNX-011
|
|
591
|
+
name: "Interactive shell parent spawned privileged Linux execution"
|
|
592
|
+
description: "Shell-driven privileged chains are useful for separating admin changes from long-running service behavior."
|
|
593
|
+
severity: medium
|
|
594
|
+
category: obom-runtime
|
|
595
|
+
dry-run-support: full
|
|
596
|
+
condition: |
|
|
597
|
+
components[
|
|
598
|
+
$prop($, 'cdx:osquery:category') = 'sudo_executions'
|
|
599
|
+
and $safeStr($prop($, 'auid')) != ''
|
|
600
|
+
and $safeStr($prop($, 'auid')) != '0'
|
|
601
|
+
and (
|
|
602
|
+
$safeStr($prop($, 'euid')) = '0'
|
|
603
|
+
or $safeStr($prop($, 'effective_user')) = 'root'
|
|
604
|
+
)
|
|
605
|
+
and (
|
|
606
|
+
$safeStr($prop($, 'parent_name')) = 'bash'
|
|
607
|
+
or $safeStr($prop($, 'parent_name')) = 'sh'
|
|
608
|
+
or $safeStr($prop($, 'parent_name')) = 'zsh'
|
|
609
|
+
or $safeStr($prop($, 'parent_name')) = 'dash'
|
|
610
|
+
or $safeStr($prop($, 'parent_name')) = 'fish'
|
|
611
|
+
or $contains($lowercase($nullSafeProp($, 'parent_cmdline')), 'bash')
|
|
612
|
+
or $contains($lowercase($nullSafeProp($, 'parent_cmdline')), 'zsh')
|
|
613
|
+
or $contains($lowercase($nullSafeProp($, 'parent_cmdline')), 'fish')
|
|
614
|
+
)
|
|
615
|
+
]
|
|
616
|
+
location: |
|
|
617
|
+
{
|
|
618
|
+
"bomRef": $."bom-ref",
|
|
619
|
+
"purl": purl
|
|
620
|
+
}
|
|
621
|
+
message: "Interactive shell lineage for privileged command '{{ $prop($, 'cmdline') }}' merits change-review validation"
|
|
622
|
+
mitigation: "Correlate the privileged command with shell history, tickets, and package changes to confirm it was expected."
|
|
623
|
+
evidence: |
|
|
624
|
+
{
|
|
625
|
+
"loginUser": $prop($, 'login_user'),
|
|
626
|
+
"parentName": $prop($, 'parent_name'),
|
|
627
|
+
"parentCmdline": $prop($, 'parent_cmdline'),
|
|
628
|
+
"path": $prop($, 'path'),
|
|
629
|
+
"cmdline": $prop($, 'cmdline'),
|
|
630
|
+
"timestamp": $prop($, 'time')
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
- id: OBOM-LNX-012
|
|
634
|
+
name: "Linux Secure Boot inventory contains revoked certificate"
|
|
635
|
+
description: "Revoked entries in the Secure Boot trust inventory can indicate stale firmware trust policy or unexpected dbx posture drift."
|
|
636
|
+
severity: high
|
|
637
|
+
category: obom-runtime
|
|
638
|
+
dry-run-support: full
|
|
639
|
+
condition: |
|
|
640
|
+
components[
|
|
641
|
+
$prop($, 'cdx:osquery:category') = 'secureboot_certificates'
|
|
642
|
+
and $safeStr($prop($, 'revoked')) = '1'
|
|
643
|
+
]
|
|
644
|
+
location: |
|
|
645
|
+
{
|
|
646
|
+
"bomRef": $."bom-ref",
|
|
647
|
+
"purl": purl
|
|
648
|
+
}
|
|
649
|
+
message: "Secure Boot certificate '{{ name }}' is marked revoked in firmware trust inventory"
|
|
650
|
+
mitigation: "Review db/dbx enrollment, remove stale trust anchors, and reconcile firmware policy with approved platform signing certificates."
|
|
651
|
+
evidence: |
|
|
652
|
+
{
|
|
653
|
+
"subject": $prop($, 'subject'),
|
|
654
|
+
"issuer": $prop($, 'issuer'),
|
|
655
|
+
"serial": $prop($, 'serial'),
|
|
656
|
+
"path": $prop($, 'path'),
|
|
657
|
+
"notValidAfter": $prop($, 'not_valid_after')
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
- id: OBOM-LNX-013
|
|
661
|
+
name: "Linux Secure Boot certificate expired or expiring soon"
|
|
662
|
+
description: "Secure Boot trust anchors nearing expiry can cause firmware validation drift and interrupt planned key rotation windows."
|
|
663
|
+
severity: medium
|
|
664
|
+
category: obom-runtime
|
|
665
|
+
dry-run-support: full
|
|
666
|
+
condition: |
|
|
667
|
+
components[
|
|
668
|
+
$prop($, 'cdx:osquery:category') = 'secureboot_certificates'
|
|
669
|
+
and $safeStr($prop($, 'not_valid_after')) != ''
|
|
670
|
+
and $number($prop($, 'not_valid_after')) <= ($floor($millis() / 1000) + 2592000)
|
|
671
|
+
]
|
|
672
|
+
location: |
|
|
673
|
+
{
|
|
674
|
+
"bomRef": $."bom-ref",
|
|
675
|
+
"purl": purl
|
|
676
|
+
}
|
|
677
|
+
message: "Secure Boot certificate '{{ name }}' expires at {{ $prop($, 'not_valid_after') }} and should be rotated or reviewed"
|
|
678
|
+
mitigation: "Rotate or re-enroll Secure Boot certificates before expiry and validate firmware trust stores against your approved signing hierarchy."
|
|
679
|
+
evidence: |
|
|
680
|
+
{
|
|
681
|
+
"subject": $prop($, 'subject'),
|
|
682
|
+
"issuer": $prop($, 'issuer'),
|
|
683
|
+
"serial": $prop($, 'serial'),
|
|
684
|
+
"path": $prop($, 'path'),
|
|
685
|
+
"notValidBefore": $prop($, 'not_valid_before'),
|
|
686
|
+
"notValidAfter": $prop($, 'not_valid_after')
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
- id: OBOM-WIN-004
|
|
690
|
+
name: "Hidden scheduled task uses suspicious execution path"
|
|
691
|
+
description: "Enabled hidden tasks executing from temp paths or encoded script launchers are common persistence tradecraft."
|
|
692
|
+
severity: high
|
|
693
|
+
category: obom-runtime
|
|
694
|
+
dry-run-support: full
|
|
695
|
+
condition: |
|
|
696
|
+
components[
|
|
697
|
+
$prop($, 'cdx:osquery:category') = 'scheduled_tasks'
|
|
698
|
+
and $safeStr($prop($, 'enabled')) = '1'
|
|
699
|
+
and $safeStr($prop($, 'hidden')) = '1'
|
|
700
|
+
and (
|
|
701
|
+
$contains($lowercase($nullSafeProp($, 'path')), '\\temp\\')
|
|
702
|
+
or ($contains($lowercase($nullSafeProp($, 'action')), 'powershell') and $contains($lowercase($nullSafeProp($, 'action')), '-enc '))
|
|
703
|
+
)
|
|
704
|
+
]
|
|
705
|
+
location: |
|
|
706
|
+
{
|
|
707
|
+
"bomRef": $."bom-ref",
|
|
708
|
+
"purl": purl
|
|
709
|
+
}
|
|
710
|
+
message: "Hidden scheduled task '{{ name }}' has suspicious action/path: {{ $prop($, 'action') }}"
|
|
711
|
+
mitigation: "Validate author and binary lineage, disable unauthorized tasks, and investigate task registration event history."
|
|
712
|
+
evidence: |
|
|
713
|
+
{
|
|
714
|
+
"taskName": name,
|
|
715
|
+
"taskPath": $prop($, 'path'),
|
|
716
|
+
"action": $prop($, 'action'),
|
|
717
|
+
"state": $prop($, 'state')
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
- id: OBOM-WIN-005
|
|
721
|
+
name: "Auto-start Windows service points to user-writable path"
|
|
722
|
+
description: "Auto-start services from temp or AppData paths may indicate privilege persistence through service hijacking."
|
|
723
|
+
severity: critical
|
|
724
|
+
category: obom-runtime
|
|
725
|
+
dry-run-support: full
|
|
726
|
+
condition: |
|
|
727
|
+
components[
|
|
728
|
+
$prop($, 'cdx:osquery:category') = 'services_snapshot'
|
|
729
|
+
and $safeStr($prop($, 'start_type')) = 'AUTO_START'
|
|
730
|
+
and (
|
|
731
|
+
$contains($lowercase($nullSafeProp($, 'path')), '\\temp\\')
|
|
732
|
+
or $contains($lowercase($nullSafeProp($, 'path')), '\\appdata\\')
|
|
733
|
+
)
|
|
734
|
+
]
|
|
735
|
+
location: |
|
|
736
|
+
{
|
|
737
|
+
"bomRef": $."bom-ref",
|
|
738
|
+
"purl": purl
|
|
739
|
+
}
|
|
740
|
+
message: "Auto-start service '{{ name }}' launches from a user-writable path: {{ $prop($, 'path') }}"
|
|
741
|
+
mitigation: "Move binaries to protected system paths, lock ACLs, and validate service image hashes/signatures."
|
|
742
|
+
evidence: |
|
|
743
|
+
{
|
|
744
|
+
"serviceName": name,
|
|
745
|
+
"displayName": $prop($, 'display_name'),
|
|
746
|
+
"servicePath": $prop($, 'path'),
|
|
747
|
+
"account": $prop($, 'user_account')
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
- id: OBOM-WIN-006
|
|
751
|
+
name: "Windows suspicious persistence surface references LOLBAS execution helper"
|
|
752
|
+
description: "Any Windows persistence or startup surface that invokes a LOLBAS helper deserves review, including vendor- or platform-managed maintenance registrations, because these surfaces can become breachable execution targets."
|
|
753
|
+
severity: high
|
|
754
|
+
category: obom-runtime
|
|
755
|
+
dry-run-support: full
|
|
756
|
+
condition: |
|
|
757
|
+
components[
|
|
758
|
+
$prop($, 'cdx:lolbas:matched') = 'true'
|
|
759
|
+
and (
|
|
760
|
+
$prop($, 'cdx:osquery:category') = 'windows_run_keys'
|
|
761
|
+
or $prop($, 'cdx:osquery:category') = 'scheduled_tasks'
|
|
762
|
+
or $prop($, 'cdx:osquery:category') = 'startup_items'
|
|
763
|
+
or $prop($, 'cdx:osquery:category') = 'services_snapshot'
|
|
764
|
+
)
|
|
765
|
+
and (
|
|
766
|
+
$listContains($prop($, 'cdx:lolbas:functions'), 'command')
|
|
767
|
+
or $listContains($prop($, 'cdx:lolbas:functions'), 'script-execution')
|
|
768
|
+
or $listContains($prop($, 'cdx:lolbas:functions'), 'proxy-execution')
|
|
769
|
+
or $listContains($prop($, 'cdx:lolbas:functions'), 'library-load')
|
|
770
|
+
or $listContains($prop($, 'cdx:lolbas:functions'), 'shell')
|
|
771
|
+
)
|
|
772
|
+
]
|
|
773
|
+
location: |
|
|
774
|
+
{
|
|
775
|
+
"bomRef": $."bom-ref",
|
|
776
|
+
"purl": purl
|
|
777
|
+
}
|
|
778
|
+
message: "Windows {{ $prop($, 'cdx:osquery:category') }} registration '{{ $firstNonEmpty($prop($, 'key'), $prop($, 'path'), name) }}' launches '{{ $firstNonEmpty($prop($, 'action'), $prop($, 'executable'), $prop($, 'module_path'), $prop($, 'path'), description, name) }}' via LOLBAS helper(s) {{ $prop($, 'cdx:lolbas:names') }}"
|
|
779
|
+
mitigation: "Review the registration surface and launched command together, validate the owning change, and do not auto-trust managed or vendor-owned maintenance surfaces without provenance and hardening review."
|
|
780
|
+
attack:
|
|
781
|
+
tactics: [TA0003, TA0004, TA0005]
|
|
782
|
+
techniques: [T1218, T1547]
|
|
783
|
+
evidence: |
|
|
784
|
+
{
|
|
785
|
+
"queryCategory": $prop($, 'cdx:osquery:category'),
|
|
786
|
+
"registrationPath": $firstNonEmpty($prop($, 'key'), $prop($, 'path'), name),
|
|
787
|
+
"targetPath": $firstNonEmpty($prop($, 'action'), $prop($, 'executable'), $prop($, 'module_path'), $prop($, 'path'), description),
|
|
788
|
+
"lolbasNames": $prop($, 'cdx:lolbas:names'),
|
|
789
|
+
"functions": $prop($, 'cdx:lolbas:functions'),
|
|
790
|
+
"matchFields": $prop($, 'cdx:lolbas:matchFields'),
|
|
791
|
+
"path": $prop($, 'path'),
|
|
792
|
+
"action": $prop($, 'action'),
|
|
793
|
+
"command": description
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
- id: OBOM-WIN-007
|
|
797
|
+
name: "Windows WMI or AppCompat persistence uses LOLBAS"
|
|
798
|
+
description: "WMI command consumers and AppCompat shims that invoke LOLBAS utilities are high-signal persistence and defense-evasion indicators."
|
|
799
|
+
severity: critical
|
|
800
|
+
category: obom-runtime
|
|
801
|
+
dry-run-support: full
|
|
802
|
+
condition: |
|
|
803
|
+
components[
|
|
804
|
+
$prop($, 'cdx:lolbas:matched') = 'true'
|
|
805
|
+
and (
|
|
806
|
+
$prop($, 'cdx:osquery:category') = 'appcompat_shims'
|
|
807
|
+
or $prop($, 'cdx:osquery:category') = 'wmi_cli_event_consumers'
|
|
808
|
+
or $prop($, 'cdx:osquery:category') = 'wmi_cli_event_consumers_snapshot'
|
|
809
|
+
)
|
|
810
|
+
]
|
|
811
|
+
location: |
|
|
812
|
+
{
|
|
813
|
+
"bomRef": $."bom-ref",
|
|
814
|
+
"purl": purl
|
|
815
|
+
}
|
|
816
|
+
message: "WMI/AppCompat persistence artifact '{{ name }}' references LOLBAS helper(s) {{ $prop($, 'cdx:lolbas:names') }}"
|
|
817
|
+
mitigation: "Treat as a persistence investigation, review WMI repository and shim databases, and remove unauthorized subscriptions or shim registrations."
|
|
818
|
+
attack:
|
|
819
|
+
tactics: [TA0003, TA0004, TA0005]
|
|
820
|
+
techniques: [T1218, T1546]
|
|
821
|
+
evidence: |
|
|
822
|
+
{
|
|
823
|
+
"queryCategory": $prop($, 'cdx:osquery:category'),
|
|
824
|
+
"lolbasNames": $prop($, 'cdx:lolbas:names'),
|
|
825
|
+
"functions": $prop($, 'cdx:lolbas:functions'),
|
|
826
|
+
"matchFields": $prop($, 'cdx:lolbas:matchFields'),
|
|
827
|
+
"path": $prop($, 'path'),
|
|
828
|
+
"executable": $prop($, 'executable'),
|
|
829
|
+
"commandLine": $prop($, 'command_line'),
|
|
830
|
+
"commandTemplate": $prop($, 'command_line_template')
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
- id: OBOM-WIN-008
|
|
834
|
+
name: "Windows startup or process activity uses network-capable LOLBAS"
|
|
835
|
+
description: "Network-capable LOLBAS helpers such as PowerShell, Certutil, Bitsadmin, or WMIC become higher priority when they appear in persistence surfaces or suspicious live process command lines."
|
|
836
|
+
severity: high
|
|
837
|
+
category: obom-runtime
|
|
838
|
+
dry-run-support: full
|
|
839
|
+
condition: |
|
|
840
|
+
components[
|
|
841
|
+
$prop($, 'cdx:lolbas:matched') = 'true'
|
|
842
|
+
and (
|
|
843
|
+
$listContains($prop($, 'cdx:lolbas:functions'), 'download')
|
|
844
|
+
or $listContains($prop($, 'cdx:lolbas:functions'), 'upload')
|
|
845
|
+
)
|
|
846
|
+
and (
|
|
847
|
+
$prop($, 'cdx:osquery:category') = 'windows_run_keys'
|
|
848
|
+
or $prop($, 'cdx:osquery:category') = 'scheduled_tasks'
|
|
849
|
+
or $prop($, 'cdx:osquery:category') = 'startup_items'
|
|
850
|
+
or (
|
|
851
|
+
$prop($, 'cdx:osquery:category') = 'processes'
|
|
852
|
+
and (
|
|
853
|
+
$contains($lowercase($nullSafeProp($, 'cmdline')), 'http://')
|
|
854
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'https://')
|
|
855
|
+
or $contains($lowercase($nullSafeProp($, 'cmdline')), '-enc ')
|
|
856
|
+
)
|
|
857
|
+
)
|
|
858
|
+
)
|
|
859
|
+
]
|
|
860
|
+
location: |
|
|
861
|
+
{
|
|
862
|
+
"bomRef": $."bom-ref",
|
|
863
|
+
"purl": purl
|
|
864
|
+
}
|
|
865
|
+
message: "Network-capable LOLBAS helper(s) {{ $prop($, 'cdx:lolbas:names') }} detected in '{{ $prop($, 'cdx:osquery:category') }}'"
|
|
866
|
+
mitigation: "Correlate with outbound connections and downloads, restrict unmanaged scripting/network utilities, and investigate encoded or remote-fetch command lines."
|
|
867
|
+
attack:
|
|
868
|
+
tactics: [TA0002, TA0010, TA0011]
|
|
869
|
+
techniques: [T1041, T1059.001, T1105]
|
|
870
|
+
evidence: |
|
|
871
|
+
{
|
|
872
|
+
"queryCategory": $prop($, 'cdx:osquery:category'),
|
|
873
|
+
"lolbasNames": $prop($, 'cdx:lolbas:names'),
|
|
874
|
+
"functions": $prop($, 'cdx:lolbas:functions'),
|
|
875
|
+
"command": description,
|
|
876
|
+
"cmdline": $prop($, 'cmdline'),
|
|
877
|
+
"action": $prop($, 'action')
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
- id: OBOM-WIN-009
|
|
881
|
+
name: "Network-facing Windows listener is a LOLBAS execution helper"
|
|
882
|
+
description: "A listening process backed by a LOLBAS execution helper is a strong remote-control or staging indicator on Windows endpoints."
|
|
883
|
+
severity: critical
|
|
884
|
+
category: obom-runtime
|
|
885
|
+
dry-run-support: full
|
|
886
|
+
condition: |
|
|
887
|
+
components[
|
|
888
|
+
$prop($, 'cdx:osquery:category') = 'listening_ports'
|
|
889
|
+
and $prop($, 'cdx:lolbas:matched') = 'true'
|
|
890
|
+
and (
|
|
891
|
+
$safeStr($prop($, 'address')) = '0.0.0.0'
|
|
892
|
+
or $safeStr($prop($, 'address')) = '::'
|
|
893
|
+
)
|
|
894
|
+
and (
|
|
895
|
+
$listContains($prop($, 'cdx:lolbas:functions'), 'command')
|
|
896
|
+
or $listContains($prop($, 'cdx:lolbas:functions'), 'script-execution')
|
|
897
|
+
or $listContains($prop($, 'cdx:lolbas:functions'), 'shell')
|
|
898
|
+
)
|
|
899
|
+
]
|
|
900
|
+
location: |
|
|
901
|
+
{
|
|
902
|
+
"bomRef": $."bom-ref",
|
|
903
|
+
"purl": purl
|
|
904
|
+
}
|
|
905
|
+
message: "Listening process '{{ name }}' on {{ $prop($, 'address') }}:{{ $prop($, 'port') }} matches LOLBAS helper(s) {{ $prop($, 'cdx:lolbas:names') }}"
|
|
906
|
+
mitigation: "Review parent process lineage, isolate unmanaged listeners, and block or remove unexpected inbound admin or scripting surfaces."
|
|
907
|
+
attack:
|
|
908
|
+
tactics: [TA0002, TA0005, TA0011]
|
|
909
|
+
techniques: [T1059, T1105, T1218]
|
|
910
|
+
evidence: |
|
|
911
|
+
{
|
|
912
|
+
"lolbasNames": $prop($, 'cdx:lolbas:names'),
|
|
913
|
+
"functions": $prop($, 'cdx:lolbas:functions'),
|
|
914
|
+
"path": $prop($, 'path'),
|
|
915
|
+
"cmdline": $prop($, 'cmdline'),
|
|
916
|
+
"address": $prop($, 'address'),
|
|
917
|
+
"port": $prop($, 'port')
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
- id: OBOM-WIN-010
|
|
921
|
+
name: "Windows persistence artifact uses LOLBAS with UAC-bypass context"
|
|
922
|
+
description: "Persistence surfaces that reference LOLBAS helpers documented with UAC-bypass behavior should be treated as privilege-escalation investigations."
|
|
923
|
+
severity: critical
|
|
924
|
+
category: obom-runtime
|
|
925
|
+
dry-run-support: full
|
|
926
|
+
condition: |
|
|
927
|
+
components[
|
|
928
|
+
$prop($, 'cdx:lolbas:matched') = 'true'
|
|
929
|
+
and $listContains($prop($, 'cdx:lolbas:contexts'), 'uac-bypass')
|
|
930
|
+
and (
|
|
931
|
+
$prop($, 'cdx:osquery:category') = 'windows_run_keys'
|
|
932
|
+
or $prop($, 'cdx:osquery:category') = 'scheduled_tasks'
|
|
933
|
+
or $prop($, 'cdx:osquery:category') = 'startup_items'
|
|
934
|
+
or $prop($, 'cdx:osquery:category') = 'wmi_cli_event_consumers'
|
|
935
|
+
or $prop($, 'cdx:osquery:category') = 'wmi_cli_event_consumers_snapshot'
|
|
936
|
+
)
|
|
937
|
+
]
|
|
938
|
+
location: |
|
|
939
|
+
{
|
|
940
|
+
"bomRef": $."bom-ref",
|
|
941
|
+
"purl": purl
|
|
942
|
+
}
|
|
943
|
+
message: "UAC-bypass-capable LOLBAS helper(s) {{ $prop($, 'cdx:lolbas:names') }} detected in Windows persistence artifact '{{ name }}'"
|
|
944
|
+
mitigation: "Investigate as a possible privilege-escalation foothold, remove unauthorized registration points, and enforce WDAC/AppLocker policies for known proxy binaries."
|
|
945
|
+
attack:
|
|
946
|
+
tactics: [TA0004, TA0005]
|
|
947
|
+
techniques: [T1548.002, T1218]
|
|
948
|
+
evidence: |
|
|
949
|
+
{
|
|
950
|
+
"queryCategory": $prop($, 'cdx:osquery:category'),
|
|
951
|
+
"lolbasNames": $prop($, 'cdx:lolbas:names'),
|
|
952
|
+
"contexts": $prop($, 'cdx:lolbas:contexts'),
|
|
953
|
+
"path": $prop($, 'path'),
|
|
954
|
+
"action": $prop($, 'action'),
|
|
955
|
+
"command": description
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
- id: OBOM-MAC-004
|
|
959
|
+
name: "macOS launchd override disables Apple-managed service"
|
|
960
|
+
description: "Launchd overrides disabling Apple-managed services can indicate tampering with built-in security or platform controls."
|
|
961
|
+
severity: medium
|
|
962
|
+
category: obom-runtime
|
|
963
|
+
dry-run-support: full
|
|
964
|
+
condition: |
|
|
965
|
+
components[
|
|
966
|
+
$prop($, 'cdx:osquery:category') = 'launchd_overrides'
|
|
967
|
+
and $safeStr($prop($, 'key')) = 'Disabled'
|
|
968
|
+
and (
|
|
969
|
+
$safeStr($prop($, 'value')) = '1'
|
|
970
|
+
or $lowercase($safeStr($prop($, 'value'))) = 'true'
|
|
971
|
+
)
|
|
972
|
+
and $startsWith($safeStr($prop($, 'label')), 'com.apple.')
|
|
973
|
+
]
|
|
974
|
+
location: |
|
|
975
|
+
{
|
|
976
|
+
"bomRef": $."bom-ref",
|
|
977
|
+
"purl": purl
|
|
978
|
+
}
|
|
979
|
+
message: "Launchd override disables Apple-managed label '{{ $prop($, 'label') }}'"
|
|
980
|
+
mitigation: "Review override provenance, restore approved launchd settings, and investigate unauthorized local configuration changes."
|
|
981
|
+
evidence: |
|
|
982
|
+
{
|
|
983
|
+
"label": $prop($, 'label'),
|
|
984
|
+
"key": $prop($, 'key'),
|
|
985
|
+
"value": $prop($, 'value'),
|
|
986
|
+
"uid": $prop($, 'uid'),
|
|
987
|
+
"plistPath": $prop($, 'path')
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
- id: OBOM-MAC-005
|
|
991
|
+
name: "macOS Gatekeeper enforcement is disabled or weakened"
|
|
992
|
+
description: "Gatekeeper should enforce assessments and identified-developer checks on managed macOS endpoints."
|
|
993
|
+
severity: high
|
|
994
|
+
category: obom-runtime
|
|
995
|
+
dry-run-support: full
|
|
996
|
+
condition: |
|
|
997
|
+
components[
|
|
998
|
+
$prop($, 'cdx:osquery:category') = 'gatekeeper'
|
|
999
|
+
and (
|
|
1000
|
+
$safeStr($prop($, 'assessments_enabled')) != '1'
|
|
1001
|
+
or $safeStr($prop($, 'dev_id_enabled')) != '1'
|
|
1002
|
+
)
|
|
1003
|
+
]
|
|
1004
|
+
location: |
|
|
1005
|
+
{
|
|
1006
|
+
"bomRef": $."bom-ref",
|
|
1007
|
+
"purl": purl
|
|
1008
|
+
}
|
|
1009
|
+
message: "Gatekeeper posture is weakened (assessments_enabled={{ $prop($, 'assessments_enabled') }}, dev_id_enabled={{ $prop($, 'dev_id_enabled') }})"
|
|
1010
|
+
mitigation: "Re-enable Gatekeeper assessments and identified-developer enforcement with spctl or an MDM configuration profile, then validate the host against baseline policy."
|
|
1011
|
+
evidence: |
|
|
1012
|
+
{
|
|
1013
|
+
"gatekeeperVersion": version,
|
|
1014
|
+
"opaqueVersion": description,
|
|
1015
|
+
"assessmentsEnabled": $prop($, 'assessments_enabled'),
|
|
1016
|
+
"devIdEnabled": $prop($, 'dev_id_enabled')
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
- id: OBOM-LNX-014
|
|
1020
|
+
name: "Linux reverse shell behavior detected in live process telemetry"
|
|
1021
|
+
description: "A shell process with a live remote socket is a strong signal for hands-on-keyboard abuse, staging, or remote command execution."
|
|
1022
|
+
severity: critical
|
|
1023
|
+
category: obom-runtime
|
|
1024
|
+
dry-run-support: full
|
|
1025
|
+
condition: |
|
|
1026
|
+
components[
|
|
1027
|
+
$prop($, 'cdx:osquery:category') = 'behavioral_reverse_shell'
|
|
1028
|
+
]
|
|
1029
|
+
location: |
|
|
1030
|
+
{
|
|
1031
|
+
"bomRef": $."bom-ref",
|
|
1032
|
+
"purl": purl
|
|
1033
|
+
}
|
|
1034
|
+
message: "Reverse-shell-like process behavior detected for '{{ name }}' reaching {{ $prop($, 'remote_address') }}:{{ $prop($, 'remote_port') }}"
|
|
1035
|
+
mitigation: "Isolate the host, review process lineage and parent shell context, and confirm whether the remote session is expected administrative activity."
|
|
1036
|
+
evidence: |
|
|
1037
|
+
{
|
|
1038
|
+
"path": $prop($, 'path'),
|
|
1039
|
+
"cmdline": $prop($, 'cmdline'),
|
|
1040
|
+
"parentCmdline": $prop($, 'parent_cmdline'),
|
|
1041
|
+
"remoteAddress": $prop($, 'remote_address'),
|
|
1042
|
+
"remotePort": $prop($, 'remote_port')
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
- id: OBOM-LNX-015
|
|
1046
|
+
name: "Linux process uses LD_PRELOAD from writable or temporary path"
|
|
1047
|
+
description: "LD_PRELOAD pointing at user-controlled paths can indicate library hijacking, stealth persistence, or runtime tampering."
|
|
1048
|
+
severity: high
|
|
1049
|
+
category: obom-runtime
|
|
1050
|
+
dry-run-support: full
|
|
1051
|
+
condition: |
|
|
1052
|
+
components[
|
|
1053
|
+
$prop($, 'cdx:osquery:category') = 'ld_preload'
|
|
1054
|
+
and (
|
|
1055
|
+
$contains($lowercase($safeStr($prop($, 'value'))), '/tmp/')
|
|
1056
|
+
or $contains($lowercase($safeStr($prop($, 'value'))), '/var/tmp/')
|
|
1057
|
+
or $contains($lowercase($safeStr($prop($, 'value'))), '/dev/shm/')
|
|
1058
|
+
or $contains($lowercase($safeStr($prop($, 'value'))), '/home/')
|
|
1059
|
+
or $contains($lowercase($safeStr($prop($, 'value'))), '/run/user/')
|
|
1060
|
+
)
|
|
1061
|
+
]
|
|
1062
|
+
location: |
|
|
1063
|
+
{
|
|
1064
|
+
"bomRef": $."bom-ref",
|
|
1065
|
+
"purl": purl
|
|
1066
|
+
}
|
|
1067
|
+
message: "Process '{{ name }}' sets LD_PRELOAD to a risky path: {{ $prop($, 'value') }}"
|
|
1068
|
+
mitigation: "Review the preload library, remove unauthorized runtime injection, and compare the process with package ownership and startup history."
|
|
1069
|
+
evidence: |
|
|
1070
|
+
{
|
|
1071
|
+
"processPath": $prop($, 'path'),
|
|
1072
|
+
"cmdline": $prop($, 'cmdline'),
|
|
1073
|
+
"cwd": $prop($, 'cwd'),
|
|
1074
|
+
"ldPreload": $prop($, 'value')
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
- id: OBOM-LNX-016
|
|
1078
|
+
name: "Linux cron entry fetches remote content or runs from writable path"
|
|
1079
|
+
description: "Cron jobs that fetch remote content or execute from temporary and user-writable paths are a high-signal persistence pattern."
|
|
1080
|
+
severity: high
|
|
1081
|
+
category: obom-runtime
|
|
1082
|
+
dry-run-support: full
|
|
1083
|
+
condition: |
|
|
1084
|
+
components[
|
|
1085
|
+
$prop($, 'cdx:osquery:category') = 'crontab_snapshot'
|
|
1086
|
+
and (
|
|
1087
|
+
(
|
|
1088
|
+
(
|
|
1089
|
+
$contains($lowercase($safeStr($prop($, 'command'))), 'curl ')
|
|
1090
|
+
or $contains($lowercase($safeStr($prop($, 'command'))), 'wget ')
|
|
1091
|
+
)
|
|
1092
|
+
and (
|
|
1093
|
+
$contains($lowercase($safeStr($prop($, 'command'))), 'http://')
|
|
1094
|
+
or $contains($lowercase($safeStr($prop($, 'command'))), 'https://')
|
|
1095
|
+
or $contains($lowercase($safeStr($prop($, 'command'))), '| sh')
|
|
1096
|
+
or $contains($lowercase($safeStr($prop($, 'command'))), '| bash')
|
|
1097
|
+
)
|
|
1098
|
+
)
|
|
1099
|
+
or $contains($lowercase($safeStr($prop($, 'command'))), '/tmp/')
|
|
1100
|
+
or $contains($lowercase($safeStr($prop($, 'command'))), '/var/tmp/')
|
|
1101
|
+
or $contains($lowercase($safeStr($prop($, 'command'))), '/dev/shm/')
|
|
1102
|
+
or $contains($lowercase($safeStr($prop($, 'command'))), '/home/')
|
|
1103
|
+
)
|
|
1104
|
+
]
|
|
1105
|
+
location: |
|
|
1106
|
+
{
|
|
1107
|
+
"bomRef": $."bom-ref",
|
|
1108
|
+
"purl": purl
|
|
1109
|
+
}
|
|
1110
|
+
message: "Cron entry '{{ name }}' has a risky command: {{ $prop($, 'command') }}"
|
|
1111
|
+
mitigation: "Move bootstrap downloads into a managed deployment path, review cron ownership, and remove unauthorized recurring tasks."
|
|
1112
|
+
evidence: |
|
|
1113
|
+
{
|
|
1114
|
+
"command": $prop($, 'command'),
|
|
1115
|
+
"path": $prop($, 'path'),
|
|
1116
|
+
"minute": $prop($, 'minute'),
|
|
1117
|
+
"hour": $prop($, 'hour')
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
- id: OBOM-LNX-017
|
|
1121
|
+
name: "Linux sysctl posture diverges from common hardening baseline"
|
|
1122
|
+
description: "Weak ASLR and redirect-handling sysctl values are commonly called out in Lynis and CIS-style hardening reviews."
|
|
1123
|
+
severity: medium
|
|
1124
|
+
category: obom-runtime
|
|
1125
|
+
dry-run-support: full
|
|
1126
|
+
condition: |
|
|
1127
|
+
components[
|
|
1128
|
+
$prop($, 'cdx:osquery:category') = 'sysctl_hardening'
|
|
1129
|
+
and (
|
|
1130
|
+
(name = 'kernel.randomize_va_space' and $safeStr(version) != '2')
|
|
1131
|
+
or (name = 'kernel.kptr_restrict' and $safeStr(version) = '0')
|
|
1132
|
+
or (
|
|
1133
|
+
(
|
|
1134
|
+
name = 'net.ipv4.conf.all.accept_redirects'
|
|
1135
|
+
or name = 'net.ipv4.conf.default.accept_redirects'
|
|
1136
|
+
or name = 'net.ipv4.conf.all.send_redirects'
|
|
1137
|
+
or name = 'net.ipv4.conf.default.send_redirects'
|
|
1138
|
+
)
|
|
1139
|
+
and $safeStr(version) = '1'
|
|
1140
|
+
)
|
|
1141
|
+
)
|
|
1142
|
+
]
|
|
1143
|
+
location: |
|
|
1144
|
+
{
|
|
1145
|
+
"bomRef": $."bom-ref",
|
|
1146
|
+
"purl": purl
|
|
1147
|
+
}
|
|
1148
|
+
message: "Sysctl '{{ name }}' has a weak hardening value: {{ version }}"
|
|
1149
|
+
mitigation: "Align the sysctl value with your baseline, apply the setting persistently, and validate whether the deviation is truly required for this host."
|
|
1150
|
+
evidence: |
|
|
1151
|
+
{
|
|
1152
|
+
"sysctl": name,
|
|
1153
|
+
"value": version
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
- id: OBOM-LNX-018
|
|
1157
|
+
name: "Linux temporary mount is missing key hardening flags"
|
|
1158
|
+
description: "Temporary and shared-memory mounts should usually carry noexec, nosuid, and nodev protections on hardened hosts."
|
|
1159
|
+
severity: high
|
|
1160
|
+
category: obom-runtime
|
|
1161
|
+
dry-run-support: full
|
|
1162
|
+
condition: |
|
|
1163
|
+
components[
|
|
1164
|
+
$prop($, 'cdx:osquery:category') = 'mount_hardening'
|
|
1165
|
+
and (
|
|
1166
|
+
name = '/tmp'
|
|
1167
|
+
or name = '/var/tmp'
|
|
1168
|
+
or name = '/dev/shm'
|
|
1169
|
+
)
|
|
1170
|
+
and (
|
|
1171
|
+
$not($contains($lowercase($safeStr(version)), 'noexec'))
|
|
1172
|
+
or $not($contains($lowercase($safeStr(version)), 'nosuid'))
|
|
1173
|
+
or $not($contains($lowercase($safeStr(version)), 'nodev'))
|
|
1174
|
+
)
|
|
1175
|
+
]
|
|
1176
|
+
location: |
|
|
1177
|
+
{
|
|
1178
|
+
"bomRef": $."bom-ref",
|
|
1179
|
+
"purl": purl
|
|
1180
|
+
}
|
|
1181
|
+
message: "Mount '{{ name }}' is missing one or more hardening flags: {{ version }}"
|
|
1182
|
+
mitigation: "Review whether the mount should carry noexec, nosuid, and nodev, then enforce the chosen baseline through fstab, systemd mounts, or image build policy."
|
|
1183
|
+
evidence: |
|
|
1184
|
+
{
|
|
1185
|
+
"mount": name,
|
|
1186
|
+
"flags": version,
|
|
1187
|
+
"device": description,
|
|
1188
|
+
"type": $prop($, 'type')
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
- id: OBOM-LNX-019
|
|
1192
|
+
name: "Live Linux runtime artifact matches GTFOBins execution helper"
|
|
1193
|
+
description: "GTFOBins-capable binaries in privileged or network-active runtime contexts deserve elevated review because they compress execution, persistence, and lateral movement tradecraft into familiar tools."
|
|
1194
|
+
severity: high
|
|
1195
|
+
category: obom-runtime
|
|
1196
|
+
dry-run-support: full
|
|
1197
|
+
condition: |
|
|
1198
|
+
components[
|
|
1199
|
+
$prop($, 'cdx:gtfobins:matched') = 'true'
|
|
1200
|
+
and (
|
|
1201
|
+
$prop($, 'cdx:osquery:category') = 'sudo_executions'
|
|
1202
|
+
or $prop($, 'cdx:osquery:category') = 'privilege_transitions'
|
|
1203
|
+
or $prop($, 'cdx:osquery:category') = 'privileged_listening_ports'
|
|
1204
|
+
or $prop($, 'cdx:osquery:category') = 'behavioral_reverse_shell'
|
|
1205
|
+
or (
|
|
1206
|
+
$prop($, 'cdx:osquery:category') = 'elevated_processes'
|
|
1207
|
+
and (
|
|
1208
|
+
$safeStr($prop($, 'package_source_hint')) = 'user-writable-path'
|
|
1209
|
+
or $contains($nullSafeProp($, 'path'), '/tmp/')
|
|
1210
|
+
or $contains($nullSafeProp($, 'path'), '/var/tmp/')
|
|
1211
|
+
or $contains($nullSafeProp($, 'path'), '/dev/shm/')
|
|
1212
|
+
or $contains($nullSafeProp($, 'path'), '/home/')
|
|
1213
|
+
or $contains($nullSafeProp($, 'path'), '/run/user/')
|
|
1214
|
+
or $contains($nullSafeProp($, 'cmdline'), '/tmp/')
|
|
1215
|
+
or $contains($nullSafeProp($, 'cmdline'), '/var/tmp/')
|
|
1216
|
+
or $contains($nullSafeProp($, 'cmdline'), '/dev/shm/')
|
|
1217
|
+
or $contains($nullSafeProp($, 'cmdline'), '/home/')
|
|
1218
|
+
or $contains($nullSafeProp($, 'cmdline'), '/run/user/')
|
|
1219
|
+
)
|
|
1220
|
+
)
|
|
1221
|
+
)
|
|
1222
|
+
and (
|
|
1223
|
+
$listContains($prop($, 'cdx:gtfobins:functions'), 'shell')
|
|
1224
|
+
or $listContains($prop($, 'cdx:gtfobins:functions'), 'command')
|
|
1225
|
+
or $listContains($prop($, 'cdx:gtfobins:functions'), 'reverse-shell')
|
|
1226
|
+
)
|
|
1227
|
+
]
|
|
1228
|
+
location: |
|
|
1229
|
+
{
|
|
1230
|
+
"bomRef": $."bom-ref",
|
|
1231
|
+
"purl": purl
|
|
1232
|
+
}
|
|
1233
|
+
message: "Runtime artifact '{{ name }}' matches GTFOBins helper(s) {{ $prop($, 'cdx:gtfobins:names') }} in '{{ $prop($, 'cdx:osquery:category') }}'"
|
|
1234
|
+
mitigation: "Validate the binary provenance and operator intent, then review related sudo, privilege-transition, listener, and remote-connection telemetry before suppressing the finding."
|
|
1235
|
+
evidence: |
|
|
1236
|
+
{
|
|
1237
|
+
"queryCategory": $prop($, 'cdx:osquery:category'),
|
|
1238
|
+
"gtfobinsNames": $prop($, 'cdx:gtfobins:names'),
|
|
1239
|
+
"functions": $prop($, 'cdx:gtfobins:functions'),
|
|
1240
|
+
"contexts": $prop($, 'cdx:gtfobins:contexts'),
|
|
1241
|
+
"riskTags": $prop($, 'cdx:gtfobins:riskTags'),
|
|
1242
|
+
"path": $prop($, 'path'),
|
|
1243
|
+
"cmdline": $prop($, 'cmdline')
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
- id: OBOM-WIN-011
|
|
1247
|
+
name: "Windows Public profile inbound firewall allow rule"
|
|
1248
|
+
description: "Inbound allow rules on the Public firewall profile can expose services beyond expected trust boundaries."
|
|
1249
|
+
severity: high
|
|
1250
|
+
category: obom-runtime
|
|
1251
|
+
dry-run-support: full
|
|
1252
|
+
condition: |
|
|
1253
|
+
components[
|
|
1254
|
+
$prop($, 'cdx:osquery:category') = 'windows_firewall_rules'
|
|
1255
|
+
and (
|
|
1256
|
+
$lowercase($safeStr($prop($, 'enabled'))) = '1'
|
|
1257
|
+
or $lowercase($safeStr($prop($, 'enabled'))) = 'true'
|
|
1258
|
+
)
|
|
1259
|
+
and $lowercase($safeStr($prop($, 'direction'))) = 'in'
|
|
1260
|
+
and $lowercase($safeStr($prop($, 'action'))) = 'allow'
|
|
1261
|
+
and $contains($lowercase($safeStr($prop($, 'profile'))), 'public')
|
|
1262
|
+
]
|
|
1263
|
+
location: |
|
|
1264
|
+
{
|
|
1265
|
+
"bomRef": $."bom-ref",
|
|
1266
|
+
"purl": purl
|
|
1267
|
+
}
|
|
1268
|
+
message: "Firewall rule '{{ name }}' allows inbound traffic on the Public profile"
|
|
1269
|
+
mitigation: "Narrow the rule scope, move it to a more trusted profile when justified, and verify the backing service really needs public-network reachability."
|
|
1270
|
+
evidence: |
|
|
1271
|
+
{
|
|
1272
|
+
"action": $prop($, 'action'),
|
|
1273
|
+
"direction": $prop($, 'direction'),
|
|
1274
|
+
"profile": $prop($, 'profile'),
|
|
1275
|
+
"localPorts": $prop($, 'local_ports'),
|
|
1276
|
+
"remoteAddresses": $prop($, 'remote_addresses')
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
- id: OBOM-WIN-012
|
|
1280
|
+
name: "Windows startup or listener binary has invalid Authenticode status"
|
|
1281
|
+
description: "Persistence and network-facing artifacts backed by definitively invalid Authenticode status deserve urgent review on managed Windows hosts."
|
|
1282
|
+
severity: critical
|
|
1283
|
+
category: obom-runtime
|
|
1284
|
+
dry-run-support: full
|
|
1285
|
+
condition: |
|
|
1286
|
+
components[
|
|
1287
|
+
(
|
|
1288
|
+
$prop($, 'cdx:osquery:category') = 'windows_run_keys'
|
|
1289
|
+
or $prop($, 'cdx:osquery:category') = 'scheduled_tasks'
|
|
1290
|
+
or $prop($, 'cdx:osquery:category') = 'startup_items'
|
|
1291
|
+
or $prop($, 'cdx:osquery:category') = 'services_snapshot'
|
|
1292
|
+
or $prop($, 'cdx:osquery:category') = 'listening_ports'
|
|
1293
|
+
)
|
|
1294
|
+
and $not(
|
|
1295
|
+
$contains(
|
|
1296
|
+
$lowercase(
|
|
1297
|
+
$firstNonEmpty(
|
|
1298
|
+
$prop($, 'image_path'),
|
|
1299
|
+
$prop($, 'executable'),
|
|
1300
|
+
$prop($, 'action'),
|
|
1301
|
+
$prop($, 'module_path'),
|
|
1302
|
+
$prop($, 'path'),
|
|
1303
|
+
description,
|
|
1304
|
+
name
|
|
1305
|
+
)
|
|
1306
|
+
),
|
|
1307
|
+
'.lnk'
|
|
1308
|
+
)
|
|
1309
|
+
)
|
|
1310
|
+
and $hasProp($, 'cdx:windows:authenticode:status')
|
|
1311
|
+
and $lowercase($safeStr($prop($, 'cdx:windows:authenticode:status'))) != 'valid'
|
|
1312
|
+
and $lowercase($safeStr($prop($, 'cdx:windows:authenticode:status'))) != 'unknown'
|
|
1313
|
+
and $lowercase($safeStr($prop($, 'cdx:windows:authenticode:status'))) != 'unknownerror'
|
|
1314
|
+
and $lowercase($safeStr($prop($, 'cdx:windows:authenticode:status'))) != 'unknown_error'
|
|
1315
|
+
]
|
|
1316
|
+
location: |
|
|
1317
|
+
{
|
|
1318
|
+
"bomRef": $."bom-ref",
|
|
1319
|
+
"purl": purl
|
|
1320
|
+
}
|
|
1321
|
+
message: "Windows {{ $prop($, 'cdx:osquery:category') }} registration '{{ $firstNonEmpty($prop($, 'key'), $prop($, 'path'), name) }}' resolves to '{{ $firstNonEmpty($prop($, 'image_path'), $prop($, 'executable'), $prop($, 'action'), $prop($, 'module_path'), $prop($, 'path'), description, name) }}' with Authenticode status {{ $prop($, 'cdx:windows:authenticode:status') }}"
|
|
1322
|
+
mitigation: "Review the startup/listener registration and backing binary together, treat the executable as suspicious until provenance is confirmed, compare the hash and signer with an approved baseline, and investigate who registered the surface."
|
|
1323
|
+
evidence: |
|
|
1324
|
+
{
|
|
1325
|
+
"queryCategory": $prop($, 'cdx:osquery:category'),
|
|
1326
|
+
"registrationPath": $firstNonEmpty($prop($, 'key'), $prop($, 'path'), name),
|
|
1327
|
+
"targetPath": $firstNonEmpty($prop($, 'image_path'), $prop($, 'executable'), $prop($, 'action'), $prop($, 'module_path'), $prop($, 'path'), description),
|
|
1328
|
+
"path": $prop($, 'path'),
|
|
1329
|
+
"imagePath": $prop($, 'image_path'),
|
|
1330
|
+
"action": $prop($, 'action'),
|
|
1331
|
+
"authenticodeStatus": $prop($, 'cdx:windows:authenticode:status'),
|
|
1332
|
+
"signerSubject": $prop($, 'cdx:windows:authenticode:signerSubject')
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
- id: OBOM-WIN-014
|
|
1336
|
+
name: "Windows user-controlled startup or listener binary has unresolved Authenticode status"
|
|
1337
|
+
description: "Unknown Authenticode state on binaries launched from user-controlled startup or network-facing surfaces deserves review even when Windows cannot conclusively mark the signature invalid."
|
|
1338
|
+
severity: high
|
|
1339
|
+
category: obom-runtime
|
|
1340
|
+
dry-run-support: full
|
|
1341
|
+
condition: |
|
|
1342
|
+
components[
|
|
1343
|
+
(
|
|
1344
|
+
$prop($, 'cdx:osquery:category') = 'windows_run_keys'
|
|
1345
|
+
or $prop($, 'cdx:osquery:category') = 'scheduled_tasks'
|
|
1346
|
+
or $prop($, 'cdx:osquery:category') = 'startup_items'
|
|
1347
|
+
or $prop($, 'cdx:osquery:category') = 'services_snapshot'
|
|
1348
|
+
or $prop($, 'cdx:osquery:category') = 'listening_ports'
|
|
1349
|
+
)
|
|
1350
|
+
and $not(
|
|
1351
|
+
$contains(
|
|
1352
|
+
$lowercase(
|
|
1353
|
+
$firstNonEmpty(
|
|
1354
|
+
$prop($, 'image_path'),
|
|
1355
|
+
$prop($, 'executable'),
|
|
1356
|
+
$prop($, 'action'),
|
|
1357
|
+
$prop($, 'module_path'),
|
|
1358
|
+
$prop($, 'path'),
|
|
1359
|
+
description,
|
|
1360
|
+
name
|
|
1361
|
+
)
|
|
1362
|
+
),
|
|
1363
|
+
'.lnk'
|
|
1364
|
+
)
|
|
1365
|
+
)
|
|
1366
|
+
and $hasProp($, 'cdx:windows:authenticode:status')
|
|
1367
|
+
and (
|
|
1368
|
+
$lowercase($safeStr($prop($, 'cdx:windows:authenticode:status'))) = 'unknown'
|
|
1369
|
+
or $lowercase($safeStr($prop($, 'cdx:windows:authenticode:status'))) = 'unknownerror'
|
|
1370
|
+
or $lowercase($safeStr($prop($, 'cdx:windows:authenticode:status'))) = 'unknown_error'
|
|
1371
|
+
)
|
|
1372
|
+
and (
|
|
1373
|
+
$isWindowsUserControlledPath(
|
|
1374
|
+
$firstNonEmpty(
|
|
1375
|
+
$prop($, 'image_path'),
|
|
1376
|
+
$prop($, 'executable'),
|
|
1377
|
+
$prop($, 'action'),
|
|
1378
|
+
description,
|
|
1379
|
+
$prop($, 'path'),
|
|
1380
|
+
name
|
|
1381
|
+
)
|
|
1382
|
+
)
|
|
1383
|
+
or $isWindowsUserControlledPath(
|
|
1384
|
+
$firstNonEmpty($prop($, 'path'), $prop($, 'key'), name)
|
|
1385
|
+
)
|
|
1386
|
+
)
|
|
1387
|
+
]
|
|
1388
|
+
location: |
|
|
1389
|
+
{
|
|
1390
|
+
"bomRef": $."bom-ref",
|
|
1391
|
+
"purl": purl
|
|
1392
|
+
}
|
|
1393
|
+
message: "Windows {{ $prop($, 'cdx:osquery:category') }} registration '{{ $firstNonEmpty($prop($, 'key'), $prop($, 'path'), name) }}' resolves to '{{ $firstNonEmpty($prop($, 'image_path'), $prop($, 'executable'), $prop($, 'action'), $prop($, 'module_path'), $prop($, 'path'), description, name) }}' with unresolved Authenticode status {{ $prop($, 'cdx:windows:authenticode:status') }}"
|
|
1394
|
+
mitigation: "Review the startup/listener registration and backing binary together, confirm signature collection completed successfully, compare the hash and signer with an approved baseline, and prioritize cleanup of user-controlled execution paths."
|
|
1395
|
+
evidence: |
|
|
1396
|
+
{
|
|
1397
|
+
"queryCategory": $prop($, 'cdx:osquery:category'),
|
|
1398
|
+
"registrationPath": $firstNonEmpty($prop($, 'key'), $prop($, 'path'), name),
|
|
1399
|
+
"targetPath": $firstNonEmpty($prop($, 'image_path'), $prop($, 'executable'), $prop($, 'action'), $prop($, 'module_path'), $prop($, 'path'), description),
|
|
1400
|
+
"path": $prop($, 'path'),
|
|
1401
|
+
"imagePath": $prop($, 'image_path'),
|
|
1402
|
+
"action": $prop($, 'action'),
|
|
1403
|
+
"authenticodeStatus": $prop($, 'cdx:windows:authenticode:status'),
|
|
1404
|
+
"signerSubject": $prop($, 'cdx:windows:authenticode:signerSubject')
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
- id: OBOM-WIN-013
|
|
1408
|
+
name: "Windows host has no active WDAC policies"
|
|
1409
|
+
description: "A managed Windows endpoint with no active WDAC policy loses an important application control and allowlisting layer."
|
|
1410
|
+
severity: high
|
|
1411
|
+
category: obom-runtime
|
|
1412
|
+
dry-run-support: full
|
|
1413
|
+
condition: |
|
|
1414
|
+
components[
|
|
1415
|
+
$hasProp($, 'cdx:windows:wdac:activePolicyCount')
|
|
1416
|
+
and $safeStr($prop($, 'cdx:windows:wdac:activePolicyCount')) = '0'
|
|
1417
|
+
]
|
|
1418
|
+
location: |
|
|
1419
|
+
{
|
|
1420
|
+
"bomRef": $."bom-ref",
|
|
1421
|
+
"purl": purl
|
|
1422
|
+
}
|
|
1423
|
+
message: "Windows Defender Application Control is not enforcing any active policy on this host"
|
|
1424
|
+
mitigation: "Deploy or restore the approved WDAC policy set and review why policy enforcement is absent on the endpoint."
|
|
1425
|
+
evidence: |
|
|
1426
|
+
{
|
|
1427
|
+
"component": name,
|
|
1428
|
+
"activePolicyCount": $prop($, 'cdx:windows:wdac:activePolicyCount')
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
- id: OBOM-MAC-006
|
|
1432
|
+
name: "macOS running app launches from Downloads, Desktop, or temporary path"
|
|
1433
|
+
description: "User-space execution from Downloads, Desktop, or temporary folders is a useful triage signal for ad hoc tooling and unreviewed payloads."
|
|
1434
|
+
severity: medium
|
|
1435
|
+
category: obom-runtime
|
|
1436
|
+
dry-run-support: full
|
|
1437
|
+
condition: |
|
|
1438
|
+
components[
|
|
1439
|
+
$prop($, 'cdx:osquery:category') = 'running_apps'
|
|
1440
|
+
and (
|
|
1441
|
+
$contains($safeStr($prop($, 'bundle_path')), '/Users/')
|
|
1442
|
+
and (
|
|
1443
|
+
$contains($safeStr($prop($, 'bundle_path')), '/Downloads/')
|
|
1444
|
+
or $contains($safeStr($prop($, 'bundle_path')), '/Desktop/')
|
|
1445
|
+
or $contains($safeStr($prop($, 'bundle_path')), '/tmp/')
|
|
1446
|
+
)
|
|
1447
|
+
)
|
|
1448
|
+
]
|
|
1449
|
+
location: |
|
|
1450
|
+
{
|
|
1451
|
+
"bomRef": $."bom-ref",
|
|
1452
|
+
"purl": purl
|
|
1453
|
+
}
|
|
1454
|
+
message: "Running app '{{ name }}' originates from a risky user path: {{ $prop($, 'bundle_path') }}"
|
|
1455
|
+
mitigation: "Validate the app origin, move approved software into managed application paths, and investigate unexpected user-land execution."
|
|
1456
|
+
evidence: |
|
|
1457
|
+
{
|
|
1458
|
+
"bundlePath": $prop($, 'bundle_path'),
|
|
1459
|
+
"bundleExecutable": $prop($, 'bundle_executable'),
|
|
1460
|
+
"isFinishedLaunching": $prop($, 'is_finished_launching')
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
- id: OBOM-MAC-007
|
|
1464
|
+
name: "macOS startup or application artifact failed notarization assessment"
|
|
1465
|
+
description: "Launchd, startup, and application artifacts with rejected notarization assessment deserve review before they are treated as trusted software."
|
|
1466
|
+
severity: high
|
|
1467
|
+
category: obom-runtime
|
|
1468
|
+
dry-run-support: full
|
|
1469
|
+
condition: |
|
|
1470
|
+
components[
|
|
1471
|
+
(
|
|
1472
|
+
(
|
|
1473
|
+
(
|
|
1474
|
+
$prop($, 'cdx:osquery:category') = 'launchd_services'
|
|
1475
|
+
or $prop($, 'cdx:osquery:category') = 'startup_items'
|
|
1476
|
+
)
|
|
1477
|
+
and (
|
|
1478
|
+
$not(
|
|
1479
|
+
$isDarwinSystemPath(
|
|
1480
|
+
$firstNonEmpty($prop($, 'path'), $prop($, 'bundle_path'))
|
|
1481
|
+
)
|
|
1482
|
+
)
|
|
1483
|
+
or $not(
|
|
1484
|
+
$isDarwinSystemPath(
|
|
1485
|
+
$firstNonEmpty(
|
|
1486
|
+
$prop($, 'program'),
|
|
1487
|
+
$prop($, 'bundle_executable'),
|
|
1488
|
+
$prop($, 'bundle_path'),
|
|
1489
|
+
$prop($, 'path')
|
|
1490
|
+
)
|
|
1491
|
+
)
|
|
1492
|
+
)
|
|
1493
|
+
)
|
|
1494
|
+
)
|
|
1495
|
+
or (
|
|
1496
|
+
$prop($, 'cdx:osquery:category') = 'running_apps'
|
|
1497
|
+
and $not(
|
|
1498
|
+
$isDarwinSystemPath(
|
|
1499
|
+
$firstNonEmpty($prop($, 'bundle_path'), $prop($, 'path'))
|
|
1500
|
+
)
|
|
1501
|
+
)
|
|
1502
|
+
)
|
|
1503
|
+
)
|
|
1504
|
+
and $hasProp($, 'cdx:darwin:notarization:assessment')
|
|
1505
|
+
and $lowercase($safeStr($prop($, 'cdx:darwin:notarization:assessment'))) = 'rejected'
|
|
1506
|
+
]
|
|
1507
|
+
location: |
|
|
1508
|
+
{
|
|
1509
|
+
"bomRef": $."bom-ref",
|
|
1510
|
+
"purl": purl
|
|
1511
|
+
}
|
|
1512
|
+
message: "macOS {{ $prop($, 'cdx:osquery:category') }} artifact '{{ name }}' uses registration path '{{ $firstNonEmpty($prop($, 'path'), $prop($, 'bundle_path'), name) }}' and target '{{ $firstNonEmpty($prop($, 'program'), $prop($, 'bundle_executable'), $prop($, 'bundle_path'), $prop($, 'path'), name) }}' with notarization assessment {{ $prop($, 'cdx:darwin:notarization:assessment') }}"
|
|
1513
|
+
mitigation: "Review the registration/config path and backing executable together, confirm the signer or team identifier against approved inventory, and remove or quarantine unexpected startup items or app bundles."
|
|
1514
|
+
evidence: |
|
|
1515
|
+
{
|
|
1516
|
+
"queryCategory": $prop($, 'cdx:osquery:category'),
|
|
1517
|
+
"registrationPath": $firstNonEmpty($prop($, 'path'), $prop($, 'bundle_path')),
|
|
1518
|
+
"targetPath": $firstNonEmpty($prop($, 'program'), $prop($, 'bundle_executable'), $prop($, 'bundle_path'), $prop($, 'path')),
|
|
1519
|
+
"label": $prop($, 'label'),
|
|
1520
|
+
"path": $prop($, 'path'),
|
|
1521
|
+
"bundlePath": $prop($, 'bundle_path'),
|
|
1522
|
+
"bundleExecutable": $prop($, 'bundle_executable'),
|
|
1523
|
+
"program": $prop($, 'program'),
|
|
1524
|
+
"programArguments": $prop($, 'program_arguments'),
|
|
1525
|
+
"teamIdentifier": $prop($, 'cdx:darwin:codesign:teamIdentifier'),
|
|
1526
|
+
"notarizationAssessment": $prop($, 'cdx:darwin:notarization:assessment')
|
|
1527
|
+
}
|
|
1528
|
+
|
|
1529
|
+
- id: OBOM-MAC-008
|
|
1530
|
+
name: "macOS user-controlled startup or application artifact has unknown notarization assessment"
|
|
1531
|
+
description: "Launchd, startup, and application artifacts with unknown notarization assessment should be reviewed when they execute from user-controlled macOS paths."
|
|
1532
|
+
severity: medium
|
|
1533
|
+
category: obom-runtime
|
|
1534
|
+
dry-run-support: full
|
|
1535
|
+
condition: |
|
|
1536
|
+
components[
|
|
1537
|
+
(
|
|
1538
|
+
(
|
|
1539
|
+
(
|
|
1540
|
+
$prop($, 'cdx:osquery:category') = 'launchd_services'
|
|
1541
|
+
or $prop($, 'cdx:osquery:category') = 'startup_items'
|
|
1542
|
+
)
|
|
1543
|
+
and (
|
|
1544
|
+
$not(
|
|
1545
|
+
$isDarwinSystemPath(
|
|
1546
|
+
$firstNonEmpty($prop($, 'path'), $prop($, 'bundle_path'))
|
|
1547
|
+
)
|
|
1548
|
+
)
|
|
1549
|
+
or $not(
|
|
1550
|
+
$isDarwinSystemPath(
|
|
1551
|
+
$firstNonEmpty(
|
|
1552
|
+
$prop($, 'program'),
|
|
1553
|
+
$prop($, 'bundle_executable'),
|
|
1554
|
+
$prop($, 'bundle_path'),
|
|
1555
|
+
$prop($, 'path')
|
|
1556
|
+
)
|
|
1557
|
+
)
|
|
1558
|
+
)
|
|
1559
|
+
)
|
|
1560
|
+
)
|
|
1561
|
+
or (
|
|
1562
|
+
$prop($, 'cdx:osquery:category') = 'running_apps'
|
|
1563
|
+
and $not(
|
|
1564
|
+
$isDarwinSystemPath(
|
|
1565
|
+
$firstNonEmpty($prop($, 'bundle_path'), $prop($, 'path'))
|
|
1566
|
+
)
|
|
1567
|
+
)
|
|
1568
|
+
)
|
|
1569
|
+
)
|
|
1570
|
+
and $hasProp($, 'cdx:darwin:notarization:assessment')
|
|
1571
|
+
and $lowercase($safeStr($prop($, 'cdx:darwin:notarization:assessment'))) = 'unknown'
|
|
1572
|
+
and (
|
|
1573
|
+
$contains(
|
|
1574
|
+
$lowercase($firstNonEmpty($prop($, 'path'), $prop($, 'bundle_path'))),
|
|
1575
|
+
'/users/'
|
|
1576
|
+
)
|
|
1577
|
+
or $contains(
|
|
1578
|
+
$lowercase(
|
|
1579
|
+
$firstNonEmpty(
|
|
1580
|
+
$prop($, 'program'),
|
|
1581
|
+
$prop($, 'bundle_executable'),
|
|
1582
|
+
$prop($, 'bundle_path'),
|
|
1583
|
+
$prop($, 'path')
|
|
1584
|
+
)
|
|
1585
|
+
),
|
|
1586
|
+
'/users/'
|
|
1587
|
+
)
|
|
1588
|
+
or $contains(
|
|
1589
|
+
$lowercase($firstNonEmpty($prop($, 'path'), $prop($, 'bundle_path'))),
|
|
1590
|
+
'/downloads/'
|
|
1591
|
+
)
|
|
1592
|
+
or $contains(
|
|
1593
|
+
$lowercase(
|
|
1594
|
+
$firstNonEmpty(
|
|
1595
|
+
$prop($, 'program'),
|
|
1596
|
+
$prop($, 'bundle_executable'),
|
|
1597
|
+
$prop($, 'bundle_path'),
|
|
1598
|
+
$prop($, 'path')
|
|
1599
|
+
)
|
|
1600
|
+
),
|
|
1601
|
+
'/downloads/'
|
|
1602
|
+
)
|
|
1603
|
+
or $contains(
|
|
1604
|
+
$lowercase($firstNonEmpty($prop($, 'path'), $prop($, 'bundle_path'))),
|
|
1605
|
+
'/desktop/'
|
|
1606
|
+
)
|
|
1607
|
+
or $contains(
|
|
1608
|
+
$lowercase(
|
|
1609
|
+
$firstNonEmpty(
|
|
1610
|
+
$prop($, 'program'),
|
|
1611
|
+
$prop($, 'bundle_executable'),
|
|
1612
|
+
$prop($, 'bundle_path'),
|
|
1613
|
+
$prop($, 'path')
|
|
1614
|
+
)
|
|
1615
|
+
),
|
|
1616
|
+
'/desktop/'
|
|
1617
|
+
)
|
|
1618
|
+
or $contains(
|
|
1619
|
+
$lowercase($firstNonEmpty($prop($, 'path'), $prop($, 'bundle_path'))),
|
|
1620
|
+
'/tmp/'
|
|
1621
|
+
)
|
|
1622
|
+
or $contains(
|
|
1623
|
+
$lowercase(
|
|
1624
|
+
$firstNonEmpty(
|
|
1625
|
+
$prop($, 'program'),
|
|
1626
|
+
$prop($, 'bundle_executable'),
|
|
1627
|
+
$prop($, 'bundle_path'),
|
|
1628
|
+
$prop($, 'path')
|
|
1629
|
+
)
|
|
1630
|
+
),
|
|
1631
|
+
'/tmp/'
|
|
1632
|
+
)
|
|
1633
|
+
or $contains(
|
|
1634
|
+
$lowercase($firstNonEmpty($prop($, 'path'), $prop($, 'bundle_path'))),
|
|
1635
|
+
'/private/var/'
|
|
1636
|
+
)
|
|
1637
|
+
or $contains(
|
|
1638
|
+
$lowercase(
|
|
1639
|
+
$firstNonEmpty(
|
|
1640
|
+
$prop($, 'program'),
|
|
1641
|
+
$prop($, 'bundle_executable'),
|
|
1642
|
+
$prop($, 'bundle_path'),
|
|
1643
|
+
$prop($, 'path')
|
|
1644
|
+
)
|
|
1645
|
+
),
|
|
1646
|
+
'/private/var/'
|
|
1647
|
+
)
|
|
1648
|
+
)
|
|
1649
|
+
]
|
|
1650
|
+
location: |
|
|
1651
|
+
{
|
|
1652
|
+
"bomRef": $."bom-ref",
|
|
1653
|
+
"purl": purl
|
|
1654
|
+
}
|
|
1655
|
+
message: "macOS {{ $prop($, 'cdx:osquery:category') }} artifact '{{ name }}' uses registration path '{{ $firstNonEmpty($prop($, 'path'), $prop($, 'bundle_path'), name) }}' and target '{{ $firstNonEmpty($prop($, 'program'), $prop($, 'bundle_executable'), $prop($, 'bundle_path'), $prop($, 'path'), name) }}' with unknown notarization assessment on a user-controlled path"
|
|
1656
|
+
mitigation: "Review the registration/config path and backing executable together, re-check notarization and code-signing metadata, and move approved software out of user-controlled paths before suppressing the finding."
|
|
1657
|
+
evidence: |
|
|
1658
|
+
{
|
|
1659
|
+
"queryCategory": $prop($, 'cdx:osquery:category'),
|
|
1660
|
+
"registrationPath": $firstNonEmpty($prop($, 'path'), $prop($, 'bundle_path')),
|
|
1661
|
+
"targetPath": $firstNonEmpty($prop($, 'program'), $prop($, 'bundle_executable'), $prop($, 'bundle_path'), $prop($, 'path')),
|
|
1662
|
+
"label": $prop($, 'label'),
|
|
1663
|
+
"path": $prop($, 'path'),
|
|
1664
|
+
"bundlePath": $prop($, 'bundle_path'),
|
|
1665
|
+
"bundleExecutable": $prop($, 'bundle_executable'),
|
|
1666
|
+
"program": $prop($, 'program'),
|
|
1667
|
+
"programArguments": $prop($, 'program_arguments'),
|
|
1668
|
+
"teamIdentifier": $prop($, 'cdx:darwin:codesign:teamIdentifier'),
|
|
1669
|
+
"notarizationAssessment": $prop($, 'cdx:darwin:notarization:assessment')
|
|
1670
|
+
}
|
|
1671
|
+
|
|
1672
|
+
- id: OBOM-LNX-020
|
|
1673
|
+
name: "Privileged Linux listener exposed on a non-local interface from writable or unclassified path"
|
|
1674
|
+
description: "Root or service-account listeners bound to all interfaces from user-controlled or unclassified paths are high-signal persistence or runtime-drift indicators."
|
|
1675
|
+
severity: high
|
|
1676
|
+
category: obom-runtime
|
|
1677
|
+
dry-run-support: full
|
|
1678
|
+
condition: |
|
|
1679
|
+
components[
|
|
1680
|
+
$prop($, 'cdx:osquery:category') = 'privileged_listening_ports'
|
|
1681
|
+
and (
|
|
1682
|
+
$safeStr($prop($, 'address')) = '0.0.0.0'
|
|
1683
|
+
or $safeStr($prop($, 'address')) = '::'
|
|
1684
|
+
)
|
|
1685
|
+
and $safeStr($prop($, 'port')) != '22'
|
|
1686
|
+
and $safeStr($prop($, 'port')) != '53'
|
|
1687
|
+
and $safeStr(name) != 'systemd-resolved'
|
|
1688
|
+
and $safeStr(name) != 'avahi-daemon'
|
|
1689
|
+
and $safeStr(name) != 'cupsd'
|
|
1690
|
+
and (
|
|
1691
|
+
$safeStr($prop($, 'package_source_hint')) = 'user-writable-path'
|
|
1692
|
+
or $safeStr($prop($, 'package_source_hint')) = 'unclassified-path'
|
|
1693
|
+
or $contains($lowercase($nullSafeProp($, 'path')), '/tmp/')
|
|
1694
|
+
or $contains($lowercase($nullSafeProp($, 'path')), '/var/tmp/')
|
|
1695
|
+
or $contains($lowercase($nullSafeProp($, 'path')), '/dev/shm/')
|
|
1696
|
+
or $contains($lowercase($nullSafeProp($, 'path')), '/home/')
|
|
1697
|
+
or $contains($lowercase($nullSafeProp($, 'path')), '/run/user/')
|
|
1698
|
+
)
|
|
1699
|
+
]
|
|
1700
|
+
location: |
|
|
1701
|
+
{
|
|
1702
|
+
"bomRef": $."bom-ref",
|
|
1703
|
+
"purl": purl
|
|
1704
|
+
}
|
|
1705
|
+
message: "Privileged listener '{{ name }}' is reachable on {{ $prop($, 'address') }}:{{ $prop($, 'port') }} from risky path '{{ $firstNonEmpty($prop($, 'path'), name) }}'"
|
|
1706
|
+
mitigation: "Treat the listener path as a high-priority review item, validate package ownership and recent changes, and remove or isolate privileged services sourced from writable or unclassified locations."
|
|
1707
|
+
evidence: |
|
|
1708
|
+
{
|
|
1709
|
+
"account": $prop($, 'account'),
|
|
1710
|
+
"pid": $prop($, 'pid'),
|
|
1711
|
+
"address": $prop($, 'address'),
|
|
1712
|
+
"port": $prop($, 'port'),
|
|
1713
|
+
"path": $prop($, 'path'),
|
|
1714
|
+
"serviceUnit": $prop($, 'service_unit'),
|
|
1715
|
+
"packageSourceHint": $prop($, 'package_source_hint'),
|
|
1716
|
+
"parentCmdline": $prop($, 'parent_cmdline')
|
|
1717
|
+
}
|
|
1718
|
+
|
|
1719
|
+
- id: OBOM-LNX-021
|
|
1720
|
+
name: "Linux APT source uses plaintext HTTP transport"
|
|
1721
|
+
description: "Plain HTTP APT mirrors weaken transport integrity and are often called out in baseline hardening reviews even when package signatures remain enabled."
|
|
1722
|
+
severity: medium
|
|
1723
|
+
category: obom-runtime
|
|
1724
|
+
dry-run-support: full
|
|
1725
|
+
condition: |
|
|
1726
|
+
components[
|
|
1727
|
+
(
|
|
1728
|
+
$prop($, 'cdx:osquery:category') = 'apt_sources'
|
|
1729
|
+
or $prop($, 'cdx:osquery:category') = 'apt_ppa_sources'
|
|
1730
|
+
)
|
|
1731
|
+
and $startsWith($lowercase($safeStr($prop($, 'base_uri'))), 'http://')
|
|
1732
|
+
]
|
|
1733
|
+
location: |
|
|
1734
|
+
{
|
|
1735
|
+
"bomRef": $."bom-ref",
|
|
1736
|
+
"purl": purl,
|
|
1737
|
+
"file": $prop($, 'source')
|
|
1738
|
+
}
|
|
1739
|
+
message: "APT source '{{ name }}' still uses plaintext HTTP transport: {{ $prop($, 'base_uri') }}"
|
|
1740
|
+
mitigation: "Move the repository to HTTPS or an authenticated local mirror, then confirm the source file and mirror policy match your approved package-trust baseline."
|
|
1741
|
+
evidence: |
|
|
1742
|
+
{
|
|
1743
|
+
"sourceFile": $prop($, 'source'),
|
|
1744
|
+
"baseUri": $prop($, 'base_uri'),
|
|
1745
|
+
"release": $prop($, 'release'),
|
|
1746
|
+
"components": $prop($, 'components'),
|
|
1747
|
+
"maintainer": $prop($, 'maintainer')
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1750
|
+
- id: OBOM-LNX-022
|
|
1751
|
+
name: "Linux authorized_keys entry uses deprecated ssh-rsa algorithm"
|
|
1752
|
+
description: "ssh-rsa authorized_keys entries rely on an older signature algorithm profile and should be reviewed during SSH hardening work."
|
|
1753
|
+
severity: medium
|
|
1754
|
+
category: obom-runtime
|
|
1755
|
+
dry-run-support: full
|
|
1756
|
+
condition: |
|
|
1757
|
+
components[
|
|
1758
|
+
$prop($, 'cdx:osquery:category') = 'authorized_keys_snapshot'
|
|
1759
|
+
and $lowercase($safeStr(version)) = 'ssh-rsa'
|
|
1760
|
+
]
|
|
1761
|
+
location: |
|
|
1762
|
+
{
|
|
1763
|
+
"bomRef": $."bom-ref",
|
|
1764
|
+
"purl": purl,
|
|
1765
|
+
"file": $prop($, 'key_file')
|
|
1766
|
+
}
|
|
1767
|
+
message: "Authorized key for account '{{ name }}' in '{{ $prop($, 'key_file') }}' still uses deprecated ssh-rsa"
|
|
1768
|
+
mitigation: "Replace the key with ed25519 or a modern RSA/SHA-2 compatible key, then re-review key restrictions and account ownership before retaining access."
|
|
1769
|
+
evidence: |
|
|
1770
|
+
{
|
|
1771
|
+
"account": name,
|
|
1772
|
+
"algorithm": version,
|
|
1773
|
+
"keyFile": $prop($, 'key_file'),
|
|
1774
|
+
"comment": description,
|
|
1775
|
+
"uid": $prop($, 'uid')
|
|
1776
|
+
}
|