Skip to content

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

Siemphony’s repertoire

Remote memory write handle without remote-thread rights

Siemphony@siemphonymediumT1055.003unverified
AN0822 describes a chain of OpenThread, SuspendThread, VirtualAllocEx, WriteProcessMemory, SetThreadContext and ResumeThread against a live process. Only one link in that chain reaches a log source in this brief: the process handle the injector must hold before it can allocate and write, which Sysmon EventID 10 records with its access mask. The rule therefore matches handles granting memory operation and remote memory write on one of the long-lived hosts an injector picks, and deliberately matches only masks that do NOT include PROCESS_CREATE_THREAD — an actor who intends to redirect a thread that already exists has no reason to ask for the right to create one, and that absence is the only thing on this feed that separates thread hijacking from the remote-thread injection published at T1055.001 and T1055.002. The mask list and the target list are authored here; MITRE names the knobs (TargetProcessList, populated here with the shell, session and service hosts, plus TimeWindow and SuspiciousThreadContextRegions, neither of which is expressible without correlation). Limits worth knowing before you trust a quiet result: Sysmon's ProcessAccess callback covers process objects only, so OpenThread, SuspendThread and SetThreadContext produce no event at all, and create_remote_thread (EventID 8) is listed in this brief but is the wrong feed here by construction — this technique reuses an existing thread rather than creating one, so a selector on EventID 8 could never fire for it. An injector that asks for full access (0x1FFFFF) is also missed here and lands in the T1055.001 mask list instead. Prerequisite: Sysmon emits EventID 10 only where the configuration carries a ProcessAccess rule, and the common baseline configurations scope that to lsass.exe alone — on such a host this rule returns zero rows, and zero rows reads as quiet when it means blind. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0295, 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=* ((TargetImage="*\\explorer.exe" OR TargetImage="*\\svchost.exe" OR TargetImage="*\\dllhost.exe" OR TargetImage="*\\taskhostw.exe" OR TargetImage="*\\winlogon.exe" OR TargetImage="*\\spoolsv.exe") AND (GrantedAccess="0x1438" OR GrantedAccess="0x1428" OR GrantedAccess="0x438" OR GrantedAccess="0x428" OR GrantedAccess="0x38" OR GrantedAccess="0x28"))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE ((TO_LOWER(TargetImage) LIKE "*\\\\explorer.exe" OR TO_LOWER(TargetImage) LIKE "*\\\\svchost.exe" OR TO_LOWER(TargetImage) LIKE "*\\\\dllhost.exe" OR TO_LOWER(TargetImage) LIKE "*\\\\taskhostw.exe" OR TO_LOWER(TargetImage) LIKE "*\\\\winlogon.exe" OR TO_LOWER(TargetImage) LIKE "*\\\\spoolsv.exe") AND (TO_LOWER(GrantedAccess) == "0x1438" OR TO_LOWER(GrantedAccess) == "0x1428" OR TO_LOWER(GrantedAccess) == "0x438" OR TO_LOWER(GrantedAccess) == "0x428" OR TO_LOWER(GrantedAccess) == "0x38" OR TO_LOWER(GrantedAccess) == "0x28"))

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="7">    <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. -->    <field name="TargetImage" type="pcre2">(?i)(\\explorer\.exe$|\\svchost\.exe$|\\dllhost\.exe$|\\taskhostw\.exe$|\\winlogon\.exe$|\\spoolsv\.exe$)</field>    <field name="GrantedAccess" type="pcre2">(?i)(^0x1438$|^0x1428$|^0x438$|^0x428$|^0x38$|^0x28$)</field>    <description>Remote memory write handle without remote-thread rights</description>    <mitre>      <id>T1055.003</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.