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 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
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: lowSplunk · 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.
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.