Detect Ignore Process Interrupts in CrowdStrike LogScale
Adversaries evade defensive mechanisms by launching processes immune to interrupt signals, preventing analyst-driven or system-triggered termination. The primary technique is nohup on Linux and macOS, which detaches a process from the controlling terminal and causes it to ignore SIGHUP—the hangup signal sent when a session ends or a terminal closes. Malware authors also call signal() or sigaction() directly to mask SIGINT, SIGTERM, SIGPIPE, SIGCHLD, and other control signals, as documented in BPFDoor (masks 7 signals) and BOLDMOVE (masks SIGCHLD, SIGHUP, SIGPIPE). On Windows, PowerShell's -ErrorAction SilentlyContinue or $ErrorActionPreference = 'SilentlyContinue' prevents script termination on errors, allowing malicious payloads to continue past failures that would otherwise halt execution. Real-world usage includes GoldMax Linux variant (nohup invocation for C2 persistence through SSH disconnection), UNC3886 (nohup /bin/support in /etc/init.d/localnet for semi-persistence across reboots), Sea Turtle running SnappyTCP via nohup, and OSX/Shlayer applying nohup to payload execution on macOS. Unlike Trap (T1546.005), this technique does not re-invoke the process after termination—it only prolongs the existing execution session through events that would otherwise end it.
MITRE ATT&CK
- Tactic
- Defense Evasion
- Technique
- T1564 Hide Artifacts
- Sub-technique
- T1564.011 Ignore Process Interrupts
- Canonical reference
- https://attack.mitre.org/techniques/T1564/011/
LogScale Detection Query
// T1564.011 - Ignore Process Interrupts: nohup + PowerShell Error Suppression
// CrowdStrike Falcon LogScale (CQL) - Humio Query Language
// ========== PART 1: Linux/macOS nohup detection ==========
#event_simpleName = ProcessRollup2
| #platform_name = /Linux|Mac/
| CommandLine = /\bnohup\s+\S/ OR ImageFileName = /\/(usr/)?bin/nohup$/
OR ParentBaseFileName = "nohup"
| eval temp_dir_payload = if(CommandLine = /\/tmp\/|\/var\/tmp\/|\/dev\/shm//, 1, 0)
| eval suspicious_net_tool = if(CommandLine = /\b(nc|ncat|netcat|socat)\s/, 1, 0)
| eval interactive_shell = if(CommandLine = /(bash|sh|dash)\s+-i/, 1, 0)
| eval persistence_path = if(CommandLine = /\/etc\/init\.d\/|\/etc\/rc\.|\/etc\/cron|\/etc\/profile/, 1, 0)
| eval background_exec = if(CommandLine = /&\s*$/, 1, 0)
| eval download_tool = if(CommandLine = /\b(curl|wget)\s/, 1, 0)
| eval suspicion_score = temp_dir_payload + suspicious_net_tool + interactive_shell + persistence_path + background_exec + download_tool
| eval detection_type = "nohup_interrupt_ignore"
| eval platform_label = "Linux/macOS"
| where not ParentBaseFileName = /(cron|anacron|crond)/
| table _time, ComputerName, UserName, ImageFileName, CommandLine, ParentBaseFileName, ParentCommandLine, suspicion_score, detection_type, platform_label
// ========== PART 2: Windows PowerShell error suppression ==========
| union
[
#event_simpleName = ProcessRollup2
| #platform_name = Windows
| ImageFileName = /\\(powershell|pwsh)\.exe$/i
| CommandLine = /(?i)(SilentlyContinue|ErrorActionPreference|-ErrorAction\s+Ignore|-EA\s+Ignore|-EA\s+SilentlyContinue)/
| eval cmd_lower = lower(CommandLine)
| eval has_download_cradle = if(cmd_lower = /invoke-webrequest|iwr\s|net\.webclient|downloadstring|downloadfile/, 1, 0)
| eval has_exec_cradle = if(cmd_lower = /invoke-expression|iex\(|iex\s|-encodedcommand|-enc\s/, 1, 0)
| eval has_persistence = if(cmd_lower = /schtasks|sc\s+create|reg\s+add|new-service/, 1, 0)
| eval has_defense_evasion = if(cmd_lower = /set-mppreference|add-mppreference|disablerealtimemonitoring/, 1, 0)
| eval has_network_util = if(cmd_lower = /certutil|start-bitstransfer|bitsadmin/, 1, 0)
| eval suspicion_score = has_download_cradle + has_exec_cradle + has_persistence + has_defense_evasion + has_network_util
| where suspicion_score > 0
| eval detection_type = "ps_error_suppression"
| eval platform_label = "Windows"
| table _time, ComputerName, UserName, ImageFileName, CommandLine, ParentBaseFileName, ParentCommandLine, suspicion_score, detection_type, platform_label
]
| sort(field=_time, order=desc)
| groupBy([ComputerName, detection_type], function=[
count(as=alert_count),
max(suspicion_score, as=max_suspicion),
collect([UserName, ImageFileName, CommandLine, ParentBaseFileName, detection_type, platform_label])
]) Detects T1564.011 Ignore Process Interrupts in CrowdStrike Falcon telemetry. Targets ProcessRollup2 events on Linux/macOS for nohup invocations (direct, child processes, or command-line containing nohup) with suspicion scoring across payload paths, network tools, interactive shells, and persistence indicators. On Windows, matches PowerShell processes with error suppression flags combined with malicious execution patterns including download cradles, encoded commands, persistence mechanisms, and defense evasion.
Data Sources
Required Tables
False Positives & Tuning
- IT operations scripts using nohup to launch legitimate background services, monitoring daemons, or database operations that must survive operator logout
- Software development and build automation environments where nohup is used to start compilers, test harnesses, or artifact servers in ephemeral CI environments
- Windows automation runbooks (SCCM, Intune, custom tooling) that use PowerShell -ErrorAction SilentlyContinue to gracefully handle environments where some commands may not apply
Other platforms for T1564.011
Testing Methodology
Validate this detection against 4 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.
- Test 1nohup Background Execution with Network Listener
Expected signal: Linux auditd EXECVE record: a0='nohup', a1='nc', a2='-lvp', a3='14444', a4='-s', a5='127.0.0.1'. A second EXECVE record for the nc process itself with ppid matching the nohup process. MDE DeviceProcessEvents: FileName='nohup' with child process FileName='nc' where InitiatingProcessFileName='nohup'. DeviceNetworkEvents: nc process creating a listening socket on port 14444.
- Test 2nohup Protecting Interpreter from Temp Directory
Expected signal: Auditd EXECVE: a0='chmod', a1='+x', a2='/tmp/df00tech_test_payload.sh' followed by a0='nohup', a1='/tmp/df00tech_test_payload.sh'. MDE DeviceFileEvents: file creation at /tmp/df00tech_test_payload.sh. DeviceProcessEvents: FileName='nohup', ProcessCommandLine contains '/tmp/' (TempDirPayload indicator). A second DeviceProcessEvents record for bash/sh with InitiatingProcessFileName='nohup' and FolderPath='/tmp/'.
- Test 3Programmatic Signal Masking via Python
Expected signal: Auditd EXECVE: a0='python3', a1='-c', a2 contains 'signal.SIG_IGN'. MDE DeviceProcessEvents: FileName='python3', ProcessCommandLine contains 'SIG_IGN' and 'signal'. /proc/<pid>/status SigIgn field will be non-zero (e.g., 0x0000000000003c06 with SIGHUP=1, SIGINT=2, SIGTERM=15, SIGPIPE=13 masked). Attempting `kill -SIGTERM <pid>` will have no effect; only `kill -9 <pid>` terminates the process.
- Test 4PowerShell Error Suppression with Download Cradle
Expected signal: Sysmon Event ID 1: Process Create — Image=powershell.exe, CommandLine contains 'ErrorActionPreference' and 'SilentlyContinue' and 'Net.WebClient' and 'DownloadString' and 'Invoke-WebRequest'. Sysmon Event ID 3: Network Connection attempts to 127.0.0.1:19999 (will fail with connection refused). PowerShell ScriptBlock Log Event ID 4104 in Microsoft-Windows-PowerShell/Operational with full script content.
References (11)
- https://attack.mitre.org/techniques/T1564/011/
- https://man7.org/linux/man-pages/man7/signal.7.html
- https://linux.die.net/man/1/nohup
- https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-7.3#erroractionpreference
- https://www.crowdstrike.com/blog/observations-from-the-stellarparticle-campaign/
- https://cloud.google.com/blog/topics/threat-intelligence/boldmove-north-korea-fortigate
- https://www.mandiant.com/resources/blog/fortinet-malware-ecosystem
- https://www.deepinstinct.com/blog/bpfdoor-an-active-chinese-global-surveillance-tool
- https://www.huntress.com/blog/a-brief-history-of-sea-turtle
- https://www.jamf.com/blog/shlayer-malware-abusing-gatekeeper-bypass-on-macos/
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1564.011/T1564.011.md
Unlock Pro Content
Get the full detection package for T1564.011 including response playbook, investigation guide, and atomic red team tests.