Detection rules › Splunk

Linux Binary Launched Process with Null Argv

Status
production
Severity
medium
Group by
host, launched_process, launching_process
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

The following analytic detects kernel-level events where a setuid binary launches a shell or interpreter with a NULL argument vector, which occurs when a privilege escalation exploit gains root and executes a process via execve() without constructing a legitimate argument array.

Known false positives

  • Legitimate false positives are rare but can occur when custom or poorly written setuid binaries, PAM modules, or login frameworks invoke shells programmatically without constructing a proper argv array. However, mainstream setuid binaries like su, sudo, and pkexec on modern Linux distributions always pass arguments, so any hit involving those specific processes should be treated as high confidence.

MITRE ATT&CK coverage

TacticTechniques
Privilege Escalation

Rule body

name: Linux Binary Launched Process with Null Argv
id: 0085652a-e682-45a2-a40c-5bb68b8f260e
version: 2
creation_date: '2026-05-12'
modification_date: '2026-07-17'
author: Raven Tait, Splunk
status: production
type: TTP
description: |-
    The following analytic detects kernel-level events where a setuid binary launches a shell or interpreter with a NULL argument vector, which occurs when a privilege escalation exploit gains root and executes a process via execve() without constructing a legitimate argument array.
data_source:
    - Linux Messages Syslog
search: |
    `linux_syslog` "NULL argv" "empty string added"
    | rex field=_raw "process '(?<launching_process>[^']+)' launched '(?<launched_process>[^']+)' with NULL argv"
    | where isnotnull(launching_process) AND isnotnull(launched_process)
    | stats
        count                        AS occurrences,
        min(_time)                   AS firstTime,
        max(_time)                   AS lastTime,
        values(_raw)                 AS message,
        values(host)                 AS dest
        by host, launching_process, launched_process
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | table dest, launching_process, launched_process,
            firstTime, lastTime, occurrences, message
    | `linux_binary_launched_process_with_null_argv_filter`
how_to_implement: To successfully implement this search, you need to have relevant kernel logs ingested with the Splunk Add-On for Unix and Linux (https://splunkbase.splunk.com/app/833).
known_false_positives: Legitimate false positives are rare but can occur when custom or poorly written setuid binaries, PAM modules, or login frameworks invoke shells programmatically without constructing a proper argv array. However, mainstream setuid binaries like su, sudo, and pkexec on modern Linux distributions always pass arguments, so any hit involving those specific processes should be treated as high confidence.
references:
    - https://www.elastic.co/security-labs/copy-fail-dirtyfrag-linux-page-bugs-in-the-wild
finding:
    title: Binary spawned process with NULL argv on $dest$ indicating possible privilege escalation.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Linux Privilege Escalation
asset_type: Endpoint
mitre_attack_id:
    - T1068
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint
cve:
    - CVE-2026-43284
    - CVE-2026-43500

Stages and Predicates

Stage 1: search

`linux_syslog` "NULL argv" "empty string added"

Stage 2: rex

| rex field=_raw "process '(?<launching_process>[^']+)' launched '(?<launched_process>[^']+)' with NULL argv"

Stage 3: where

| where isnotnull(launching_process) AND isnotnull(launched_process)

Stage 4: stats

| stats
    count                        AS occurrences,
    min(_time)                   AS firstTime,
    max(_time)                   AS lastTime,
    values(_raw)                 AS message,
    values(host)                 AS dest
    by host, launching_process, launched_process

Stage 5: search

| `security_content_ctime(firstTime)`

Stage 6: search

| `security_content_ctime(lastTime)`

Stage 7: table

| table dest, launching_process, launched_process,
        firstTime, lastTime, occurrences, message

Stage 8: search

| `linux_binary_launched_process_with_null_argv_filter`

Indicators

These rows show field, operator, and value matches.

Search terms

These SPL tokens match against raw event text.

StageTerm
1"NULL argv"
1"empty string added"