Attack to detection

The scheduled-task alert that only knows one word for it

technique T1053.005lab capture 2026-09-12ran as NT AUTHORITY\SYSTEM

What we ran, and what the rules saw

2 routes to the same outcome1 rule read as text0 matched

Not alert results. Rule text read against captured telemetry. No connector in that lab: nothing alerted, and nothing could.

Routeran as NT AUTHORITY\SYSTEMRule text · SigmaHQproc_creation_win_schtasks_creationImage ends \schtasks.exe and CommandLine contains ' /create 'then drops any User containing AUTHORI / AUTORI (the system account)the log that records the actSecurity 4698a scheduled task was createdthe log that records the actTaskScheduler 106task registered
01schtasks.exe /createcommand line"C:\WINDOWS\system32\schtasks.exe" /create /tn CyRaySOCTest-A /tr "cmd /c exit" /sc once /st 23:59 /ffiltered outImage and ' /create ' both matched; the rule drops it because the creator was NT AUTHORITY\SYSTEMrecordedrecorded
02Register-ScheduledTaskTask Scheduler API from PowerShellRegister-ScheduledTaskno eventno schtasks.exe process ran, so the process log holds nothing for this rule to readrecordedrecorded
filtered outthe selection matched; the rule’s own exclusion filter dropped itno eventnothing was recorded for the rule to readrecordedthe operating system logged the act itself, whichever tool did it

lab capture 2026-09-12 17:24 UTC · a CyRay lab workstation · Sysmon process creation, Security process auditing, Task Scheduler operational log · imported unchanged, sha256 99fe02ddd6b4

The lesson

The lesson is not that the rule is bad. It is that a detection anchored to one tool's name inherits that tool's blind spots. Persistence is an outcome. Assert the outcome — a task was registered, read from 4698 — not the name of whichever program registered it this time.

Worth doing Monday

Worth trying on Monday: run Register-ScheduledTask on a lab box and see whether anything in your console notices.

How it happened

A common persistence detection watches for one thing: schtasks.exe creating a task. It is a sound rule for the case it names. The trouble is that "schedule a task" has more than one spelling, and the rule knows one of them.

So we ran the same persistence two ways, on a machine we own, and watched what each produced.

First the textbook way: schtasks.exe with its /create flag. The process log shows schtasks.exe, /create on the command line, exactly what the rule expects. Anyone watching for it sees it.

Then Register-ScheduledTask from PowerShell, which drives the Task Scheduler's COM interface directly. Same outcome — a task registered to run the attacker's code later. But schtasks.exe never runs, so there is no process event for it to produce. Our process log held the first attack's schtasks.exe event and nothing at all from the second. Same persistence, nothing to match.

The task landed both times. Security 4698 fired twice, and TaskScheduler/Operational 106 fired twice. The ground truth was sitting there the whole run. The detection missed the second one not because the evidence was absent, but because it was watching the name of a tool instead of the act of scheduling.

There is a sharper version of the same blind spot. The rule excludes tasks created by NT AUTHORITY\SYSTEM, so it stays quiet during ordinary background activity. That account is exactly what an intruder is running as once they have escalated — so the textbook attack, run after escalation, is waved through by design.

The lesson is not that the rule is bad. It is that a detection anchored to one tool's name inherits that tool's blind spots. Persistence is an outcome. Assert the outcome — a task was registered, read from 4698 — not the name of whichever program registered it this time.

Worth trying on Monday: run Register-ScheduledTask on a lab box and see whether anything in your console notices.

Run this against your SOC

The same move, T1053.005, as a safe test you can run on a machine you own - then look at your alerts.