Portfolio reference implementation · synthetic fixtures · no production telemetry

Detection Engineering Lab

Five Sigma detections compiled to Elastic and, where supported, CrowdStrike LogScale. The explorer makes the test evidence and missing host-validation evidence equally visible.

1 · Read one ruleDET-001 PowerShell explains the signal and its blind spot.
2 · Inspect the proofThe SIEM test asserts exact synthetic positives and zero negative controls.
3 · Check the boundaryThe isolated-VM plan remains intentionally unexecuted.

Showing 5 of 5 detections

DET-001fixture-validated
high severity

PowerShell Launched With an Encoded Command or a Hidden Window Plus a Download Cradle

T1059.001 · PowerShell · windows / process_creation

Detects powershell.exe or pwsh.exe process creation where the command line either carries an encoded command (-enc / -EncodedCommand / -ec) or combines a hidden window with a download cradle (Net.WebClient, DownloadString, Invoke-WebRequest, IEX). Both shapes are how Atomic Red Team T1059.001 launches payloads and how commodity loaders stage second stages. Plain interactive or scripted PowerShell without those flags is deliberately out of scope. ATT&CK Enterprise v19.2 and the Atomic test catalog were accessed 2026-08-29.

What is proven: the Elastic query returned 4 synthetic positive fixtures and none of this rule's 3 negative controls in the live-Elasticsearch CI test.
What is not proven: no retained Windows/Sysmon host telemetry exists; VM validation remains pending.
Inspect implementation and limits

Source and compiled targets

Fixtures and validation

Representative blind spot

Case sensitivity is a deployment property, not a rule property. Sigma contains is case-insensitive; the compiled Lucene query is only case-insensitive if the index field is lowercase-normalised.

Read the complete detection write-up

DET-002fixture-validated
critical severity

LSASS Memory Dump via comsvcs MiniDump or ProcDump

T1003.001 · LSASS Memory · windows / process_creation

Detects two documented ways of writing lsass.exe memory to disk without a custom tool: rundll32 invoking the MiniDump export of comsvcs.dll, and Sysinternals ProcDump targeting lsass with a full (-ma) or mini (-mm) dump. These are Atomic Red Team T1003.001 tests 1, 2 and 9. Direct system-call dumpers (Dumpert, NanoDump) do not create these command lines and need the Sysmon process-access (EventID 10) variant recorded in future-work. ATT&CK Enterprise v19.2 and the Atomic test catalog were accessed 2026-08-29.

What is proven: the Elastic query returned 3 synthetic positive fixtures and none of this rule's 3 negative controls in the live-Elasticsearch CI test.
What is not proven: no retained Windows/Sysmon host telemetry exists; VM validation remains pending.
Inspect implementation and limits

Source and compiled targets

Fixtures and validation

Representative blind spot

Direct-syscall and API-unhooking dumpers (Atomic tests 3, 4, 14), Task Manager (test 5), and Mimikatz operating in memory (test 6, 10) create no matching command line.

Read the complete detection write-up

DET-003fixture-validated
medium severity

Scheduled Task Created to Run as SYSTEM or From a User-Writable Path or Script Host

T1053.005 · Scheduled Task · windows / process_creation

Detects schtasks.exe creating a task that either runs as SYSTEM or whose action points at a user-writable location (AppData, Temp, Users\Public) or a script host / shell (powershell, cmd /c, mshta, wscript, cscript, rundll32, regsvr32). This is the shape of Atomic Red Team T1053.005 tests 1 and 2. Tasks created through the Task Scheduler COM API or PowerShell cmdlets (tests 4, 6) do not spawn schtasks.exe and need Security 4698 telemetry instead. ATT&CK Enterprise v19.2 and the Atomic test catalog were accessed 2026-08-29.

What is proven: the Elastic query returned 3 synthetic positive fixtures and none of this rule's 3 negative controls in the live-Elasticsearch CI test.
What is not proven: no retained Windows/Sysmon host telemetry exists; VM validation remains pending.
Inspect implementation and limits

Source and compiled targets

Fixtures and validation

Representative blind spot

Capitalisation: positive 3 (/Create) hits on the lab mapping only; on the stock Elastic mapping the compiled query is case-sensitive (see DET-001, Blind spots).

Read the complete detection write-up

DET-004fixture-validated
medium severity

Run Key Persistence Pointing at a User-Writable Path or Script Host

T1547.001 · Registry Run Keys / Startup Folder · windows / registry_set

Detects a registry value written under a Run, RunOnce or Policies\Explorer\Run key whose data points at a user-writable location (AppData, Temp, Users\Public) or launches a script host or shell. Atomic Red Team T1547.001 tests 1, 3, 9, 12 and 13 write such values. Values that point at Program Files binaries are excluded because that is how legitimate software registers tray agents; the trade-off is documented in the writeup. Startup-folder variants (tests 4-7) are file writes, not registry sets, and are out of scope for this rule. ATT&CK Enterprise v19.2 and the Atomic test catalog were accessed 2026-08-29.

What is proven: the Elastic query returned 3 synthetic positive fixtures and none of this rule's 3 negative controls in the live-Elasticsearch CI test.
What is not proven: no retained Windows/Sysmon host telemetry exists; VM validation remains pending.
Inspect implementation and limits

Source and compiled targets

  • Sigma: source rule
  • Elastic: json, lucene, ndjson (executed with synthetic fixtures)
  • LogScale: recorded gap — NoLogsourceMapping: crowdstrike_falcon_pipeline has no event mapping for logsource category=registry_set/product=windows; field names passed through untranslated

Fixtures and validation

Representative blind spot

Startup-folder persistence (Atomic tests 4–7), Winlogon Userinit/Shell (14–15), and BootExecute (17) are different keys or file writes and are out of scope here.

Read the complete detection write-up

DET-005fixture-validated
medium severity

RDP Logon From a Source Outside the Documented Jump Hosts

T1021.001 · Remote Desktop Protocol · windows / security

Detects a successful RemoteInteractive logon (Security 4624, LogonType 10) whose source address is not one of the documented RDP jump hosts. In the lab the jump hosts are 10.10.20.5 and 10.10.20.6; the list is the tuning surface and must match the environment. Atomic Red Team T1021.001 test 1 produces this event on the target when it opens mstsc from a workstation. Restricted Admin and NLA pre-authentication produce additional LogonType 3 events that this rule deliberately ignores. Local logons carry IpAddress "-" in the raw event; Winlogbeat drops that value before it reaches source.ip, so no "-" filter is needed at the ECS layer and one would break the ip-typed field. ATT&CK Enterprise v19.2 and the Atomic test catalog were accessed 2026-08-29.

What is proven: the Elastic query returned 2 synthetic positive fixtures and none of this rule's 3 negative controls in the live-Elasticsearch CI test.
What is not proven: no retained Windows/Sysmon host telemetry exists; VM validation remains pending.
Inspect implementation and limits

Source and compiled targets

  • Sigma: source rule
  • Elastic: json, lucene, ndjson (executed with synthetic fixtures)
  • LogScale: recorded gap — NoLogsourceMapping: crowdstrike_falcon_pipeline has no event mapping for logsource product=windows/service=security; field names passed through untranslated

Fixtures and validation

Representative blind spot

Restricted Admin mode and some RDP wrappers produce different logon types; the rule only sees type 10.

Read the complete detection write-up

Questions a screen actually asks

Written for a recruiter or hiring manager with a few minutes, ahead of the engineer with an hour. Every answer links to the evidence it rests on, and every figure is derived from the catalog, compile manifest, and validation matrix when this page is generated.

What is this, in one sentence?

5 behaviour-based detection rules for common Windows attacker techniques, written in Sigma, compiled to Elastic and CrowdStrike LogScale, and replayed against synthetic events on a real Elasticsearch in CI, with the line between “the query works” and “the telemetry was really generated” enforced by the build rather than described in a document.

Is this a real SOC deployment? Does it catch real attacks?

No. It is a portfolio lab. Every event the rules have ever matched is a synthetic fixture, no production telemetry has been ingested, and no false-positive rate is claimed. 5 of 5 rules are at the lifecycle state fixture-validated; 0 are validated, and the page says so on every card.

What role is this evidence for?

Detection engineering and SOC analyst or threat-hunting work: authoring Sigma rules with documented blind spots, mapping to MITRE ATT&CK, compiling one rule to two query languages, testing detections in CI with positive and negative controls, and keeping an evidence trail a reviewer can audit. It is not evidence of incident response on production telemetry, and does not claim to be.

What exactly has been proven, and what has not?

Proven: 5 of 5 rules compile to Elastic and 3 of 5 to LogScale; each compiled Elastic query returned exactly its own positives (15 in total) and none of the 15 negative controls on elasticsearch 8.19.20 in CI. Not proven: that any rule fires on Sysmon or Security events generated by a real Windows host. The isolated-VM plan that would prove it is written, per detection, and deliberately unexecuted; until it runs, the promotion gate must fail, and CI asserts that it fails.

Why is LogScale only 3 of 5?

Because the pySigma Falcon pipeline has no mapping for registry-set events or for Security event 4624, and it does not raise when it meets one: it passes the Windows field names through untouched. The compiler treats a query without the Falcon event marker as unsupported and records why, rather than committing a query that could never match. That quiet failure was found here and is the first entry in the validation log.

Is anything actually executed? Is the data real?

No payload runs anywhere. The fixtures are text, hand-authored to the shape of named Atomic Red Team tests (the GUIDs and access dates are recorded beside each fixture), and nothing from a third party is ingested. The public site links those fixtures, which contain command-line shapes such as a comsvcs MiniDump call; they are detection test data that already appears in the public Atomic catalog, not tooling. The site content policy states the boundary: no payload binaries, no execution path, no secrets, no raw host telemetry.

Was it built with AI?

Yes, as a collaboration between the author and Claude Code rather than a hand-off to either. The author set the problem, the lifecycle boundary, the stop conditions, and the rule that every gate is watched failing once before it counts; Claude Code did much of the implementation and testing under those rules. ROADMAP.md records the division of labour, including the unattended passes and two independent tool-assisted reviews whose confirmed findings are tracked there by ID.

Are the numbers on this page hand-typed?

No. This page, the status image in the README, and the compiled queries are all generated from the catalog, the compile manifest, the rules, and the validation matrix, and CI fails if a committed copy differs from a fresh render. The figures in this FAQ are derived from the same sources when the page is built, and a test pins them. The rules are checked against MITRE ATT&CK v19.2 and compiled with pySigma 1.5.0, pinned exactly because a backend upgrade can change the emitted query. One honest caveat: GitHub Pages publishes from the branch on its own, so CI detects drift rather than gating publication.

Has anyone outside the author reviewed it?

Two independent tool-assisted reviews on 4 September 2026, both recommending the repository for junior detection-engineering screens. Every substantive finding was verified in code and is tracked in ROADMAP.md by ID: the wording and truth items are closed; the mechanical promotion gate and the isolated-VM run remain, and both are gated on the owner because they change the lifecycle rather than the presentation.

What would a detection engineer probe first?

Case sensitivity. Sigma “contains” is case-insensitive, but the compiled Lucene query is only case-insensitive if the index field is lowercase-normalised, and the stock Elastic Windows integration maps the command line as a case-sensitive wildcard field. One test proves both outcomes on the same fixture. The second probe is the Falcon pipeline’s quiet failure above. Both are in the README under findings worth knowing before deploying these queries.

How long did it take?

The commit history is the record: built and published on 28 and 29 August 2026, the explorer on 2 September, external review and finalization on 4 September, and the wording pass with this FAQ on 12 September. Speed is not the point. The discipline is that every gate was watched failing once, and the mutation that made it fail is written down in the validation log.

Is it finished, and is it maintained?

The fixture-validated release is finished and tagged. What remains is the only work that would change the lifecycle: a stronger mechanical promotion gate and the isolated-VM run, both owner-gated and described in ROADMAP.md with their stop conditions. Nothing is promoted to validated as polish, and the inverted CI step stays until the last rule earns it. The backlog is in future-work.md.

Can I run it, and is anything hosted?

The unit and contract suite runs from a clean clone with no SIEM. The query replay needs Docker: a localhost-bound Elasticsearch from the compose lab, then one pytest marker. Nothing is hosted beyond this static page, deliberately: Elasticsearch, Kibana, and any laboratory host stay off the internet.

Where should an engineer spend ten minutes?

The DET-001 rule for the logic and its false positives, its write-up for how a SOC would document it, test_siem.py for the two tests that carry every claim, and the validation log for what broke when each gate was tested.