Skip to content

docs(incident-management): add endpoint compromise runbook - #647

Open
s1ns3nz0 wants to merge 7 commits into
security-alliance:developfrom
s1ns3nz0:docs/endpoint-compromise-runbook
Open

s1ns3nz0 wants to merge 7 commits into
security-alliance:developfrom
s1ns3nz0:docs/endpoint-compromise-runbook

Conversation

@s1ns3nz0

@s1ns3nz0 s1ns3nz0 commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

What

Adds Runbook: Endpoint Compromise to the incident response template, plus the cross-links that connect it to pages already in the repo.

The runbooks covered infrastructure and key compromise but not the contributor workstation, which is where infostealer and fake-recruiter intrusions actually land. playbooks/malware.mdx covers the victim side of the same incident ("your computer was hacked, save your crypto"). This is the responder side: what the security team does once a colleague reports it.

Design decisions

Severity derives from the access tier the user holds, not the malware family. Access is observable in the first twenty minutes and impact is not, so the tier table stands in for the impact bands in the Incident Response Policy. Escalators cover pipelines that reach production without an approval gate, sub-threshold multisig signers, and control of public channels.

The revocation table is ordered, because the common failures are sequencing errors. Rotating an SSH key before killing the attacker's live session lets them add the new key. Changing a password before revoking sessions leaves the stolen cookie valid. Re-enrolling 2FA from a cloud backup restores the stolen seed. The table supplies the order; each row links to whoever owns the procedure.

Containment forks on capability, not doctrine. Teams with endpoint tooling contain in the console and keep the host up for memory capture. Teams without it disconnect, and power off only when nobody can capture memory. The table also handles the already-powered-off device, which is the state malware.mdx produces when it tells the affected person to shut down immediately.

There is an insider branch. The normal path says to phone the user immediately, which is exactly wrong if the user is the threat actor, so that case routes to Legal and the DPRK IT worker guidance instead.

The runbook stops at P3. The policy defines P4 and P5, but their response times ("can be scheduled", "no immediate action") do not fit a confirmed endpoint compromise. A downgrade path closes the incident when the lure arrived but never ran.

Checked against NIST and CISA

Evidence collection runs in order of volatility per NIST SP 800-86. Eradication is gated on finishing the foothold inventory first, per the CISA incident and vulnerability response playbooks. A closing section covers the incident log, post-mortem, indicator sharing, and the detection gap, since SP 800-61r3 treats improvement as a standing function and the repo's own runbook template asks for a resolution checklist.

Files

File Change
runbooks/endpoint-compromise.mdx New runbook
runbooks/overview.mdx Listed under Critical (P1)
runbooks/index.mdx Regenerated
vocs.config.ts Sidebar entry after Key Compromise
playbooks/malware.mdx Links to the responder-side runbook
playbooks/hacked-dprk.mdx Same
playbooks/hacked-elusive-comet.mdx Previously ended at the malware playbook, which is victim guidance, so there was no route to the org-side process

Notes for review

  • Everything is an example, as with the sibling runbooks: [Date], [Name], [X hours], and the suggested 30-day monitoring window need filling in per organization.
  • The widest element is the 5-column revocation table. Worth a look on a narrow viewport.
  • Checked locally: cspell clean, validate:content passes, every internal link resolves, renders in vocs dev.
  • Out of scope: 8 of the 10 sibling runbooks lack the resolution/post-mortem section the template asks for. Separate cleanup.

The runbooks covered infrastructure and key compromise but not the
contributor workstation, which is where infostealer and fake-recruiter
intrusions actually land. malware.mdx covers the victim side; this is
the responder side.

Severity derives from the access tier the user holds rather than the
malware family, since access is observable in the first twenty minutes
and impact is not. Escalators cover ungated pipelines, sub-threshold
signers, and public channel control.

The credential revocation table is ordered because the common failures
are sequencing errors: rotating an SSH key before killing the live
session lets the attacker re-add it, and changing a password before
revoking sessions leaves the stolen cookie valid.

Containment forks on capability rather than doctrine, and handles the
already-powered-off device, which is the state malware.mdx produces.

Claude-Session: https://claude.ai/code/session_01CPQ1FcHGiBKWPd8waT7uGx
Checked the runbook against SP 800-61r3, SP 800-86, and the CISA
incident and vulnerability response playbooks. Four things were missing.

Evidence collection now runs in order of volatility per SP 800-86, so a
responder holding a live machine knows memory outranks disk rather than
working down an unordered list.

Eradication is gated on finishing the foothold inventory first, which is
the CISA sequencing rule. Rebuilding the laptop while an OAuth grant
survives moves the attacker off the device and leaves them in the
accounts, and the rebuild destroys the evidence that would have found
them.

The runbook had no way to close an incident. SP 800-61r3 makes improve a
standing function, and the repo's own runbook template asks for a
resolution checklist, so there is now a closing section covering the
incident log, post-mortem, indicator sharing, and the detection gap.

External notification was absent on the responder side even though
malware.mdx carries it for victims. Legal owns the decision, but the
clock starts at discovery, so it belongs in escalation.

Claude-Session: https://claude.ai/code/session_01CPQ1FcHGiBKWPd8waT7uGx
The closing section opened by negating ("an incident is not closed
because the laptop was rebuilt") and letting the next sentence carry the
correction, which is the same rhetorical move the key takeaway already
spends. Leads with the claim instead.

Also drops a filler "just", replaces an unclear line about evidence
surviving "without you" with what the rows actually do, and unpacks
"a deadline stays a choice" into plain terms.

Claude-Session: https://claude.ai/code/session_01CPQ1FcHGiBKWPd8waT7uGx
The symptoms list describes lures this repo already documents with real
message screenshots, but nothing connected the two. Differentiation now
routes a suspicious meeting-link domain or fake recruiter task to the
DPRK playbook, and a Zoom screen-share request to ELUSIVE COMET, since
naming the campaign tells the responder which follow-on accounts to
check.

Both playbooks link back. ELUSIVE COMET previously ended at the malware
playbook, which is victim guidance, leaving no route to the org-side
process.

External notification points at the communications template and
communication strategies, which own wording, cadence, and spokesperson
while this runbook only covers the legal clock. Closing the incident
points at Lessons Learned for the review questions and blameless format.

Claude-Session: https://claude.ai/code/session_01CPQ1FcHGiBKWPd8waT7uGx
The paragraph added with the playbook cross-links leaned on "worth"
twice in four sentences and closed on a generic recommendation rather
than a reason. Says what the screenshots are for and stops there.

Claude-Session: https://claude.ai/code/session_01CPQ1FcHGiBKWPd8waT7uGx
"A stolen session cookie stays valid until revoked" was stated three
times: in the P4/P5 note, in step 4, and in row 1 of the revocation
table. Step 4 carried nothing else, since it only pointed at the section
immediately below it, so it is gone.

Two lines contradicted each other on the same phrase. Quick Reference
said access is observable within the first twenty minutes, then twenty
lines later said access is least understood during the first twenty
minutes. The second now makes its point about defaulting high without
re-litigating when access becomes knowable.

Step 2 explained the memory tradeoff twice in consecutive paragraphs.
General principle first, then the already-powered-off case as a short
consequence.

Claude-Session: https://claude.ai/code/session_01CPQ1FcHGiBKWPd8waT7uGx
Six headings were sentence case while the ones inherited from the
template were title case, so the file was inconsistent with itself and
with all nine sibling runbooks, which title-case step headings too.

Claude-Session: https://claude.ai/code/session_01CPQ1FcHGiBKWPd8waT7uGx
@github-actions

Copy link
Copy Markdown

Sidebar Configuration Reminder

This PR includes added, renamed, or removed documentation files:

  • docs/pages/incident-management/incident-response-template/runbooks/endpoint-compromise.mdx (added)

Please ensure that:

  • The sidebar in vocs.config.ts has been updated to include these files
  • New content has the dev: true parameter so it's marked as under development
  • Sidebar links match the file paths - use the preview deployment to verify

See Contributing guidelines - Sidebar / Navigation for more details.


This is an automated reminder. If this PR doesn't need sidebar changes, you can ignore this message.

@github-actions

github-actions Bot commented Sep 22, 2026

Copy link
Copy Markdown
built with Refined Cloudflare Pages Action

⚡ Cloudflare Pages Deployment

Name Status Preview Last Commit
frameworks ✅ Ready (View Log) Visit Preview 9996ce4

@scode2277

Copy link
Copy Markdown
Collaborator

Thanks for this contribution @s1ns3nz0!
The stewards of the incident management framework will take a first look at the content and leave suggestions if needed!

@hexnickk4997 and @n0guest 🙏🏻

@scode2277 scode2277 added the content:add This issue or PR adds content or suggests to label Sep 22, 2026

This branch was successfully deployed

1 active deployment
Preview 9996ce4b Deployed Sep 22, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

content:add This issue or PR adds content or suggests to

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants