Skip to content

Siemphony is in beta and still being built. How a rule earns its badge.

Siemphony’s repertoire

Linux firmware flashing tool executed

AN0917 names three signals on Linux: raw ioctl/write syscalls that write firmware or controller memory, "unexpected flashing tools execution", and anomalous SMART/kernel-audit firmware checksums. This rule takes only the middle one. The raw syscall leg cannot be scoped honestly with the fields this corpus has established for {product: linux, service: auditd}: a SYSCALL record for ioctl or write carries no file path (that lives on a separate PATH record auditd does not always emit for ioctl, and Sigma cannot join the two), so a bare `syscall: ioctl` or `syscall: write` selector would match nearly every process on the host — the same over-matching failure this corpus treats as equivalent to a selector that never fires. The flashing-tools leg has no such problem: it is a process-identity match with `type: SYSCALL`, `syscall: execve`, and `exe`, the same auditd EXECVE vocabulary already used for T1547.006. `flashrom`, `fwupdmgr` and `fwupdtool` are this rule's own addition, not MITRE's, chosen because unlike diagnostic tools such as `nvme` or `ethtool` — which spend most invocations on read-only inventory subcommands this ruleset has no field to distinguish from a firmware-write subcommand, since raw auditd EXECVE carries no argv this corpus has an established field for — a `flashrom` or `fwupd*` invocation has no comparably common benign read-only mode; running the binary at all is itself the observable MITRE's analytic asks for. AN0916, the Windows leg, is not attempted: its only logsource, {category: driver_load, product: windows}, carries just `ImageLoaded`, `Signed` and `Hashes`, and both ways of using them are already claimed by published siblings — `Signed: false` is T1014's rule verbatim, and a named-driver list is T1068's — so nothing distinct from either sibling remains on that logsource. AN0918, the macOS leg, is not attempted either: its only logsource, {product: macos, service: unifiedlog}, has no established Sigma field vocabulary anywhere in this corpus, the same blocker already recorded against that exact source for T1037.002, T1036.004, T1036.006, T1053.003 and others. The Linux driver-load/syslog source in AN0917 ({product: linux, service: syslog}) is also unattempted for the same reason. MITRE's `AlertThresholds` knob (SMART error tolerance) has no field to bind to here at all; `FirmwareImageBaseline` would require a checksum comparison lib/sigma cannot express. Prerequisite: raw auditd does not record execve by default; this returns nothing 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 DET0323, 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

title: Linux firmware flashing tool executedid: 76e797f2-b52e-4743-b47e-ae03b0bdbd45status: experimentaldescription: |  AN0917 names three signals on Linux: raw ioctl/write syscalls that write  firmware or controller memory, "unexpected flashing tools execution", and  anomalous SMART/kernel-audit firmware checksums. This rule takes only the  middle one. The raw syscall leg cannot be scoped honestly with the fields  this corpus has established for {product: linux, service: auditd}: a  SYSCALL record for ioctl or write carries no file path (that lives on a  separate PATH record auditd does not always emit for ioctl, and Sigma  cannot join the two), so a bare `syscall: ioctl` or `syscall: write`  selector would match nearly every process on the host — the same  over-matching failure this corpus treats as equivalent to a selector that  never fires. The flashing-tools leg has no such problem: it is a  process-identity match with `type: SYSCALL`, `syscall: execve`, and `exe`,  the same auditd EXECVE vocabulary already used for T1547.006. `flashrom`,  `fwupdmgr` and `fwupdtool` are this rule's own addition, not MITRE's, chosen  because unlike diagnostic tools such as `nvme` or `ethtool` — which spend  most invocations on read-only inventory subcommands this ruleset has no  field to distinguish from a firmware-write subcommand, since raw auditd  EXECVE carries no argv this corpus has an established field for — a  `flashrom` or `fwupd*` invocation has no comparably common benign  read-only mode; running the binary at all is itself the observable MITRE's  analytic asks for. AN0916, the Windows leg, is not attempted: its only  logsource, {category: driver_load, product: windows}, carries just  `ImageLoaded`, `Signed` and `Hashes`, and both ways of using them are  already claimed by published siblings — `Signed: false` is T1014's rule  verbatim, and a named-driver list is T1068's — so nothing distinct from  either sibling remains on that logsource. AN0918, the macOS leg, is not  attempted either: its only logsource, {product: macos, service:  unifiedlog}, has no established Sigma field vocabulary anywhere in this  corpus, the same blocker already recorded against that exact source for  T1037.002, T1036.004, T1036.006, T1053.003 and others. The Linux  driver-load/syslog source in AN0917 ({product: linux, service: syslog}) is  also unattempted for the same reason. MITRE's `AlertThresholds` knob (SMART  error tolerance) has no field to bind to here at all; `FirmwareImageBaseline`  would require a checksum comparison lib/sigma cannot express.  Prerequisite: raw auditd does not record execve by default; this returns  nothing 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 DET0323, not hand-written and not tested by its author. Any lab result is on this rule's own page.references:  - https://attack.mitre.org/techniques/T1542/002  - https://attack.mitre.org/detectionstrategies/DET0323author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-18tags:  - attack.defense-evasion  - attack.persistence  - attack.t1542.002logsource:  product: linux  service: auditddetection:  selection:    type: 'SYSCALL'    syscall: 'execve'    exe|endswith:      - '/flashrom'      - '/fwupdmgr'      - '/fwupdtool'  condition: selectionfalsepositives:  - "Fleet firmware-management tooling: GNOME Software / KDE Discover and the systemd-managed fwupd background service invoke fwupdmgr or fwupdtool on a timer to check for and apply Linux Vendor Firmware Service updates, which is the routine, intended way most desktop distributions patch NIC, SSD, TPM and UEFI firmware."  - "IT staff or a configuration-management run (Ansible, Puppet, cloud-init) deliberately re-flashing BIOS, EC or peripheral-controller firmware with flashrom during a break-fix, hardware-refresh or coreboot/firmware-security hardening project — this is legitimate use of the identical binary this rule matches on."level: low

Splunk · SPL

Run this as a search.

index=* (type="SYSCALL" AND syscall="execve" AND (exe="*/flashrom" OR exe="*/fwupdmgr" OR exe="*/fwupdtool"))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE (TO_LOWER(type) == "syscall" AND TO_LOWER(syscall) == "execve" AND (TO_LOWER(exe) LIKE "*/flashrom" OR TO_LOWER(exe) LIKE "*/fwupdmgr" OR TO_LOWER(exe) LIKE "*/fwupdtool"))

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)^SYSCALL$</field>    <field name="syscall" type="pcre2">(?i)^execve$</field>    <field name="exe" type="pcre2">(?i)(/flashrom$|/fwupdmgr$|/fwupdtool$)</field>    <description>Linux firmware flashing tool executed</description>    <mitre>      <id>T1542.002</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.