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 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="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.
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.