Logs are untrusted input
Sent to the model inside delimiters, with instructions that they are data to analyse — never commands. That is the prompt-injection defence.
Case study · Oct 2026
I wanted to prove two things: that I can do real SOC work end to end, and that I can use AI inside a security workflow without letting it make the decisions. So I built the whole loop — attack, collect, detect, triage, write up — and published it.
01 · The lab
Windows 11 ARM · victim
Ubuntu 22.04 · SIEM
Vercel · Postgres
Host-only network: the victim is never exposed. Real hostnames, users and IPs are replaced with placeholders before anything leaves the lab.
02 · Findings
The most serious miss — LSASS credential dumping, the technique behind Mimikatz — wasn’t a rule problem first. Sysmon wasn’t collecting the access at all. I enabled ProcessAccess logging, then wrote the rule.
| Technique | What it is | Default Wazuh | My rule | What I found |
|---|---|---|---|---|
T1033 | System owner / user discoveryDiscovery | Missed | 100020 | whoami left no trace in the alert queue at all |
T1059.001 | Encoded PowerShellExecution | Caught | not needed | flagged by script-block logging, but only at level 4 |
T1547.001 | Registry Run keyPersistence | Missed | 100030 | Sysmon logged it; no default rule raised it |
T1053.005 | Scheduled taskPersistence | Partial | 100050 | caught the dropped script, not the task itself |
T1136.001 | Create local accountPersistence | Caught | not needed | caught cleanly by the defaults |
T1003.001 | LSASS memory dumpCredential access | Missed | 100010 | the headline gap — a telemetry gap, not just a rule gap |
T1070.004 | File deletionDefense evasion | Caught | not needed | caught, at a low level worth raising |
T1560.001 | Archive for exfil (makecab)Collection | Missed | 100040 | a living-off-the-land tool nothing flagged |
03 · Detections
Each rule is mapped to ATT&CK and has a severity that reflects how often the behaviour is legitimate.
| Rule | Level | ATT&CK | Detects | Notes |
|---|---|---|---|---|
100010 | 12 | T1003.001 | Credential dumping — a process opened LSASS memory | Validated. Needed Sysmon ProcessAccess turned on first; now flags normal svchost.exe access too, which I document as a known false positive. |
100030 | 10 | T1547.001 | Persistence — registry Run key value set | Promotes Sysmon event 13 on Run keys to an alert. |
100050 | 8 | T1053.005 | Persistence — scheduled task created from the command line | Names the technique the defaults only caught indirectly. |
100040 | 8 | T1560.001 | Collection — archiving tool launched | Watches living-off-the-land archivers such as makecab.exe. |
100020 | 6 | T1033 · T1082 · T1016 | Discovery — recon binary executed | Low level on purpose: recon is common, so it adds context rather than noise. |

04 · The console
Built for triage speed: keyboard triage (j/k/enter/t/f/e), filters in the URL, near-duplicate grouping, process trees, raw events and analyst notes.
05 · Using AI safely
Sent to the model inside delimiters, with instructions that they are data to analyse — never commands. That is the prompt-injection defence.
Every response must match a strict zod schema or it is rejected. Model output never triggers an action by itself.
Natural-language questions are turned into a constrained filter object, never raw SQL.
The API key is server-side only; results are cached and calls go through a database-backed daily rate limit, so a public demo can’t run up a bill.
06 · Write-ups
Summary, timeline, evidence, verdict, response and lessons — the format a SOC lead actually reads.
07 · Lessons
01
You can’t alert on what you don’t collect — check the endpoint, not just the SIEM.
02
False positives are where tuning starts. I document them.
03
Validated, never executed. I make the final call.
Walkthrough
I’ll share my screen, run an alert end to end and explain every decision.