Playbook ID: PB-WEBAPP | Default severity: SEV-2 (escalate to SEV-1 if a web shell was used interactively, the application's database account was used to read outside its normal query set, the application's cloud role was used from outside your account, or the application sits on a payment or authentication path) | Owner: Operations Lead (Application)
php-fpm → sh, java → bash, w3wp.exe → cmd.exe. This maps to Exploit Public Facing Application [T1190], and CISA lists web shells as a named indicator for that technique (CISA IR Playbook, Table 1).UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS naming the web tier's instance role — the classic tail end of a server-side request forgery chain (GuardDuty IAM finding types).Not for: perimeter appliances — VPN concentrators, firewalls, load-balancer appliances, file-transfer boxes — which are Playbook 14.12, because their forensics and their vendor relationship work differently. Container and cluster compromise is 14.10. Availability loss without intrusion is 14.8. Takeover of a SaaS application you do not host is 14.3. Manipulation of an LLM or agent's behavior rather than its host is 14.11. A compromise that arrived through a dependency you shipped is 14.5, run in parallel. Once you can name records and data subjects, the notification workstream is 14.7. Chapter 10 owns the vulnerability management program this playbook fails over from; Chapter 9 owns the detections that should have caught it.
Two different incidents wear the same clothes here, and you must decide early which one you are in. The first is a targeted attack on your application: someone found a flaw in code you wrote, and they came for you. The second, far more common in 2026, is that you were one of several thousand hosts a scanner walked past. An internet-wide scan is not a burglar casing your house. It is someone walking the whole street trying every door handle, and yours turned. The exploitation was indiscriminate; the triage of victims afterwards is not, and that is the part that hurts.
The numbers moved decisively in this direction. Vulnerability exploitation reached 31% of breaches in the 2026 DBIR, overtaking credential abuse for the first time in that report's nineteen-year history (SecurityWeek), and Mandiant has recorded exploits as the top initial infection vector for six consecutive years, at 32% (M-Trends 2026). VulnCheck's 1H-2026 measurement is the one to keep in your head when someone asks whether you have time: 23.43% of KEV entries showed evidence of exploitation on or before the day the CVE was published, and around 200 CVEs reached exploited status within 31 days (VulnCheck). Meanwhile only 26% of KEV vulnerabilities were fully remediated across 13,000 polled organizations, down from 38%, with median patching time rising to 43 days (Help Net Security). The window is closing and the response is slowing. The UK's NCSC makes the consequence concrete: three vulnerabilities — Ivanti Connect Secure CVE-2025-0282, Fortinet FortiManager CVE-2024-47575, and Microsoft SharePoint CVE-2025-53770 — accounted for 29 of its nationally significant incidents in a single reporting year (NCSC Annual Review 2025).
What the adversary wants is rarely the application. It is what the application is trusted to reach: the database account, the object store, the secrets in the process environment, and — on cloud-hosted web tiers — the instance role. A web application is the one component in your estate that is deliberately reachable by everyone on earth and deliberately holds credentials to your data. That combination is the whole business model.
And here is the mistake teams make, almost universally. They patch, confirm the scanner is clean, and close the ticket. Patching removes the door handle that turned. It does nothing whatsoever about the person already inside, because the web shell they dropped is served by your own application over ordinary HTTPS to an ordinary-looking path, and it does not care that the original flaw is fixed. CISA's own framing is that a vulnerability found to have been exploited is no longer a vulnerability ticket — it escalates immediately into incident response (CISA vulnerability response playbook). Patch. Then hunt. Both. Every time.
| Role | Responsibility in PB-WEBAPP |
|---|---|
| Incident Commander | Owns the take-it-offline call, the patch-versus-assess sequencing, and the accessed-versus-accessible determination. |
| Operations Lead (Application) | Host and application work: log preservation, web shell hunt, artefact integrity, session and secret invalidation, rebuild from clean artefact. |
| Operations Lead (Platform) | Edge and infrastructure: WAF and CDN rules, load-balancer target membership, network egress controls, cloud role revocation, IMDS posture. |
| Operations Lead (Data) | Database and object-store scoping: what the application account could read, what it did read, and evidence for both. |
| Communications Lead | Customer and status-page comms; coordination with the vendor and any sector ISAC in a mass-exploitation event. |
| Scribe | UTC/ISO 8601 timeline, chain of custody, artefact register including build and image digests. |
| Legal Liaison | Legal hold on log exports and snapshots; owns the record of the accessed-versus-accessible reasoning. |
| Executive Sponsor | Approves any action that takes a revenue-bearing application offline. |
Marking used below: `TIP-OFF = the adversary can observe this action. EVIDENCE` = this destroys or degrades evidence and must not run before capture.
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 1 | Declare T+0. Set a 60-minute triage box; containment fires at expiry whether or not scoping is finished. | IC | Time box recorded | Declaration time (UTC/ISO 8601), triggering alert or advisory ID |
| 2 | Stop the clock on your logs before anything else. Suspend rotation and extend retention on web access logs, application logs, WAF/CDN logs, database logs and cloud audit logs. CloudTrail console Event history is a hard 90 days and management events only (CloudTrail concepts). | Ops Lead (Platform) | Rotation suspended on every source | Retention settings before and after, per source |
| 3 | Export the raw logs for the full suspected window to the evidence store and hash them. Export before you contain — containment changes what the logs will contain. | Ops Lead (Application) | Exports stored and hashed | SHA-256 per file, query window, exporting identity |
| 4 | Place legal hold on the exports. S3 Object Lock legal hold has no expiration date, applies per object version, and requires S3 Versioning (S3 Object Lock). Hold first, analyze second. | Legal Liaison | Hold confirmed on every evidence object version | Object versions held, hold timestamp, case ID |
| 5 | Pin the exact running build: version, commit, image digest, patch level, and every enabled module or plugin. Then classify the asset against the vendor advisory as Not Affected, Susceptible, or Compromised — CISA's three evaluation states (CISA playbook). | Ops Lead (Application) | Every instance classified | Build identifiers, advisory reference, per-host state table |
| 6 | Find the first request that worked. Filter access logs for the exploit path and separate 4xx/5xx from 2xx/3xx. The first success is the adversary's T-zero and it is almost never the same as your alert time. | Ops Lead (Application) | First successful exploit request identified, or excluded | Log lines, source IP, user agent, timestamp, status, byte count |
| 7 | Hunt web shells: enumerate every file under the web root newer than the last known-good deployment, and diff the running tree against the artefact that was supposed to be deployed. | Ops Lead (Application) | Full candidate list produced | find and diff output, deployment record used as baseline |
| 8 | Hunt non-file persistence: attacker-created application admin accounts, API tokens, OAuth clients, webhook endpoints, scheduled jobs, mail/SMTP config, and any application-level plugin or extension added since deployment. | Ops Lead (Application) | Each object dispositioned as expected or not | Object inventory with creation timestamps and creating principal |
| 9 | Hunt host persistence: cron and systemd units, authorized_keys, new local accounts, LD_PRELOAD, and package integrity via rpm -Va or dpkg --verify. | Ops Lead (Application) | Host persistence accounted for | Command output, deltas annotated |
| 10 | Enumerate the application's identity — everything the process can authenticate as. Database account and its grants, cloud instance or workload role and its policies, object-store access, secrets in environment variables and config files, outbound API keys, and the session-signing key. | Ops Lead (Data) + Ops Lead (Platform) | Written inventory of reachable systems | Grant listings, IAM policy documents, secret inventory (names, not values) |
| 11 | Cloud branch: determine whether the role credential left the environment. An ASIA short-term key for the web tier's role calling from a non-AWS source IP is the classic SSRF-to-IMDS signature, and ec2RoleDelivery with value "1.0" explicitly confirms IMDSv1 was used to obtain the credential (AWS CloudTrail investigation guide). | Ops Lead (Platform) | Off-host credential use confirmed or excluded | CloudTrail records, principalId, session names, source IPs, ec2RoleDelivery values |
| 12 | Scope the fleet, not the host. Every instance behind the same load balancer, every instance running the same build, every environment sharing the same secrets — staging and DR included. | Ops Lead (Platform) | Fleet inventory complete with per-host state | Instance list, build digests, target-group membership |
| 13 | Establish whether this is a mass-exploitation event: check KEV, the vendor advisory, and your sector ISAC. If a directive or advisory prescribes specific detection steps, run them verbatim and record the result — being one of thousands does not change your obligations, it changes your timeline. | IC | Mass-exploitation status recorded | Advisory references, prescribed steps run, outputs |
# 1) Files under the web root modified since the last known-good deploy.
# Substitute your real deployment timestamp, in UTC.
find /var/www -xdev -type f -newermt "2026-09-01 00:00:00" \
-printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\n' | sort
# 2) mtime is attacker-controllable with `touch`; ctime is not settable directly.
# Run this second pass whenever timestomping is plausible - it usually is.
find /var/www -xdev -type f -newerct "2026-09-01 00:00:00" \
-printf '%CY-%Cm-%CdT%CH:%CM:%CS %p\n' | sort
# 3) The strongest single check: diff the live tree against the artefact you
# believe you deployed. Anything "Only in" the live tree is a candidate.
diff -r --brief /mnt/known-good-build /var/www/html
# 4) Package integrity on the host (RPM and dpkg systems respectively).
rpm -Va
dpkg --verify# Find the first successful exploitation attempt in a combined-format access log.
# In that format: $1 source IP, $4 timestamp, $7 request URI, $9 status, $10 bytes sent.
# Confirm your own log_format before trusting the field positions.
awk '$7 ~ /<vulnerable-path>/ && $9 ~ /^[23]/ { print $4, $1, $7, $9, $10 }' \
access.log | head -40Sequence is the content of this phase. Capture volatile state, then break the vector at the edge, then cut the identity, then cut egress, and only then move the host out of service. Reverse the last two and the adversary watches their access die while their C2 channel is still open, which is exactly the window they use to burn what they have.
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 1 | Capture host memory before touching the host. RFC 3227 order of volatility puts registers and memory above disk, and disk above remote logging (RFC 3227). Interpreter-hosted shells frequently exist only in process memory. | Ops Lead (Application) | Memory image acquired and hashed | Image hash, tool and version, acquiring operator, UTC time |
| 2 | Capture live process and network state on the host: running processes with full command lines, open sockets and their peers, loaded modules, and the application's own child-process tree. | Ops Lead (Application) | Live capture stored and hashed | Command outputs with timestamps, hashes |
| 3 | Snapshot the instance volumes. Snapshots are Region-scoped, and if the snapshot is encrypted you must also share the customer-managed KMS key for a forensics account to use it; grant the forensic role read-only (AWS forensic environment strategies). | Ops Lead (Platform) | Snapshot copied to the forensics account | Snapshot IDs, KMS key ARN, destination account, custody record |
| 4 | Preserve every suspected web shell as a file — copy it out, hash it, record full timestamps and ownership — before any removal. `EVIDENCE` if skipped | Ops Lead (Application) | Artefact preserved with metadata | File copy, SHA-256, stat output, owning UID/GID |
| 5 | Put a blocking WAF rule on the exploitation vector: the specific URI, method, header or parameter pattern the advisory describes. This stops new exploitation of this flaw. It does not stop the shell that is already installed. `TIP-OFF` | Ops Lead (Platform) | Rule enforcing, verified with a replayed request | Rule definition, deploy time, first blocked request, before/after test |
| 6 | Block the shell's own path at the edge as a second, separate rule — and deny by path, not by source IP. Source IPs rotate within minutes; the artefact path does not. `TIP-OFF` | Ops Lead (Platform) | Requests to the artefact path return a deny at the edge | Rule definition, matched request log |
| 7 | Cut the application's cloud identity. For an assumed role you must revoke sessions and change permissions — AWS states plainly that revocation alone is insufficient, and that if a resource-based policy independently allows the principal you need an explicit deny keyed on aws:PrincipalArn (revoke role sessions). `TIP-OFF` | Ops Lead (Platform) | Role calls failing in CloudTrail | AWSRevokeOlderSessions policy JSON with its aws:TokenIssueTime, first denied call |
| 8 | Rotate the database credentials the application uses, and kill existing sessions authenticated with the old ones. Rotating without terminating sessions leaves an open connection doing exactly what it was doing before. `TIP-OFF` | Ops Lead (Data) | New credential live, old sessions terminated | Rotation record, session-kill output, connection list before and after |
| 9 | Close the metadata path so a residual SSRF primitive cannot mint new credentials: require IMDSv2 and drop the PUT response hop limit. AWS documents that a hop limit of 1 blocks container-to-IMDS in many topologies and "can cause issues" in container environments — check before you set it (configure IMDS options). | Ops Lead (Platform) | IMDSv2 required on every web-tier instance | CLI output, before/after metadata options, MetadataNoToken reading |
| 10 | Cut outbound egress from the web tier. A web server that initiates connections to the internet is doing something you did not design. Note AWS's own caveat: "the existing tracked connections won't be terminated as a result of changing security groups" (remediating a compromised EC2 instance) — for established C2 you need a stateless control such as a NACL. `TIP-OFF` | Ops Lead (Platform) | New and existing outbound sessions both dead | Rule definitions, flow-log evidence of the session dropping |
| 11 | Remove the instance from the load-balancer target group rather than terminating it. Traffic stops, evidence survives, and the customer-visible effect is a capacity change rather than an outage. `TIP-OFF` | Ops Lead (Platform) | Instance draining and no longer receiving requests | Target-group state before and after, deregistration time |
| 12 | Isolate the host at the network layer: create an isolation security group with no rule permitting 0.0.0.0/0 in either direction, associate it, and remove all other associations (AWS procedure). | Ops Lead (Platform) | Host reachable only from the forensic path | Security-group IDs before and after, command transcript |
| 13 | Freeze deployments to the affected application and lock the pipeline. If the actor reached the repository or CI, the cleanest rebuild in the world redeploys their code. | Ops Lead (Application) + IC | Pipeline frozen, freeze announced to engineering | Freeze time, approver, pipeline state |
# Isolation security group swap - `--groups` replaces the instance's groups entirely
# and requires at least one group ID.
aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --groups sg-0isolation
# Force IMDSv2 and restrict the hop limit. `--http-endpoint` must be set when
# `--http-tokens` is set. Verify the MetadataNoToken metric reads zero first.
aws ec2 modify-instance-metadata-options \
--instance-id i-1234567890abcdef0 \
--http-tokens required \
--http-put-response-hop-limit 1 \
--http-endpoint enabled// The inline policy the AWS console attaches as `AWSRevokeOlderSessions`.
// It denies sessions assumed before the timestamp plus roughly 30 seconds of
// propagation slack. Attaching it requires PutRolePolicy on the role, and it
// does NOT work for service-linked roles or IAM Identity Center permission sets.
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"DateLessThan": {"aws:TokenIssueTime": "2026-09-05T14:00:00Z"}
}
}
}Do not start this phase until CISA's three preconditions hold: all means of persistent access are accounted for, adversary activity is sufficiently contained, and all evidence has been collected (CISA IR playbook). It is an iterative gate, not a checkbox — if the hunt turns up a new artefact, you are back in Phase 1.
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 1 | Rebuild from the known-good artefact onto fresh infrastructure. Do not clean the compromised host and return it to service. You are cleaning against an inventory the adversary wrote. `EVIDENCE` on the old host if it is destroyed before capture completes | Ops Lead (Application) | Replacement instances running the patched build | Build digest deployed, provisioning record, old-host disposition |
| 2 | Apply the patch. Where no patch exists, CISA's acceptable alternatives are limiting access, isolating the asset, or making permanent configuration changes — and disabling services, firewall blocks or increased monitoring as temporary compensating controls. Track those systems as Mitigated, never as closed. | Ops Lead (Application) | Every susceptible instance Remediated or Mitigated | Per-system status table, patch version, control descriptions |
| 3 | Rotate every secret the application process could read: database credentials, object-store keys, outbound API keys, message-queue credentials, and anything in the environment or a mounted config file. Scope by what the process could reach, not by what you think was used. | Ops Lead (Data) | Full rotation confirmed against the Phase 1 inventory | Rotation record per secret, old-credential revocation confirmations |
| 4 | Rotate the session-signing key and invalidate every existing user session. If the actor read the signing secret, they can mint valid sessions for any user indefinitely, and no password reset touches that. | Ops Lead (Application) | New key live, all prior sessions rejected | Key rotation time, session-store flush record, first rejected old cookie |
| 5 | Remove attacker-created application objects found in Phase 1: admin accounts, API tokens, OAuth clients, webhooks, scheduled jobs. Remove them by object, and re-run the enumeration afterwards. | Ops Lead (Application) | Re-enumeration returns only expected objects | Deleted object IDs, before/after inventories |
| 6 | Check the database for persistence in its own right: triggers, stored procedures, scheduled jobs, and unexpected grants on the application's account. A shell removed from the web tier is worth little if a trigger reinstalls it. | Ops Lead (Data) | Database objects reconciled against schema baseline | Schema diff, object creation timestamps, grant listing |
| 7 | Search the source repository and build pipeline for the artefact and for unexpected commits, branches, workflow files or self-hosted runner changes in the exposure window. | Ops Lead (Application) | Repository and pipeline reconciled | Commit range reviewed, diff output, reviewer identity |
| 8 | Rebuild the least-privilege posture for the application's cloud role using IAM Access Analyzer policy generation from CloudTrail activity, and use an unused-access analyzer to find the permissions it never needed (Access Analyzer). | Ops Lead (Platform) | Replacement policy applied and the old one removed | Generated policy, diff against the previous policy, approval record |
| 9 | Re-sweep the entire fleet for the same artefact and the same IOCs, including staging, DR and any environment sharing the build. Note CISA's caution: an adversary can introduce new tools or modify existing ones to subvert IOC-centric response. | Ops Lead (Application) | Sweep complete across every environment | Sweep scope, tooling, per-host results |
Accessed, or merely accessible. This is the determination that sets your severity, your notification obligation and your legal exposure, and it is the one teams answer with a feeling instead of evidence. Work it as three separate questions with three separate answers.
What could it reach? Answer this from configuration, and answer it today. It is the grants on the database account, the policies on the cloud role, the buckets and the API keys. It requires no logs and it defines the outer bound — the "accessible" set. Legal will want this number whether or not you can narrow it.
What did it do? Answer this from the application's data-access telemetry: database query or audit logs, object-store data-event logs, and application-level access records. This is where most organizations discover the hole. Cloud object-store data events are frequently opt-in — AWS states that by default, trails and event data stores log management events but not data events (CloudTrail concepts) — and database query logging is off in most production configurations for performance reasons. If it was off, say so in the record, in those words, and stop there. Absence of evidence in a source that was never collecting is not evidence of absence, and a report that blurs the two will not survive a regulator or a plaintiff.
How much left? When data-access logs are missing, the web tier's own access log is the fallback and it is better than nothing. Response byte counts distinguish a command result from a data set: a 2xx returning 300 bytes is a shell answering whoami; a series of 2xx responses returning tens of megabytes to the same client is data leaving the building. Pair that with egress volume from flow logs for the same window and you have a defensible upper bound even without query-level visibility.
# Total bytes returned to a suspect source IP, and the largest responses it received.
# Combined format: $1 source IP, $7 request URI, $9 status, $10 body bytes sent.
awk -v ip="203.0.113.7" '$1==ip { n++; sum += $10 } \
END { printf "%d requests, %d bytes returned\n", n, sum }' access.log
awk -v ip="203.0.113.7" '$1==ip { print $10, $9, $7 }' access.log | sort -rn | head -25| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 1 | Prove the patch actually fixes it. Replay the exploit against the patched build in a non-production environment and confirm it fails. CISA has had to re-issue guidance in a live campaign because devices reported as "patched" remained exposed (CISA re-issued guidance, Nov 2025). | Ops Lead (Application) | Exploit confirmed non-functional against the new build | Test transcript, build digest tested, tester identity |
| 2 | Return capacity to the load balancer incrementally, starting with a single instance, with request logging at full verbosity. | Ops Lead (Platform) | Traffic serving normally at full capacity | Registration times, error rates per stage |
| 3 | Keep the WAF virtual patch in place until the fix is verified in production, then remove it deliberately. CISA's reversion rule: once patches are available and can be safely applied, mitigations can be removed and patches applied — in that order. | Ops Lead (Platform) | Mitigations removed with a recorded decision | Removal time, approver, verification evidence relied on |
| 4 | Deploy detections from this incident: the exploit signature, the artefact path, the actor's request fingerprint, and an alert on the application process spawning an interpreter. Author them as versioned rules, not console edits — Chapter 9 owns the pipeline. | Ops Lead (Application) | Rules in production and firing on a replayed sample | Rule IDs, validation test result, deploy commit |
| 5 | Run a heightened-monitoring window of at least 30 days on the application and its data stores. The actor knows this application, knows it was worth their time, and will notice when it comes back. | Ops Lead (Application) | Window scheduled with a named owner and end date | Monitoring plan, alert routing, owner |
| 6 | Close out every system in the fleet to a terminal state — Remediated (patched, no longer vulnerable) or Mitigated (compensating controls in place, still tracked). No system closes as "Susceptible." | Ops Lead (Platform) | Fleet status table complete | Per-system state with evidence reference |
| 7 | Lift the deployment freeze once the pipeline has been reconciled, with a named approver. | IC | Freeze lifted, engineering notified | Approval record, reconciliation evidence |
| # | Action | Who | Done when | Evidence to capture |
|---|---|---|---|---|
| 1 | Reconcile the timeline: advisory publication, KEV listing if any, your patch availability, your patch application, first successful exploitation, detection, declaration, containment. The gaps between those are the findings. | Scribe | Timeline signed off by IC | Complete UTC/ISO 8601 timeline with source per entry |
| 2 | Measure your real time-to-patch for this class of asset against the 43-day median and against your own SLA, and take the number to the risk register. | Ops Lead (Platform) | Metric produced and filed | Measurement, comparison, register entry |
| 3 | Answer the inventory question honestly: did you know this application was internet-facing, and was it in the asset inventory with a named owner before the incident? | IC | Answer recorded, gap logged if the answer is no | Inventory record as it stood at T+0 |
| 4 | Close the data-access determination in writing with Legal — the accessible set, the accessed set, the evidence for each, and every telemetry gap named explicitly. | Legal Liaison | Determination signed | Determination memo, evidence index |
| 5 | Fix the logging gap the incident exposed. Enable data-event or query-level logging on the stores this application reaches, and set retention deliberately — the international event-logging guidance is blunt that "default log retention periods are often insufficient" and notes it can take up to 18 months to discover an incident (Best Practices for Event Logging and Threat Detection). | Ops Lead (Data) | Logging enabled and retention set with an owner | Configuration change record, retention values, validation query |
| 6 | Add this application class to the "assume compromise on KEV listing" list, so the next advisory triggers a compromise assessment automatically rather than a patch ticket. | IC | Standing rule documented in the VM program | Rule text, owner, effective date |
| 7 | Blameless review within 10 working days, with engineering in the room and not just security. | IC | Review held, actions assigned with dates | Findings, owners, due dates |
Exploitation of an application starts no regulatory clock by itself. What starts a clock is confirmed unauthorized access to data, and in this scenario that determination arrives through the database or the object store, not through the web tier. The trigger to escalate is Phase 3's accessed-versus-accessible work: the moment you can say a specific data set was read by an unauthorized principal, brief Legal Liaison and hand off to Playbook 14.7. Do not wait until you can count records — the clock does not.
Three paths here are easy to miss. If the application processes payment card data, contractual notification duties to your acquirer and the card brands typically run on far shorter timelines than statute, and they are triggered by suspected compromise rather than confirmed access. If the application is multi-tenant, your customers' data is in scope and their own regulators may be too. And in a mass-exploitation event, coordinate with the vendor and your sector ISAC before publishing anything: your independent disclosure can burn a coordinated timeline and tell other victims' attackers what defenders have found. Chapter 15 holds the notification decision tree and every regulatory deadline. Do not reconstruct them here and never commit to a deadline from memory.
Automate freely. All of Phase 1's gathering: on an exploit-signature hit, automatically suspend log rotation, export the log window with hashes, snapshot the instance volumes, open the legal hold, run the web-root diff against the deployment artefact, pull the application's IAM policy and database grants, and post the whole package into the incident channel. Every one of those is reversible, evidence-producing and verifiable after the fact. Automating the snapshot is the highest-value play available here for the same reason it is in Playbook 14.10: it removes the time pressure that makes responders start deleting things.
Automate behind a human gate. WAF vector blocking in enforce mode, and deregistration from the load-balancer target group. Both are reversible and both cost latency or capacity rather than correctness when they fire on a false positive — but both are visible to the adversary and to your customers, so gate them on a named approver and rate-limit them. Require the automation to prove the block by replaying a request and reporting the status code, rather than reporting success on an API acknowledgement.
Never automate. Patching production, credential and session-key rotation, database credential changes, egress blocks that sever established connections, instance termination, and the accessed-versus-accessible determination. The last one deserves particular emphasis: the documented failure modes of agentic triage are overconfident closure backed by weak proof and hallucinated detail in investigation narratives, and a data-access determination is exactly the artefact where a confident-sounding wrong answer becomes a regulatory filing. Use AI to assemble the log timeline and to summarize the grant inventory. Have a human sign the conclusion. Chapter 17 has the gate design in full.
Takeaway: scope by build digest and target group, never by the hostname that happened to alert, and rebuild from the pipeline artefact onto fresh infrastructure rather than deleting the shell you found. If you cannot reproduce the host from source, write that down as an architecture finding with a date against it — it is the most valuable thing this incident will hand you.