Systemctl invoked with a state-changing service subcommand
Matches the execution leg of AN0200 on raw auditd: an EXECVE record whose argv[0] is `systemctl` and whose first argument is one of the subcommands that actually make a unit run or persist, rather than one of the many that only report state. MITRE's `SuspiciousSubcommands` knob names start, enable and daemon-reload; the list here is those three plus restart, reenable and link, added by the author because `systemctl link /tmp/evil.service` is the direct expression of the analytic's "services loaded from unusual locations". The logic stays inside one record on purpose. Raw auditd splits an execution across records — `exe`, `uid` and `auid` are on SYSCALL, the arguments on EXECVE — so a selection that gates the binary on `exe` and the subcommand on `a1` can never be true in a single event; matching argv[0] instead keeps both halves on the EXECVE record, and it is anchored with `endswith` because a shell passes the word as typed while a script usually passes `/usr/bin/systemctl`. Two gaps follow from auditd's positional arguments and should be assumed present rather than discovered later: an option placed before the subcommand, as in `systemctl --now enable x`, moves it to `a2` and this rule misses it, and Sigma has no way to say "any argument". The path-carrying form is not gated on either, because the unit path may land in `a2`, `a3` or later depending on options. The analytic's other legs are deliberately not used here: unit-file writes under /etc/systemd/system and /tmp are the mechanism ATT&CK models as T1543.002, and writing them under this technique would file another technique's observable behind the T1569.003 tag; the CONFIG_CHANGE leg records auditd's own ruleset changes, not systemd's. MITRE's `CorrelationWindow` knob, which joins a unit file write to the later systemctl call, needs a timeframe lib/sigma does not model. Prerequisite: auditd records no execve at all by default, so this rule returns zero rows until a rule such as `-a always,exit -F arch=b64 -S execve -k exec` is loaded, and zero rows reads as quiet when it actually means blind. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0073, 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 3 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
Splunk · SPL
Run this as a search.
index=* ((type="EXECVE" AND a0="*systemctl") AND (a1="start" OR a1="restart" OR a1="enable" OR a1="reenable" OR a1="link" OR a1="daemon-reload"))Elastic · ES|QL
Run this as a search.
FROM logs-*| WHERE ((TO_LOWER(type) == "execve" AND TO_LOWER(a0) LIKE "*systemctl") AND (TO_LOWER(a1) == "start" OR TO_LOWER(a1) == "restart" OR TO_LOWER(a1) == "enable" OR TO_LOWER(a1) == "reenable" OR TO_LOWER(a1) == "link" OR TO_LOWER(a1) == "daemon-reload"))
Wazuh · XML rule
Deploy to your manager — this is a rule, not a search.
<group name="sigma,linux,"> <!-- Rule ids must be unique on your manager; 100000+ is the user range. --> <rule id="100000" level="5"> <!-- Set <if_sid> to the decoder/base rule for linux so this only evaluates relevant events. --> <field name="type" type="pcre2">(?i)^EXECVE$</field> <field name="a0" type="pcre2">(?i)systemctl$</field> <field name="a1" type="pcre2">(?i)(^start$|^restart$|^enable$|^reenable$|^link$|^daemon-reload$)</field> <description>Systemctl invoked with a state-changing service subcommand</description> <mitre> <id>T1569.003</id> </mitre> </rule></group>
Sentinel · KQL
Run this as a search.
Sentinel cannot express this construct. No Sentinel table is modelled for this logsource ({"product":"linux","service":"auditd"}), so there is nothing honest to query. Pick a logsource this translator maps, or write the KQL by hand. The Sigma source is on the first tab, unchanged.
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.