PowerShell launched pinned to the version 2 engine
AN0995 names PowerShell version downgrade as its own example, and the version-2 engine is the cleanest single-event observable the strategy offers: it exists specifically to run without Script Block Logging, transcription or AMSI, so a process-creation command line that requests it is unambiguous rather than merely suspicious. PowerShell resolves partial parameter names, so the selection covers every abbreviation of `-Version 2` down to `-ve 2`, alongside `powershell_ise.exe` since the ISE takes the same switch. The single-letter form `-v 2` is deliberately excluded: `-v` is a near-universal short flag for other tools' verbose output, and `-v 2>&1` — verbose plus the extremely common stderr-to-stdout redirect — contains the same substring, so keeping it would have turned this into a rule that fires on redirected verbose output inside almost any `-Command` invocation rather than on a version pin. The registry leg of the same analytic (Defender/HVCI keys via Security 4657) is not authored here: 4657 splits a key and its value across `ObjectName`/`ObjectValueName` rather than the single `TargetObject` the `registry_set` category expects, so it needs a field-mapping decision this rule does not make. The Linux (AN0996) and macOS (AN0997) legs of DET0350 cover a different technique's shape entirely — legacy interpreters and TLS fallback — and are out of scope for a single Windows-only rule. Requires Sysmon to be installed, since process creation is not logged at all without it. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0350, not hand-written and not tested by its author. Any lab result is on this rule's own page.Full descriptionShow less
The detection
The 4 SIEM queries below are previews produced by Siemphony’s own translator, not pySigma, and none has been executed against a real backend — review before you deploy.
detection.yml
Sentinel · KQL
Run this as a search.
DeviceProcessEvents| where ((FolderPath endswith "\\powershell.exe" or FolderPath endswith "\\powershell_ise.exe") and (ProcessCommandLine contains "-version 2" or ProcessCommandLine contains "-versio 2" or ProcessCommandLine contains "-versi 2" or ProcessCommandLine contains "-vers 2" or ProcessCommandLine contains "-ver 2" or ProcessCommandLine contains "-ve 2"))
Splunk · SPL
Run this as a search.
index=* ((Image="*\\powershell.exe" OR Image="*\\powershell_ise.exe") AND (CommandLine="*-version 2*" OR CommandLine="*-versio 2*" OR CommandLine="*-versi 2*" OR CommandLine="*-vers 2*" OR CommandLine="*-ver 2*" OR CommandLine="*-ve 2*"))Elastic · ES|QL
Run this as a search.
FROM logs-*| WHERE ((TO_LOWER(process.executable) LIKE "*\\\\powershell.exe" OR TO_LOWER(process.executable) LIKE "*\\\\powershell_ise.exe") AND (TO_LOWER(process.command_line) LIKE "*-version 2*" OR TO_LOWER(process.command_line) LIKE "*-versio 2*" OR TO_LOWER(process.command_line) LIKE "*-versi 2*" OR TO_LOWER(process.command_line) LIKE "*-vers 2*" OR TO_LOWER(process.command_line) LIKE "*-ver 2*" OR TO_LOWER(process.command_line) LIKE "*-ve 2*"))
Wazuh · XML rule
Deploy to your manager — this is a rule, not a search.
<group name="sigma,windows,process_creation,"> <!-- Rule ids must be unique on your manager; 100000+ is the user range. --> <rule id="100000" level="12"> <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. --> <field name="Image" type="pcre2">(?i)(\\powershell\.exe$|\\powershell_ise\.exe$)</field> <field name="CommandLine" type="pcre2">(?i)(-version 2|-versio 2|-versi 2|-vers 2|-ver 2|-ve 2)</field> <description>PowerShell launched pinned to the version 2 engine</description> <mitre> <id>T1689</id> </mitre> </rule></group>
Verdicts · reactions · comments
Community
Verdicts from engineers who actually deployed it, and the conversation around it.
Nobody has run this in a real environment and said what happened.
Verdicts from engineers who deployed it
0 castNo verdicts reported yet. The first one is worth more than the tenth — say what you ran it against.
Log in to report a verdict.
Log in to join the discussion.
1 thread
@priya-raman
Excluding the single-letter `-v 2` form is the right call, and it is the kind of thing you only learn by running the rule. We carried the naive version on Splunk for about a year and the top match by volume was `-v 2>&1` inside a monitoring script — verbose plus a stderr redirect, nothing to do with a downgrade. Good that the reasoning is written down rather than left as an unexplained gap in the list.
@hana-kobayashi
One thing worth checking before you treat a hit as high: whether the host still has the v2 engine feature installed at all. On anything built from a modern Server image it usually is not, so the command line is a request that fails and nothing actually runs downgraded. Still a fine intent signal — nobody types it by accident — but the triage note should say so, or an analyst will go looking for a session that never existed.