T1564.011

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.

Microsoft Sentinel / Defender
kusto
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
medium severity medium confidence

Data Sources

Process: Process Creation Command: Command Execution Microsoft Defender for Endpoint (Linux agent) Microsoft Defender for Endpoint (Windows)

Required Tables

DeviceProcessEvents

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

Unlock Pro Content

Get the full detection package for T1564.011 including response playbook, investigation guide, and atomic red team tests.

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections