Skip to content

Suspicious activity rules

Triage → Process → Suspicious activity lists behaviours recognised in a run’s system calls, kernel records and packets. This page is the reference for every rule: the 14 rule ids that exist in 0.7.0 (13 behaviours; memory.rwx_attempt is the failed form of memory.rwx), and the classification planned for 0.7.1 and 0.8.0. A row is something to look at, not a verdict.

How tiers, categories and status marks work is on Tiers and categories. How rows are grouped, lowered and hidden is on Noise handling.

Each rule has a stable id, such as persistence.cron. Its first line gives:

  • the tier (HIGH, MEDIUM, LOW, INFO), and the category;
  • the status: ✅ recorded today, 🔶 needs correlation, 🔷 needs new kernel data;
  • whether it exists in 0.7.0 or is planned, with the version.

Then:

  • ATT&CK — the MITRE ATT&CK Enterprise technique for Linux, with the ATT&CK detection strategy (DET…) where there is one, and the Malware Behavior Catalog (MBC) id where useful. IDs were checked against ATT&CK v20 on 2026-10-21; ATT&CK v19 renumbered several defense evasion techniques, and the old IDs are given where they changed.
  • Trigger — the exact calls, arguments, paths or sequence.
  • Data — where the rule reads from: the syscall trace, a kernel record (lifecycle.creds, lifecycle.file_hash, lifecycle.file_id, lifecycle.exec_image), the Triage file lifecycle, the network capture (as TShark reads it), or static analysis.
  • Why this tier — how often benign software does the same, and the usual false positives.
  • References — a malware report, a detection rule (SigmaHQ, Elastic, CAPE) or the kernel documentation for the mechanism.

A finding is evaluated only on data the recording has. A recording from an older base without file identity records, for example, follows files by name, and network rules need a network capture for the run.

0.7.0 has 14 rule ids, two severities and no categories. Each matching call is one row; see Processes for the columns and Triage table filters for the fields.

Rule in 0.7.0 Severity today Planned (0.7.1)
memory.rwx high HIGH; also write-and-execute without read, and pkey_mprotect; T1620 instead of T1055
memory.rwx_attempt high MEDIUM (the failed form)
process.exec medium INFO, not counted in the badge
process.interpreter medium LOW; versioned names and more interpreters; judged by the #! interpreter
process.memfd_exec high HIGH; also /proc/self/fd/N and memfd inodes
process.memfd medium LOW
process.ptrace high Split: injection.ptrace_attach and injection.ptrace_poke (HIGH), evasion.traceme (MEDIUM), the rest LOW
process.vm_rw high Split: injection.vm_write (HIGH, T1055) and credential.proc_mem_read (HIGH, T1003.007); the id is retired
persistence.module high HIGH, unchanged
persistence.config_write medium Split into the specific persistence, injection and privilege rules below; the rest LOW
privilege.change medium Replaced by privilege.gain (MEDIUM), privilege.drop (INFO), privilege.setuid_exec (LOW) and privilege.kernel_exploit (HIGH), from the kernel’s credential records; the id is retired
bpf.program medium MEDIUM; rootkit.bpf_tracing (HIGH) for tracing programs with tampering helpers
bpf.socket_filter medium MEDIUM; c2.bpf_backdoor (HIGH) with a packet socket
bpf.seccomp_filter medium LOW

Defects in 0.7.0 that the planned version fixes are noted under each rule as Correction. A filter on a retired id keeps matching the rows of a recording indexed before the change.

These are not rules of their own; they change the tier of a matching rule. They are explained in Noise handling.

Context Effect
The call failed One tier down, except where failing is the signal (scans, brute force, memory.rwx_attempt keeps its own row)
Not in the run’s process tree and not caused by the sample One tier down, hidden in a run
Started by cron, systemd, at or SSH for something the sample wrote Keeps its tier; linked to the file that caused it
Program on the rule’s allow-list One tier down
VM housekeeping on the built-in suppression list (DHCP, neighbor discovery, mDNS/LLMNR, NTP, the gateway’s DNS for the base’s own lookups) Hidden
Network row not tied to a process of the run (until per-packet process attribution, planned for 0.7.1) One tier down (VM-wide)
Capture all: process started before the capture began Out of scope

The planned classification has 149 rules: 61 HIGH, 57 MEDIUM, 24 LOW, 7 INFO.

Rule Planned tier Category Status Rule available
process.exec INFO Execution ✅ in 0.7.0
process.interpreter LOW Execution ✅ in 0.7.0
execution.download_cradle MEDIUM Execution ✅ planned 0.7.1
execution.dropped_exec HIGH Execution 🔶 planned 0.7.1
execution.chmod_exec_temp MEDIUM Execution ✅ planned 0.7.1
execution.temp_exec MEDIUM Execution ✅ planned 0.7.1
execution.compile_then_run MEDIUM Execution 🔶 planned 0.7.1
process.memfd_exec HIGH Execution ✅ in 0.7.0
execution.fileless_exec HIGH Execution ✅ planned 0.7.1
process.memfd LOW Execution ✅ in 0.7.0
execution.memfd_elf MEDIUM Execution 🔶 planned 0.7.1
execution.dropped_library MEDIUM Execution 🔶 planned 0.7.1
process.ptrace LOW Injection ✅ in 0.7.0
injection.ptrace_attach HIGH Injection ✅ planned 0.7.1
injection.ptrace_poke HIGH Injection ✅ planned 0.7.1
injection.vm_write HIGH Injection ✅ planned 0.7.1
injection.proc_mem_write HIGH Injection ✅ planned 0.7.1
injection.ld_preload_env MEDIUM Injection ✅ planned 0.7.1
injection.ld_so_preload HIGH Injection ✅ planned 0.7.1
injection.ld_so_conf MEDIUM Injection ✅ planned 0.7.1
persistence.cron HIGH Persistence ✅ planned 0.7.1
persistence.at_job MEDIUM Persistence ✅ planned 0.7.1
persistence.systemd HIGH Persistence ✅ planned 0.7.1
persistence.rc_init HIGH Persistence ✅ planned 0.7.1
persistence.event_script MEDIUM Persistence ✅ planned 0.7.1
persistence.shell_profile MEDIUM Persistence ✅ planned 0.7.1
persistence.ssh_authorized_keys HIGH Persistence ✅ planned 0.7.1
persistence.xdg_autostart MEDIUM Persistence ✅ planned 0.7.1
persistence.udev HIGH Persistence ✅ planned 0.7.1
persistence.pam HIGH Persistence ✅ planned 0.7.1
persistence.module HIGH Persistence ✅ in 0.7.0
persistence.module_autoload HIGH Persistence ✅ planned 0.7.1
persistence.apt_hook MEDIUM Persistence ✅ planned 0.7.1
persistence.web_shell MEDIUM Persistence ✅ planned 0.7.1
persistence.binary_replace HIGH Persistence ✅ planned 0.7.1
persistence.account HIGH Persistence ✅ planned 0.7.1
persistence.config_write LOW Persistence ✅ in 0.7.0
privilege.drop INFO Privilege escalation 🔶 planned 0.7.1
privilege.gain MEDIUM Privilege escalation 🔶 planned 0.7.1
privilege.setuid_exec LOW Privilege escalation ✅ planned 0.7.1
privilege.setid_bit HIGH Privilege escalation ✅ planned 0.7.1
privilege.pwnkit HIGH Privilege escalation ✅ planned 0.7.1
privilege.kernel_exploit HIGH Privilege escalation 🔶 planned 0.7.1
privilege.cred_overwrite HIGH Privilege escalation 🔷 planned 0.8.0
privilege.sudoers HIGH Privilege escalation ✅ planned 0.7.1
privilege.userns MEDIUM Privilege escalation ✅ planned 0.7.1
privilege.kernel_helper_hijack HIGH Privilege escalation ✅ planned 0.7.1
privilege.container_escape MEDIUM Privilege escalation ✅ planned 0.7.1
privilege.dirty_pipe HIGH Privilege escalation 🔶 planned 0.7.1
memory.rwx HIGH Defense evasion / anti-analysis ✅ in 0.7.0
memory.rwx_attempt MEDIUM Defense evasion / anti-analysis ✅ in 0.7.0
memory.wx_transition MEDIUM Defense evasion / anti-analysis 🔶 planned 0.7.1
memory.write_then_exec HIGH Defense evasion / anti-analysis 🔷 planned 0.7.1
memory.unpacked_capture INFO Defense evasion / anti-analysis 🔷 planned 0.7.1
evasion.packed_image LOW Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.self_delete HIGH Defense evasion / anti-analysis 🔶 planned 0.7.1
evasion.log_clear HIGH Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.history_clear MEDIUM Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.security_disable HIGH Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.firewall_modify MEDIUM Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.audit_disable HIGH Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.masquerade_kthread HIGH Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.masquerade_daemon MEDIUM Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.sandbox_probe MEDIUM Defense evasion / anti-analysis 🔶 planned 0.7.1
evasion.probe_then_exit MEDIUM Defense evasion / anti-analysis 🔶 planned 0.7.1
evasion.traceme MEDIUM Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.debugger_check LOW Defense evasion / anti-analysis 🔶 planned 0.7.1
evasion.container_check LOW Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.long_sleep MEDIUM Defense evasion / anti-analysis 🔶 planned 0.7.1
evasion.cpuid_probe MEDIUM Defense evasion / anti-analysis 🔷 planned, later
evasion.timing_probe LOW Defense evasion / anti-analysis 🔷 planned, later
evasion.timestomp MEDIUM Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.kill_list MEDIUM Defense evasion / anti-analysis 🔶 planned 0.7.1
evasion.hidden_artifact LOW Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.immutable_attr HIGH Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.proc_hide_mount HIGH Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.sysctl_security MEDIUM Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.dumpable_off LOW Defense evasion / anti-analysis ✅ planned 0.7.1
evasion.io_uring_usage INFO Defense evasion / anti-analysis ✅ planned 0.7.1
bpf.seccomp_filter LOW Defense evasion / anti-analysis ✅ in 0.7.0
credential.shadow_read HIGH Credential access ✅ planned 0.7.1
credential.ssh_keys MEDIUM Credential access ✅ planned 0.7.1
credential.cloud_tokens HIGH Credential access ✅ planned 0.7.1
credential.browser_store MEDIUM Credential access ✅ planned 0.7.1
credential.wallet MEDIUM Credential access ✅ planned 0.7.1
credential.history_read LOW Credential access ✅ planned 0.7.1
credential.kerberos_ccache MEDIUM Credential access ✅ planned 0.7.1
credential.proc_mem_read HIGH Credential access ✅ planned 0.7.1
credential.cloud_metadata HIGH Credential access ✅ planned 0.7.1
discovery.process_enum LOW Discovery 🔶 planned 0.7.1
discovery.system_info INFO Discovery 🔶 planned 0.7.1
discovery.network_config LOW Discovery 🔶 planned 0.7.1
discovery.user_enum INFO Discovery ✅ planned 0.7.1
discovery.file_search LOW Discovery 🔶 planned 0.7.1
discovery.security_software MEDIUM Discovery ✅ planned 0.7.1
discovery.network_scan MEDIUM Discovery 🔶 planned 0.7.1
c2.reverse_shell HIGH Command & control 🔶 planned 0.7.1
c2.bind_shell HIGH Command & control 🔶 planned 0.7.1
network.listen_any MEDIUM Command & control ✅ planned 0.7.1
network.raw_socket MEDIUM Command & control ✅ planned 0.7.1
c2.bpf_backdoor HIGH Command & control 🔶 planned 0.7.1
bpf.socket_filter MEDIUM Command & control ✅ in 0.7.0
network.tor MEDIUM Command & control ✅ planned 0.7.1
network.ip_literal LOW Command & control 🔶 planned 0.7.1
network.dga_nxdomain MEDIUM Command & control 🔶 planned 0.7.1
network.dns_tunnel MEDIUM Command & control 🔶 planned 0.7.1
network.nonstandard_port LOW Command & control 🔶 planned 0.7.1
network.irc_c2 MEDIUM Command & control ✅ planned 0.7.1
network.web_service LOW Command & control ✅ planned 0.7.1
network.beacon LOW Command & control 🔶 planned 0.7.1
network.proxy_tunnel MEDIUM Command & control ✅ planned 0.7.1
c2.elf_download HIGH Command & control 🔶 planned 0.7.1
lateral.ssh_spread HIGH Lateral movement 🔶 planned 0.7.1
lateral.bruteforce HIGH Lateral movement 🔶 planned 0.7.1
lateral.service_exploit MEDIUM Lateral movement 🔶 planned 0.7.1
lateral.tool_transfer MEDIUM Lateral movement ✅ planned 0.7.1
exfil.file_to_socket MEDIUM Exfiltration ✅ planned 0.7.1
exfil.large_upload MEDIUM Exfiltration 🔶 planned 0.7.1
collection.keylog MEDIUM Collection ✅ planned 0.7.1
collection.tty_inject MEDIUM Collection ✅ planned 0.7.1
collection.screen_capture LOW Collection ✅ planned 0.7.1
collection.av_capture LOW Collection ✅ planned 0.7.1
collection.archive_staging MEDIUM Collection 🔶 planned 0.7.1
collection.clipboard LOW Collection ✅ planned 0.7.1
collection.local_sweep LOW Collection 🔶 planned 0.7.1
impact.ransom_rewrite HIGH Impact 🔶 planned 0.7.1
impact.ransom_note MEDIUM Impact 🔶 planned 0.7.1
impact.mass_delete HIGH Impact 🔶 planned 0.7.1
impact.block_device_write HIGH Impact ✅ planned 0.7.1
impact.reboot HIGH Impact ✅ planned 0.7.1
impact.miner HIGH Impact ✅ planned 0.7.1
impact.miner_tuning MEDIUM Impact ✅ planned 0.7.1
impact.fork_bomb MEDIUM Impact 🔶 planned 0.7.1
impact.ddos_flood HIGH Impact 🔶 planned 0.7.1
impact.service_stop MEDIUM Impact ✅ planned 0.7.1
impact.inhibit_recovery MEDIUM Impact ✅ planned 0.7.1
bpf.program MEDIUM Rootkit ✅ in 0.7.0
rootkit.bpf_tracing HIGH Rootkit ✅ planned 0.8.0
rootkit.dev_mem HIGH Rootkit ✅ planned 0.7.1
rootkit.module_capture INFO Rootkit 🔷 planned 0.8.0
rootkit.module_hidden HIGH Rootkit 🔷 planned 0.8.0
rootkit.syscall_table HIGH Rootkit 🔷 planned 0.8.0
rootkit.text_patch HIGH Rootkit 🔷 planned 0.8.0
rootkit.ftrace_hook HIGH Rootkit 🔷 planned 0.8.0
rootkit.kprobe_hook HIGH Rootkit 🔷 planned 0.8.0
rootkit.netfilter_hook HIGH Rootkit 🔷 planned 0.8.0
rootkit.hidden_process HIGH Rootkit 🔶🔷 planned 0.8.0
rootkit.hidden_file HIGH Rootkit 🔶🔷 planned 0.8.0
rootkit.hidden_port HIGH Rootkit 🔶🔷 planned 0.8.0
  • INFO · Execution · ✅ · Exists in 0.7.0 as medium; INFO from 0.7.1 (version 2)
  • ATT&CK: data component DC0032 Process Creation; a technique only through the rules below
  • Trigger: execve (59) or execveat (322).
  • Data: syscall trace (path, argv, envp at entry; lifecycle.exec_commit, lifecycle.exec_image).
  • Why this tier: every program starts programs. In 0.7.0 this rule is most of the badge; as INFO it stays on the timeline and in the graph but is not counted.
  • References: execve(2), execveat(2).

process.interpreter — shell or script interpreter started

Section titled “process.interpreter — shell or script interpreter started”
  • LOW · Execution · ✅ · Exists in 0.7.0 as medium; LOW and widened in 0.7.1 (version 2)
  • ATT&CK: T1059.004 Unix Shell (DET0384), T1059.006 Python (DET0063), T1059.007 JavaScript (DET0264), T1059.011 Lua (DET0101)
  • Trigger: an exec whose image, or whose #! interpreter in lifecycle.exec_image, is a shell or interpreter. 0.7.0 matches the exact names sh, bash, dash, zsh, python, python3, perl, ruby, node. Version 2 adds versioned names (python3.12), ash, ksh, mksh, busybox sh, php, lua, tclsh, awk, and judges a script by its interpreter.
  • Data: syscall trace; kernel record lifecycle.exec_image.
  • Why this tier: system() and popen() start a shell; package scripts and services run interpreters constantly. The summary shows the -c command line, which is the useful part.
  • Noise: grouped per parent and command line.
  • References: Sigma: Linux Shell Pipe to Shell, Sigma: Inline Python Execution - Spawn Shell Via OS System Library.

execution.download_cradle — download piped into an interpreter

Section titled “execution.download_cradle — download piped into an interpreter”

execution.dropped_exec — a file written during the run is executed

Section titled “execution.dropped_exec — a file written during the run is executed”
  • HIGH · Execution · 🔶 · Planned 0.7.1
  • ATT&CK: T1105 Ingress Tool Transfer (DET0060) · MBC B0023 Install Additional Program
  • Trigger: an exec whose image was created or written by the run before the exec: the inode in the exec’s lifecycle.file_id (kind Exec) matches a file the run created, wrote or renamed into place; without file identity, the same path. The launched sample itself and files uploaded before the run do not count.
  • Data: kernel records lifecycle.file_id, lifecycle.exec_image, lifecycle.file_hash (write at last close); Triage file lifecycle.
  • Why this tier: this is what a dropper does. Benign cases are self-extracting installers and build systems; compilers are handled by execution.compile_then_run.
  • References: Aqua Kinsing report (above: d.sh downloads kinsing and runs it), Sigma: Download File To Potentially Suspicious Directory Via Wget.

execution.chmod_exec_temp — made executable in a staging directory

Section titled “execution.chmod_exec_temp — made executable in a staging directory”

execution.temp_exec — program run from a staging or hidden directory

Section titled “execution.temp_exec — program run from a staging or hidden directory”

execution.compile_then_run — code compiled in the guest and run

Section titled “execution.compile_then_run — code compiled in the guest and run”
  • MEDIUM · Execution · 🔶 · Planned 0.7.1
  • ATT&CK: T1027.004 Compile After Delivery (DET0501)
  • Trigger: gcc, cc, clang, tcc, as or ld started by the run writes an output file that the run then executes.
  • Data: syscall trace, process tree, file identity.
  • Why this tier: compiling is normal on a developer machine and rare for a dropped sample; local exploit compilation is the typical case.
  • References: ATT&CK T1027.004 procedure examples (Rocke delivered .c files compiled with GCC), Elastic: Potential Privilege Escalation via Recently Compiled Executable.

process.memfd_exec — execution of a memory-only file

Section titled “process.memfd_exec — execution of a memory-only file”
  • HIGH · Execution · ✅ · Exists in 0.7.0 (high); widened in 0.7.1 (version 2)
  • ATT&CK: T1620 Reflective Code Loading (DET0300)
  • Trigger: 0.7.0: execveat(fd, "", AT_EMPTY_PATH) on a descriptor the run got from memfd_create. Version 2 also: execve("/proc/self/fd/N"), /proc/PID/fd/N or /dev/fd/N resolving to a memfd, and any exec whose lifecycle.file_id names a memfd inode.
  • Data: syscall trace with descriptor state; kernel record lifecycle.file_id.
  • Why this tier: running an image that never existed on disk is a loader technique; benign uses (some sandboxes and self-updaters) are rare.
  • References: memfd_create(2); LevelBlue (AT&T Alien Labs), Malware using new Ezuri memory loader (2021; TeamTNT and Gafgyt; the Ezuri stub calls memfd_create then execs /proc/self/fd/N); Sandfly Security, Detecting Linux memfd_create() Fileless Malware; Elastic: Potential Fileless Execution via Unusual memfd Create Call.
  • Correction: 0.7.0 cites DET0508 for process.memfd. DET0508 is the T1055 process injection strategy; the memfd execution strategy is DET0300.

execution.fileless_exec — execution of a deleted or unnamed file

Section titled “execution.fileless_exec — execution of a deleted or unnamed file”
  • HIGH · Execution · ✅ · Planned 0.7.1
  • ATT&CK: T1620 Reflective Code Loading (DET0300)
  • Trigger: an exec whose image inode has no name left (nlink == 0 in lifecycle.file_id), was opened with O_TMPFILE, or is reached through /proc/*/fd/N and is not a memfd.
  • Data: kernel record lifecycle.file_id; syscall trace.
  • Why this tier: a program that deletes its image and then runs it, or runs an unnamed file, is hiding its executable.
  • References: Sandfly Security memfd article (above; /proc/*/exe -> (deleted)), Elastic: Potential Fileless Execution via O_TMPFILE, open(2) O_TMPFILE.

process.memfd — memory-only file created

Section titled “process.memfd — memory-only file created”
  • LOW · Execution · ✅ · Exists in 0.7.0 as medium; LOW in 0.7.1 (version 2)
  • ATT&CK: context for T1620 (DET0300)
  • Trigger: memfd_create (319).
  • Data: syscall trace.
  • Why this tier: systemd, Wayland and PulseAudio clients, Chromium and many runtimes use memfds for shared memory. Only what is written into it and executed matters.
  • References: memfd_create(2).

execution.memfd_elf — an ELF image written into a memfd

Section titled “execution.memfd_elf — an ELF image written into a memfd”
  • MEDIUM · Execution · 🔶 · Planned 0.7.1
  • ATT&CK: T1620 Reflective Code Loading
  • Trigger: a write, pwrite64, sendfile or copy_file_range into a memfd whose first captured bytes are \x7fELF.
  • Data: syscall trace (written bytes are captured).
  • Why this tier: staging an executable in memory; it becomes HIGH when it is executed (process.memfd_exec).
  • References: Ezuri stub and LevelBlue report (above).

execution.dropped_library — a library written during the run is loaded

Section titled “execution.dropped_library — a library written during the run is loaded”
  • MEDIUM · Execution · 🔶 · Planned 0.7.1
  • ATT&CK: T1129 Shared Modules (DET0018)
  • Trigger: mmap with PROT_EXEC of a file the run created or wrote (by file identity or path).
  • Data: syscall trace; Triage file category Mapped; file identity.
  • Why this tier: plugins and JIT caches do this; a dropper that loads its payload as a .so does too.
  • References: ATT&CK T1129 procedure examples (RotaJakiro loads .so files with dlopen()), Elastic: Shared Object Created by Previously Unknown Process, dlopen(3).
  • LOW · Injection · ✅ · Exists in 0.7.0 as high for every request; LOW in 0.7.1 (version 2) for requests no rule below covers
  • ATT&CK: T1055.008 Ptrace System Calls (context)
  • Trigger: ptrace (101) with a request other than those of evasion.traceme, injection.ptrace_attach and injection.ptrace_poke (for example PEEKDATA, GETREGS, CONT).
  • Data: syscall trace.
  • Why this tier: these requests follow an attach and are only meaningful with it; one row per tracer and target, with a count.
  • References: ptrace(2).

injection.ptrace_attach — attach to another process

Section titled “injection.ptrace_attach — attach to another process”

injection.ptrace_poke — writing another process’s memory or registers

Section titled “injection.ptrace_poke — writing another process’s memory or registers”
  • HIGH · Injection · ✅ · Planned 0.7.1 (split from process.ptrace)
  • ATT&CK: T1055.008 Ptrace System Calls (DET0203)
  • Trigger: ptrace with POKETEXT (4), POKEDATA (5), POKEUSER (6), SETREGS (13), SETFPREGS (15) or SETREGSET (0x4205).
  • Data: syscall trace. The target’s memory is never read (it is recorded as address only); the written word is the data argument.
  • Why this tier: changing another process’s code or registers is injection unless the sample is a debugger.
  • References: Akamai guide and dlinject (above), ptrace(2).

injection.vm_write — process_vm_writev into another process

Section titled “injection.vm_write — process_vm_writev into another process”
  • HIGH · Injection · ✅ · Planned 0.7.1 (split from process.vm_rw)
  • ATT&CK: T1055 Process Injection (DET0508, DET0203) · MBC E1055 Process Injection
  • Trigger: process_vm_writev (311) with a pid other than the caller’s.
  • Data: syscall trace; the local buffers (the payload) are captured, the remote side is address only.
  • Why this tier: benign uses are debuggers and checkpoint tools.
  • References: process_vm_writev(2), Akamai guide (above).
  • Correction: 0.7.0 labels both process_vm_readv and process_vm_writev T1055.009, which is /proc/PID/mem. Writing maps to T1055 (ATT&CK has no dedicated sub-technique); reading is credential.proc_mem_read.

injection.proc_mem_write — writing /proc/PID/mem

Section titled “injection.proc_mem_write — writing /proc/PID/mem”

injection.ld_preload_env — program started with a preload variable

Section titled “injection.ld_preload_env — program started with a preload variable”

injection.ld_so_preload — /etc/ld.so.preload written

Section titled “injection.ld_so_preload — /etc/ld.so.preload written”

injection.ld_so_conf — linker search path changed

Section titled “injection.ld_so_conf — linker search path changed”
  • MEDIUM · Injection · ✅ · Planned 0.7.1
  • ATT&CK: T1574.006 Dynamic Linker Hijacking
  • Trigger: a change to /etc/ld.so.conf or /etc/ld.so.conf.d/*, or /etc/ld.so.cache.
  • Data: syscall trace; file lifecycle.
  • Why this tier: package installs add library directories; a sample adding one in a temp or hidden directory is redirecting libraries.
  • References: Elastic: Dynamic Linker Creation.

All persistence rules match on the destination of a rename or link, follow a file across renames by its inode when the guest recorded it, and also apply to file operations submitted through io_uring or AIO (planned).

  • HIGH · Persistence · ✅ · Planned 0.7.1 (in 0.7.0 only as persistence.config_write)
  • ATT&CK: T1053.003 Cron (DET0290)
  • Trigger: a change under /etc/crontab, /etc/cron.d, /etc/cron.{hourly,daily,weekly,monthly}, /var/spool/cron, or an exec of crontab with a file or - argument.
  • Data: syscall trace; file lifecycle; path class persistence.
  • Why this tier: only package installs write cron files, and a sample is rarely a package.
  • References: Microsoft, Rise in XorDdos (2022; /etc/cron.hourly/gcc.sh), Aqua Kinsing report (above; crontab every minute), Sigma: New Cron File Created, Elastic: Cron Job Created or Modified, crontab(5).

persistence.systemd — systemd unit or timer written

Section titled “persistence.systemd — systemd unit or timer written”

persistence.rc_init — init script or rc.local written

Section titled “persistence.rc_init — init script or rc.local written”
  • HIGH · Persistence · ✅ · Planned 0.7.1
  • ATT&CK: T1037.004 RC Scripts (DET0237)
  • Trigger: a change to /etc/rc.local, /etc/rc*.d/*, /etc/init.d/*, /etc/init/*.conf, or an exec of update-rc.d/chkconfig naming a script the run wrote.
  • Data: syscall trace; file lifecycle.
  • Why this tier: SysV scripts are almost never added outside package installs.
  • References: Microsoft XorDdos report (above; /etc/init.d script and S90 links), Intezer, New Linux Backdoor RedXOR (2021), Elastic: System V Init Script Created.

persistence.event_script — login or network event script written

Section titled “persistence.event_script — login or network event script written”

persistence.shell_profile — shell start-up file changed

Section titled “persistence.shell_profile — shell start-up file changed”
  • MEDIUM · Persistence · ✅ · Planned 0.7.1 (partly in 0.7.0 as persistence.config_write)
  • ATT&CK: T1546.004 Unix Shell Configuration Modification (DET0020)
  • Trigger: a change to /etc/profile, /etc/profile.d/*, /etc/bash.bashrc, /etc/environment, or a home directory’s (including /root’s) .bashrc, .bash_profile, .bash_login, .bash_logout, .profile, .zshrc, .zshenv, .zprofile, .zlogin.
  • Data: syscall trace; path class persistence.
  • Why this tier: tool installers (conda, nvm, rustup) append to these files.
  • Correction: 0.7.0 checks /root/.ssh/ but not /root/.bashrc or /root/.profile.
  • References: RotaJakiro report (above; modifies .bashrc), Sigma: Unix Shell Configuration Modification, Elastic: Shell Configuration Creation.

persistence.ssh_authorized_keys — SSH key or SSH daemon configuration planted

Section titled “persistence.ssh_authorized_keys — SSH key or SSH daemon configuration planted”
  • HIGH · Persistence · ✅ · Planned 0.7.1 (partly in 0.7.0 as persistence.config_write)
  • ATT&CK: T1098.004 SSH Authorized Keys (DET0126)
  • Trigger: a change to any authorized_keys or authorized_keys2, ~/.ssh/rc, /etc/ssh/sshd_config or /etc/ssh/sshd_config.d/*.
  • Data: syscall trace; path classes persistence and credentials.
  • Why this tier: a sample adding a key gives its operator a login.
  • References: Trend Micro, Backdoor.SH.SHELLBOT.AA (Outlaw; writes the attacker’s key to authorized_keys), Elastic: SSH Authorized Keys File Activity.

persistence.xdg_autostart — desktop autostart entry

Section titled “persistence.xdg_autostart — desktop autostart entry”

persistence.pam — PAM module or configuration changed

Section titled “persistence.pam — PAM module or configuration changed”

persistence.module — kernel module loaded

Section titled “persistence.module — kernel module loaded”

persistence.module_autoload — module set to load at boot

Section titled “persistence.module_autoload — module set to load at boot”

persistence.apt_hook — package manager hook

Section titled “persistence.apt_hook — package manager hook”
  • MEDIUM · Persistence · ✅ · Planned 0.7.1
  • ATT&CK: T1546.016 Installer Packages (DET0330)
  • Trigger: a change under /etc/apt/apt.conf.d/, /etc/dpkg/dpkg.cfg.d/, /etc/yum/pluginconf.d/, /etc/dnf/plugins/, or a DPkg::Post-Invoke/APT::Update::Pre-Invoke line written anywhere.
  • Data: syscall trace; captured bytes.
  • Why this tier: packages add hooks; the command in the hook decides.
  • References: Elastic: APT Package Manager Configuration File Creation.

persistence.web_shell — script dropped into a web root

Section titled “persistence.web_shell — script dropped into a web root”

persistence.binary_replace — system program or library replaced

Section titled “persistence.binary_replace — system program or library replaced”

persistence.account — local account created or changed

Section titled “persistence.account — local account created or changed”

persistence.config_write — other configuration change

Section titled “persistence.config_write — other configuration change”
  • LOW · Persistence · ✅ · Exists in 0.7.0 as medium; LOW fallback in 0.7.1 (version 2)
  • ATT&CK: tactic TA0003 Persistence only; no sub-technique is claimed
  • Trigger: 0.7.0: a write-like call (write*, truncate, rename*, unlink*, chmod, chown, or an open with O_CREAT/O_TRUNC) under /etc/, /root/.ssh/, /var/spool/cron/, /usr/lib/systemd/, /lib/systemd/, or a home directory’s .ssh, .config, .bashrc, .profile. Version 2: only paths that none of the specific persistence rules above matched, using the shared path classes.
  • Data: syscall trace.
  • Why this tier: /etc/resolv.conf, /etc/hostname, /etc/mtab and similar files change for ordinary reasons.
  • References: Triage files for the path classes.
  • INFO · Privilege escalation · 🔶 · Planned 0.7.1 (replaces part of privilege.change)
  • ATT&CK: no technique; context for T1548 Abuse Elevation Control Mechanism
  • Trigger: a lifecycle.creds record with lower ids or fewer capabilities than the task’s previous record.
  • Data: kernel record lifecycle.creds.
  • Why this tier: daemons drop root after start; it explains later failures.
  • References: credentials(7).

privilege.gain — privileges gained through a normal path

Section titled “privilege.gain — privileges gained through a normal path”
  • MEDIUM · Privilege escalation · 🔶 · Planned 0.7.1 (replaces part of privilege.change)
  • ATT&CK: T1548.001 Setuid and Setgid (DET0110)
  • Trigger: a lifecycle.creds record whose effective uid becomes 0, or that adds capabilities in the initial user namespace, with a known reason (SetUid, SetRes, CapSet, Prctl, ExecSetId, ExecCaps).
  • Data: kernel record lifecycle.creds (ids are mapped to the initial user namespace).
  • Why this tier: sudo, su, pkexec and setuid helpers do exactly this; it matters with what follows.
  • References: credentials(7), capabilities(7).
  • Correction: 0.7.0’s privilege.change (setuid, setgid, setreuid, setregid, setresuid, setresgid, setfsuid, setfsgid, capset) fires on drops and misses gains through a setuid exec, which makes no credential syscall.

privilege.setuid_exec — setuid or file-capability program run

Section titled “privilege.setuid_exec — setuid or file-capability program run”
  • LOW · Privilege escalation · ✅ · Planned 0.7.1
  • ATT&CK: T1548.001 Setuid and Setgid
  • Trigger: a lifecycle.creds record with reason ExecSetId or ExecCaps. MEDIUM when the image is in a temp or hidden directory or was written by the run.
  • Data: kernel record lifecycle.creds.
  • Why this tier: ping, passwd, sudo and mount are setuid on many systems.
  • References: execve(2) set-user-ID.

privilege.setid_bit — setuid bit or file capability set

Section titled “privilege.setid_bit — setuid bit or file capability set”

privilege.pwnkit — pkexec started with no arguments

Section titled “privilege.pwnkit — pkexec started with no arguments”

privilege.kernel_exploit — root without a legitimate path

Section titled “privilege.kernel_exploit — root without a legitimate path”
  • HIGH · Privilege escalation · 🔶 · Planned 0.7.1 (from the credential records the guest writes since 0.7.0)
  • ATT&CK: T1068 Exploitation for Privilege Escalation (DET0514)
  • Trigger: a lifecycle.creds record with reason Other (the kernel changed credentials during a call that is not a credential call or an exec, such as an ioctl, write, setsockopt, bpf or keyctl) whose effective uid becomes 0 or that adds CAP_SYS_ADMIN/CAP_SYS_MODULE in the initial user namespace, for a task that did not have them.
  • Data: kernel record lifecycle.creds; the guest writes it from commit_creds(), so an exploit that calls commit_creds(prepare_kernel_cred(0)) is caught under the call that ran the exploit.
  • Why this tier: the kernel only changes credentials on its own for exploits.
  • Testing: a fixture recorded in a test base with a deliberately vulnerable test module (or a test-only kernel path) that calls commit_creds(prepare_kernel_cred(0)) from an ioctl, so the rule is checked against a real Other record without shipping an exploit.
  • References: Credentials in Linux (kernel documentation), credentials(7), Elastic: UID Elevation from Previously Unknown Executable.

privilege.cred_overwrite — credentials changed without commit_creds

Section titled “privilege.cred_overwrite — credentials changed without commit_creds”
  • HIGH · Privilege escalation · 🔷 · Planned 0.8.0
  • ATT&CK: T1068 Exploitation for Privilege Escalation
  • Trigger: the task’s credentials at syscall exit differ from its last record although no record was written (a direct overwrite of struct cred). Needs a new guest check at syscall exit.
  • Data: new kernel data.
  • Why this tier: only memory-corruption exploits change credentials in place.
  • References: Credentials in Linux (“must not be modified once committed”).

privilege.kernel_helper_hijack — kernel helper path changed

Section titled “privilege.kernel_helper_hijack — kernel helper path changed”

privilege.container_escape — host namespace or container socket

Section titled “privilege.container_escape — host namespace or container socket”

privilege.dirty_pipe — page-cache overwrite through a pipe

Section titled “privilege.dirty_pipe — page-cache overwrite through a pipe”
  • HIGH · Privilege escalation · 🔶 · Planned 0.7.1
  • ATT&CK: T1068 Exploitation for Privilege Escalation
  • Trigger: splice from a file opened read-only into a pipe, followed by a write into that pipe, where the file is setuid, /etc/passwd or a system binary; confirmed when the file’s next exec or read hash differs.
  • Data: syscall trace; file hashes.
  • Why this tier: it is the CVE-2022-0847 pattern; benign programs do not write into a pipe after splicing a read-only file into it.
  • References: Max Kellermann, The Dirty Pipe Vulnerability, splice(2).

This category is the planned Evasion view: there is no separate tab. Select the Defense evasion / anti-analysis chip in Suspicious activity to see every check the sample made and the answer the guest gave. Since ATT&CK v19 the old Defense Evasion tactic is split into Stealth (TA0005) and Defense Impairment (TA0112); several technique IDs moved (for example T1562.001 is now T1685). The IDs below are the current ones.

memory.rwx and memory.rwx_attempt — writable and executable memory

Section titled “memory.rwx and memory.rwx_attempt — writable and executable memory”
  • HIGH (memory.rwx) and MEDIUM (memory.rwx_attempt, the failed call) · Defense evasion / anti-analysis · ✅ · Exist in 0.7.0 (both high); fixed in 0.7.1 (version 2)
  • ATT&CK: T1620 Reflective Code Loading (DET0300) · MBC C0008 Change Memory Protection
  • Trigger: mmap (9), mprotect (10) or, from version 2, pkey_mprotect (329), with PROT_WRITE and PROT_EXEC both set. 0.7.0 requires read, write and execute (prot & 7 == 7), so a write-and-execute mapping without read is missed.
  • Data: syscall trace.
  • Why this tier: compiled programs never need memory that is writable and executable at once; packers and shellcode loaders do. Java (HotSpot), Mono and some other JIT runtimes do it too: they are on the allow-list and drop to MEDIUM. A refused request (a hardened kernel or policy) is still worth seeing, so the failed form keeps its own row.
  • References: Elastic: Unknown Execution of Binary with RWX Memory Region, Elastic: Network Connection from Binary with RWX Memory Region, mprotect(2).
  • Correction: 0.7.0 cites T1055 (process injection) for a change to the process’s own memory; T1620 fits, and T1055 only applies when the memory belongs to another process.

memory.wx_transition — written memory made executable

Section titled “memory.wx_transition — written memory made executable”
  • MEDIUM · Defense evasion / anti-analysis · 🔶 · Planned 0.7.1
  • ATT&CK: T1027.002 Software Packing (DET0023), T1620 · MBC F0001 Software Packing
  • Trigger: an mprotect that adds PROT_EXEC to an anonymous or private range the same process had mapped or protected writable earlier (followed per process as an address map).
  • Data: syscall trace.
  • Why this tier: this is how unpackers and JITs that respect W^X work (write, then flip to read-execute). LuaJIT, V8 and the Java runtime do it constantly and are allow-listed.
  • References: JPCERT/CC, Anti-UPX Unpacking Technique (2022; Mirai variants), Trajanovski and Zhang, IoT-BDA (IEEE Access 2021; UPX is the most common packer of IoT malware).

memory.write_then_exec — code executed from pages written at run time

Section titled “memory.write_then_exec — code executed from pages written at run time”
  • HIGH · Defense evasion / anti-analysis · 🔷 · Planned 0.7.1 (MMU-level unpacking)
  • ATT&CK: T1027.002 Software Packing (DET0023), T1620 Reflective Code Loading (DET0300)
  • Trigger: the guest kernel keeps pages a process wrote non-executable until the first instruction fetch from them; that fault records the region, the original entry point and the jumping instruction, dumps the region, then lets the process continue. Covers unpacking stubs, memfd/execveat and /proc/self/fd loaders, and userland ELF loaders that never call execve.
  • Data: new kernel data.
  • Why this tier: native programs do not execute code they just wrote. JIT runtimes do, and get a budget and an allow-list.
  • References: as memory.wx_transition; Elastic: Potential Fileless Execution via Unusual memfd Create Call.

memory.unpacked_capture — unpacked or fileless code captured

Section titled “memory.unpacked_capture — unpacked or fileless code captured”
  • INFO · Defense evasion / anti-analysis · 🔷 · Planned 0.7.1
  • ATT&CK: T1027.002, T1620 when the payload never touched the disk
  • Trigger: each region dumped by memory.write_then_exec, each memfd or deleted image that was executed. The dump goes to Static analysis with its hash.
  • Data: new kernel data (dumps).
  • Why this tier: it is evidence to analyse, linked from the HIGH row that caused it.
  • References: Cozzi et al., Understanding Linux Malware (IEEE S&P 2018; packed Linux samples are almost all UPX or UPX variants).
  • LOW · Defense evasion / anti-analysis · ✅ (static) · Planned 0.7.1
  • ATT&CK: T1027.002 Software Packing (DET0023) · MBC F0001.008 UPX
  • Trigger: Static analysis of the launched program or of an executed dropped file reports a packer (UPX header, damaged UPX header, high-entropy sections with a tiny import table).
  • Data: static analysis.
  • Why this tier: some legitimate tools ship UPX-packed; the behaviour rows matter more.
  • References: Cozzi et al. (above), JPCERT/CC (above).

evasion.self_delete — program deletes its own file

Section titled “evasion.self_delete — program deletes its own file”
  • HIGH · Defense evasion / anti-analysis · 🔶 · Planned 0.7.1
  • ATT&CK: T1070.004 File Deletion (DET0140) · MBC F0007 Self Deletion
  • Trigger: unlink, unlinkat or rename of the inode a still-running process was executed from (exec image identity from lifecycle.file_id/lifecycle.exec_image, else the path), or a written file whose last-close hash record says no name is left.
  • Data: kernel records; syscall trace.
  • Why this tier: installers sometimes remove themselves; malware does it to leave nothing on disk. On bases built before 0.7.0, Antinomie’s own resource collector does it too and is excluded (see Noise handling).
  • References: Mirai bot/main.c (unlink(args[0])), Sandfly BPFDoor analysis (below), Sysdig, VoidLink threat analysis (2026), Elastic: Process Execution Followed by Self-Deletion.

evasion.history_clear — command history cleared or disabled

Section titled “evasion.history_clear — command history cleared or disabled”
  • MEDIUM · Defense evasion / anti-analysis · ✅ · Planned 0.7.1
  • ATT&CK: T1070.003 Clear Command History (DET0165)
  • Trigger: unlink, truncate or symlink to /dev/null of .bash_history, .zsh_history and similar; an exec whose environment sets HISTFILE=/dev/null, HISTSIZE=0 or HISTFILESIZE=0; history -c in a captured shell command line.
  • Data: syscall trace (envp and argv captured).
  • Why this tier: users clear history too; in a sample run it is covering tracks.
  • References: Sandfly Security, BPFDoor – An Evasive Linux Backdoor Technical Analysis (HISTFILE=/dev/null), Unit 42 Hildegard report (history -c), Sigma: Linux Command History Tampering.

evasion.security_disable — security tools or policies turned off

Section titled “evasion.security_disable — security tools or policies turned off”
  • HIGH · Defense evasion / anti-analysis · ✅ · Planned 0.7.1
  • ATT&CK: T1685 Disable or Modify Tools (formerly T1562.001; DET0497)
  • Trigger: a write of 0 to /sys/fs/selinux/enforce, a write of SELINUX=disabled to /etc/selinux/config, an exec of setenforce 0, aa-teardown, systemctl stop|disable|mask of apparmor, auditd, falcon-sensor, osqueryd, wazuh-agent and similar, or uninstall scripts of cloud agents (aegis, aliyun-service, cloudmonitor, qcloud).
  • Data: syscall trace.
  • Why this tier: administrators rarely do this, and a sample has no reason to.
  • References: Unit 42 Rocke report (above; uninstalls Alibaba and Tencent agents), Trend Micro, TeamTNT Returns – or Does It? (2022), Elastic: Potential Disabling of SELinux, Sigma: Disabling Security Tools.

evasion.firewall_modify — firewall flushed or changed

Section titled “evasion.firewall_modify — firewall flushed or changed”
  • MEDIUM · Defense evasion / anti-analysis · ✅ · Planned 0.7.1
  • ATT&CK: T1686 Disable or Modify System Firewall (formerly T1562.004; DET0145)
  • Trigger: an exec of iptables -F/-X/-P ACCEPT, iptables -t nat -A … REDIRECT, nft flush ruleset, ufw disable, systemctl stop firewalld; netfilter setsockopt(IPT_SO_SET_REPLACE) or nftables netlink messages from the sample.
  • Data: syscall trace.
  • Why this tier: container runtimes and VPNs change rules all the time.
  • References: Sandfly BPFDoor analysis (above; iptables redirect), Lumen, KV-botnet investigation (2023), Sigma: Flush Iptables Ufw Chain.

evasion.audit_disable — Linux audit turned off

Section titled “evasion.audit_disable — Linux audit turned off”

evasion.masquerade_kthread — user process named like a kernel thread

Section titled “evasion.masquerade_kthread — user process named like a kernel thread”

evasion.masquerade_daemon — process renamed to a system program

Section titled “evasion.masquerade_daemon — process renamed to a system program”
  • MEDIUM · Defense evasion / anti-analysis · ✅ · Planned 0.7.1
  • ATT&CK: T1036.005, T1036.011
  • Trigger: PR_SET_NAME or argv[0] set to a daemon name (sshd, systemd-journald, dbus-daemon, crond, udevd, /sbin/agetty…) that differs from the executed image, or a random-looking name.
  • Data: syscall trace. A process that overwrites its argv memory without a system call is not seen; the planned process view compares /proc/PID/cmdline reads.
  • Why this tier: programs set thread names for their own workers (worker-1, JVM threads); only names on the daemon list count.
  • References: Sandfly BPFDoor analysis (above; runs as /sbin/udevd -d and similar), Mirai bot/main.c (random argv[0] and PR_SET_NAME), Cozzi et al. (above).

evasion.sandbox_probe — virtual machine or sandbox checks

Section titled “evasion.sandbox_probe — virtual machine or sandbox checks”
  • MEDIUM · Defense evasion / anti-analysis · 🔶 · Planned 0.7.1
  • ATT&CK: T1497.001 System Checks (DET0168) · MBC B0009 Virtual Machine Detection
  • Trigger: one process probes two or more classes of VM evidence: /sys/class/dmi/id/{sys_vendor,product_name,board_vendor,bios_vendor,product_uuid}, /proc/cpuinfo (the hypervisor flag), /proc/scsi/scsi, /sys/hypervisor, /proc/xen, /dev/vboxguest, /sys/bus/pci/devices/*/vendor, MAC address prefixes, /proc/uptime, dmidecode, lscpu, systemd-detect-virt, virt-what. A single probe is INFO.
  • Data: syscall trace. Details shows the answer the guest gave (the bytes read), which the VM’s Stealth profile decides, and what the process did in the next 30 seconds.
  • Why this tier: many programs read cpuinfo alone; reading several VM indicators is a check.
  • References: Cozzi et al. (above; Table XIV lists these files in Linux malware), Elastic: Virtual Machine Fingerprinting.

evasion.probe_then_exit — checks followed by an early exit

Section titled “evasion.probe_then_exit — checks followed by an early exit”
  • MEDIUM · Defense evasion / anti-analysis · 🔶 · Planned 0.7.1
  • ATT&CK: T1497.001 System Checks
  • Trigger: a process with an evasion.sandbox_probe, evasion.debugger_check or evasion.container_check row exits or sleeps within 5 seconds of a VM-revealing answer, without network or file activity.
  • Data: syscall trace; process tree.
  • Why this tier: it tells you the sample probably held back; try another Stealth profile.
  • References: as evasion.sandbox_probe.

evasion.traceme — anti-debugging with PTRACE_TRACEME

Section titled “evasion.traceme — anti-debugging with PTRACE_TRACEME”
  • MEDIUM · Defense evasion / anti-analysis · ✅ · Planned 0.7.1 (split from process.ptrace)
  • ATT&CK: T1622 Debugger Evasion (DET0371) · MBC B0001 Debugger Detection
  • Trigger: ptrace(PTRACE_TRACEME) (request 0) not followed by an exec in the same process, or a process that attaches to its own parent.
  • Data: syscall trace. The result says whether a debugger was seen: Antinomie’s debugger does not use ptrace, so the call succeeds unless something else traces the sample.
  • Why this tier: a debugger’s child calls TRACEME right before exec; a program that calls it for itself is checking for a debugger.
  • References: Trajanovski and Zhang, IoT-BDA (2021; PTRACE_TRACEME in IoT botnet samples), Cozzi et al. (above), ptrace(2).

evasion.debugger_check — TracerPid and similar checks

Section titled “evasion.debugger_check — TracerPid and similar checks”
  • LOW · Defense evasion / anti-analysis · 🔶 · Planned 0.7.1
  • ATT&CK: T1622 Debugger Evasion (DET0371)
  • Trigger: a read of /proc/self/status or /proc/PID/status whose captured bytes include TracerPid: and that is followed by a branch-like effect (exit, sleep, or a different path), a SIGTRAP handler installed with rt_sigaction, or prctl(PR_GET_DUMPABLE) probes.
  • Data: syscall trace (the value the guest returned is shown).
  • Why this tier: runtimes read /proc/self/status for memory statistics.
  • References: Sysdig VoidLink report (above; checks TracerPid), proc_pid_status(5).

evasion.container_check — container checks

Section titled “evasion.container_check — container checks”
  • LOW · Defense evasion / anti-analysis · ✅ · Planned 0.7.1
  • ATT&CK: T1497.001 System Checks, also T1082
  • Trigger: a probe of /.dockerenv, /run/.containerenv, /proc/1/cgroup, /proc/self/cgroup or /proc/1/sched by the sample.
  • Data: syscall trace.
  • Why this tier: many tools check where they run; container-aware malware decides its payload this way.
  • References: Sysdig VoidLink report (above; /.dockerenv and cgroup checks), Sigma: Docker Container Discovery Via Dockerenv Listing.

evasion.long_sleep — long sleep before doing anything

Section titled “evasion.long_sleep — long sleep before doing anything”
  • MEDIUM · Defense evasion / anti-analysis · 🔶 · Planned 0.7.1
  • ATT&CK: T1497.003 Time Based Checks (formerly “Time Based Evasion”; DET0141) · MBC B0003.003 Delayed Execution
  • Trigger: nanosleep, clock_nanosleep, select/poll/epoll_wait with no descriptors, or alarm/timerfd that asks for 60 seconds or more before the process’s first network or file write; LOW for later long sleeps.
  • Data: syscall trace (the requested time is an argument).
  • Why this tier: daemons sleep between jobs; sleeping before the first action is how samples outwait sandboxes.
  • References: nanosleep(2); Cozzi et al. (above) found no stalling code in their 2018 Linux corpus, so treat this as context.

evasion.cpuid_probe and evasion.timing_probe — CPU-level VM checks

Section titled “evasion.cpuid_probe and evasion.timing_probe — CPU-level VM checks”
  • MEDIUM (cpuid_probe) and LOW (timing_probe) · Defense evasion / anti-analysis · 🔷 · Planned, version not set
  • ATT&CK: T1497.001 System Checks, T1497.003 Time Based Checks · MBC B0009.034 (CPUID), B0009.036 (RDTSC)
  • Trigger: the CPUID hypervisor leaves (0x40000000…) or the hypervisor bit, executed by the sample, trapped through CPUID faulting; dense RDTSC loops trapped through CR4.TSD.
  • Data: new kernel data. The kernel’s per-task CPUID faulting (ARCH_SET_CPUID) is reset on execve, so the guest has to arm it after the sample’s exec.
  • Why this tier: the C library runs CPUID at start for feature detection, so only the hypervisor leaves count; timing loops are also used for benchmarking.
  • References: arch_prctl(2) ARCH_SET_CPUID.
  • MEDIUM · Defense evasion / anti-analysis · ✅ · Planned 0.7.1
  • ATT&CK: T1070.006 Timestomp (DET0591)
  • Trigger: utimensat, utimes, futimesat or utime with explicit times (not “now”), especially copied from another file (touch -r: a stat of a reference, then the same times set).
  • Data: syscall trace; Triage file category Timestamps.
  • Why this tier: tar, cp -p, rsync and package managers set times on purpose; they are allow-listed.
  • References: Sandfly BPFDoor analysis (above; sets times to 2008), NCSC Cyclops Blink report (above; utime), Sigma: File Time Attribute Change - Linux, utimensat(2).

evasion.kill_list — other programs killed

Section titled “evasion.kill_list — other programs killed”
  • MEDIUM · Defense evasion / anti-analysis · 🔶 · Planned 0.7.1
  • ATT&CK: T1489 Service Stop (DET0021); T1685 Disable or Modify Tools when the targets are security tools. ATT&CK has no technique for killing rival malware.
  • Trigger: kill, tkill, tgkill or pidfd_send_signal with SIGKILL/SIGTERM to five or more processes that are not the sample’s descendants, usually after reading their /proc/PID/cmdline or exe; or an exec of pkill/killall with a list of names.
  • Data: syscall trace; process tree.
  • Why this tier: service managers stop processes; samples clear the machine of rival miners and bots.
  • References: Mirai bot/killer.c, Unit 42 Rocke report (above; kills other miners), Aqua Kinsing report (above).

evasion.hidden_artifact — hidden file or directory created

Section titled “evasion.hidden_artifact — hidden file or directory created”
  • LOW · Defense evasion / anti-analysis · ✅ · Planned 0.7.1
  • ATT&CK: T1564.001 Hidden Files and Directories (DET0032) · MBC F0005.002
  • Trigger: creation of a file or directory whose name starts with . under /tmp, /var/tmp, /dev/shm, /usr/share, /lib or another system directory, or with a name such as ... or a single space.
  • Data: syscall trace; path class hidden.
  • Why this tier: dotfiles in home directories are normal and are not counted.
  • References: Trend Micro TeamTNT report (above; /usr/share/..hide), Sigma: Hidden Files and Directories.

evasion.immutable_attr — file made immutable or append-only

Section titled “evasion.immutable_attr — file made immutable or append-only”

evasion.proc_hide_mount — mount over a /proc entry

Section titled “evasion.proc_hide_mount — mount over a /proc entry”
  • HIGH · Defense evasion / anti-analysis · ✅ · Planned 0.7.1
  • ATT&CK: T1564.013 Bind Mounts (DET0428)
  • Trigger: mount with MS_BIND (or the new mount API) whose target is /proc/PID or a file under it, or a mount of /proc with hidepid.
  • Data: syscall trace (mount arguments are captured).
  • Why this tier: it hides a process from ps; nothing benign does it.
  • References: Lumen KV-botnet report (above; bind-mounts over /proc), mount(2), Elastic: Suspicious Path Mounted.

evasion.sysctl_security — kernel protections weakened

Section titled “evasion.sysctl_security — kernel protections weakened”

evasion.dumpable_off — process made non-dumpable

Section titled “evasion.dumpable_off — process made non-dumpable”
  • LOW · Defense evasion / anti-analysis · ✅ · Planned 0.7.1
  • ATT&CK: T1622 Debugger Evasion (weak fit) · MBC B0002 Debugger Evasion
  • Trigger: prctl(PR_SET_DUMPABLE, 0).
  • Data: syscall trace.
  • Why this tier: ssh-agent, gpg-agent and sshd do it to protect secrets; it also blocks ptrace attach and core dumps. Antinomie’s process cores do not depend on it.
  • References: PR_SET_DUMPABLE(2const).

evasion.io_uring_usage — work done through io_uring

Section titled “evasion.io_uring_usage — work done through io_uring”
  • INFO · Defense evasion / anti-analysis · ✅ · Planned 0.7.1
  • ATT&CK: none; context for every other rule
  • Trigger: io_uring_setup or io_uring_enter by the sample.
  • Data: syscall trace; async observations.
  • Why this tier: high-performance programs use io_uring. It is shown because work submitted through a ring makes few system calls; Antinomie reads file requests from the ring, but socket requests are not yet expanded (see Async observations).
  • References: ARMO, io_uring Is Back, This Time as a Rootkit (2025; the Curing proof of concept evades system-call monitoring).

bpf.seccomp_filter — seccomp filter installed

Section titled “bpf.seccomp_filter — seccomp filter installed”
  • LOW · Defense evasion / anti-analysis · ✅ · Exists in 0.7.0 as medium; LOW in 0.7.1 (version 2)
  • ATT&CK: no technique mentions seccomp; context only
  • Trigger: seccomp(SECCOMP_SET_MODE_FILTER) or prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER).
  • Data: syscall trace; the filter is decoded in Triage → eBPF.
  • Why this tier: systemd services, browsers, OpenSSH and container runtimes all install filters. A sample can use one to block analysis calls, which the decoded filter shows.
  • References: seccomp(2), Seccomp BPF.

credential.shadow_read — password hashes read

Section titled “credential.shadow_read — password hashes read”

credential.ssh_keys — SSH private keys read

Section titled “credential.ssh_keys — SSH private keys read”
  • MEDIUM · Credential access · ✅ · Planned 0.7.1
  • ATT&CK: T1552.004 Private Keys (DET0549)
  • Trigger: a read of ~/.ssh/id_* (not .pub), /etc/ssh/ssh_host_*_key, or any file whose first captured bytes are -----BEGIN … PRIVATE KEY-----, by a program other than ssh, ssh-agent, ssh-add or sshd.
  • Data: syscall trace; path class credentials.
  • Why this tier: the SSH client itself reads keys; a sample that starts ssh is covered by lateral.ssh_spread.
  • References: Unit 42, Hildegard: New TeamTNT Cryptojacking Malware (2021; searches SSH keys, Docker credentials, Kubernetes tokens), Elastic: Private Key Searching Activity.

credential.cloud_tokens — cloud and container credentials read

Section titled “credential.cloud_tokens — cloud and container credentials read”

credential.browser_store — browser password store read

Section titled “credential.browser_store — browser password store read”
  • MEDIUM · Credential access · ✅ · Planned 0.7.1
  • ATT&CK: T1555.003 Credentials from Web Browsers (DET0037)
  • Trigger: a read of logins.json, key4.db, signons.sqlite under ~/.mozilla/firefox/, or Login Data, Cookies, Local State under ~/.config/{google-chrome,chromium,BraveSoftware,microsoft-edge}/, by a program that is not that browser.
  • Data: syscall trace.
  • Why this tier: backup and sync tools read browser profiles too.
  • References: LaZagne Linux browser modules, BeaverTail (ATT&CK S1246).

credential.wallet — cryptocurrency wallet files read

Section titled “credential.wallet — cryptocurrency wallet files read”

credential.history_read — shell history read

Section titled “credential.history_read — shell history read”
  • LOW · Credential access · ✅ · Planned 0.7.1
  • ATT&CK: T1552.003 Shell History (formerly “Bash History”; DET0385)
  • Trigger: a read of .bash_history, .zsh_history, .mysql_history, .psql_history, .python_history by a program other than the matching shell.
  • Data: syscall trace.
  • Why this tier: shells read their own history at start.
  • References: Sigma: Suspicious History File Operations - Linux; ATT&CK T1552.003 procedure examples (Kinsing).

credential.kerberos_ccache — Kerberos ticket cache read

Section titled “credential.kerberos_ccache — Kerberos ticket cache read”
  • MEDIUM · Credential access · ✅ · Planned 0.7.1
  • ATT&CK: T1558.005 Ccache Files (DET0024)
  • Trigger: a read of /tmp/krb5cc_*, /var/lib/sss/db/ccache_* or a keytab (*.keytab, /etc/krb5.keytab) by a program that is not a Kerberos client.
  • Data: syscall trace.
  • Why this tier: rare outside domain-joined machines.
  • References: MIT Kerberos, credential cache types.

credential.proc_mem_read — another process’s memory read

Section titled “credential.proc_mem_read — another process’s memory read”

credential.cloud_metadata — instance metadata service contacted

Section titled “credential.cloud_metadata — instance metadata service contacted”
  • HIGH · Credential access · ✅ · Planned 0.7.1
  • ATT&CK: T1552.005 Cloud Instance Metadata API (DET0001; ATT&CK lists the IaaS platform, which the guest is pretending to be)
  • Trigger: a connect or sendto to 169.254.169.254, 169.254.170.2 or fd00:ec2::254, or a DNS question or HTTP Host for metadata.google.internal.
  • Data: syscall trace (sockaddr); network capture (DNS, HTTP).
  • Why this tier: a guest that is not a cloud instance has no reason to ask; a failed attempt (nothing answers in a lab) still drops only to MEDIUM.
  • References: Unit 42 Hildegard report (above; queries 169.254.169.254 and 169.254.170.2), Cisco Talos, TeamTNT targeting AWS, Alibaba (2022), Elastic: Suspicious Instance Metadata Service (IMDS) API Request.

discovery.process_enum — process list walked

Section titled “discovery.process_enum — process list walked”
  • LOW · Discovery · 🔶 · Planned 0.7.1
  • ATT&CK: T1057 Process Discovery (DET0034)
  • Trigger: getdents64 on /proc followed by reads of /proc/PID/cmdline, comm, status or exe for 10 or more pids by one process, or an exec of ps, pgrep, pidof, top.
  • Data: syscall trace (directory listings are captured).
  • Why this tier: ps and many daemons do it; for malware it usually precedes evasion.kill_list or evasion.security_disable.
  • References: Sigma: Process Discovery (threat-hunting set), proc(5).

discovery.system_info — system details read

Section titled “discovery.system_info — system details read”
  • INFO · Discovery · 🔶 · Planned 0.7.1
  • ATT&CK: T1082 System Information Discovery (DET0525)
  • Trigger: several of uname, sysinfo, reads of /etc/os-release, /proc/version, /proc/cpuinfo, /proc/meminfo, /etc/hostname, or an exec of uname, lscpu, hostnamectl, by one process.
  • Data: syscall trace.
  • Why this tier: almost every program asks something about the system.
  • References: Sigma: System Information Discovery.

discovery.network_config — network configuration read

Section titled “discovery.network_config — network configuration read”

discovery.user_enum — users and groups listed

Section titled “discovery.user_enum — users and groups listed”

discovery.file_search — file system swept

Section titled “discovery.file_search — file system swept”
  • LOW · Discovery · 🔶 · Planned 0.7.1
  • ATT&CK: T1083 File and Directory Discovery (DET0370)
  • Trigger: getdents64 over 200 or more directories by one process within a minute, or an exec of find/locate with credential or document patterns (*.pem, id_rsa, *.kdbx, wallet.dat).
  • Data: syscall trace.
  • Why this tier: indexers and backup tools walk the disk; it gets weight when followed by reads of what it found.
  • References: Sigma: File and Directory Discovery - Linux.

discovery.security_software — security tools looked for

Section titled “discovery.security_software — security tools looked for”
  • MEDIUM · Discovery · ✅ · Planned 0.7.1
  • ATT&CK: T1518.001 Security Software Discovery (DET0016)
  • Trigger: a probe (stat, access, open, /proc/*/cmdline match) of paths or names of security agents: /etc/aliyun, /usr/local/aegis, /usr/local/qcloud, /opt/CrowdStrike, falcon-sensor, osqueryd, auditd, /etc/apparmor.d, /sys/fs/selinux, clamd, wazuh, sysdig, falco.
  • Data: syscall trace (probed paths are recorded even when they do not exist).
  • Why this tier: the probes themselves are cheap and rare in benign software, but configuration tools also check for AppArmor and SELinux.
  • References: Cisco Talos TeamTNT report (above; looks for aliyun processes before disabling agents), Unit 42, Malware Used by Rocke Group Evolves to Evade Detection by Cloud Security Products (2019), Sigma: Security Software Discovery - Linux.

discovery.network_scan — many hosts or ports probed

Section titled “discovery.network_scan — many hosts or ports probed”
  • MEDIUM · Discovery · 🔶 · Planned 0.7.1
  • ATT&CK: T1046 Network Service Discovery (DET0376)
  • Trigger: one process makes connect attempts (including EINPROGRESS, ECONNREFUSED, timeouts) to 20 or more distinct address and port pairs within 10 seconds, or to one port across 10 or more hosts, or sends TCP SYNs from a raw socket. The capture confirms with SYNs that never complete (planned: tcp.flags).
  • Data: syscall trace (sockaddrs); network capture.
  • Why this tier: failures are the point, so a failed attempt does not lower it. Benign: service discovery and some monitoring agents.
  • References: Antonakakis et al., Understanding the Mirai Botnet (USENIX Security 2017; stateless SYN probes to ports 23 and 2323), Mirai scanner.c, Sigma: Linux Network Service Scanning - Auditd.

c2.reverse_shell — socket wired to a shell’s standard input and output

Section titled “c2.reverse_shell — socket wired to a shell’s standard input and output”

c2.bind_shell — listening socket wired to a shell

Section titled “c2.bind_shell — listening socket wired to a shell”
  • HIGH · Command & control · 🔶 · Planned 0.7.1
  • ATT&CK: T1059.004 Unix Shell · MBC B0022 Remote Access (MBC has no bind-shell method)
  • Trigger: bind and listen, then an accepted socket copied onto descriptors 0, 1 and 2 before a shell exec.
  • Data: syscall trace with descriptor state.
  • Why this tier: as c2.reverse_shell; inetd-style services are the only benign pattern and are not started by samples.
  • References: Elastic Security Labs BPFDoor article (above), Elastic: File Transfer or Listener Established via Netcat.

network.listen_any — listening on every interface

Section titled “network.listen_any — listening on every interface”
  • MEDIUM · Command & control · ✅ · Planned 0.7.1
  • ATT&CK: no technique covers listening as such; MBC C0001.005 Start TCP Server; T1059.004 when a shell is attached (c2.bind_shell)
  • Trigger: bind to 0.0.0.0, :: or a non-loopback address followed by listen, for TCP; UDP bind to a fixed port on all interfaces.
  • Data: syscall trace (sockaddr).
  • Why this tier: servers listen by design, but a sample that opens a port is offering a backdoor or a proxy.
  • References: ip(7) INADDR_ANY, listen(2).

network.raw_socket — raw or packet socket opened

Section titled “network.raw_socket — raw or packet socket opened”
  • MEDIUM · Command & control · ✅ · Planned 0.7.1
  • ATT&CK: T1095 Non-Application Layer Protocol (DET0457) when it sends crafted packets; T1040 Network Sniffing (DET0314) when it only receives
  • Trigger: socket(AF_PACKET, …) or socket(AF_INET/AF_INET6, SOCK_RAW, …).
  • Data: syscall trace.
  • Why this tier: DHCP clients and tcpdump use packet sockets; ping now mostly uses ICMP datagram sockets. Mirai floods and scans, and BPFDoor listens, through raw sockets.
  • References: packet(7), raw(7), Mirai scanner.c.

c2.bpf_backdoor — packet socket with a filter (magic-packet backdoor)

Section titled “c2.bpf_backdoor — packet socket with a filter (magic-packet backdoor)”

bpf.socket_filter — classic socket filter attached

Section titled “bpf.socket_filter — classic socket filter attached”
  • MEDIUM · Command & control · ✅ · Exists in 0.7.0 (medium)
  • ATT&CK: T1205.002 Socket Filters (DET0162)
  • Trigger: setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER) (level 1, option 26).
  • Data: syscall trace; the program is decoded in Triage → eBPF.
  • Why this tier: tcpdump and DHCP clients attach filters too.
  • References: McCanne and Jacobson, The BSD Packet Filter (USENIX Winter 1993; the 0.7.0 source), socket(7), Linux Socket Filtering.

network.ip_literal — server contacted by address, never resolved

Section titled “network.ip_literal — server contacted by address, never resolved”
  • LOW · Command & control · 🔶 · Planned 0.7.1
  • ATT&CK: closest is T1071.001 Web Protocols (DET0027); ATT&CK has no technique for “no DNS”
  • Trigger: a connect or sendto to a public address that no DNS answer in the run produced, or an HTTP request whose Host is an IP literal.
  • Data: syscall trace; network capture (DNS answers, HTTP host).
  • Why this tier: hard-coded addresses are common in malware but also in update checks and NTP; it is evidence for the IOC list more than a finding.
  • References: CAPE: network_cnc_http (“HTTP connection was made to an IP address rather than domain name”).

network.dga_nxdomain — burst of failed lookups for random names

Section titled “network.dga_nxdomain — burst of failed lookups for random names”

network.dns_tunnel — data carried in DNS names

Section titled “network.dns_tunnel — data carried in DNS names”
  • MEDIUM · Command & control · 🔶 · Planned 0.7.1
  • ATT&CK: T1071.004 DNS (DET0400)
  • Trigger: many queries to one domain with labels over 40 characters, or TXT/NULL queries at a high rate.
  • Data: network capture.
  • Why this tier: some CDNs and anti-spam lookups use long labels.
  • References: Elastic: Potential DNS Tunneling via NULL or Long DNS Queries; ESET Ebury analysis (above; Ebury sends stolen data in DNS queries, as exfiltration).

network.nonstandard_port — known protocol on an unusual port

Section titled “network.nonstandard_port — known protocol on an unusual port”
  • MEDIUM · Command & control · ✅ · Planned 0.7.1
  • ATT&CK: T1071 Application Layer Protocol (DET0444; there is no IRC sub-technique)
  • Trigger: bytes written to a socket that start with IRC commands (NICK , USER , JOIN #, PRIVMSG ), or a connection to port 6667/6697.
  • Data: syscall trace (socket payloads are captured).
  • Why this tier: IRC clients are rare in a sample run; old bot families still use IRC.
  • References: Trend Micro, Perl-Based Shellbot Looks to Target Organizations via C&C (Outlaw, 2018), Unit 42 Hildegard report (above; IRC channel to the C2), CAPE: network_irc.

network.web_service — paste, chat or file-drop service used

Section titled “network.web_service — paste, chat or file-drop service used”
  • LOW · Command & control · 🔶 · Planned 0.7.1
  • ATT&CK: T1071 Application Layer Protocol (DET0444) · MBC B0030.005 Check for Payload
  • Trigger: eight or more connections or requests from one process to one endpoint at a near-constant interval (see loop collapse in Noise handling).
  • Data: syscall trace; network capture.
  • Why this tier: update checks and heartbeats are regular too; it gains weight with other C2 rows to the same endpoint.
  • References: Active Countermeasures, RITA (beacon analysis).

network.proxy_tunnel — tunnel or proxy tool

Section titled “network.proxy_tunnel — tunnel or proxy tool”

c2.elf_download — executable received over the network and saved

Section titled “c2.elf_download — executable received over the network and saved”
  • HIGH · Command & control · 🔶 · Planned 0.7.1
  • ATT&CK: T1105 Ingress Tool Transfer (DET0060) · MBC E1105 Ingress Tool Transfer
  • Trigger: bytes read from a socket that start with \x7fELF (or a shell script’s #!) and are written to a file by the same process or its curl/wget child; HIGH when that file is then executed (chained with execution.dropped_exec).
  • Data: syscall trace (socket reads and file writes are captured); file identity.
  • Why this tier: package managers download executables too, but do not run as samples.
  • References: Mirai loader server.c (wget, tftp and echo upload then execute), Sigma: Wget Creating Files in Tmp Directory.

lateral.ssh_spread — SSH to hosts found on this machine

Section titled “lateral.ssh_spread — SSH to hosts found on this machine”
  • HIGH · Lateral movement · 🔶 · Planned 0.7.1
  • ATT&CK: T1021.004 SSH (DET0596), T1552.004 Private Keys (DET0549)
  • Trigger: reads of ~/.ssh/known_hosts, ~/.ssh/config or .bash_history, then ssh/scp execs or connections to port 22 on hosts named there, using keys read from ~/.ssh/.
  • Data: syscall trace; network capture.
  • Why this tier: this is worm behaviour; administrators do it by hand, not from a sample.
  • References: Sysdig, SSH-Snake: New Self-Modifying Worm Threatens Networks (2024), Aqua Kinsing report (above; tries every user and key combination over SSH, reads known_hosts).

lateral.bruteforce — repeated login attempts

Section titled “lateral.bruteforce — repeated login attempts”
  • HIGH · Lateral movement · 🔶 · Planned 0.7.1
  • ATT&CK: T1110.001 Password Guessing (DET0551)
  • Trigger: 10 or more short TCP sessions to port 22, 23 or 2323 (or other login services) on one or many hosts within a minute, with the client writing login prompts’ answers.
  • Data: syscall trace (socket payloads); network capture.
  • Why this tier: failed logins are the point, so failures do not lower it.
  • References: Antonakakis et al. (above; Mirai’s list of 62 credentials), Elastic: Potential Internal Linux SSH Brute Force Detected, Trend Micro Outlaw Shellbot report (above).

lateral.service_exploit — services on other hosts targeted

Section titled “lateral.service_exploit — services on other hosts targeted”

lateral.tool_transfer — files pushed to another host

Section titled “lateral.tool_transfer — files pushed to another host”
  • MEDIUM · Lateral movement · ✅ · Planned 0.7.1
  • ATT&CK: T1570 Lateral Tool Transfer (DET0183)
  • Trigger: an exec of scp, rsync, sftp or curl -T with a remote destination, or ssh host 'cat > …' with the sample’s own image as input.
  • Data: syscall trace (argv).
  • Why this tier: deployment scripts do the same.
  • References: Elastic: Unusual Remote File Creation, Sysdig SSH-Snake report (above).

exfil.file_to_socket — file sent straight to a socket

Section titled “exfil.file_to_socket — file sent straight to a socket”
  • MEDIUM · Exfiltration · ✅ · Planned 0.7.1
  • ATT&CK: T1041 Exfiltration Over C2 Channel (DET0348), T1048 Exfiltration Over Alternative Protocol (DET0131)
  • Trigger: sendfile, splice or copy_file_range from a regular file to a socket, especially from a credential or document path.
  • Data: syscall trace with descriptor state.
  • Why this tier: web servers send files this way; samples are not web servers.
  • References: sendfile(2), SecurityWeek TeamTNT report (above; sends ~/.aws files to the attacker’s server).

exfil.large_upload — much more sent than received

Section titled “exfil.large_upload — much more sent than received”
  • MEDIUM · Collection · ✅ · Planned 0.7.1
  • ATT&CK: T1056.001 Keylogging (DET0089)
  • Trigger: an open of /dev/input/event*, /dev/input/by-id/*kbd* or /dev/uinput, by a program other than the display server or libinput tools.
  • Data: syscall trace.
  • Why this tier: X and Wayland servers read input devices; a sample normally has no reason to. Keylogging through X11 (XRecord) makes no such call and is not seen here.
  • References: Linux input documentation, logkeys, Intezer, EvilGnome: Rare Malware Spying on Linux Desktop Users (2019).

collection.tty_inject — keystrokes pushed into a terminal

Section titled “collection.tty_inject — keystrokes pushed into a terminal”
  • MEDIUM · Collection · ✅ · Planned 0.7.1
  • ATT&CK: no technique found; closest T1059.004 Unix Shell (the injected text runs as commands)
  • Trigger: ioctl(fd, TIOCSTI) on a terminal.
  • Data: syscall trace.
  • Why this tier: almost unused by benign software; disabled for unprivileged users on recent kernels.
  • References: TIOCSTI(2const), ioctl_tty(2).

collection.screen_capture — screen captured

Section titled “collection.screen_capture — screen captured”

collection.av_capture — microphone or camera opened

Section titled “collection.av_capture — microphone or camera opened”

collection.archive_staging — data archived for sending

Section titled “collection.archive_staging — data archived for sending”

collection.local_sweep — many user documents read

Section titled “collection.local_sweep — many user documents read”

impact.ransom_rewrite — many files rewritten and renamed

Section titled “impact.ransom_rewrite — many files rewritten and renamed”

impact.ransom_note — the same note dropped in many directories

Section titled “impact.ransom_note — the same note dropped in many directories”
  • HIGH · Impact · 🔶 · Planned 0.7.1
  • ATT&CK: T1485 Data Destruction (DET0146) · MBC E1485
  • Trigger: one process unlinks 100 or more files it did not create, across several directories, within 30 seconds.
  • Data: syscall trace; file lifecycle (the guest hashes each file before it is deleted).
  • Why this tier: cleaning its own temp files is excluded; deleting other files in bulk is destruction.
  • References: SentinelOne, AcidRain: A Modem Wiper Rains Down on Europe (2022), Sigma: DD File Overwrite.

impact.block_device_write — disk written directly

Section titled “impact.block_device_write — disk written directly”
  • HIGH · Impact · ✅ · Planned 0.7.1
  • ATT&CK: T1561.001 Disk Content Wipe (DET0316), T1561.002 Disk Structure Wipe (DET0297) · MBC F0014 Disk Wipe
  • Trigger: an open for writing of /dev/sd*, /dev/vd*, /dev/nvme*, /dev/mmcblk*, /dev/mtd*, /dev/loop*, /dev/dm-*, or ioctl(BLKDISCARD/BLKSECDISCARD/BLKZEROOUT) or the MTD erase ioctl.
  • Data: syscall trace.
  • Why this tier: only partitioning and imaging tools write raw disks.
  • References: SentinelOne AcidRain report (above), ESET, Industroyer2: Industroyer reloaded (2022; the AwfulShred Linux wiper).

impact.reboot — reboot, power-off or kernel replacement

Section titled “impact.reboot — reboot, power-off or kernel replacement”
  • HIGH · Impact · ✅ · Planned 0.7.1
  • ATT&CK: T1496.001 Compute Hijacking (DET0540) · MBC B0018.002 Cryptojacking
  • Trigger: socket bytes that are Stratum JSON-RPC ("method":"login", "mining.subscribe", "mining.authorize"); an argument vector with stratum+tcp://, stratum+ssl://, --donate-level, -o pool…; or a DNS name of a known pool.
  • Data: syscall trace (socket payloads, argv); network capture.
  • Why this tier: benign miners exist, but not as unknown samples.
  • References: XMRig source (login in src/base/net/stratum/Client.cpp, mining.subscribe in EthStratumClient.cpp), Aqua Kinsing report (above), Sigma: Linux Crypto Mining Indicators.

impact.miner_tuning — machine tuned for mining

Section titled “impact.miner_tuning — machine tuned for mining”
  • MEDIUM · Impact · ✅ · Planned 0.7.1
  • ATT&CK: T1496.001 Compute Hijacking
  • Trigger: a write to /proc/sys/vm/nr_hugepages or /sys/kernel/mm/hugepages/*, modprobe msr, an open for writing of /dev/cpu/*/msr.
  • Data: syscall trace.
  • Why this tier: databases enable huge pages too; MSR writes are rare.
  • References: XMRig, RandomX optimization guide: MSR, XMRig, Huge pages.

impact.fork_bomb — runaway process creation

Section titled “impact.fork_bomb — runaway process creation”
  • MEDIUM · Impact · 🔶 · Planned 0.7.1
  • ATT&CK: T1499.001 OS Exhaustion Flood (DET0356)
  • Trigger: one lineage creates more than 200 processes per second without exec, or fork/clone start failing with EAGAIN.
  • Data: syscall trace; process tree.
  • Why this tier: busy servers fork a lot but exec or exit; loss counters often rise at the same time.
  • References: ATT&CK T1499.001 only (no malware report verified).
  • HIGH · Impact · 🔶 · Planned 0.7.1
  • ATT&CK: T1498.001 Direct Network Flood (DET0343)
  • Trigger: one process sends more than 1,000 packets per second to one destination (sendto/sendmmsg counts, raw or UDP sockets), or the capture shows a matching flood.
  • Data: syscall trace; network capture.
  • Why this tier: nothing benign floods one target from a sample run.
  • References: Mirai attack.h (UDP and SYN flood vectors), Microsoft XorDdos report (above).

impact.service_stop — services or virtual machines stopped

Section titled “impact.service_stop — services or virtual machines stopped”
  • MEDIUM · Impact · ✅ · Planned 0.7.1
  • ATT&CK: T1489 Service Stop (DET0021)
  • Trigger: an exec of systemctl stop/disable, service … stop, esxcli vm process kill, vim-cmd vmsvc/power.off, or kill of database and virtualization processes.
  • Data: syscall trace.
  • Why this tier: administrators stop services; ransomware stops them to unlock files.
  • References: Trend Micro LockBit Linux-ESXi report (above; esxcli vm process kill), Sigma: Disable Or Stop Services.

impact.inhibit_recovery — backups or snapshots removed

Section titled “impact.inhibit_recovery — backups or snapshots removed”

Most rootkit rules need kernel state rather than system calls. They belong to the Root-level activity work planned for 0.8.0.

bpf.program — eBPF program loaded or attached

Section titled “bpf.program — eBPF program loaded or attached”
  • MEDIUM · Rootkit · ✅ · Exists in 0.7.0 (medium)
  • ATT&CK: T1014 Rootkit (DET0377), as context
  • Trigger: bpf with BPF_PROG_LOAD, BPF_PROG_ATTACH or BPF_PROG_DETACH.
  • Data: syscall trace; programs decoded in Triage → eBPF.
  • Why this tier: systemd and container runtimes load cgroup and socket programs.
  • References: Fournier, Afchain, Baubeau, With Friends Like eBPF, Who Needs Enemies? (Black Hat USA 2021; the 0.7.0 source; companion code ebpfkit), Elastic: BPF Program or Map Load via bpftool.

rootkit.bpf_tracing — eBPF program that can change what others see

Section titled “rootkit.bpf_tracing — eBPF program that can change what others see”

rootkit.dev_mem — kernel or physical memory opened

Section titled “rootkit.dev_mem — kernel or physical memory opened”

rootkit.module_capture — loaded module image kept

Section titled “rootkit.module_capture — loaded module image kept”
  • INFO · Rootkit · 🔷 · Planned 0.8.0
  • ATT&CK: T1547.006 Kernel Modules and Extensions
  • Trigger: every module the run loads (persistence.module); the image is saved for Static analysis and YARA.
  • Data: new kernel data (the image as loaded).
  • Why this tier: it is evidence, not a behaviour.
  • References: init_module(2).

rootkit.module_hidden — module removed from the module list

Section titled “rootkit.module_hidden — module removed from the module list”
  • HIGH · Rootkit · 🔷 · Planned 0.8.0
  • ATT&CK: T1014 Rootkit, T1564 Hide Artifacts (DET0502)
  • Trigger: a module the run loaded is missing from /proc/modules and /sys/module while its code is still in the module address range.
  • Data: new kernel data.
  • Why this tier: only rootkits unlink themselves.
  • References: Diamorphine (list_del(&THIS_MODULE->list)), Reptile, KoviD.

rootkit.syscall_table — system call table changed

Section titled “rootkit.syscall_table — system call table changed”
  • HIGH · Rootkit · 🔷 · Planned 0.8.0
  • ATT&CK: T1014 Rootkit
  • Trigger: an entry of sys_call_table differs from the boot value.
  • Data: new kernel data.
  • Why this tier: only rootkits patch the table.
  • Note: since Linux 6.9, and in the 6.12.94 guest, x86-64 dispatches system calls through a switch in x64_sys_call(), so a changed table entry shows an attempt but no longer redirects calls. Modern rootkits patch x64_sys_call itself; that is rootkit.text_patch.
  • References: Linux commit 1e3ad78334a6 (“x86/syscall: Don’t force use of indirect calls for system calls”), Elastic Security Labs, FlipSwitch: a Novel Syscall Hooking Technique (2025), Diamorphine.

rootkit.text_patch — kernel code modified

Section titled “rootkit.text_patch — kernel code modified”
  • HIGH · Rootkit · 🔷 · Planned 0.8.0
  • ATT&CK: T1014 Rootkit
  • Trigger: the kernel text, including x64_sys_call, differs from its boot hash outside the kernel’s own patching (alternatives, static keys, ftrace and kprobe sites accounted for).
  • Data: new kernel data; the host can also hash guest kernel text from QEMU memory.
  • Why this tier: benign modules do not patch kernel code.
  • References: Elastic FlipSwitch article (above).

rootkit.ftrace_hook — ftrace hook that rewrites calls

Section titled “rootkit.ftrace_hook — ftrace hook that rewrites calls”
  • HIGH · Rootkit · 🔷 · Planned 0.8.0
  • ATT&CK: T1014 Rootkit
  • Trigger: an ftrace_ops with FTRACE_OPS_FL_IPMODIFY registered by a module the run loaded, on syscall, VFS or network functions.
  • Data: new kernel data.
  • Why this tier: live-patching is the only benign user, and it is not loaded by samples.
  • References: Using ftrace to hook to functions, ftrace-hook, KoviD.

rootkit.kprobe_hook — kprobe registered by a module

Section titled “rootkit.kprobe_hook — kprobe registered by a module”
  • HIGH · Rootkit · 🔷 · Planned 0.8.0
  • ATT&CK: T1014 Rootkit
  • Trigger: register_kprobe/register_kretprobe from a module the run loaded (Diamorphine uses one to find kallsyms_lookup_name).
  • Data: new kernel data.
  • Why this tier: tracing tools use kprobes through perf or BPF, not from new modules.
  • References: Kernel Probes (Kprobes), Diamorphine.

rootkit.netfilter_hook — netfilter hook registered by a module

Section titled “rootkit.netfilter_hook — netfilter hook registered by a module”
  • HIGH · Rootkit · 🔷 · Planned 0.8.0
  • ATT&CK: T1014 Rootkit, T1205 Traffic Signaling
  • Trigger: nf_register_net_hook from a module the run loaded.
  • Data: new kernel data.
  • Why this tier: magic-packet rootkits listen this way.
  • References: Reptile (port knocking backdoor).

rootkit.hidden_process, rootkit.hidden_file, rootkit.hidden_port — objects hidden from userland

Section titled “rootkit.hidden_process, rootkit.hidden_file, rootkit.hidden_port — objects hidden from userland”
  • HIGH · Rootkit · 🔶 (cross-view on recorded data) and 🔷 (active check) · Planned 0.8.0
  • ATT&CK: T1014 Rootkit, T1564 Hide Artifacts (DET0502)
  • Trigger: a process the guest kernel traces, a file whose inode still has names, or a socket that is listening, is missing from what a program in the run was shown: a getdents64 of /proc or of the file’s directory, or a read of /proc/net/tcp*. The 🔷 form asks the guest kernel to compare its own view with what /proc returns, without waiting for a program to look.
  • Data: syscall trace (directory listings and file bytes are captured); new kernel data for the active form.
  • Why this tier: nothing benign hides objects from /proc.
  • References: Diamorphine, Reptile, KoviD.