T1564.011 Microsoft Sentinel · KQL

Detect Ignore Process Interrupts in Microsoft Sentinel

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/

KQL Detection Query

Microsoft Sentinel (KQL)
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

Detects T1564.011 across Linux/macOS and Windows platforms. On Linux and macOS, identifies nohup process execution (FileName == 'nohup') and processes whose parent is nohup (InitiatingProcessFileName == 'nohup') via Microsoft Defender for Endpoint's DeviceProcessEvents, which covers Linux endpoints with the MDE agent deployed. Suspicion scoring flags background execution (&), temp directory payloads, network tools (nc, socat), interactive shells, and persistence-related paths. On Windows, detects PowerShell using error suppression flags (-ErrorAction SilentlyContinue, $ErrorActionPreference) combined with malicious indicators including download cradles, encoded commands, persistence actions, and defense evasion patterns.

Data Sources

Process: Process CreationCommand: Command ExecutionMicrosoft Defender for Endpoint (Linux agent)Microsoft Defender for Endpoint (Windows)

Required Tables

DeviceProcessEvents

False Positives & Tuning

  • 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
Download portable Sigma rule (.yml)

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.

  1. 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.

  2. 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/'.

  3. 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.

  4. 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.

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