Skip to content

Siemphony is in beta and still being built. What ships today, and what does not.

Siemphony’s repertoire

Systemctl invoked with a state-changing service subcommand

Siemphony@siemphonylowT1569.003unverified
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 description

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.

Log in to react
Not yet reported on

Nobody has run this in a real environment and said what happened.

Verdicts from engineers who deployed it

0 cast

No 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.