Skip to content

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

Siemphony’s repertoire

Open of another process's /proc mem or maps file on Linux

Siemphony@siemphonylowT1055.009unverified
Matches an auditd PATH record naming `/proc/<pid>/mem` or `/proc/<pid>/maps` for any pid, which is what AN1494 describes: enumerating a target process's memory mappings via `/proc/[pid]/maps` to find gadgets, then overwriting its stack via `/proc/[pid]/mem`. Unlike the static `-w` file watches this corpus uses elsewhere (e.g. T1053.003's cron paths), the pid segment here is dynamic and cannot be named in a `-w` watch, so this rule only matches if the underlying audit configuration is a broad syscall rule on `open`/`openat` rather than a path watch — see the prerequisite note below. The regex is anchored so it only matches the two files under a numeric pid directory, not `/proc/self/...` or `/proc/<pid>/status` and similar metadata files that are read constantly and would swamp the rule. What this cannot see: `write(2)` operates on an already-open file descriptor and carries no path argument, so auditd never attaches a PATH record to it — this rule can only observe the `open`/`openat` of the target file, not the write that follows. That means it cannot distinguish a read-only inspection of `/proc/<pid>/mem` (some debuggers and profilers read it directly instead of using ptrace) from an actual overwrite; the open call's flags argument (`O_RDONLY` vs. `O_WRONLY`/`O_RDWR`) is carried in the SYSCALL record as a raw, unnamed integer this corpus does not decode, so read/write cannot be told apart here — that is a detection limitation, not a false positive. MITRE's `TimeWindowBetweenMapAccessAndMemWrite` and `FileWriteThreshold` knobs both need the write event this rule cannot observe, so they are not applied. The brief's other two logsources are not attempted: the `process_creation` execve logsource covers only the narrower case of `dd` or `sed` invoked directly against these paths, which this open-based selection already subsumes without needing a specific tool list; and `linux:osquery` has no standardised Sigma field vocabulary in this corpus, the same reason `macos:unifiedlog` was skipped for T1027.015's AN0784. Prerequisite: no distribution audits `/proc/*/mem` or `/proc/*/maps` opens by default, and because the path is per-pid, a `-w` watch cannot cover it — this needs a syscall-scoped rule such as `-a always,exit -F arch=b64 -S open -S openat -k procmem_access`, which also logs every other file open on the host and is high-volume by design. Until it is loaded, this rule returns zero rows, meaning blind rather than quiet. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0541, not hand-written and not tested by its author. Any lab result is on this rule's own page.Full description

The detection

The 2 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=* | where (match(type, "(?i)^PATH$") AND match(name, "^/proc/[0-9]+/(mem|maps)$"))

Wazuh · XML rule

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

<group name="sigma,linux,">  <!-- 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 linux so this only evaluates relevant events. -->    <field name="type" type="pcre2">(?i)^PATH$</field>    <field name="name" type="pcre2">(?i)^/proc/[0-9]+/(mem|maps)$</field>    <description>Open of another process's /proc mem or maps file on Linux</description>    <mitre>      <id>T1055.009</id>    </mitre>  </rule></group>

Sentinel · KQL

Run this as a search.

Sentinel cannot express this construct. No Sentinel table is modelled for this logsource ({"product":"linux","service":"auditd"}), 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.

Elastic · ES|QL

Run this as a search.

Elastic cannot express this construct. ES|QL RLIKE uses Lucene regexp syntax, which has no case-insensitive flag, and Sigma regexes are case-insensitive. Use |contains/|startswith/|endswith, or write the ES|QL 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.