Detection rules › Elastic
Powershell Encoded Command
Detects process events where the process is Powershell (pwsh) or a shell interpreter (sh, bash, zsh) with the encoded command flag set in the process arguments. Powershell usage on macOS is extremely rare but usage of Powershell with the encoded command flag, used for executing base64 encoded command strings, is almost always inherently malicious.
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Execution |
Rule body
[rule]
description = """
Detects process events where the process is Powershell (pwsh) or a shell interpreter (sh, bash, zsh) with the encoded
command flag set in the process arguments. Powershell usage on macOS is extremely rare but usage of Powershell with the
encoded command flag, used for executing base64 encoded command strings, is almost always inherently malicious.
"""
id = "4abb4f46-2066-4769-b073-dca491067e1b"
license = "Elastic License v2"
name = "Powershell Encoded Command"
os_list = ["macos"]
version = "1.0.22"
query = '''
process where event.type == "start" and process.args in~ ("-EncodedCommand", "-enc") and
(process.name in ("sh", "bash", "zsh", "pwsh", "dash", "csh", "tcsh", "ksh", "tclsh", "fish") or process.name like "tclsh*") and
not process.args like "/Applications/Visual Studio Code.app/*" and
not process.executable like "/Applications/Docker.app/Contents/Resources/bin/docker" and
not process.parent.executable in ("/Applications/Docker.app/Contents/Resources/bin/com.docker.cli",
"/Applications/VSCodium.app/Contents/Frameworks/VSCodium Helper.app/Contents/MacOS/VSCodium Helper",
"/Applications/Cursor.app/Contents/Frameworks/Cursor Helper.app/Contents/MacOS/Cursor Helper",
"/Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper.app/Contents/MacOS/Code Helper",
"/Applications/Docker.app/Contents/Resources/bin/docker") and
not process.parent.code_signature.team_id in ("UBF8T346G9", "83Z2LHX6XW") and
not process.Ext.effective_parent.name == "electron" and
not ((process.name == "zsh" and process.parent.name == "zsh") or
(process.name == "pwsh" and process.parent.name == "pwsh") or
(process.name == "pwsh" and process.parent.name == "Code Helper"))
'''
min_endpoint_version = "8.11.0"
optional_actions = []
[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 0
[[actions]]
action = "kill_process"
field = "process.parent.entity_id"
state = 0
[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1059"
name = "Command and Scripting Interpreter"
reference = "https://attack.mitre.org/techniques/T1059/"
[[threat.technique.subtechnique]]
id = "T1059.001"
name = "PowerShell"
reference = "https://attack.mitre.org/techniques/T1059/001/"
[threat.tactic]
id = "TA0002"
name = "Execution"
reference = "https://attack.mitre.org/tactics/TA0002/"
[internal]
min_endpoint_version = "8.11.0"
Stages and Predicates
Stage 1: process
process where event.type == "start" and process.args in~ ("-EncodedCommand", "-enc") and
(process.name in ("sh", "bash", "zsh", "pwsh", "dash", "csh", "tcsh", "ksh", "tclsh", "fish") or process.name like "tclsh*") and
not process.args like "/Applications/Visual Studio Code.app/*" and
not process.executable like "/Applications/Docker.app/Contents/Resources/bin/docker" and
not process.parent.executable in ("/Applications/Docker.app/Contents/Resources/bin/com.docker.cli",
"/Applications/VSCodium.app/Contents/Frameworks/VSCodium Helper.app/Contents/MacOS/VSCodium Helper",
"/Applications/Cursor.app/Contents/Frameworks/Cursor Helper.app/Contents/MacOS/Cursor Helper",
"/Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper.app/Contents/MacOS/Code Helper",
"/Applications/Docker.app/Contents/Resources/bin/docker") and
not process.parent.code_signature.team_id in ("UBF8T346G9", "83Z2LHX6XW") and
not process.Ext.effective_parent.name == "electron" and
not ((process.name == "zsh" and process.parent.name == "zsh") or
(process.name == "pwsh" and process.parent.name == "pwsh") or
(process.name == "pwsh" and process.parent.name == "Code Helper"))
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
process.name | eq | pwsh | excludes:process.name field:"process.name" value:"pwsh" |
process.parent.name | eq | Code Helper | excludes:process.parent.name field:"process.parent.name" value:"Code Helper" |
process.parent.name | eq | pwsh | excludes:process.parent.name field:"process.parent.name" value:"pwsh" |
process.name | eq | zsh | excludes:process.name field:"process.name" value:"zsh" |
process.parent.name | eq | zsh | excludes:process.parent.name field:"process.parent.name" value:"zsh" |
process.Ext.effective_parent.name | eq | electron | excludes:process.Ext.effective_parent.name field:"process.Ext.effective_parent.name" value:"electron" |
process.args | starts_with | /Applications/Visual Studio Code.app/ | excludes:process.args field:"process.args" value:"/Applications/Visual Studio Code.app/" |
process.executable | eq | /Applications/Docker.app/Contents/Resources/bin/docker | excludes:process.executable field:"process.executable" value:"/Applications/Docker.app/Contents/Resources/bin/docker" |
process.parent.code_signature.team_id | in | 83Z2LHX6XW, UBF8T346G9 | excludes:process.parent.code_signature.team_id field:"process.parent.code_signature.team_id" value:"83Z2LHX6XW" field:"process.parent.code_signature.team_id" value:"UBF8T346G9" |
process.parent.executable | in | /Applications/Cursor.app/Contents/Frameworks/Cursor Helper.app/Contents/MacOS/Cursor Helper, /Applications/Docker.app/Contents/Resources/bin/com.docker.cli, /Applications/Docker.app/Contents/Resources/bin/docker, /Applications/VSCodium.app/Contents/Frameworks/VSCodium Helper.app/Contents/MacOS/VSCodium Helper, /Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper.app/Contents/MacOS/Code Helper | excludes:process.parent.executable |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
event.type | eq |
| field:"event.type" kind:eq value:"start" |
process.args | in |
| field:"process.args" kind:in |
process.name | in |
| field:"process_name" kind:in |
process.name | wildcard |
| field:"process_name" kind:wildcard value:"tclsh*" |