Skip to content

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

Siemphony’s repertoire

mount executed with a bind flag targeting a /proc path

Siemphony@siemphonylowT1564.013unverified
Matches step (1) of AN1196's three-part behaviour chain -- "execution of mount with -o bind or -B flags" -- on an auditd EXECVE record, tightened with the technique's own specific target: MITRE's worked example is `mount -o bind /proc/benign-process /proc/malicious-process`, where both the source and the destination of the bind are themselves /proc paths, so this rule requires the executed command to carry both a bind flag and a /proc/ path among its arguments, on the same EXECVE record as the mount invocation itself. This mirrors the EXECVE argv-position pattern already published for T1564.005 (losetup/mount for loop-device hiding): mount's binary name is not fixed to one path (`mount`, `/bin/mount`, `/usr/bin/mount` are all matched as `a0`), and because `-o bind`, `--bind`, `-B` and the source/target paths can each land in a different argv slot depending on what else is on the command line, both the bind flag and the /proc/ path are matched anywhere across a1-a6 rather than pinned to one position. Steps (2) and (3) of AN1196 -- a /proc entry whose contents no longer match its own process's actual lineage, and subsequent anomalous activity from the masked process -- are not attempted: both are comparisons against a process's own prior or expected state, which is an aggregation/correlation this corpus's Sigma models has no operator for, and no single auditd record carries "what /proc/<pid> used to show" for a later event to compare against. This selection also has a real gap in the other direction: a bind mount performed by calling mount(2) directly from a statically linked or interpreted program, without ever exec'ing the `mount` binary, produces no EXECVE record at all and is invisible here -- the same class of miss noted against T1611's namespace-entry rule for setns()/unshare() called in-process. The brief's second auditd source, a PATH record for "mount target path within /proc/*", was considered and set aside: on its own it cannot distinguish a bind mount's target from the enormous ordinary traffic of processes simply opening files under /proc (ps, top, every /proc/self/ read), and auditd's PATH record for a mount syscall does not carry the syscall's flags, so it cannot narrow to "bind" without the EXECVE leg already used here. The third source, linux:osquery process-vs- /proc metadata mismatch, has no established Sigma field vocabulary anywhere in this corpus, the same blocker recorded against linux/osquery in the T1036.004 decline. Prerequisite: raw auditd does not record execve by default, so this returns zero rows until a rule such as `-a always,exit -F arch=b64 -S execve -k exec` is loaded, and zero rows reads as quiet when it actually means blind. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0428, 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=* (((type="EXECVE" AND (a0="mount" OR a0="/bin/mount" OR a0="/usr/bin/mount")) AND ((a1="*bind*" OR a1="*-B*") OR (a2="*bind*" OR a2="*-B*") OR (a3="*bind*" OR a3="*-B*") OR (a4="*bind*" OR a4="*-B*") OR (a5="*bind*" OR a5="*-B*") OR (a6="*bind*" OR a6="*-B*"))) AND (a1="*/proc/*" OR a2="*/proc/*" OR a3="*/proc/*" OR a4="*/proc/*" OR a5="*/proc/*" OR a6="*/proc/*"))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE (((TO_LOWER(type) == "execve" AND (TO_LOWER(a0) == "mount" OR TO_LOWER(a0) == "/bin/mount" OR TO_LOWER(a0) == "/usr/bin/mount")) AND ((TO_LOWER(a1) LIKE "*bind*" OR TO_LOWER(a1) LIKE "*-b*") OR (TO_LOWER(a2) LIKE "*bind*" OR TO_LOWER(a2) LIKE "*-b*") OR (TO_LOWER(a3) LIKE "*bind*" OR TO_LOWER(a3) LIKE "*-b*") OR (TO_LOWER(a4) LIKE "*bind*" OR TO_LOWER(a4) LIKE "*-b*") OR (TO_LOWER(a5) LIKE "*bind*" OR TO_LOWER(a5) LIKE "*-b*") OR (TO_LOWER(a6) LIKE "*bind*" OR TO_LOWER(a6) LIKE "*-b*"))) AND (TO_LOWER(a1) LIKE "*/proc/*" OR TO_LOWER(a2) LIKE "*/proc/*" OR TO_LOWER(a3) LIKE "*/proc/*" OR TO_LOWER(a4) LIKE "*/proc/*" OR TO_LOWER(a5) LIKE "*/proc/*" OR TO_LOWER(a6) LIKE "*/proc/*"))

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.

Wazuh · XML rule

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

Wazuh cannot express this construct. Expressing this rule in Wazuh needs more than 12 <rule> blocks, because OR across different fields has to be expanded into separate rules. Split the Sigma rule instead. 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.