Ignore Process Interrupts
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.
let LookbackPeriod = 24h;
let SuspiciousNohupPayloads = dynamic([
"/tmp/", "/var/tmp/", "/dev/shm/", "/run/",
"nc ", "ncat ", "netcat", "socat",
"python", "perl", "ruby",
"bash -i", "sh -i", "dash -i",
"chmod", "curl ", "wget ",
"/etc/init.d/", "/etc/rc.", "/etc/cron"
]);
let PSErrorSuppressionTerms = dynamic([
"SilentlyContinue", "ErrorActionPreference",
"-ErrorAction Ignore", "-EA Ignore",
"-ErrorAction SilentlyContinue", "-EA SilentlyContinue"
]);
let PSMaliciousIndicators = dynamic([
"Invoke-WebRequest", "IWR ", "Net.WebClient", "DownloadString", "DownloadFile",
"Invoke-Expression", "IEX(", "IEX ", "-EncodedCommand", "-enc ",
"Start-BitsTransfer", "schtasks", "sc create", "reg add",
"New-Service", "Set-MpPreference", "Add-MpPreference",
"Invoke-Mimikatz", "certutil"
]);
// Linux/macOS: nohup process creation or processes whose parent is nohup
let NohupExecution = DeviceProcessEvents
| where Timestamp > ago(LookbackPeriod)
| where FileName == "nohup"
or InitiatingProcessFileName == "nohup"
or (ProcessCommandLine matches regex @"(?i)\bnohup\s+\S"
and FileName in~ ("bash", "sh", "dash", "zsh", "ksh", "python3", "python", "perl", "ruby"))
| extend IsNohupParent = InitiatingProcessFileName == "nohup"
| extend BackgroundExecution = ProcessCommandLine has "&"
| extend TempDirPayload = ProcessCommandLine has_any ("/tmp/", "/var/tmp/", "/dev/shm/")
| extend SuspiciousNetTool = ProcessCommandLine has_any ("nc ", "ncat ", "netcat", "socat")
| extend InteractiveShell = ProcessCommandLine has_any ("bash -i", "sh -i", "dash -i", "/bin/bash -c", "/bin/sh -c")
| extend PersistencePath = ProcessCommandLine has_any ("/etc/init.d/", "/etc/rc.", "/etc/cron", "/etc/profile", "~/.bashrc", "~/.bash_profile")
| extend SuspiciousPayload = ProcessCommandLine has_any (SuspiciousNohupPayloads)
| extend SuspicionScore = toint(BackgroundExecution) + toint(TempDirPayload) + toint(SuspiciousNetTool) + toint(InteractiveShell) + toint(PersistencePath)
| extend DetectionType = "nohup_interrupt_ignore";
// Windows: PowerShell executing with error suppression combined with malicious patterns
let PSErrorSuppression = DeviceProcessEvents
| where Timestamp > ago(LookbackPeriod)
| where FileName in~ ("powershell.exe", "pwsh.exe")
| where ProcessCommandLine has_any (PSErrorSuppressionTerms)
| extend HasMaliciousIndicator = ProcessCommandLine has_any (PSMaliciousIndicators)
| extend HasEncodedCommand = ProcessCommandLine has_any ("-EncodedCommand", "-enc ", "-e ")
| extend HasDownloadCradle = ProcessCommandLine has_any ("Invoke-WebRequest", "Net.WebClient", "DownloadString", "DownloadFile")
| extend HasPersistenceAction = ProcessCommandLine has_any ("schtasks", "sc create", "reg add", "New-Service")
| extend HasDefenseEvasion = ProcessCommandLine has_any ("Set-MpPreference", "Add-MpPreference", "DisableRealtimeMonitoring")
| extend SuspicionScore = toint(HasMaliciousIndicator) + toint(HasEncodedCommand) + toint(HasDownloadCradle) + toint(HasPersistenceAction) + toint(HasDefenseEvasion)
| where SuspicionScore > 0
| extend DetectionType = "ps_error_suppression";
// Union both detection types
NohupExecution
| union PSErrorSuppression
| project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine,
InitiatingProcessFileName, InitiatingProcessCommandLine,
FolderPath, SHA256, DetectionType, SuspicionScore
| sort by Timestamp desc Data Sources
Required Tables
False Positives
- System administrators running long-duration jobs with nohup to survive SSH disconnection (e.g., nohup rsync, nohup tar, nohup python batch jobs)
- CI/CD pipeline agents (Jenkins, GitLab Runner, GitHub Actions) using nohup to daemonize build processes or test runners
- Monitoring and observability daemons (Datadog agent, Prometheus exporters, Telegraf) started via init scripts or cron using nohup
- Software installation scripts using nohup to continue package downloads after session timeout
- PowerShell automation scripts using -ErrorAction SilentlyContinue to handle expected errors in idempotent deployment scripts (SCCM, DSC, Intune)
- Developer workstations where nohup is used to keep local development servers running after terminal close
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.