Service installed under a well-known Windows service display name
AN0324 asks for service creation "with names or descriptions mimicking legitimate entries." MITRE's own knob for this, TaskNameSimilarityThreshold, calls for a fuzzy comparison — its description names Levenshtein distance — that lib/sigma has no function for; nothing in this pipeline can compute a string-edit distance inside a Sigma condition. This rule substitutes a narrower, exact-match proxy that is entirely its own, not MITRE's: rather than a near-miss of a legitimate name, it looks for an exact reuse of one, paired with an image path outside where that name is ever legitimately installed. EventID 7045 on the System channel is written by the Service Control Manager on every install with no audit policy to enable, and its `ServiceName` field is populated from the display name passed to CreateService, not the internal service key — which is precisely what makes this observable real: a duplicate of an internal key name would be rejected at creation and 7045 would never fire, but nothing stops an installer from reusing a display name that is already in use elsewhere on the system, since display names carry no uniqueness constraint. The twelve names in `selection_known_name` are core, universally-present Windows service display names populated by this pipeline, not sourced from MITRE, chosen because a genuine instance of any of them only ever installs from `\Windows\System32\` or `\Windows\SysWOW64\`; `filter_expected_path` excludes exactly those two locations so the rule fires only when the name and the path disagree. Two of MITRE's other knobs go unreached here: BinaryReputationScore needs an external reputation source no local field carries, and ExecutionContext asks for the account context of a later, anomalous execution of the installed binary — a second, correlated event this single service-creation record does not join to. The Linux leg (AN0325) is not attempted. Its one usable logsource, {product: linux, service: auditd}, reduces — once the fuzzy-name comparison is set aside for the same reason as above — to "a file was written under a systemd unit-file search path," which is exactly what the published T1543.002 rule already covers on that same logsource; re-authoring the identical PATH selector under this technique ID would double-count one signal rather than add coverage, and PATH records carry only a bare filename with no way to tell `networks.service` (a masquerade) from `network.service` (the real unit) beyond a string comparison a reviewer has to make by hand regardless of which technique tagged the alert. AN0325's other two sources, {product: linux, service: osquery} and {product: linux, service: cron}, have no established Sigma field vocabulary anywhere in this corpus. The macOS leg (AN0326) is not attempted either: both its logsources, {product: macos, service: unifiedlog} and {product: macos, service: endpointsecurity}, are unstandardised in this pipeline — the same blocker already recorded against these exact sources for T1037.002, T1059.002, T1548.004 and T1546.006. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0117, not hand-written and not tested by its author. Any lab result is on this rule's own page.Full descriptionShow less
The detection
The 4 SIEM queries below are previews produced by Siemphony’s own translator, not pySigma, and none has been executed against a real backend — review before you deploy.
detection.yml
Sentinel · KQL
Run this as a search.
Event| where (((Source =~ "Service Control Manager" and EventID == 7045) and (ServiceName =~ "Windows Update" or ServiceName =~ "Windows Defender Antivirus Service" or ServiceName =~ "Print Spooler" or ServiceName =~ "Background Intelligent Transfer Service" or ServiceName =~ "DHCP Client" or ServiceName =~ "DNS Client" or ServiceName =~ "Windows Event Log" or ServiceName =~ "Remote Procedure Call (RPC)" or ServiceName =~ "Task Scheduler" or ServiceName =~ "Windows Management Instrumentation" or ServiceName =~ "Server" or ServiceName =~ "Workstation")) and not ((ImagePath contains "\\Windows\\System32\\" or ImagePath contains "\\Windows\\SysWOW64\\")))
Splunk · SPL
Run this as a search.
index=* (((Provider_Name="Service Control Manager" AND EventID="7045") AND (ServiceName="Windows Update" OR ServiceName="Windows Defender Antivirus Service" OR ServiceName="Print Spooler" OR ServiceName="Background Intelligent Transfer Service" OR ServiceName="DHCP Client" OR ServiceName="DNS Client" OR ServiceName="Windows Event Log" OR ServiceName="Remote Procedure Call (RPC)" OR ServiceName="Task Scheduler" OR ServiceName="Windows Management Instrumentation" OR ServiceName="Server" OR ServiceName="Workstation")) AND NOT ((ImagePath="*\\Windows\\System32\\*" OR ImagePath="*\\Windows\\SysWOW64\\*")))Elastic · ES|QL
Run this as a search.
FROM logs-*| WHERE (((TO_LOWER(winlog.provider_name) == "service control manager" AND event.code == 7045) AND (TO_LOWER(service.name) == "windows update" OR TO_LOWER(service.name) == "windows defender antivirus service" OR TO_LOWER(service.name) == "print spooler" OR TO_LOWER(service.name) == "background intelligent transfer service" OR TO_LOWER(service.name) == "dhcp client" OR TO_LOWER(service.name) == "dns client" OR TO_LOWER(service.name) == "windows event log" OR TO_LOWER(service.name) == "remote procedure call (rpc)" OR TO_LOWER(service.name) == "task scheduler" OR TO_LOWER(service.name) == "windows management instrumentation" OR TO_LOWER(service.name) == "server" OR TO_LOWER(service.name) == "workstation")) AND NOT ((TO_LOWER(ImagePath) LIKE "*\\\\windows\\\\system32\\\\*" OR TO_LOWER(ImagePath) LIKE "*\\\\windows\\\\syswow64\\\\*")))
Wazuh · XML rule
Deploy to your manager — this is a rule, not a search.
<group name="sigma,windows,"> <!-- Rule ids must be unique on your manager; 100000+ is the user range. --> <rule id="100000" level="7"> <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. --> <field name="Provider_Name" type="pcre2">(?i)^Service Control Manager$</field> <field name="EventID" type="pcre2">(?i)^7045$</field> <field name="ServiceName" type="pcre2">(?i)(^Windows Update$|^Windows Defender Antivirus Service$|^Print Spooler$|^Background Intelligent Transfer Service$|^DHCP Client$|^DNS Client$|^Windows Event Log$|^Remote Procedure Call \(RPC\)$|^Task Scheduler$|^Windows Management Instrumentation$|^Server$|^Workstation$)</field> <field name="ImagePath" negate="yes" type="pcre2">(?i)(\\Windows\\System32\\|\\Windows\\SysWOW64\\)</field> <description>Service installed under a well-known Windows service display name</description> <mitre> <id>T1036.004</id> </mitre> </rule></group>
Verdicts · reactions · comments
Community
Verdicts from engineers who actually deployed it, and the conversation around it.
Nobody has run this in a real environment and said what happened.
Verdicts from engineers who deployed it
0 castNo verdicts reported yet. The first one is worth more than the tenth — say what you ran it against.
Log in to report a verdict.
Log in to join the discussion.
No comments yet. Someone who deploys this will have something to say about it.