Skip to content

Siemphony is in beta and still being built. How a rule earns its badge.

Siemphony’s repertoire

JamPlus-spawned shell runs a script interpreter or downloader

Siemphony@siemphonymediumT1127.003unverified
AN1610 describes JamPlus being handed a crafted `.jam` file so that the build utility, rather than the adversary's own binary, is what executes the payload — the point being that a reputable developer tool passes application control where an unknown executable would not. An earlier version of this rule pinned `ParentImage` to `jam.exe` and listed the interpreter or downloader directly as the `Image`, which is one process generation too shallow: Jam (and JamPlus, which forks Perforce Jam) does not exec an action's command directly on Windows, it runs every action through the shell, building `cmd.exe /Q/C <action>` and, for multi-line or over-length actions, spilling to a generated temporary `.bat` file. A `.jam` action of `powershell -enc ...` therefore produces `powershell.exe` with `ParentImage` `\cmd.exe`, not `\jam.exe` — ten of the eleven entries in that child list could never fire, and what remained, `jam.exe` spawning `cmd.exe`, is this rule's own highest-volume false positive with no discriminating power left once the dead entries are stripped out. This version anchors on the real shape of the behaviour instead: `jam.exe` or `JamPlus.exe` (MITRE's own spelling, added here — the original binary name was omitted from the parent list entirely) as `ParentImage` of `cmd.exe`, and MITRE's `SuspiciousChildList` knob, populated here with script-host and living-off-the-land tokens, is checked against that shell's own `CommandLine` rather than a further child's image — which the `process_creation` category can carry because Sysmon EID 1 attaches the full command line to the shell's own process-creation event. This still misses a payload that arrives via the temp-`.bat` spill: for a multi-line or over-length action, only `cmd.exe /Q/C C:\...\jamXXXX.bat` is visible on this event, and the interpreter or downloader token that would trigger a match sits inside the batch file's content, which process creation does not carry. Two further limits. T1127.003 is bring-your-own-binary — the operator supplies the JamPlus copy, so the name is theirs to pick — and the parent list only reaches the two spellings above; a rename to any other name defeats it, which is why a second path is ORed in keying on `ParentCommandLine` containing `.jam`, so a renamed copy invoked against a jamfile still lands somewhere, at the cost of matching any command line that merely references a path with a `.jam` extension. And no process-creation event, on Sysmon or on Security 4688, carries the parent's original file name — the earlier description blamed this on 4688 specifically, which was wrong; there is no vocabulary in which a renamed parent falls back to a true name. The analytic's other legs — the artefact written to a user-writable path behind MITRE's `RarePathRegex` knob (Sysmon 11), and the egress that follows (Sysmon 3 and 22) — are separate events inside MITRE's `TimeWindow` knob, and lib/sigma has no timeframe or join to tie them to the execution here. MITRE's `AllowedBuildHosts` knob, scoping alerts to machines where JamPlus is not expected, is a deployment-time filter with no field on the event either. Vocabulary and prerequisite: the brief maps Security 4688 onto Sigma's `process_creation` category, which is Sysmon-shaped, and this rule is written in that vocabulary (`Image`, `ParentImage`, `CommandLine`, `ParentCommandLine`); a 4688 feed needs those mapped from `NewProcessName`/`ParentProcessName`/ `CommandLine` first, and produces nothing at all until Audit Process Creation is enabled, which no default install or baseline turns on. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0585, not hand-written and not tested by its author. Any lab result is on this rule's own page.Full description

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 ((((InitiatingProcessFolderPath endswith "\\jam.exe" or InitiatingProcessFolderPath endswith "\\JamPlus.exe") or InitiatingProcessCommandLine contains ".jam") and FolderPath endswith "\\cmd.exe") and (ProcessCommandLine contains "powershell" or ProcessCommandLine contains "pwsh" or ProcessCommandLine contains "wscript" or ProcessCommandLine contains "cscript" or ProcessCommandLine contains "mshta" or ProcessCommandLine contains "rundll32" or ProcessCommandLine contains "regsvr32" or ProcessCommandLine contains "certutil" or ProcessCommandLine contains "curl" or ProcessCommandLine contains "bitsadmin"))

Splunk · SPL

Run this as a search.

index=* ((((ParentImage="*\\jam.exe" OR ParentImage="*\\JamPlus.exe") OR ParentCommandLine="*.jam*") AND Image="*\\cmd.exe") AND (CommandLine="*powershell*" OR CommandLine="*pwsh*" OR CommandLine="*wscript*" OR CommandLine="*cscript*" OR CommandLine="*mshta*" OR CommandLine="*rundll32*" OR CommandLine="*regsvr32*" OR CommandLine="*certutil*" OR CommandLine="*curl*" OR CommandLine="*bitsadmin*"))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE ((((TO_LOWER(process.parent.executable) LIKE "*\\\\jam.exe" OR TO_LOWER(process.parent.executable) LIKE "*\\\\jamplus.exe") OR TO_LOWER(process.parent.command_line) LIKE "*.jam*") AND TO_LOWER(process.executable) LIKE "*\\\\cmd.exe") AND (TO_LOWER(process.command_line) LIKE "*powershell*" OR TO_LOWER(process.command_line) LIKE "*pwsh*" OR TO_LOWER(process.command_line) LIKE "*wscript*" OR TO_LOWER(process.command_line) LIKE "*cscript*" OR TO_LOWER(process.command_line) LIKE "*mshta*" OR TO_LOWER(process.command_line) LIKE "*rundll32*" OR TO_LOWER(process.command_line) LIKE "*regsvr32*" OR TO_LOWER(process.command_line) LIKE "*certutil*" OR TO_LOWER(process.command_line) LIKE "*curl*" OR TO_LOWER(process.command_line) LIKE "*bitsadmin*"))

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. -->  <!-- 2 rules: the Sigma condition ORs across different fields,       which one rule cannot express. Any one matching is a hit. -->  <rule id="100000" level="7">    <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. -->    <field name="ParentImage" type="pcre2">(?i)(\\jam\.exe$|\\JamPlus\.exe$)</field>    <field name="Image" type="pcre2">(?i)\\cmd\.exe$</field>    <field name="CommandLine" type="pcre2">(?i)(powershell|pwsh|wscript|cscript|mshta|rundll32|regsvr32|certutil|curl|bitsadmin)</field>    <description>JamPlus-spawned shell runs a script interpreter or downloader (1/2)</description>    <mitre>      <id>T1127.003</id>    </mitre>  </rule>   <rule id="100001" level="7">    <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. -->    <field name="ParentCommandLine" type="pcre2">(?i)\.jam</field>    <field name="Image" type="pcre2">(?i)\\cmd\.exe$</field>    <field name="CommandLine" type="pcre2">(?i)(powershell|pwsh|wscript|cscript|mshta|rundll32|regsvr32|certutil|curl|bitsadmin)</field>    <description>JamPlus-spawned shell runs a script interpreter or downloader (2/2)</description>    <mitre>      <id>T1127.003</id>    </mitre>  </rule></group>

Verdicts · reactions · comments

Community

Verdicts from engineers who actually deployed it, and the conversation around it.

Log in to react
Not yet reported on

Nobody has run this in a real environment and said what happened.

Verdicts from engineers who deployed it

0 cast

No 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.

No comments yet. Someone who deploys this will have something to say about it.