Skip to content

Siemphony is in beta and still being built. What ships today, and what does not.

Siemphony’s repertoire

Executable created at an unquoted service path interception point

Siemphony@siemphonyhighT1574.009unverified
Matches the file-creation leg of AN0176: an executable written to one of the fixed locations Windows probes when it resolves an unquoted service or shortcut path containing spaces. CreateProcess splits such a path on each space and tries every prefix in turn, appending `.exe` when the prefix has no extension, so `C:\Program Files\Common Files\Vendor\svc.exe` written without quotes is attempted first as `C:\Program.exe`, then as `C:\Program Files\Common.exe`, and only then as the intended binary. The prefix ends at each space, not at each path component, which is why anything under `C:\Program Files (x86)\` yields a second drive-root probe at `C:\Program Files.exe` — the same write permission as `C:\Program.exe` buys the adversary the whole x86 tree, so both roots are listed. Those prefixes are a short, closed list on a stock Windows install, which is why this rule enumerates the interception points themselves rather than trying to find the vulnerable service configuration — MITRE's `MonitoredServices` and `BaselineServiceConfig` knobs both require a per-host inventory of ImagePath values compared against a known-good baseline, and lib/sigma has neither a join nor a stored baseline to compare against. The `SuspiciousBinaryList` knob is what the filename list implements, populated here from the prefixes Windows actually probes rather than taken from MITRE. Each entry is anchored with `endswith` on `:\` or on the `Program Files` folder name so a drive root is required: `C:\Program.exe` matches, `C:\Tools\Program.exe` does not, and the anchor works on a system drive other than C:. Only `.exe` is listed because CreateProcess appends only that extension to an extensionless prefix, so a `Program.com` or `Program.bat` at the drive root is not an interception target and is deliberately absent. Scope and limits. This sees the payload being planted, not the hijack firing; the execution half of the analytic — the intercepted process starting from the unexpected location, within MITRE's `TimeWindow` knob — is a separate Sysmon EventID 1 record and a cross-event correlation this rule cannot express. It also sees only the standard prefixes: a service installed under a bespoke unquoted path such as `C:\My App\bin\svc.exe` creates an interception point at `C:\My.exe` that no static list can anticipate, and a site with such services should extend the list from its own ImagePath inventory. The brief's registry source is not used here: it maps Security EventID 4657 onto the Sigma `registry_set` category, and detecting the vulnerable configuration itself would need "ImagePath value contains a space before the extension and does not begin with a quote", which is a structural test on the value rather than a match on it. Prerequisite: Sysmon FileCreate is an allowlist in every mainstream configuration, and the drive root and the Program Files roots are not always in it, so confirm they are in scope before reading an empty result as an absence of this technique. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0064, 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.

DeviceFileEvents| where (FolderPath endswith ":\\Program.exe" or FolderPath endswith ":\\Program Files.exe" or FolderPath endswith ":\\Documents.exe" or FolderPath endswith "\\Program Files\\Common.exe" or FolderPath endswith "\\Program Files (x86)\\Common.exe")

Splunk · SPL

Run this as a search.

index=* (TargetFilename="*:\\Program.exe" OR TargetFilename="*:\\Program Files.exe" OR TargetFilename="*:\\Documents.exe" OR TargetFilename="*\\Program Files\\Common.exe" OR TargetFilename="*\\Program Files (x86)\\Common.exe")

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE (TO_LOWER(file.path) LIKE "*:\\\\program.exe" OR TO_LOWER(file.path) LIKE "*:\\\\program files.exe" OR TO_LOWER(file.path) LIKE "*:\\\\documents.exe" OR TO_LOWER(file.path) LIKE "*\\\\program files\\\\common.exe" OR TO_LOWER(file.path) LIKE "*\\\\program files (x86)\\\\common.exe")

Wazuh · XML rule

Deploy to your manager — this is a rule, not a search.

<group name="sigma,windows,file_event,">  <!-- 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="TargetFilename" type="pcre2">(?i)(:\\Program\.exe$|:\\Program Files\.exe$|:\\Documents\.exe$|\\Program Files\\Common\.exe$|\\Program Files \(x86\)\\Common\.exe$)</field>    <description>Executable created at an unquoted service path interception point</description>    <mitre>      <id>T1574.009</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.

1 thread

  • @owen-mackay

    The mitigation-stub false positive is my favourite one in this whole corpus: the recommended hardening for unquoted service paths is to pre-create a benign, ACL-locked C:\Program.exe so no attacker can claim the name — and your detection fires on the remediation. It happens once per host, under SYSTEM, during a build window, so it brackets easily, but only if you know it is coming. We did not, the first time.

    • @priya-raman

      And the Atomic test for this drops the file and deletes it seconds later, exactly as the create-then-delete pair the description mentions. If you run Atomics on a schedule, exclude the test host explicitly. Otherwise you spend a quarter training your analysts that this alert is always the test, and then it is not.