OS Exhaustion Flood
Adversaries may launch a denial of service (DoS) attack targeting an endpoint's operating system (OS). OS exhaustion floods do not need to deplete physical hardware resources—they exhaust OS-imposed limits on concurrent connections and state tracking. SYN floods send excessive TCP SYN packets without completing the three-way handshake, filling the OS half-open connection backlog queue and preventing new legitimate TCP connections from being established. ACK floods send packets referencing non-existent connections, forcing the OS to perform a full TCP state table search for each packet, causing CPU and memory exhaustion that degrades or stops service. Both techniques can render any TCP-based service unavailable on the targeted endpoint.
// Detect OS Exhaustion Flood — SYN floods, ACK floods, TCP state exhaustion
// Branch 1: Network security device alerts via CommonSecurityLog (Firewall, IDS, IPS)
let FloodSignatures = dynamic([
"syn flood", "ack flood", "tcp flood", "tcp state exhaustion",
"half-open", "connection table full", "syn attack", "synflood",
"tcp exhaustion", "possible syn flooding", "syn cookie",
"incomplete handshake", "dos tcp", "ddos tcp"
]);
let NWSAlerts = CommonSecurityLog
| where TimeGenerated > ago(1h)
| where Activity has_any (FloodSignatures)
or Message has_any (FloodSignatures)
or DeviceEventClassID has_any ("DOS", "DDOS", "FLOOD", "SYN_ATTACK", "TCP_EXHAUST")
| extend AttackType = case(
Activity has_any ("syn flood", "syn attack", "synflood") or Message has_any ("syn flood", "syn attack"),
"SYN Flood",
Activity has_any ("ack flood") or Message has_any ("ack flood"),
"ACK Flood",
Activity has_any ("tcp flood", "tcp exhaustion") or Message has_any ("tcp exhaustion", "tcp flood"),
"TCP State Exhaustion",
Message has_any ("half-open", "connection table full"),
"Half-Open Queue Exhaustion",
"OS Exhaustion Flood"
)
| extend TargetAsset = coalesce(DestinationHostName, DestinationIP, "Unknown")
| extend SourceLabel = "network-device"
| summarize
AlertCount = count(),
UniqueSourceIPs = dcount(SourceIP),
SourceIPSample = make_set(SourceIP, 10),
TargetPorts = make_set(DestinationPort, 10),
FirstSeen = min(TimeGenerated),
LastSeen = max(TimeGenerated),
AttackTypes = make_set(AttackType, 5)
by TargetAsset, DeviceVendor, DeviceProduct, SourceLabel
| extend DurationMinutes = datetime_diff('minute', LastSeen, FirstSeen)
| extend IsDDoS = iff(UniqueSourceIPs > 10, true, false)
| project FirstSeen, LastSeen, DurationMinutes, TargetAsset, AttackTypes,
AlertCount, UniqueSourceIPs, SourceIPSample, TargetPorts,
IsDDoS, DeviceVendor, DeviceProduct, SourceLabel;
// Branch 2: Linux kernel TCP SYN flood and conntrack table exhaustion via Syslog
let KernelAlerts = Syslog
| where TimeGenerated > ago(1h)
| where Facility == "kern"
| where SyslogMessage has_any (
"TCP: request_sock_TCP:",
"Possible SYN flooding on port",
"sending cookies",
"TCP: drop open request from",
"nf_conntrack: table full, dropping packet",
"ip_conntrack: table full, dropping packet",
"possible SYN attack",
"TCP: too many of orphaned sockets"
)
| extend AttackType = case(
SyslogMessage has_any ("SYN flooding", "SYN attack", "sending cookies", "request_sock_TCP"),
"SYN Flood - Linux Kernel Alert",
SyslogMessage has_any ("nf_conntrack", "ip_conntrack"),
"Connection Tracking Table Full",
SyslogMessage has "orphaned sockets",
"TCP Orphaned Socket Exhaustion",
"TCP State Exhaustion - Linux Kernel"
)
| summarize
AlertCount = count(),
UniqueSourceIPs = int(0),
SourceIPSample = dynamic([]),
TargetPorts = dynamic([]),
FirstSeen = min(TimeGenerated),
LastSeen = max(TimeGenerated),
AttackTypes = make_set(AttackType, 5)
by TargetAsset = Computer, DeviceVendor = "Linux", DeviceProduct = "Kernel TCP Stack",
SourceLabel = "linux-kernel"
| extend DurationMinutes = datetime_diff('minute', LastSeen, FirstSeen)
| extend IsDDoS = false
| project FirstSeen, LastSeen, DurationMinutes, TargetAsset, AttackTypes,
AlertCount, UniqueSourceIPs, SourceIPSample, TargetPorts,
IsDDoS, DeviceVendor, DeviceProduct, SourceLabel;
NWSAlerts
| union KernelAlerts
| where AlertCount >= 3
| sort by AlertCount desc Data Sources
Required Tables
False Positives
- Legitimate high-traffic web servers receiving organic traffic spikes from CDN edge nodes, load testing campaigns, or major product launches can trigger connection count thresholds in IPS/IDS signatures
- Network security scanners and vulnerability assessment tools (Nessus, Qualys, Rapid7, nmap) performing broad TCP port scans may generate SYN flood-like signatures on IPS/IDS devices when run at high rates
- Cloud auto-scaling events and health check storms from load balancers (AWS ELB, Azure Application Gateway) can produce connection bursts that resemble early-stage floods from the perspective of perimeter devices
- Misconfigured network monitoring tools performing high-frequency TCP keepalive probes may trigger half-open connection alerts on target systems
- Software bugs causing TCP connection leaks or aggressive retry storms in microservices can mimic flood patterns, especially triggering Linux kernel nf_conntrack table full warnings in high-throughput environments
References (8)
- https://attack.mitre.org/techniques/T1499/001/
- https://www.cloudflare.com/learning/ddos/syn-flood-ddos-attack/
- https://web.archive.org/web/20220119104451/https://www.corero.com/resource-hub/syn-ack-flood-attack/
- https://pages.arbornetworks.com/rs/082-KNA-087/images/13th_Worldwide_Infrastructure_Security_Report.pdf
- https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html
- https://learn.microsoft.com/en-us/azure/ddos-protection/ddos-protection-overview
- https://docs.splunk.com/Documentation/SplunkCloud/latest/SearchReference/CommonStatsFunctions
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1499.001/T1499.001.md
Unlock Pro Content
Get the full detection package for T1499.001 including response playbook, investigation guide, and atomic red team tests.