Playbook ID: PB-DDOS | Default severity: SEV-2 (escalate to SEV-1 if a revenue-generating or safety-relevant service is fully unavailable, if shared infrastructure such as DNS or the identity provider is targeted, or if any concurrent intrusion indicator appears) | Owner: Operations Lead
Availability degrades and the cause is inbound traffic rather than your own change. Triggers:
Not this playbook: an outage from your own deploy or capacity miss (change management). Ransomware-driven unavailability → 14.1. Resource exhaustion from exploitation of an application flaw → 14.13, or of a perimeter appliance → 14.12. If the flood turns out to be the visible half of an intrusion, run both playbooks in parallel — not one after the other.
DDoS is the one attack class where the adversary needs no cleverness or patience. They need capacity, and capacity is now cheap and enormous. Cloudflare mitigated 47.1 million DDoS attacks in 2025, averaging 5,376 an hour, and the largest peaked at 31.4 Tbps and lasted 35 seconds (Cloudflare Q4 2025). Thirty-five seconds. Your on-call engineer has not finished reading the page alert.
That is not an outlier, it is the shape of the problem: 71% of HTTP DDoS attacks and 89% of network-layer attacks end in under ten minutes (Cloudflare Q3 2025). If your response depends on waking someone for approval, the attack ends before the approval lands — and returns tomorrow on a different vector. CISA sorts the technique space three ways, and the distinction drives what you do next: volumetric (saturate the pipe), protocol (exhaust state on firewalls, balancers and hosts — SYN floods, reflection/amplification), and application-layer (cheap requests that buy expensive work). Layer 7 is the one your bandwidth graph will not show you: small, indistinguishable from customers, and able to "critically overload CPUs and databases" (CISA DDoS Quick Guide). Map as T1498 Network Denial of Service, T1498.001 Direct Network Flood, T1498.002 Reflection Amplification.
Now the mistake, and it is why this playbook sits in a book about intrusion response. A DDoS is a very loud thing to have happening to you, and loud is useful cover. CISA states these attacks "can be launched in conjunction with other types of attacks"; ransomware crews list DDoS as a standard triple-extortion pressure layer beside exfiltration (BleepingComputer). Pulling a fire alarm empties a building, but it is an even better way to walk out the back with the safe while everyone stands in the car park counting heads. Every responder staring at a traffic graph is a responder not watching the identity plane. Actionable takeaway: the first structural decision here is not a mitigation setting. It is splitting the team, and you make it at T+10m.
| Role | Responsibility in this scenario |
|---|---|
| Incident Commander | Declares severity; owns the team split; approves any control that degrades service for legitimate users. |
| Operations Lead | Owns the mitigation sequence at edge, provider and origin; owns provider escalation. |
| Network/Edge Engineer | Executes edge, BGP and tunnel changes; captures flow and packet evidence. |
| Parallel Intrusion Watch | A named analyst who does not work the outage. Watches identity, egress, EDR and control-plane change; signs off before close. |
| Communications Lead | Status page and customer notice; controls what mitigation detail becomes public. |
| Scribe | UTC timeline with the source of each timestamp; every control applied, by whom. |
| Legal Liaison | Extortion communication, SLA exposure, law-enforcement referral, notification assessment. |
| Executive Sponsor | Concurs on blackhole decisions and on accepting a hard revenue outage. |
Two markers in the tables. TIP-OFF — observable by whoever is attacking you; it tells them which control landed and what to change. EVIDENCE — reshapes or ages out the traffic evidence; the preceding capture step must be complete first.
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 1 | Reproduce the failure from outside — three external regions plus one mobile network. An internal check proves nothing. | Network/Edge Eng | External fail, internal pass | Per-region output, resolver used |
| 2 | Rule the change window in or out: deploys and config pushes in the last 60 minutes. If one correlates, roll back first. | Operations Lead | Change window cleared | Deploy IDs and times examined |
| 3 | Classify the layer: bandwidth and pps vs baseline, then request rate, then origin CPU and connection count. | Network/Edge Eng | Layer named (3/4, 7, mixed) | Dashboard export, baseline vs current |
| 4 | EVIDENCE Capture flow and packet evidence now, before mitigation reshapes traffic. Flow records roll over; dashboards age out. | Network/Edge Eng | pcap and flow export stored | pcap + SHA-256, flow export, collector, UTC start/stop |
| 5 | Export the provider attack record (Cloudflare DDoS Overview, Shield Advanced events page, Azure DDoS metrics) and declare severity. | Operations Lead / IC | Declared, T+0 set | Attack ID, vectors, peak rate, source ASN/geo mix |
| 6 | Assign the Parallel Intrusion Watch and take that person off outage work. Scope: authentication anomalies, new OAuth grants, privileged role changes, egress volume, EDR detections, edge/WAF config change. | Incident Commander | Analyst acknowledged in channel | Assignment message, name, scope |
| 7 | Determine whether the origin answers directly, bypassing the CDN. If it does, edge mitigation will not work. | Network/Edge Eng | Reachability known | Resolver output, direct-to-origin probe |
| 8 | Sweep abuse@, support, executive inboxes and public social accounts for an extortion note. Do not reply. | Communications Lead | Sweep complete | Message preserved unaltered, full headers |
# What does the public world resolve to, from an off-net resolver?
dig +short A app.example.com @1.1.1.1
# Is the origin answering directly — i.e. is the edge being bypassed?
# A 200 here means your CDN is optional to the attacker.
curl -sS -o /dev/null -w '%{http_code} %{time_total}s\n' \
--resolve app.example.com:443:<origin-ip> https://app.example.com/
# Half-open connections on a suspected SYN-flood target (Linux origin or LB)
ss -tan state syn-recv | wc -l
# Bounded evidence capture. -s 96 keeps headers only; -c bounds the file
# so a flood cannot fill the evidence disk.
tcpdump -n -i eth0 -s 96 -c 200000 -w /evidence/ddos-$(date -u +%Y%m%dT%H%M%SZ).pcapOrder is deliberate: cheapest-for-legitimate-users first, most user-hostile last. Reversing it breaks your own customers before you have tried the controls that would not have.
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 1 | Set provider DDoS managed rulesets to documented maximum posture — Cloudflare's guidance is High sensitivity with default mitigation actions (Cloudflare). | Network/Edge Eng | Confirmed at High | Before/after ruleset export |
| 2 | Raise caching to absorb requests at the edge. Cloudflare's documented pattern: exclude query strings from the cache key so cache-busting floods do not become origin subrequests. | Network/Edge Eng | Origin load falling | Cache config diff, origin CPU graph |
| 3 | Deploy rate-limit and custom rules in Count mode first, verify they match attack traffic and not customers, then switch to Block. AWS: "Always test your rules first by initially using the rule action Count instead of Block" (AWS). Blocking on an untested match takes you down faster than the attacker could. | Operations Lead | Blocking, customers verified unaffected | Rule definitions, Count-mode counts, post-Block success rate |
| 4 | Engage the provider's humans. AWS Shield Advanced: open a Support case — critical and urgent cases route directly to DDoS experts, and the Shield Response Team can apply AWS WAF mitigations with your consent (AWS). Azure DDoS Network Protection: support request → Issue Type Technical → Service DDOS Protection → the DDoS plan linked to the protected virtual network → Severity A – Critical Impact → Problem Type Under attack (Microsoft). | Operations Lead | Case open with a number | Case number, time opened, engineer assigned |
| 5 | Give the ISP the attacking source addresses. CISA also suggests asking the ISP for port and packet-size filtering. | Network/Edge Eng | ISP ticket open | Ticket number, IP list, filters applied |
| 6 | Shed application load: disable or queue expensive unauthenticated endpoints — search, export, report generation, PDF rendering. Serve a static degraded page, not a 500. | Operations Lead | Expensive endpoints gated | Feature-flag changes, timestamps |
| 7 | TIP-OFF EVIDENCE Before any interstitial challenge, blackhole or blanket geo-block, snapshot edge logs and the provider attack record — these controls change the traffic mix and you lose the ability to characterize the original attack. Then decide, per the callouts below. | Scribe captures; IC approves | Snapshot stored, approval recorded | Log export hash, approval message, enable time, stated expiry |
| 8 | Confirm in channel each status cycle that the Intrusion Watch is still running and has not been quietly pulled onto the outage. | Incident Commander | Confirmed each cycle | Channel confirmations |
No malware to remove. Eradication here means taking away the leverage — the exposed origin, the amplifiable service, the expensive endpoint — and closing the intrusion question.
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 1 | If the origin IP was exposed and directly targeted, rotate it. Cloudflare's guidance: get new origin IPs from the hosting provider, and accept traffic only from the edge provider's ranges. | Network/Edge Eng | New IPs live, firewall restricted | Old/new IP record, firewall diff |
| 2 | Audit your own internet-facing services for reflection surface — open resolvers, exposed UDP services, anything answering unauthenticated queries larger than the request. | Network/Edge Eng | External scan clean | Scan output before/after |
| 3 | Fix the layer-7 weakness the attack found: authentication, pagination, caching or a cost ceiling on the endpoint that fell over. | Operations Lead | Load-tested at attack request rate | Load-test result, change reference |
| 4 | Complete the Intrusion Watch review across the window plus two hours either side: authentication events, new OAuth grants, privileged role changes, service-account activity, outbound volume, EDR detections, edge/WAF/DNS config change. | Intrusion Watch | Written finding, including "none found" | Queries run, time ranges, findings |
| 5 | EVIDENCE Export the provider attack report and edge logs before dashboard retention expires or a temporary rule is deleted. | Scribe | Export verified readable | Manifest with hashes; custody per RFC 3227 |
| 6 | Disposition every emergency rule: a reviewed permanent rule with a named owner, or a deletion with a date. No rule leaves without one. | Operations Lead | All rules dispositioned | Rule inventory, owner, disposition |
| 7 | Withdraw temporary BGP announcements and blackhole routes one at a time, monitoring between each. | Network/Edge Eng | Temporary routing reverted | Routing diff, withdrawal times |
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 1 | Step controls down in reverse order of user harm: blackhole, interstitial challenge, geo/ASN blocks, rate limits, caching posture. One at a time, 15-minute hold — remove several at once and you cannot tell which was carrying you. | Operations Lead | Each step held 15 min clean | Step-down log, per-step metrics |
| 2 | Re-enable disabled endpoints; watch origin CPU, connection count and queue depth against baseline. | Operations Lead | Metrics within baseline | Graphs before/after |
| 3 | Validate a real customer journey from outside — sign-in, one transaction, one write. Not a 200 on the homepage. | Network/Edge Eng | Journey passes from three regions | Journey transcript with timings |
| 4 | Drain the backlog: queued jobs, retried webhooks, failed payment authorizations, abandoned sessions. This is where the money actually went. | Operations Lead | Drained or written off | Queue depth, failed transaction count |
| 5 | Restore any DNS TTLs shortened during the incident. | Network/Edge Eng | TTLs at documented values | Zone diff |
| 6 | Publish the resolution notice only after independent external validation, never off the internal dashboard. | Communications Lead | Notice published | Published text and time |
| 7 | Do not close until the Intrusion Watch signs off in writing. Service restored is not incident over. | Incident Commander | Sign-off recorded | Sign-off with name and scope covered |
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 1 | Reconcile your timeline against the provider's attack record; note every disagreement. | Scribe | Merged timeline complete | Timeline, discrepancy list |
| 2 | Decompose time-to-mitigate into detect / decide / act. "Decide" is usually the largest number and the only one you can fix this quarter. | Incident Commander | Three intervals measured | Calculation with source timestamps |
| 3 | Pre-authorize in writing every control you had to stop and ask permission for, with thresholds, an expiry, and a named approver beyond them. | Executive Sponsor | Standing authority signed | Document version and date |
| 4 | Drill the provider escalation path out of band: contract entitlement, 24×7 contact, case severity, who may open a critical case. | Operations Lead | Drill completed | Drill record, response times |
| 5 | Publish a traffic baseline per internet-facing service — requests/sec, bandwidth, pps, geo and ASN mix — so the next comparison takes seconds. | Network/Edge Eng | Baselines published | Baseline document per service |
| 6 | Report it. CISA and FBI urge prompt reporting to a local FBI Field Office or CISA at report@cisa.gov / (888) 282-0870; US state, local, tribal and territorial entities may also report to MS-ISAC at SOC@cisecurity.org / 866-787-4722. | Legal Liaison | Report filed | Reference and time filed |
| 7 | Add the architectural exposure found — exposed origin, single-provider dependency, uncached expensive endpoint — to the risk register with the outage cost. | Incident Commander | Register updated | Entry with owner and review date |
A pure availability event usually does not start a personal-data breach clock. Three other clocks may already be running.
Externally, publish what customers can act on: which services are affected, whether their data is involved (say "no evidence of data access" only if the Intrusion Watch supports it), and when the next update comes. Never publish which vector you filtered or which control you applied — that is tuning notes for the person attacking you.
With 71% of HTTP and 89% of network-layer attacks finishing inside ten minutes, a mitigation gated on a human approval arrives after the incident. Automation is not an optimization here. It is the only way to be on time.
Automate without a gate — reversible, scoped, evidence-producing: correlation across synthetic checks, edge metrics and provider alerts; evidence capture (flow export, bounded pcap, provider attack record, edge log snapshot); channel and ticket creation; status-page draft for human approval; managed-ruleset escalation to the documented High posture; rate-limit rules deployed in Count mode; auto-paging the Intrusion Watch role whenever this playbook opens.
Require a named human approver — irreversible, or blast radius scaled by a false positive: switching any rule from Count to Block, global Under Attack Mode, geography or ASN blocking, blackhole requests to the upstream, BGP announcement changes, origin IP rotation. This is the book's general gate rule: automation may gather, enrich, correlate and recommend freely; it may act only where the action is reversible, scoped and rate-limited.
Two conditions on every automated mitigation. It must auto-expire — a mitigation with no expiry becomes permanent shadow configuration nobody remembers approving. And it must write its evidence to the incident record as it fires, because an automated block with no captured rationale is indistinguishable from a misconfiguration when someone asks in six weeks why a whole country cannot reach your site.