Skip to content

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

Siemphony’s repertoire

mount executed with a bind flag targeting a /proc path

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

title: mount executed with a bind flag targeting a /proc pathid: 681175ca-7c26-4d7f-8606-bb352266fee7status: experimentaldescription: |  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.references:  - https://attack.mitre.org/techniques/T1564/013  - https://attack.mitre.org/detectionstrategies/DET0428author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-18tags:  - attack.defense-evasion  - attack.t1564.013logsource:  product: linux  service: auditddetection:  selection_mount_exec:    type: 'EXECVE'    a0:      - 'mount'      - '/bin/mount'      - '/usr/bin/mount'  selection_bind_flag:    - a1|contains: ['bind', '-B']    - a2|contains: ['bind', '-B']    - a3|contains: ['bind', '-B']    - a4|contains: ['bind', '-B']    - a5|contains: ['bind', '-B']    - a6|contains: ['bind', '-B']  selection_proc_target:    - a1|contains: '/proc/'    - a2|contains: '/proc/'    - a3|contains: '/proc/'    - a4|contains: '/proc/'    - a5|contains: '/proc/'    - a6|contains: '/proc/'  condition: selection_mount_exec and selection_bind_flag and selection_proc_targetfalsepositives:  - "Container runtimes and orchestration tooling (runc, containerd, Kubernetes kubelet, LXC) that bind-mount host /proc entries or a masked /proc/<pid> into a container's mount namespace as a routine part of container start-up and cgroup/PID isolation -- on a busy container host this is the loudest and most frequent source of matches."  - "chroot and jail-style service sandboxing (BIND9, vsftpd and similar daemons run in a chroot, or manually built jails) that bind-mounts /proc into the jail root with `mount --bind /proc <jail>/proc` so jailed tools like `ps` continue to function -- a documented, legitimate systems-administration pattern rather than an evasion attempt."  - "Diagnostic and forensic tooling (process-namespace inspectors, `nsenter`-adjacent debugging scripts, some APM/observability agents) that bind-mounts a specific process's /proc/<pid> directory elsewhere to inspect it out-of-band without disturbing the running process."level: low

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.