Skip to content

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

Siemphony’s repertoire

Shared object opened from /tmp, or ptrace called by a network service

Siemphony@siemphonylowT1055.014unverified
AN1241 groups four things under one "OS API Execution" logsource: ptrace, mmap, mprotect, open and dlopen. Three of those five names are dead ends on their own and are deliberately not gated on here. `dlopen` is not a syscall at all — it is a glibc wrapper that resolves to `openat`, so `syscall: 'dlopen'` would never fire; the open half of this rule matches the syscall that actually appears instead. Bare `mmap` is called continually by every process doing ordinary memory allocation, so including it would make a selection effectively always-true, the same reasoning this corpus's T1055.008 rule already applied to the identical syscall. And bare `ptrace` by any process is exactly what T1055.008 already covers on this same logsource; repeating that selector here under a different technique id would double-count one signal rather than add coverage, which is the same trap this corpus's T1036.004 rule named when it declined to re-author a sibling's PATH selector. What is left, and what this rule matches instead, is the two pieces AN1241 names that T1055.008 does not touch. First, a PATH record naming a `.so` file opened from a location no legitimate dynamic linker resolves from — /tmp, /dev/shm or /var/tmp — which is the concrete form of "open and map a malicious shared object" the analytic's own text asks for. Second, `ptrace` called by a process whose own binary is one that should never legitimately attach to another process — nginx, apache2 and sshd, MITRE's own three examples for the AnomalousParentProcessList knob — which is a materially narrower claim than T1055.008's bare "ptrace happened" and is aimed at exactly this technique's privilege-escalation framing: a compromised network-facing service escalating by hijacking a peer's VDSO rather than a developer or debugger attaching from a shell. Three of AN1241's pieces cannot be honestly expressed. The memprotect leg — "change from PROT_READ|PROT_WRITE to PROT_EXEC" — has no field to bind to: raw auditd's mprotect SYSCALL record carries the requested protection as an unresolved hex bitmask in its argument fields, and lib/sigma has no bitwise-AND construct to test it even if the field were named. The TimeWindow_PtraceToMmap knob is a join between the ptrace-attach record and a later mmap/open record from the same target process; PATH and SYSCALL are separate auditd records with no correlation construct connecting them here. And the osquery leg, {product: linux, service: osquery}, has no standardised Sigma field vocabulary anywhere in this corpus. Prerequisite: none of `ptrace`, `open` or `openat` are audited on any distribution out of the box. This rule returns zero rows — meaning blind, not quiet — until rules such as `-a always,exit -F arch=b64 -S ptrace -S openat -k vdso_hijack` are loaded. The `syscall` field also depends on name resolution: raw, unresolved auditd output records the architecture-specific syscall number rather than the string `ptrace`, so this selector needs `ausearch -i`, laurel or an equivalent interpreting layer in front of it, the same caveat already recorded against T1055.008. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0448, 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="PATH" AND (name="*/tmp/*" OR name="*/dev/shm/*" OR name="*/var/tmp/*") AND name="*.so") OR (type="SYSCALL" AND syscall="ptrace" AND (exe="*/nginx" OR exe="*/apache2" OR exe="*/sshd")))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE ((TO_LOWER(type) == "path" AND (TO_LOWER(name) LIKE "*/tmp/*" OR TO_LOWER(name) LIKE "*/dev/shm/*" OR TO_LOWER(name) LIKE "*/var/tmp/*") AND TO_LOWER(name) LIKE "*.so") OR (TO_LOWER(type) == "syscall" AND TO_LOWER(syscall) == "ptrace" AND (TO_LOWER(exe) LIKE "*/nginx" OR TO_LOWER(exe) LIKE "*/apache2" OR TO_LOWER(exe) LIKE "*/sshd")))

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. -->  <!-- 2 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="type" type="pcre2">(?i)^PATH$</field>    <field name="name" type="pcre2">(?i)(/tmp/|/dev/shm/|/var/tmp/)</field>    <field name="name" type="pcre2">(?i)\.so$</field>    <description>Shared object opened from /tmp, or ptrace called by a network service (1/2)</description>    <mitre>      <id>T1055.014</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="type" type="pcre2">(?i)^SYSCALL$</field>    <field name="syscall" type="pcre2">(?i)^ptrace$</field>    <field name="exe" type="pcre2">(?i)(/nginx$|/apache2$|/sshd$)</field>    <description>Shared object opened from /tmp, or ptrace called by a network service (2/2)</description>    <mitre>      <id>T1055.014</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.