@cyclonedx/cdxgen
Version:
Creates CycloneDX Software Bill of Materials (SBOM) from source or container image
1,248 lines (1,213 loc) • 71.2 kB
YAML
# OBOM Runtime Security & Compliance Rules
# Category: obom-runtime
# Detects host posture, persistence, and runtime indicators from osquery-derived OBOM components
- id: OBOM-LNX-001
name: "Linux systemd unit sourced from temporary path"
description: "Systemd units loaded from /tmp or /var/tmp can indicate unauthorized persistence."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'systemd_units'
and (
$contains($nullSafeProp($, 'fragment_path'), '/tmp/')
or $contains($nullSafeProp($, 'fragment_path'), '/var/tmp/')
or $contains($nullSafeProp($, 'source_path'), '/tmp/')
or $contains($nullSafeProp($, 'source_path'), '/var/tmp/')
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
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')) }}'"
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."
evidence: |
{
"activeState": $prop($, 'active_state'),
"unitFileState": $prop($, 'unit_file_state'),
"fragmentPath": $prop($, 'fragment_path'),
"sourcePath": $prop($, 'source_path')
}
- id: OBOM-LNX-002
name: "Linux sudoers broad privilege rule"
description: "Sudoers entries allowing unrestricted command execution increase lateral movement and privilege escalation risk."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'sudoers_snapshot'
and (
$contains(description, 'NOPASSWD:ALL')
or $contains(description, 'ALL=(ALL) ALL')
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Sudo policy '{{ name }}' contains broad privilege grant: {{ description }}"
mitigation: "Replace broad grants with command-specific allowlists and enforce MFA/approval workflows for privileged operations."
evidence: |
{
"sourceFile": $prop($, 'path'),
"ruleDetails": description
}
- id: OBOM-LNX-003
name: "Root authorized_keys entry without restrictions"
description: "Root SSH keys without command/from/no-agent-forwarding restrictions weaken access controls and traceability."
severity: medium
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'authorized_keys_snapshot'
and name = 'root'
and $hasProp($, 'options')
and $safeStr($prop($, 'options')) = ''
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Root authorized_keys entry in '{{ $prop($, 'key_file') }}' lacks restrictive key options"
mitigation: "Apply restrictive key options (from=, command=, no-agent-forwarding, no-port-forwarding) and rotate unmanaged keys."
evidence: |
{
"account": name,
"algorithm": version,
"keyFile": $prop($, 'key_file'),
"options": $prop($, 'options')
}
- id: OBOM-WIN-001
name: "Windows drive without BitLocker protection"
description: "Drives with disabled BitLocker protection can violate endpoint encryption requirements and increase data exposure risk."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'windows_bitlocker_info'
and $safeStr($prop($, 'protection_status')) != '1'
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "BitLocker protection is not enabled for drive '{{ version }}' (device '{{ name }}')"
mitigation: "Enable BitLocker with approved encryption policy and escrow recovery keys in managed KMS/AD."
evidence: |
{
"deviceId": name,
"driveLetter": version,
"protectionStatus": $prop($, 'protection_status'),
"encryptionMethod": $prop($, 'encryption_method'),
"percentageEncrypted": $prop($, 'percentage_encrypted')
}
- id: OBOM-WIN-002
name: "Windows Security Center unhealthy state"
description: "Poor Security Center health indicates one or more key endpoint protections are disabled or degraded."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'windows_security_center'
and (
name = 'Poor'
or version = 'Poor'
or description = 'Poor'
or $prop($, 'internet_settings') = 'Poor'
or $prop($, 'windows_security_center_service') = 'Poor'
or $prop($, 'user_account_control') = 'Poor'
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Windows Security Center reports degraded protection posture (antivirus={{ name }}, firewall={{ version }}, autoupdate={{ description }})"
mitigation: "Restore endpoint protection controls and enforce policy baselines for AV, firewall, updates, and UAC."
evidence: |
{
"antivirus": name,
"firewall": version,
"autoupdate": description,
"internetSettings": $prop($, 'internet_settings'),
"securityCenterService": $prop($, 'windows_security_center_service'),
"uac": $prop($, 'user_account_control')
}
- id: OBOM-WIN-003
name: "Windows Run key references temporary/script execution path"
description: "Run/RunOnce entries launching from temp or encoded script commands are common persistence techniques."
severity: critical
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'windows_run_keys'
and (
$contains($lowercase($safeStr(description)), '\\appdata\\local\\temp\\')
or $contains($lowercase($safeStr(description)), '\\temp\\')
or $contains($lowercase($safeStr(description)), '-enc ')
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Run key '{{ name }}' launches potentially suspicious command/path: {{ description }}"
mitigation: "Validate publisher and hash of the referenced executable/script, remove unauthorized entries, and investigate parent change events."
evidence: |
{
"registryPath": name,
"command": description,
"registryKey": $prop($, 'key'),
"mtime": version
}
- id: OBOM-MAC-001
name: "macOS firewall disabled or stealth mode off"
description: "ALF misconfiguration can expose endpoints to unsolicited inbound traffic and weakens host hardening baselines."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'alf'
and (
$safeStr(version) = '0'
or $safeStr($prop($, 'stealth_enabled')) = '0'
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "macOS ALF posture is weak (global_state={{ version }}, stealth_enabled={{ $prop($, 'stealth_enabled') }})"
mitigation: "Enable ALF and stealth mode via managed profile or MDM baseline."
evidence: |
{
"globalState": version,
"stealthEnabled": $prop($, 'stealth_enabled'),
"allowSignedEnabled": $prop($, 'allow_signed_enabled'),
"loggingEnabled": $prop($, 'logging_enabled')
}
- id: OBOM-MAC-002
name: "macOS launchd item from user-writable temporary path"
description: "Launchd agents/daemons sourced from temporary paths are a strong persistence and execution abuse signal."
severity: critical
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'launchd_services'
and (
$contains($nullSafeProp($, 'path'), '/tmp/')
or $contains($nullSafeProp($, 'path'), '/var/tmp/')
or $contains($nullSafeProp($, 'program'), '/tmp/')
or $contains($nullSafeProp($, 'program'), '/var/tmp/')
)
and (
$safeStr($prop($, 'run_at_load')) = 'true'
or $safeStr($prop($, 'run_at_load')) = '1'
or $safeStr($prop($, 'keep_alive')) = 'true'
or $safeStr($prop($, 'keep_alive')) = '1'
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
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"
mitigation: "Review the launchd plist and target executable together, remove unauthorized entries, relocate approved binaries to trusted paths, and enforce signed launchd payloads."
evidence: |
{
"label": $prop($, 'label'),
"plistPath": $prop($, 'path'),
"targetPath": $firstNonEmpty($prop($, 'program'), $prop($, 'program_arguments')),
"program": $prop($, 'program'),
"programArguments": $prop($, 'program_arguments'),
"runAtLoad": $prop($, 'run_at_load'),
"keepAlive": $prop($, 'keep_alive')
}
- id: OBOM-MAC-003
name: "macOS firewall exception for binary in untrusted user path"
description: "ALF exceptions for binaries in user Downloads/Desktop/tmp increase risk of untrusted inbound network exposure."
severity: medium
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'alf_exceptions'
and (
$contains($safeStr(name), '/Users/')
and (
$contains($safeStr(name), '/Downloads/')
or $contains($safeStr(name), '/Desktop/')
or $contains($safeStr(name), '/tmp/')
)
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "ALF exception allows inbound access for risky path '{{ name }}'"
mitigation: "Restrict exceptions to signed, managed applications in trusted system paths."
evidence: |
{
"path": name,
"state": version
}
- id: OBOM-LNX-004
name: "Linux shell history contains suspicious download-execute pattern"
description: "Shell history with direct download-and-execute commands may indicate malware staging or hands-on-keyboard activity."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'shell_history_snapshot'
and (
($contains($lowercase(description), 'curl ') and $contains($lowercase(description), '| sh'))
or ($contains($lowercase(description), 'wget ') and $contains($lowercase(description), '| bash'))
or $contains($lowercase(description), 'base64 -d')
or $contains($lowercase(description), 'nc -e ')
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Suspicious shell history entry for user '{{ name }}': {{ description }}"
mitigation: "Correlate with process/network telemetry, validate command intent, and isolate host if command lineage is untrusted."
evidence: |
{
"account": name,
"command": description,
"historyFile": $prop($, 'history_file'),
"timestamp": $prop($, 'time')
}
- id: OBOM-LNX-005
name: "Docker API exposed over unauthenticated TCP port"
description: "Dockerd listening on TCP 2375 enables remote daemon control if not protected by network controls and TLS."
severity: critical
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'listening_ports'
and $safeStr($prop($, 'port')) = '2375'
and (
$safeStr($prop($, 'address')) = '0.0.0.0'
or $safeStr($prop($, 'address')) = '::'
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Potentially insecure Docker API exposure detected on {{ $prop($, 'address') }}:{{ $prop($, 'port') }} for process '{{ name }}'"
mitigation: "Disable insecure TCP listener, enforce TLS/mTLS, and restrict daemon access to trusted local interfaces."
evidence: |
{
"process": name,
"pid": $prop($, 'pid'),
"address": $prop($, 'address'),
"port": $prop($, 'port'),
"protocol": $prop($, 'protocol')
}
- id: OBOM-LNX-006
name: "Privileged Linux listener exposed on a non-local interface"
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."
severity: medium
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'privileged_listening_ports'
and (
$safeStr($prop($, 'address')) = '0.0.0.0'
or $safeStr($prop($, 'address')) = '::'
)
and $safeStr($prop($, 'port')) != '22'
and $safeStr($prop($, 'port')) != '53'
and $safeStr(name) != 'systemd-resolved'
and $safeStr(name) != 'avahi-daemon'
and $safeStr(name) != 'cupsd'
and $safeStr($prop($, 'package_source_hint')) != 'user-writable-path'
and $safeStr($prop($, 'package_source_hint')) != 'unclassified-path'
and $not($contains($lowercase($nullSafeProp($, 'path')), '/tmp/'))
and $not($contains($lowercase($nullSafeProp($, 'path')), '/var/tmp/'))
and $not($contains($lowercase($nullSafeProp($, 'path')), '/dev/shm/'))
and $not($contains($lowercase($nullSafeProp($, 'path')), '/home/'))
and $not($contains($lowercase($nullSafeProp($, 'path')), '/run/user/'))
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Privileged listener '{{ name }}' from '{{ $firstNonEmpty($prop($, 'path'), name) }}' is reachable on {{ $prop($, 'address') }}:{{ $prop($, 'port') }} and should be validated against approved exposure"
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."
evidence: |
{
"account": $prop($, 'account'),
"pid": $prop($, 'pid'),
"address": $prop($, 'address'),
"port": $prop($, 'port'),
"path": $prop($, 'path'),
"serviceUnit": $prop($, 'service_unit'),
"packageSourceHint": $prop($, 'package_source_hint'),
"parentCmdline": $prop($, 'parent_cmdline')
}
- id: OBOM-LNX-007
name: "Administrative Linux surface running with elevated privileges"
description: "Cockpit, PackageKit, pkexec, and related admin surfaces running with elevated privileges should be continuously monitored for exposure and drift."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
(
$prop($, 'cdx:osquery:category') = 'elevated_processes'
or $prop($, 'cdx:osquery:category') = 'privileged_listening_ports'
or $prop($, 'cdx:osquery:category') = 'sudo_executions'
or $prop($, 'cdx:osquery:category') = 'privilege_transitions'
)
and (
$contains($lowercase($safeStr(name)), 'cockpit')
or $contains($lowercase($nullSafeProp($, 'path')), 'cockpit')
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'cockpit')
or $contains($lowercase($safeStr(name)), 'packagekit')
or $contains($lowercase($nullSafeProp($, 'path')), 'packagekit')
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'packagekit')
or $contains($lowercase($safeStr(name)), 'pkexec')
or $contains($lowercase($nullSafeProp($, 'path')), 'pkexec')
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'pkexec')
or $contains($lowercase($safeStr(name)), 'pkcon')
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'pkcon')
)
and (
$safeStr($prop($, 'uid')) = '0'
or $safeStr($prop($, 'euid')) = '0'
or $safeStr($prop($, 'account')) = 'root'
or $safeStr($prop($, 'effective_user')) = 'root'
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Administrative surface '{{ name }}' is active with elevated privileges and should be reviewed for exposure"
mitigation: "Review network reachability, patch cadence, and whether the administrative package is still needed on this host."
evidence: |
{
"category": $prop($, 'cdx:osquery:category'),
"path": $prop($, 'path'),
"cmdline": $prop($, 'cmdline'),
"account": $prop($, 'account'),
"effectiveUser": $prop($, 'effective_user'),
"serviceUnit": $prop($, 'service_unit'),
"address": $prop($, 'address'),
"port": $prop($, 'port'),
"packageSourceHint": $prop($, 'package_source_hint')
}
- id: OBOM-LNX-008
name: "Interactive sudo chain touched sensitive administrative binary"
description: "Interactive sudo or pkexec invocations against package-management and admin-control binaries can indicate privileged changes worth auditing."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'sudo_executions'
and $safeStr($prop($, 'auid')) != ''
and $safeStr($prop($, 'auid')) != '0'
and (
$safeStr($prop($, 'euid')) = '0'
or $safeStr($prop($, 'effective_user')) = 'root'
)
and (
$contains($lowercase($nullSafeProp($, 'path')), 'pkexec')
or $contains($lowercase($nullSafeProp($, 'path')), 'pkcon')
or $contains($lowercase($nullSafeProp($, 'path')), 'packagekit')
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'pkexec')
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'pkcon')
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'packagekit')
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'cockpit')
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'systemctl')
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'service ')
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' apt ')
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' apt-get ')
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' dnf ')
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' yum ')
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' zypper ')
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' rpm ')
or $contains($lowercase($nullSafeProp($, 'cmdline')), ' dpkg ')
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Interactive privileged execution by '{{ $prop($, 'login_user') }}' touched sensitive administrative command '{{ $prop($, 'path') }}'"
mitigation: "Review whether the command was expected, tie it to change records, and investigate unexpected package-management or control-plane activity."
evidence: |
{
"loginUser": $prop($, 'login_user'),
"effectiveUser": $prop($, 'effective_user'),
"path": $prop($, 'path'),
"cmdline": $prop($, 'cmdline'),
"parentCmdline": $prop($, 'parent_cmdline'),
"serviceUnit": $prop($, 'service_unit'),
"packageSourceHint": $prop($, 'package_source_hint'),
"timestamp": $prop($, 'time')
}
- id: OBOM-LNX-009
name: "Unexpected Linux privilege transition for non-allowlisted executable"
description: "Setuid/setgid transitions outside a small baseline of expected tools can indicate risky privilege-bound packages or exploit activity."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'privilege_transitions'
and $safeStr($prop($, 'auid')) != ''
and $safeStr($prop($, 'auid')) != '0'
and (
$safeStr($prop($, 'euid')) = '0'
or $safeStr($prop($, 'egid')) = '0'
)
and $safeStr($prop($, 'path')) != '/usr/bin/sudo'
and $safeStr($prop($, 'path')) != '/bin/su'
and $safeStr($prop($, 'path')) != '/usr/bin/su'
and $safeStr($prop($, 'path')) != '/usr/bin/doas'
and $safeStr($prop($, 'path')) != '/usr/bin/passwd'
and $safeStr($prop($, 'path')) != '/usr/bin/chsh'
and $safeStr($prop($, 'path')) != '/usr/bin/chfn'
and $safeStr($prop($, 'path')) != '/usr/bin/gpasswd'
and $safeStr($prop($, 'path')) != '/usr/bin/newgrp'
and $safeStr($prop($, 'path')) != '/usr/bin/mount'
and $safeStr($prop($, 'path')) != '/usr/bin/umount'
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Unexpected privilege transition detected for '{{ $prop($, 'path') }}' (auid={{ $prop($, 'auid') }}, euid={{ $prop($, 'euid') }})"
mitigation: "Validate binary provenance, file permissions, and recent package changes; treat unfamiliar setuid/setgid paths as high-priority review items."
evidence: |
{
"loginUser": $prop($, 'login_user'),
"path": $prop($, 'path'),
"cmdline": $prop($, 'cmdline'),
"parentCmdline": $prop($, 'parent_cmdline'),
"auid": $prop($, 'auid'),
"uid": $prop($, 'uid'),
"euid": $prop($, 'euid'),
"gid": $prop($, 'gid'),
"egid": $prop($, 'egid'),
"packageSourceHint": $prop($, 'package_source_hint')
}
- id: OBOM-LNX-010
name: "Elevated Linux process launched from user-writable or temporary path"
description: "Root processes executing from explicit user-controlled, temporary, or per-user runtime paths are a strong signal for persistence or package drift."
severity: critical
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'elevated_processes'
and $safeStr($prop($, 'uid')) = '0'
and (
$contains($nullSafeProp($, 'path'), '/tmp/')
or $contains($nullSafeProp($, 'path'), '/var/tmp/')
or $contains($nullSafeProp($, 'path'), '/dev/shm/')
or $contains($nullSafeProp($, 'path'), '/home/')
or $contains($nullSafeProp($, 'path'), '/run/user/')
or $contains($nullSafeProp($, 'cmdline'), '/tmp/')
or $contains($nullSafeProp($, 'cmdline'), '/var/tmp/')
or $contains($nullSafeProp($, 'cmdline'), '/dev/shm/')
or $contains($nullSafeProp($, 'cmdline'), '/home/')
or $contains($nullSafeProp($, 'cmdline'), '/run/user/')
or $safeStr($prop($, 'package_source_hint')) = 'user-writable-path'
)
and $safeStr(name) != 'systemd'
and $safeStr(name) != 'init'
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Elevated process '{{ name }}' executes from a risky path or command: {{ $firstNonEmpty($prop($, 'path'), $prop($, 'cmdline'), name) }}"
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."
evidence: |
{
"account": $prop($, 'account'),
"path": $prop($, 'path'),
"cmdline": $prop($, 'cmdline'),
"serviceUnit": $prop($, 'service_unit'),
"parentPath": $prop($, 'parent_path'),
"parentCmdline": $prop($, 'parent_cmdline'),
"startTime": $prop($, 'start_time'),
"packageSourceHint": $prop($, 'package_source_hint')
}
- id: OBOM-LNX-011
name: "Interactive shell parent spawned privileged Linux execution"
description: "Shell-driven privileged chains are useful for separating admin changes from long-running service behavior."
severity: medium
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'sudo_executions'
and $safeStr($prop($, 'auid')) != ''
and $safeStr($prop($, 'auid')) != '0'
and (
$safeStr($prop($, 'euid')) = '0'
or $safeStr($prop($, 'effective_user')) = 'root'
)
and (
$safeStr($prop($, 'parent_name')) = 'bash'
or $safeStr($prop($, 'parent_name')) = 'sh'
or $safeStr($prop($, 'parent_name')) = 'zsh'
or $safeStr($prop($, 'parent_name')) = 'dash'
or $safeStr($prop($, 'parent_name')) = 'fish'
or $contains($lowercase($nullSafeProp($, 'parent_cmdline')), 'bash')
or $contains($lowercase($nullSafeProp($, 'parent_cmdline')), 'zsh')
or $contains($lowercase($nullSafeProp($, 'parent_cmdline')), 'fish')
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Interactive shell lineage for privileged command '{{ $prop($, 'cmdline') }}' merits change-review validation"
mitigation: "Correlate the privileged command with shell history, tickets, and package changes to confirm it was expected."
evidence: |
{
"loginUser": $prop($, 'login_user'),
"parentName": $prop($, 'parent_name'),
"parentCmdline": $prop($, 'parent_cmdline'),
"path": $prop($, 'path'),
"cmdline": $prop($, 'cmdline'),
"timestamp": $prop($, 'time')
}
- id: OBOM-LNX-012
name: "Linux Secure Boot inventory contains revoked certificate"
description: "Revoked entries in the Secure Boot trust inventory can indicate stale firmware trust policy or unexpected dbx posture drift."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'secureboot_certificates'
and $safeStr($prop($, 'revoked')) = '1'
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Secure Boot certificate '{{ name }}' is marked revoked in firmware trust inventory"
mitigation: "Review db/dbx enrollment, remove stale trust anchors, and reconcile firmware policy with approved platform signing certificates."
evidence: |
{
"subject": $prop($, 'subject'),
"issuer": $prop($, 'issuer'),
"serial": $prop($, 'serial'),
"path": $prop($, 'path'),
"notValidAfter": $prop($, 'not_valid_after')
}
- id: OBOM-LNX-013
name: "Linux Secure Boot certificate expired or expiring soon"
description: "Secure Boot trust anchors nearing expiry can cause firmware validation drift and interrupt planned key rotation windows."
severity: medium
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'secureboot_certificates'
and $safeStr($prop($, 'not_valid_after')) != ''
and $number($prop($, 'not_valid_after')) <= ($floor($millis() / 1000) + 2592000)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Secure Boot certificate '{{ name }}' expires at {{ $prop($, 'not_valid_after') }} and should be rotated or reviewed"
mitigation: "Rotate or re-enroll Secure Boot certificates before expiry and validate firmware trust stores against your approved signing hierarchy."
evidence: |
{
"subject": $prop($, 'subject'),
"issuer": $prop($, 'issuer'),
"serial": $prop($, 'serial'),
"path": $prop($, 'path'),
"notValidBefore": $prop($, 'not_valid_before'),
"notValidAfter": $prop($, 'not_valid_after')
}
- id: OBOM-WIN-004
name: "Hidden scheduled task uses suspicious execution path"
description: "Enabled hidden tasks executing from temp paths or encoded script launchers are common persistence tradecraft."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'scheduled_tasks'
and $safeStr($prop($, 'enabled')) = '1'
and $safeStr($prop($, 'hidden')) = '1'
and (
$contains($lowercase($nullSafeProp($, 'path')), '\\temp\\')
or ($contains($lowercase($nullSafeProp($, 'action')), 'powershell') and $contains($lowercase($nullSafeProp($, 'action')), '-enc '))
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Hidden scheduled task '{{ name }}' has suspicious action/path: {{ $prop($, 'action') }}"
mitigation: "Validate author and binary lineage, disable unauthorized tasks, and investigate task registration event history."
evidence: |
{
"taskName": name,
"taskPath": $prop($, 'path'),
"action": $prop($, 'action'),
"state": $prop($, 'state')
}
- id: OBOM-WIN-005
name: "Auto-start Windows service points to user-writable path"
description: "Auto-start services from temp or AppData paths may indicate privilege persistence through service hijacking."
severity: critical
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'services_snapshot'
and $safeStr($prop($, 'start_type')) = 'AUTO_START'
and (
$contains($lowercase($nullSafeProp($, 'path')), '\\temp\\')
or $contains($lowercase($nullSafeProp($, 'path')), '\\appdata\\')
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Auto-start service '{{ name }}' launches from a user-writable path: {{ $prop($, 'path') }}"
mitigation: "Move binaries to protected system paths, lock ACLs, and validate service image hashes/signatures."
evidence: |
{
"serviceName": name,
"displayName": $prop($, 'display_name'),
"servicePath": $prop($, 'path'),
"account": $prop($, 'user_account')
}
- id: OBOM-WIN-006
name: "Windows suspicious persistence surface references LOLBAS execution helper"
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."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:lolbas:matched') = 'true'
and (
$prop($, 'cdx:osquery:category') = 'windows_run_keys'
or $prop($, 'cdx:osquery:category') = 'scheduled_tasks'
or $prop($, 'cdx:osquery:category') = 'startup_items'
or $prop($, 'cdx:osquery:category') = 'services_snapshot'
)
and (
$listContains($prop($, 'cdx:lolbas:functions'), 'command')
or $listContains($prop($, 'cdx:lolbas:functions'), 'script-execution')
or $listContains($prop($, 'cdx:lolbas:functions'), 'proxy-execution')
or $listContains($prop($, 'cdx:lolbas:functions'), 'library-load')
or $listContains($prop($, 'cdx:lolbas:functions'), 'shell')
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
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') }}"
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."
attack:
tactics: [TA0003, TA0004, TA0005]
techniques: [T1218, T1547]
evidence: |
{
"queryCategory": $prop($, 'cdx:osquery:category'),
"registrationPath": $firstNonEmpty($prop($, 'key'), $prop($, 'path'), name),
"targetPath": $firstNonEmpty($prop($, 'action'), $prop($, 'executable'), $prop($, 'module_path'), $prop($, 'path'), description),
"lolbasNames": $prop($, 'cdx:lolbas:names'),
"functions": $prop($, 'cdx:lolbas:functions'),
"matchFields": $prop($, 'cdx:lolbas:matchFields'),
"path": $prop($, 'path'),
"action": $prop($, 'action'),
"command": description
}
- id: OBOM-WIN-007
name: "Windows WMI or AppCompat persistence uses LOLBAS"
description: "WMI command consumers and AppCompat shims that invoke LOLBAS utilities are high-signal persistence and defense-evasion indicators."
severity: critical
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:lolbas:matched') = 'true'
and (
$prop($, 'cdx:osquery:category') = 'appcompat_shims'
or $prop($, 'cdx:osquery:category') = 'wmi_cli_event_consumers'
or $prop($, 'cdx:osquery:category') = 'wmi_cli_event_consumers_snapshot'
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "WMI/AppCompat persistence artifact '{{ name }}' references LOLBAS helper(s) {{ $prop($, 'cdx:lolbas:names') }}"
mitigation: "Treat as a persistence investigation, review WMI repository and shim databases, and remove unauthorized subscriptions or shim registrations."
attack:
tactics: [TA0003, TA0004, TA0005]
techniques: [T1218, T1546]
evidence: |
{
"queryCategory": $prop($, 'cdx:osquery:category'),
"lolbasNames": $prop($, 'cdx:lolbas:names'),
"functions": $prop($, 'cdx:lolbas:functions'),
"matchFields": $prop($, 'cdx:lolbas:matchFields'),
"path": $prop($, 'path'),
"executable": $prop($, 'executable'),
"commandLine": $prop($, 'command_line'),
"commandTemplate": $prop($, 'command_line_template')
}
- id: OBOM-WIN-008
name: "Windows startup or process activity uses network-capable LOLBAS"
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."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:lolbas:matched') = 'true'
and (
$listContains($prop($, 'cdx:lolbas:functions'), 'download')
or $listContains($prop($, 'cdx:lolbas:functions'), 'upload')
)
and (
$prop($, 'cdx:osquery:category') = 'windows_run_keys'
or $prop($, 'cdx:osquery:category') = 'scheduled_tasks'
or $prop($, 'cdx:osquery:category') = 'startup_items'
or (
$prop($, 'cdx:osquery:category') = 'processes'
and (
$contains($lowercase($nullSafeProp($, 'cmdline')), 'http://')
or $contains($lowercase($nullSafeProp($, 'cmdline')), 'https://')
or $contains($lowercase($nullSafeProp($, 'cmdline')), '-enc ')
)
)
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Network-capable LOLBAS helper(s) {{ $prop($, 'cdx:lolbas:names') }} detected in '{{ $prop($, 'cdx:osquery:category') }}'"
mitigation: "Correlate with outbound connections and downloads, restrict unmanaged scripting/network utilities, and investigate encoded or remote-fetch command lines."
attack:
tactics: [TA0002, TA0010, TA0011]
techniques: [T1041, T1059.001, T1105]
evidence: |
{
"queryCategory": $prop($, 'cdx:osquery:category'),
"lolbasNames": $prop($, 'cdx:lolbas:names'),
"functions": $prop($, 'cdx:lolbas:functions'),
"command": description,
"cmdline": $prop($, 'cmdline'),
"action": $prop($, 'action')
}
- id: OBOM-WIN-009
name: "Network-facing Windows listener is a LOLBAS execution helper"
description: "A listening process backed by a LOLBAS execution helper is a strong remote-control or staging indicator on Windows endpoints."
severity: critical
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'listening_ports'
and $prop($, 'cdx:lolbas:matched') = 'true'
and (
$safeStr($prop($, 'address')) = '0.0.0.0'
or $safeStr($prop($, 'address')) = '::'
)
and (
$listContains($prop($, 'cdx:lolbas:functions'), 'command')
or $listContains($prop($, 'cdx:lolbas:functions'), 'script-execution')
or $listContains($prop($, 'cdx:lolbas:functions'), 'shell')
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Listening process '{{ name }}' on {{ $prop($, 'address') }}:{{ $prop($, 'port') }} matches LOLBAS helper(s) {{ $prop($, 'cdx:lolbas:names') }}"
mitigation: "Review parent process lineage, isolate unmanaged listeners, and block or remove unexpected inbound admin or scripting surfaces."
attack:
tactics: [TA0002, TA0005, TA0011]
techniques: [T1059, T1105, T1218]
evidence: |
{
"lolbasNames": $prop($, 'cdx:lolbas:names'),
"functions": $prop($, 'cdx:lolbas:functions'),
"path": $prop($, 'path'),
"cmdline": $prop($, 'cmdline'),
"address": $prop($, 'address'),
"port": $prop($, 'port')
}
- id: OBOM-WIN-010
name: "Windows persistence artifact uses LOLBAS with UAC-bypass context"
description: "Persistence surfaces that reference LOLBAS helpers documented with UAC-bypass behavior should be treated as privilege-escalation investigations."
severity: critical
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:lolbas:matched') = 'true'
and $listContains($prop($, 'cdx:lolbas:contexts'), 'uac-bypass')
and (
$prop($, 'cdx:osquery:category') = 'windows_run_keys'
or $prop($, 'cdx:osquery:category') = 'scheduled_tasks'
or $prop($, 'cdx:osquery:category') = 'startup_items'
or $prop($, 'cdx:osquery:category') = 'wmi_cli_event_consumers'
or $prop($, 'cdx:osquery:category') = 'wmi_cli_event_consumers_snapshot'
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "UAC-bypass-capable LOLBAS helper(s) {{ $prop($, 'cdx:lolbas:names') }} detected in Windows persistence artifact '{{ name }}'"
mitigation: "Investigate as a possible privilege-escalation foothold, remove unauthorized registration points, and enforce WDAC/AppLocker policies for known proxy binaries."
attack:
tactics: [TA0004, TA0005]
techniques: [T1548.002, T1218]
evidence: |
{
"queryCategory": $prop($, 'cdx:osquery:category'),
"lolbasNames": $prop($, 'cdx:lolbas:names'),
"contexts": $prop($, 'cdx:lolbas:contexts'),
"path": $prop($, 'path'),
"action": $prop($, 'action'),
"command": description
}
- id: OBOM-MAC-004
name: "macOS launchd override disables Apple-managed service"
description: "Launchd overrides disabling Apple-managed services can indicate tampering with built-in security or platform controls."
severity: medium
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'launchd_overrides'
and $safeStr($prop($, 'key')) = 'Disabled'
and (
$safeStr($prop($, 'value')) = '1'
or $lowercase($safeStr($prop($, 'value'))) = 'true'
)
and $startsWith($safeStr($prop($, 'label')), 'com.apple.')
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Launchd override disables Apple-managed label '{{ $prop($, 'label') }}'"
mitigation: "Review override provenance, restore approved launchd settings, and investigate unauthorized local configuration changes."
evidence: |
{
"label": $prop($, 'label'),
"key": $prop($, 'key'),
"value": $prop($, 'value'),
"uid": $prop($, 'uid'),
"plistPath": $prop($, 'path')
}
- id: OBOM-MAC-005
name: "macOS Gatekeeper enforcement is disabled or weakened"
description: "Gatekeeper should enforce assessments and identified-developer checks on managed macOS endpoints."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'gatekeeper'
and (
$safeStr($prop($, 'assessments_enabled')) != '1'
or $safeStr($prop($, 'dev_id_enabled')) != '1'
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Gatekeeper posture is weakened (assessments_enabled={{ $prop($, 'assessments_enabled') }}, dev_id_enabled={{ $prop($, 'dev_id_enabled') }})"
mitigation: "Re-enable Gatekeeper assessments and identified-developer enforcement with spctl or an MDM configuration profile, then validate the host against baseline policy."
evidence: |
{
"gatekeeperVersion": version,
"opaqueVersion": description,
"assessmentsEnabled": $prop($, 'assessments_enabled'),
"devIdEnabled": $prop($, 'dev_id_enabled')
}
- id: OBOM-LNX-014
name: "Linux reverse shell behavior detected in live process telemetry"
description: "A shell process with a live remote socket is a strong signal for hands-on-keyboard abuse, staging, or remote command execution."
severity: critical
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'behavioral_reverse_shell'
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Reverse-shell-like process behavior detected for '{{ name }}' reaching {{ $prop($, 'remote_address') }}:{{ $prop($, 'remote_port') }}"
mitigation: "Isolate the host, review process lineage and parent shell context, and confirm whether the remote session is expected administrative activity."
evidence: |
{
"path": $prop($, 'path'),
"cmdline": $prop($, 'cmdline'),
"parentCmdline": $prop($, 'parent_cmdline'),
"remoteAddress": $prop($, 'remote_address'),
"remotePort": $prop($, 'remote_port')
}
- id: OBOM-LNX-015
name: "Linux process uses LD_PRELOAD from writable or temporary path"
description: "LD_PRELOAD pointing at user-controlled paths can indicate library hijacking, stealth persistence, or runtime tampering."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'ld_preload'
and (
$contains($lowercase($safeStr($prop($, 'value'))), '/tmp/')
or $contains($lowercase($safeStr($prop($, 'value'))), '/var/tmp/')
or $contains($lowercase($safeStr($prop($, 'value'))), '/dev/shm/')
or $contains($lowercase($safeStr($prop($, 'value'))), '/home/')
or $contains($lowercase($safeStr($prop($, 'value'))), '/run/user/')
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Process '{{ name }}' sets LD_PRELOAD to a risky path: {{ $prop($, 'value') }}"
mitigation: "Review the preload library, remove unauthorized runtime injection, and compare the process with package ownership and startup history."
evidence: |
{
"processPath": $prop($, 'path'),
"cmdline": $prop($, 'cmdline'),
"cwd": $prop($, 'cwd'),
"ldPreload": $prop($, 'value')
}
- id: OBOM-LNX-016
name: "Linux cron entry fetches remote content or runs from writable path"
description: "Cron jobs that fetch remote content or execute from temporary and user-writable paths are a high-signal persistence pattern."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'crontab_snapshot'
and (
(
(
$contains($lowercase($safeStr($prop($, 'command'))), 'curl ')
or $contains($lowercase($safeStr($prop($, 'command'))), 'wget ')
)
and (
$contains($lowercase($safeStr($prop($, 'command'))), 'http://')
or $contains($lowercase($safeStr($prop($, 'command'))), 'https://')
or $contains($lowercase($safeStr($prop($, 'command'))), '| sh')
or $contains($lowercase($safeStr($prop($, 'command'))), '| bash')
)
)
or $contains($lowercase($safeStr($prop($, 'command'))), '/tmp/')
or $contains($lowercase($safeStr($prop($, 'command'))), '/var/tmp/')
or $contains($lowercase($safeStr($prop($, 'command'))), '/dev/shm/')
or $contains($lowercase($safeStr($prop($, 'command'))), '/home/')
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Cron entry '{{ name }}' has a risky command: {{ $prop($, 'command') }}"
mitigation: "Move bootstrap downloads into a managed deployment path, review cron ownership, and remove unauthorized recurring tasks."
evidence: |
{
"command": $prop($, 'command'),
"path": $prop($, 'path'),
"minute": $prop($, 'minute'),
"hour": $prop($, 'hour')
}
- id: OBOM-LNX-017
name: "Linux sysctl posture diverges from common hardening baseline"
description: "Weak ASLR and redirect-handling sysctl values are commonly called out in Lynis and CIS-style hardening reviews."
severity: medium
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'sysctl_hardening'
and (
(name = 'kernel.randomize_va_space' and $safeStr(version) != '2')
or (name = 'kernel.kptr_restrict' and $safeStr(version) = '0')
or (
(
name = 'net.ipv4.conf.all.accept_redirects'
or name = 'net.ipv4.conf.default.accept_redirects'
or name = 'net.ipv4.conf.all.send_redirects'
or name = 'net.ipv4.conf.default.send_redirects'
)
and $safeStr(version) = '1'
)
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Sysctl '{{ name }}' has a weak hardening value: {{ version }}"
mitigation: "Align the sysctl value with your baseline, apply the setting persistently, and validate whether the deviation is truly required for this host."
evidence: |
{
"sysctl": name,
"value": version
}
- id: OBOM-LNX-018
name: "Linux temporary mount is missing key hardening flags"
description: "Temporary and shared-memory mounts should usually carry noexec, nosuid, and nodev protections on hardened hosts."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:osquery:category') = 'mount_hardening'
and (
name = '/tmp'
or name = '/var/tmp'
or name = '/dev/shm'
)
and (
$not($contains($lowercase($safeStr(version)), 'noexec'))
or $not($contains($lowercase($safeStr(version)), 'nosuid'))
or $not($contains($lowercase($safeStr(version)), 'nodev'))
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Mount '{{ name }}' is missing one or more hardening flags: {{ version }}"
mitigation: "Review whether the mount should carry noexec, nosuid, and nodev, then enforce the chosen baseline through fstab, systemd mounts, or image build policy."
evidence: |
{
"mount": name,
"flags": version,
"device": description,
"type": $prop($, 'type')
}
- id: OBOM-LNX-019
name: "Live Linux runtime artifact matches GTFOBins execution helper"
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."
severity: high
category: obom-runtime
dry-run-support: full
condition: |
components[
$prop($, 'cdx:gtfobins:matched') = 'true'
and (
$prop($, 'cdx:osquery:category') = 'sudo_executions'
or $prop($, 'cdx:osquery:category') = 'privilege_transitions'
or $prop($, 'cdx:osquery:category') = 'privileged_listening_ports'
or $prop($, 'cdx:osquery:category') = 'behavioral_reverse_shell'
or (
$prop($, 'cdx:osquery:category') = 'elevated_processes'
and (
$safeStr($prop($, 'package_source_hint')) = 'user-writable-path'
or $contains($nullSafeProp($, 'path'), '/tmp/')
or $contains($nullSafeProp($, 'path'), '/var/tmp/')
or $contains($nullSafeProp($, 'path'), '/dev/shm/')
or $contains($nullSafeProp($, 'path'), '/home/')
or $contains($nullSafeProp($, 'path'), '/run/user/')
or $contains($nullSafeProp($, 'cmdline'), '/tmp/')
or $contains($nullSafeProp($, 'cmdline'), '/var/tmp/')
or $contains($nullSafeProp($, 'cmdline'), '/dev/shm/')
or $contains($nullSafeProp($, 'cmdline'), '/home/')
or $contains($nullSafeProp($, 'cmdline'), '/run/user/')
)
)
)
and (
$listContains($prop($, 'cdx:gtfobins:functions'), 'shell')
or $listContains($prop($, 'cdx:gtfobins:functions'), 'command')
or $listContains($prop($, 'cdx:gtfobins:functions'), 'reverse-shell')
)
]
location: |
{
"bomRef": $."bom-ref",
"purl": purl
}
message: "Runtime artifact '{{ name }}' matches GTFOBins helper(s) {{ $prop($, 'cdx:gtfobins:names') }} in '{{ $prop($, 'cdx:osquery:category') }}'"
mitigation: "Validate the binary provenance and operator intent, then review related sudo, privilege-transition, listener, and remote-connection telemetry before suppressing the finding."
evidence: |
{
"queryCategory": $prop($, 'cdx:osquery:category'),
"gtfobinsNames": $prop($, 'cdx:gtfobins:names'),
"functions": $prop($, 'cdx:gtfobins:functions'),
"contexts": $prop($, 'cdx:gtfobins:contexts'),
"riskTags": $prop($, 'cdx:gtfobins:riskTags'),
"path": $prop($, 'path'),
"cmdline": $prop($, 'cmdline')
}
- id: OBOM-WIN-011
name: "Windows Public profile inbound firewall allow rule"
description: "Inbound allow rules on the Public firewall profile can expose services beyon