Open of another process's /proc mem or maps file on Linux
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 descriptionShow less
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.
Nobody has run this in a real environment and said what happened.
Verdicts from engineers who deployed it
0 castNo 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.