Skip to content

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

Siemphony’s repertoire

Symbol stripping run against a compiled binary on Linux

Siemphony@siemphonylowT1027.008unverified
The observable this technique is named for is a property of a *file* — no symbol table, no readable strings — and no log source in this brief carries it. Sysmon EventID 1 emits Image, CommandLine and Hashes, EventID 11 emits TargetFilename and the writing process, and Zeek http.log and files.log emit MIME type and size; none of them records whether a binary has a .symtab section, and MITRE's `EntropyThreshold` knob is not a field on any of them. So this rule takes the Linux leg of AN0056 and matches the stripping *act* instead of the stripped artefact: an execution of the binutils strip tool, an objcopy invocation carrying one of the flags that removes symbols, or a Go build whose linker flags discard the symbol table and DWARF data. That is MITRE's `StripFlags` knob — flag combinations indicating symbol table removal — populated here with those specific tools and switches rather than taken from MITRE. Because `endswith` anchors on the tail of the path, the tool list carries both `/strip` and `-strip`, so the prefixed builds of the same binary that are what is actually installed on many hosts — `llvm-strip`, `eu-strip`, `x86_64-linux-gnu-strip`, `aarch64-linux-gnu-strip` — are covered as well as a bare `strip`. Three limits are structural and none of them is fixable from this source. Stripping is overwhelmingly done on the adversary's build host before delivery, or inside a compiler the victim never runs, so the common case produces no event on the victim at all — this rule sees only the unusual case where the payload is built or post-processed in place. `gcc -s` and `ld -s` are deliberately absent: compiler binaries are version-suffixed and target-prefixed (`gcc-12`, `x86_64-linux-gnu-gcc-12`), which defeats an `endswith` on `/gcc`, and a bare ` -s ` on a compiler command line is not specific enough to carry the rule on its own. Packers are also out of scope by design — a UPX-compressed payload is T1027.002, not this. The other three analytics under DET0019 are not attempted: AN0055 (Windows) and AN0058 (network) have no field for symbols or strings as described above, and AN0057 (macOS), whose real observable is a run-only AppleScript produced by `osacompile -x`, offers only unifiedlog, EndpointSecurity and osquery, none of which has a standardised Sigma field vocabulary — inventing one would produce a rule that parses, renders in four backends and matches nothing. Vocabulary and prerequisite: this rule is written in the Sysmon-for-Linux shaped `process_creation` vocabulary (Image, CommandLine) that the brief maps `auditd:EXECVE::EXECVE` onto. Raw auditd carries the same values as `exe=` on the SYSCALL record and `a0`..`aN` on a separate EXECVE record, so that feed needs a field mapping before this rule applies to it, and auditd records no execve at all until a rule such as `-a always,exit -F arch=b64 -S execve -k exec` is loaded. Until one is, this rule returns zero rows, and zero rows here means blind rather than quiet. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0019, not hand-written and not tested by its author. Any lab result is on this rule's own page.Full description

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.

DeviceProcessEvents| where (((FolderPath endswith "/strip" or FolderPath endswith "-strip" or FolderPath endswith "/sstrip") or ((FolderPath endswith "/objcopy" or FolderPath endswith "-objcopy") and (ProcessCommandLine contains "--strip-all" or ProcessCommandLine contains "--strip-debug" or ProcessCommandLine contains "--strip-unneeded" or ProcessCommandLine contains "--strip-symbol" or ProcessCommandLine contains "--discard-all"))) or ((FolderPath endswith "/go" and ProcessCommandLine contains "-ldflags") and (ProcessCommandLine contains "-s -w" or ProcessCommandLine contains "-w -s")))

Splunk · SPL

Run this as a search.

index=* (((Image="*/strip" OR Image="*-strip" OR Image="*/sstrip") OR ((Image="*/objcopy" OR Image="*-objcopy") AND (CommandLine="*--strip-all*" OR CommandLine="*--strip-debug*" OR CommandLine="*--strip-unneeded*" OR CommandLine="*--strip-symbol*" OR CommandLine="*--discard-all*"))) OR ((Image="*/go" AND CommandLine="*-ldflags*") AND (CommandLine="*-s -w*" OR CommandLine="*-w -s*")))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE (((TO_LOWER(process.executable) LIKE "*/strip" OR TO_LOWER(process.executable) LIKE "*-strip" OR TO_LOWER(process.executable) LIKE "*/sstrip") OR ((TO_LOWER(process.executable) LIKE "*/objcopy" OR TO_LOWER(process.executable) LIKE "*-objcopy") AND (TO_LOWER(process.command_line) LIKE "*--strip-all*" OR TO_LOWER(process.command_line) LIKE "*--strip-debug*" OR TO_LOWER(process.command_line) LIKE "*--strip-unneeded*" OR TO_LOWER(process.command_line) LIKE "*--strip-symbol*" OR TO_LOWER(process.command_line) LIKE "*--discard-all*"))) OR ((TO_LOWER(process.executable) LIKE "*/go" AND TO_LOWER(process.command_line) LIKE "*-ldflags*") AND (TO_LOWER(process.command_line) LIKE "*-s -w*" OR TO_LOWER(process.command_line) LIKE "*-w -s*")))

Wazuh · XML rule

Deploy to your manager — this is a rule, not a search.

<group name="sigma,linux,process_creation,">  <!-- Rule ids must be unique on your manager; 100000+ is the user range. -->  <!-- 3 rules: the Sigma condition ORs across different fields,       which one rule cannot express. Any one matching is a hit. -->  <rule id="100000" level="5">    <!-- Set <if_sid> to the decoder/base rule for linux so this only evaluates relevant events. -->    <field name="Image" type="pcre2">(?i)(/strip$|-strip$|/sstrip$)</field>    <description>Symbol stripping run against a compiled binary on Linux (1/3)</description>    <mitre>      <id>T1027.008</id>    </mitre>  </rule>   <rule id="100001" level="5">    <!-- Set <if_sid> to the decoder/base rule for linux so this only evaluates relevant events. -->    <field name="Image" type="pcre2">(?i)(/objcopy$|-objcopy$)</field>    <field name="CommandLine" type="pcre2">(?i)(--strip-all|--strip-debug|--strip-unneeded|--strip-symbol|--discard-all)</field>    <description>Symbol stripping run against a compiled binary on Linux (2/3)</description>    <mitre>      <id>T1027.008</id>    </mitre>  </rule>   <rule id="100002" level="5">    <!-- Set <if_sid> to the decoder/base rule for linux so this only evaluates relevant events. -->    <field name="Image" type="pcre2">(?i)/go$</field>    <field name="CommandLine" type="pcre2">(?i)-ldflags</field>    <field name="CommandLine" type="pcre2">(?i)(-s -w|-w -s)</field>    <description>Symbol stripping run against a compiled binary on Linux (3/3)</description>    <mitre>      <id>T1027.008</id>    </mitre>  </rule></group>

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.