Try it live: pick an attack at ghost-soc.streamlit.app and press ▶ Run live investigation to watch Nemotron investigate in real time.

Inspiration

I'm a cybersecurity student, and one fact kept bothering me: security teams receive thousands of alerts a day, and most never get investigated. Real attacks hide in that noise. I wanted to see whether an AI agent could do the first investigation the way a skilled analyst would, so humans spend their time only on decisions that matter.

What it does

GHOST (Generative Hunting & Operations Security Toolkit) turns raw security logs into investigated incidents.

  1. Detect: eight fast detection rules scan every event, from brute force and exfiltration to PsExec-style service creation, WMI remote execution, encoded PowerShell, and Mimikatz-style reads of LSASS memory.
  2. Investigate: for each alert, an NVIDIA Nemotron agent served through Nebius Token Factory decides which tools to use: searching logs, following Windows process chains, decoding hidden PowerShell, checking IP reputation, comparing behavior to what's normal for that user, and mapping findings to MITRE ATT&CK.
  3. Connect the dots: the agent sees earlier findings, so it links separate alerts into one attack chain.
  4. Recommend, don't act: GHOST suggests containment steps, but a human approves every action in the dashboard.
  5. Bring your own logs: upload a log file in the dashboard (GHOST format or raw Windows Security/Sysmon events) and watch Nemotron investigate it live.

I tested it on 4 real attacks recorded by the OTRF Security Datasets project (Empire PsExec, SMBExec, WMI and Mimikatz) plus a synthetic attack: 25,461 events in total.

Scenario Events Answer key GHOST found
Mimikatz LogonPasswords 6,015 T1003.001 1/1
Empire Invoke-PsExec 4,335 T1021 1/1
Empire Invoke-SMBExec 7,489 T1021.002 1/1
Empire Invoke-WMI 6,352 T1047 1/1
Synthetic 3-stage attack 1,270 4 techniques 4/4

The answer key for each real attack is the dataset's official label, not mine. Every technique GHOST reports is backed by evidence from that investigation, and it correctly dismissed a legitimate Microsoft Azure agent reading LSASS memory, which a simple rule would have flagged as credential theft.

How I built it

  • Data: a loader that downloads OTRF recordings and normalizes raw Windows Security and Sysmon events into one schema, keeping the background noise so detection scans the full haystack. Each scenario has an answer key the detectors and agent never see.
  • Detection: Python and pandas, written so the same code runs on an NVIDIA GPU through RAPIDS cudf.pandas with no changes. On 5 million events, an NVIDIA T4 runs all eight detectors 8.9x faster than the CPU (25.7 s to 2.9 s) and raises the identical 1,771 alerts. Each rule carries ATT&CK tags, like Sigma rules do.
  • Agent: Nemotron 3.5 Lightning via Nebius Token Factory's OpenAI-compatible API, with tool calling in a custom agent loop and structured JSON reports. The same code also runs against NVIDIA NIM: switching providers is a settings change. On Nebius, the full benchmark's agent time dropped from 1,312 s to 160 s with identical accuracy, about 11 seconds per alert.
  • Knowledge base: all 706 MITRE ATT&CK v20 techniques, built from MITRE's official STIX data and searched with BM25 ranking. Search results are reference, not evidence: a technique the logs don't support is shown as "possible" for an analyst, never counted.
  • Uploads: a parser that accepts GHOST-format events or raw Windows event logs and runs them through the same normalizer as the real scenarios. The raw OTRF PsExec and Mimikatz files produce exactly the same events and alerts as the built-in versions.
  • Dashboard: Streamlit, with a scenario picker, live step-by-step investigations, the reconstructed attack chain, and approve/reject buttons.
  • Benchmark: one command runs every scenario and scores detection and agent separately.

Challenges I ran into

The agent found the right answer but lost it. On the first real attack, Nemotron scored 0/1. One investigation reached the correct verdict but wrote invalid JSON; another ran out of steps while still reasoning in prose. I added self-correction: when a report can't be parsed, the agent sees its own error and fixes it once. The next run scored 1/1, confirmed 3 of 3 alerts, and finished in about 2 minutes instead of 16.

The agent made things up. Once it claimed "File Deletion" (T1070.004) with no supporting evidence. I added a grounding check: a technique only counts if it appeared in the alert's rule tags or in a tool result during that investigation.

Then the grounding check had a loophole of its own. Reviewing the live demo, I spotted "Exfiltration Over Alternative Protocol" (T1048) on an SMBExec alert, where no data left the network. When the MITRE lookup found no match, it listed every known technique as options, and the checker counted that menu as evidence. After closing the loophole, the next run caught 2 real hallucinations ("Hidden Files" and "Visual Basic"), but it also rejected 4 true PowerShell claims, because my tools never connected evidence to techniques. I made the lookup accept lists of technique IDs and had the PowerShell decoder state which techniques its findings prove. The final run scored 8/8 with every reported technique backed by evidence. Testing the tester mattered as much as testing the AI.

My detectors missed an attack. When I ran the PsExec-era rules on three new real attacks, they caught SMBExec unchanged, caught only side effects of the WMI attack, and missed the Mimikatz password theft entirely. I studied the raw events and wrote two new detectors.

Scaling to millions broke my detectors. To test the GPU, I copied the real logs into 5 million events. The first run never finished: two detectors re-scanned every log for each suspicious event, fine at 25,000 events and hopeless at millions. I rewrote them as single table-wide joins. The first GPU run was then only 1.5x faster, because two detectors used operations RAPIDS can't run on a GPU (a case-insensitive regex and a Python loop over groups), so the work quietly fell back to the CPU. After rewriting those, the GPU was 8.9x faster, and every rewrite produced identical alerts on all five real scenarios. One detector, lateral movement, is still faster on the CPU, because it walks each user's logins in time order.

Real data has legitimate look-alikes. The SMBExec recording contains Microsoft's Azure guest agent reading LSASS memory. Instead of hard-coding an exception, GHOST raises it as a medium alert and lets the agent decide. Nemotron traced the parent process (WaAppAgent.exe) and called it a false positive.

What I learned

  • Agents fail in specific, fixable ways. Tool design, feedback and guardrails mattered as much as the model.
  • Two layers beat one. Cheap detection plus expensive LLM investigation is far more practical than sending every log line to a model.
  • Measure honestly. Answer keys from someone else, a record of what failed, and false-positive checks turned "it seems to work" into numbers.
  • Check the checker. A guardrail with a loophole gives false confidence; mine let a wrong technique through until I looked at real output closely.
  • Keep humans in the loop. In security, AI should speed up decisions, not make them alone.

What's next

  • Move the last CPU-bound detector (lateral movement) onto the GPU
  • Read more log formats for uploads: Windows .evtx files, Linux and cloud audit logs
  • More OTRF recordings and live threat-intelligence APIs

Built With

  • cudf
  • github
  • google-colab
  • mitre-att&ck
  • nebius-token-factory
  • nvidia-nemotron
  • nvidia-nim
  • nvidia-rapids
  • openai-api
  • pandas
  • python
  • streamlit
  • sysmon
Share this project:

Updates

posted an update —

How GHOST evolved

GHOST started as a question: can an AI agent do the first investigation of a security alert the way a skilled analyst would? Here is how it got from idea to what you can try today.

1. A working pipeline on a practice attack. I built the two-layer design first: fast detection rules scan every log event and raise a few alerts, then an NVIDIA Nemotron agent investigates each alert with tools (log search, IP checks, user context, MITRE ATT&CK mapping). On a synthetic attack, the first version found only 2 of 4 attack techniques. Rewriting the instructions and feeding the detection rules in as hints took it to 4 of 4.

2. Real attacks, and the first real failures (October 3). I moved to real recordings from the OTRF Security Datasets project, scored against their official labels. The first real attack scored 0/1: the agent reached the right verdict but wrote an unreadable report, so I added self-correction. My detectors also missed Mimikatz entirely, so I wrote LSASS and WMI detectors. The agent sometimes claimed techniques with no evidence, so I added a grounding check that rejects them. Result: 8/8 across 4 real attacks and a practice attack, but 1,312 seconds of agent time on NVIDIA's free endpoint.

3. Nebius, and checking the checker (October 5). Switching to Nebius Token Factory was a settings change and cut agent time to 147 seconds. Then I found a loophole in my own grounding check that let an unsupported technique through. Closing it overcorrected and rejected true claims, so I made the tools state exactly which techniques their evidence proves. Final: 8/8, zero unsupported claims, 178 seconds. Around the same time the dashboard went live on Streamlit, and I recorded the demo video.

4. Proving the GPU claim (October 11). To test NVIDIA RAPIDS, I scaled the logs to 5 million events. The first run never finished: two detectors re-scanned every log for each suspicious event. After rewriting them as table-wide joins, the GPU was only 1.5x faster, because some operations silently fell back to the CPU. After fixing those, an NVIDIA T4 ran all 8 detectors 8.9x faster than the CPU, with identical alerts.

5. Submitted, then made testable by anyone (October 12-13). After submitting, I focused on letting judges see GHOST work, not just read about it:

  • Live Nemotron runs on the public site, with per-visitor and daily limits to protect the API budget.
  • Upload your own logs: GHOST-format or raw Windows event logs, run through the same pipeline.
  • Full MITRE ATT&CK knowledge base: all 706 techniques are searchable, but search results stay suggestions, never evidence.
  • A redesigned console with a live attack map that replays the machines and connections in the logs.

The latest benchmark with all of this enabled: still 8/8, zero unsupported claims, 160 seconds, about 11 seconds per alert.

The biggest lesson: guardrails need testing as much as the AI does. A "0 rejected" score once hid a loophole, and finding it made the final results trustworthy.

Try it live: ghost-soc.streamlit.app

Log in or sign up for Devpost to join the conversation.

Submission history