CYART // SCHEMA · ALERT-CORRELATION6 NODES · 6 LINKSACTOR · Alerts — 10k/day, many dupesACTOR01Alerts10k/day, many dupesSERVICE · Fingerprint — rule + entity + windowSERVICE02Fingerprintrule + entity + windowSERVICE · Dedupe — same key → count++SERVICE03Dedupesame key → count++SERVICE · Group — same host / userSERVICE04Groupsame host / userSERVICE · Score — severity × asset × recencySERVICE05Scoreseverity × asset × recencyDATA · Case — one per incidentDATA06Caseone per incident

The triage loop

A repeatable loop for every alert: validate, scope, contain, collect, decide. How to validate on raw events, pick the smallest containment, write a case note others can act on, and avoid the two classic failures: closing too early and chasing everything.

● Must know for interviewsFREELesson·25 min read·Beginner → Intermediate
triageincident responseprocess

01Five steps, every time

✓What you will learn
  • Run the validate, scope, contain, collect, decide loop
  • Validate on raw events, not the alert summary
  • Choose the smallest reversible containment for each entity
  • Separate true positive from benign true positive and write a case note that survives handover
  1. Validate: is the alert describing a real event? Open the raw events, not the alert summary. Rule bugs and parser drift produce confident nonsense.
  2. Scope: one user or many? One host or a fleet? Pivot on IP, hash, session, and time window. Write down what you checked.
  3. Contain (if real and spreading): the smallest reversible action that stops the bleeding. Revoke a session, isolate a host, disable a key. Not wipe, not delete.
  4. Collect: export evidence to the case before it rotates: logs, process trees, the file, a memory snapshot if the host matters.
  5. Decide: true positive → incident or ticket; benign true positive (the behaviour happened, an admin did it) → document and tune; false positive → fix the rule.
FigWhere alerts come from
CYART // SCHEMA · ALERT-CORRELATION6 NODES · 6 LINKSACTOR · Alerts — 10k/day, many dupesACTOR01Alerts10k/day, many dupesSERVICE · Fingerprint — rule + entity + windowSERVICE02Fingerprintrule + entity + windowSERVICE · Dedupe — same key → count++SERVICE03Dedupesame key → count++SERVICE · Group — same host / userSERVICE04Groupsame host / userSERVICE · Score — severity × asset × recencySERVICE05Scoreseverity × asset × recencyDATA · Case — one per incidentDATA06Caseone per incident
  • ACTOR
  • SERVICE
  • DATA
  • Live flow
//Detections fire on normalised events, correlation groups related alerts into one case by shared entities (user, host, IP), and the analyst works the case, not 40 separate alerts.
!The two classic failures

Closing too early: a single explainable line is not a disproof of the sequence. Chasing everything: define scope boundaries (this user, this day, these three systems) before pivoting, and park anything outside them as a new lead.

02Validate on raw events

An alert is a claim made by a rule. The rule may be right, may be fed broken data, or may be matching something it was never meant to. Open the underlying events and check that they say what the alert says.

Alert vs raw eventtext
ALERT  Suspicious PowerShell download cradle   host=FIN-LT-042  user=CYART\m.okafor  sev=high

raw 4688  2026-11-13T09:41:12Z  FIN-LT-042
  NewProcessName:     C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  ParentProcessName:  C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE
  CommandLine:        powershell -nop -w hidden -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBi...

Here the raw event is worse than the alert. Excel spawning hidden, encoded PowerShell is a macro dropper pattern. Decode the base64 (it is UTF-16LE) before you decide; IEX (New-Object Net.WebClient)... confirms a download cradle.

CheckWhy
Do the raw events exist for that host and time?Rules on stale or replayed data fire on ghosts
Does the parsed field match the raw text?Parser drift puts the user name in the host field and the rule fires on nonsense
Is the parent process what you expect?Same command, different parent: an admin's terminal versus Excel is the whole verdict
Has this exact alert fired before on this entity?History tells you whether it is a known benign pattern or new
Test yourself

An alert claims a login from North Korea. The raw event shows the IP is in your own VPN egress range. Most likely explanation?

03Scope, then contain the smallest thing

Scope by pivoting on entities: users, hosts, IPs, hashes, domains, sessions. For each pivot write what you searched, the window, and the result, including "none". That list is what lets someone else pick the case up.

EntitySmallest reversible containmentHeavier option
User / sessionRevoke sessions and refresh tokens, force re-authDisable account, reset password, remove MFA methods
HostEDR network isolation (keeps agent link)Power off (loses memory evidence)
Cloud keyDeactivate the access keyDelete key, rotate all secrets it could read
Domain / IPBlock at proxy and DNSBlock at perimeter firewall for all protocols
MailSoft-delete the message from mailboxesBlock sender domain at gateway
▭On the whiteboard · Contain or watch?3 points
01
contain now
active spread, data leaving, privileged account, ransomware precursors
02
watch briefly
single host, no egress, need to learn the C2 or scope before tipping them off
03
always
collect evidence before the containment action changes state
!Do not tip them off by accident

Resetting one password while the attacker holds three other accounts tells them they are seen. When scope is unclear and the attacker is active, coordinate containment across all known footholds at once.

04Decide, document, hand over

OutcomeMeaningAction
True positiveMalicious and realIncident; follow the runbook
Benign true positiveDetection fired correctly on authorised activityClose with reference; add an allow-list keyed to the approval, not a rule disable
False positiveRule logic or data is wrongFix the rule; add the sample to its negative tests
A case note someone else can act ontext
CASE 4412  FIN-LT-042 macro dropper          status: escalated to IR  sev: high
What:     EXCEL.EXE -> powershell -enc (download cradle to hxxp://cdn-update[.]top/a.ps1)
Validated: raw 4688 + EDR process tree; decoded payload attached
Scope:    hash seen on 1 host; domain resolved by 3 hosts (FIN-LT-042, FIN-LT-017, HR-LT-003)
          mail: 14 recipients of invoice_Nov.xlsm, 2 opened (searched 7d, all mailboxes)
Contain:  FIN-LT-042 isolated 09:58Z; domain blocked at proxy + DNS 10:02Z
Evidence: memory image FIN-LT-042, proxy logs 08:00-11:00Z exported to case
Next:     check FIN-LT-017 and HR-LT-003 process trees; purge mail; reset m.okafor
“How to say it in the room

"I validate on raw events, scope by pivoting on the entities, contain with the smallest reversible action, collect before anything changes, and classify as true, benign-true or false positive, because each of those has a different fix."

Q1When do you escalate from alert to incident?+

When it is a true positive with impact beyond one contained entity: multiple hosts or users, privileged credentials, data access, or anything with legal or customer notification implications. Escalating early is cheap; late is expensive.

Q2How do you stop the same benign alert every week?+

Tune with a narrow, documented exception tied to the approval (this account, this host, this change ticket), with an expiry. Never disable the rule outright.

Q3What makes a good case note?+

Facts with times in UTC, what was searched and found (including nothing), actions taken and when, and the explicit next steps. Opinions labelled as hypotheses.

Test yourself

An alert says a developer ran `curl | bash` on a build host. The developer confirms they did it to install a tool. Classification?

Finished this one?
Tick it and it shows as done on the roadmap and the course.