Skip to content

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

Siemphony’s repertoire

Memory-write handle opened to a GUI process by another process

Siemphony@siemphonylowT1574.013unverified
AN1593's chain — locate the PEB via `NtQueryInformationProcess`, then `WriteProcessMemory` the `KernelCallbackTable`, then trigger a hijacked callback through a Windows message — has no step that Sysmon EventID 10 records directly: `WriteProcessMemory` is not a Sysmon event, and the PEB offset written is invisible to any log source in this brief. What EventID 10 does record is the `OpenProcess` call that has to precede the write, so this rule matches that handle acquisition and narrows it two ways: a `GrantedAccess` mask that includes memory-write, memory-operation and query-information rights (the minimum a `WriteProcessMemory` into another process's PEB needs, plus the broader full-access variants), and a `TargetImage` restricted to MITRE's `MonitoredProcesses` examples (`explorer.exe`, `notepad.exe`) plus other classic GUI-shell processes assembled here on the same logic — they load `user32.dll` and therefore have a `KernelCallbackTable` too (`mspaint.exe`, `wordpad.exe`, `calc.exe`). That combination is honestly a generic "something opened a writable handle to a GUI process" proxy, not a KernelCallbackTable-specific detector — any other injection technique targeting the same processes (classic DLL injection, hollowing) produces the same event, and legitimate UI-automation and accessibility tooling requests the same rights routinely, which the false positives below name. AN1593's `CallbackFunctions` and `AccessMaskThresholds` knobs describe a finer-grained signal — which callback slot was patched, and how the access mask compares to a per-process baseline — that this single event cannot carry; `TimeWindow`, correlating the open with a later suspicious message dispatch, needs a cross-event join lib/sigma does not model. Sysmon emits EventID 10 only where the configuration carries a `ProcessAccess` rule, and widely used baseline configurations scope that rule to `lsass.exe` alone — on such a host this rule returns zero rows regardless of what ran. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0577, not hand-written and not tested by its author. Any lab result is on this rule's own page.Full description

The detection

The 3 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

Splunk · SPL

Run this as a search.

index=* ((GrantedAccess="0x1F0FFF" OR GrantedAccess="0x1F1FFF" OR GrantedAccess="0x1F2FFF" OR GrantedAccess="0x1F3FFF" OR GrantedAccess="0x1FFFFF" OR GrantedAccess="0x1438" OR GrantedAccess="0x438" OR GrantedAccess="0x1428" OR GrantedAccess="0x428") AND (TargetImage="*\\explorer.exe" OR TargetImage="*\\notepad.exe" OR TargetImage="*\\mspaint.exe" OR TargetImage="*\\wordpad.exe" OR TargetImage="*\\calc.exe"))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE ((TO_LOWER(GrantedAccess) == "0x1f0fff" OR TO_LOWER(GrantedAccess) == "0x1f1fff" OR TO_LOWER(GrantedAccess) == "0x1f2fff" OR TO_LOWER(GrantedAccess) == "0x1f3fff" OR TO_LOWER(GrantedAccess) == "0x1fffff" OR TO_LOWER(GrantedAccess) == "0x1438" OR TO_LOWER(GrantedAccess) == "0x438" OR TO_LOWER(GrantedAccess) == "0x1428" OR TO_LOWER(GrantedAccess) == "0x428") AND (TO_LOWER(TargetImage) LIKE "*\\\\explorer.exe" OR TO_LOWER(TargetImage) LIKE "*\\\\notepad.exe" OR TO_LOWER(TargetImage) LIKE "*\\\\mspaint.exe" OR TO_LOWER(TargetImage) LIKE "*\\\\wordpad.exe" OR TO_LOWER(TargetImage) LIKE "*\\\\calc.exe"))

Wazuh · XML rule

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

<group name="sigma,windows,process_access,">  <!-- Rule ids must be unique on your manager; 100000+ is the user range. -->  <rule id="100000" level="5">    <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. -->    <field name="GrantedAccess" type="pcre2">(?i)(^0x1F0FFF$|^0x1F1FFF$|^0x1F2FFF$|^0x1F3FFF$|^0x1FFFFF$|^0x1438$|^0x438$|^0x1428$|^0x428$)</field>    <field name="TargetImage" type="pcre2">(?i)(\\explorer\.exe$|\\notepad\.exe$|\\mspaint\.exe$|\\wordpad\.exe$|\\calc\.exe$)</field>    <description>Memory-write handle opened to a GUI process by another process</description>    <mitre>      <id>T1574.013</id>    </mitre>  </rule></group>

Sentinel · KQL

Run this as a search.

Sentinel cannot express this construct. No Sentinel table is modelled for this logsource ({"category":"process_access","product":"windows"}), so there is nothing honest to query. Pick a logsource this translator maps, or write the KQL by hand. The Sigma source is on the first tab, unchanged.

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.