NVD has published CVE-2026-76404, a critical vulnerability carrying a CVSS score of 9.1 affecting the Splunk MCP Server app in versions below 1.2.1. The flaw is remotely exploitable over the network and allows any user holding the Splunk "admin" role to execute arbitrary operating system commands on the host running the app.
The root cause is a classic but dangerous pattern: the app's credential management component deserializes stored data without validating that the content matches the expected type. In practical terms, a user with admin privileges — or, more critically, an attacker who has compromised or phished admin credentials — can weaponize the app's own stored credential data to break out of the application layer and run commands on the underlying OS.
Why this demands immediate attention: Splunk infrastructure sits at the center of most security operations. A Splunk host typically holds authentication material, log archives containing sensitive telemetry, and network reach into nearly every segment of the enterprise. Command execution on a Splunk deployment is not a localized compromise — it is a potential pivot point into your entire environment, including the very monitoring stack you depend on to detect intrusions. Treat this as a priority-one patch action.
Technical Analysis
Affected Products and Versions
| Attribute | Detail |
|---|---|
| CVE | CVE-2026-76404 |
| CVSS v3.x Score | 9.1 (CRITICAL) |
| Attack Vector | Network |
| Affected Product | Splunk MCP Server app |
| Affected Versions | All versions below 1.2.1 |
| Fixed Version | 1.2.1 |
| Privilege Requirement | Splunk "admin" role |
| Vulnerable Component | Credential management (insecure deserialization / missing type validation) |
| Reference | https://nvd.nist.gov/vuln/detail/CVE-2026-76404 |
How the Vulnerability Works (Defender's View)
The attack chain is straightforward from a detection standpoint:
- Prerequisite access: The attacker authenticates to Splunk with the "admin" role. This can be a legitimate-but-malicious insider, a compromised admin credential set, or an attacker who has escalated from a lower-privileged Splunk account. The "authenticated admin" requirement lowers the external exposure but does nothing to protect you against credential theft — the dominant initial-access pattern we see in IR engagements.
- Abuse of credential management: The attacker interacts with the MCP Server app's credential management functionality. Because stored credential data is deserialized without type validation, the attacker can supply or tamper with stored content so that the app interprets attacker-controlled structures.
- Arbitrary command execution: The deserialization flaw is converted into OS-level command execution with the privileges of the account running the Splunk/MCP Server process (commonly the
splunkservice account — which on many deployments has broad filesystem access and, on poorly hardened systems, near-root or SYSTEM-equivalent reach).
Why "Admin-Only" Does Not Mean "Low Risk"
In our incident response work, the most damaging breaches rarely start with a zero-day against an unauthenticated service. They start with stolen credentials. A CVSS 9.1 score reflects that the exploit is network-reachable and yields full OS command execution — the authentication requirement is the only mitigating factor, and it is one that defenders cannot rely on. Splunk admin accounts are high-value phishing targets precisely because of the reach they confer. If your threat model includes credential compromise (and it must), this vulnerability is exploitable in your environment.
Exploitation Status
At the time of publication, NVD lists the technical details and severity; there is no confirmed in-the-wild mass exploitation noted in the summary, and no CISA KEV entry has been cited. However, given the low complexity of deserialization-to-RCE paths and the ubiquity of Splunk, you should operate under the assumption that proof-of-concept code will circulate quickly. Do not wait for a KEV listing to patch.
Detection & Response
The most reliable detection strategy for post-exploitation of this flaw is monitoring for unexpected child processes spawned by the Splunk/MCP Server process chain. Legitimate Splunk operations spawn well-known binaries (splunkd, splunk, python for modular inputs and scripted lookups). A deserialization-driven command execution will typically manifest as splunkd or the MCP app's Python interpreter spawning shells, downloaders, or reconnaissance commands that have no business originating from Splunk.
Sigma Rules
---
title: Splunk Process Spawning Suspicious Shell or System Binary
id: 3f8c1a72-7640-4b04-a9c5-2026c476404a
status: experimental
description: Detects Splunk daemon or MCP Server Python process spawning shells, downloaders, or reconnaissance tools consistent with post-exploitation of CVE-2026-76404 (arbitrary command execution via MCP Server credential management deserialization).
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-76404
- https://attack.mitre.org/techniques/T1059/
author: Security Arsenal
date: 2026/04/06
tags:
- attack.execution
- attack.t1059
logsource:
category: process_creation
product: windows
detection:
selection_parent:
ParentImage|endswith:
- '\splunkd.exe'
- '\python.exe'
- '\python3.exe'
selection_child:
Image|endswith:
- '\cmd.exe'
- '\powershell.exe'
- '\pwsh.exe'
- '\wscript.exe'
- '\cscript.exe'
- '\mshta.exe'
- '\rundll32.exe'
- '\certutil.exe'
- '\bitsadmin.exe'
- '\net.exe'
- '\net1.exe'
- '\whoami.exe'
- '\nltest.exe'
filter_known_good:
CommandLine|contains:
- 'splunk'
condition: selection_parent and selection_child and not filter_known_good
falsepositives:
- Custom Splunk apps or scripted inputs that legitimately invoke system commands — baseline per deployment
level: high
---
title: Linux Splunk Process Spawning Shell or Reconnaissance Commands
id: 8e2d5b14-7640-4c91-b7a3-2026c476404b
status: experimental
description: Detects splunkd or MCP Server Python processes on Linux spawning interactive shells or common post-exploitation tools, consistent with exploitation of CVE-2026-76404.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-76404
- https://attack.mitre.org/techniques/T1059.004/
author: Security Arsenal
date: 2026/04/06
tags:
- attack.execution
- attack.t1059.004
logsource:
category: process_creation
product: linux
detection:
selection_parent:
ParentImage|endswith:
- '/splunkd'
- '/python'
- '/python3'
selection_child:
Image|endswith:
- '/bash'
- '/sh'
- '/dash'
- '/zsh'
- '/curl'
- '/wget'
- '/nc'
- '/ncat'
- '/netcat'
- '/python3'
- '/perl'
- '/whoami'
- '/id'
- '/uname'
condition: selection_parent and selection_child
falsepositives:
- Splunk scripted inputs and modular inputs that legitimately shell out — tune against your installed app inventory
level: high
---
title: MCP Server App Credential Store Modification by Non-Splunk Process
id: c41a9e67-7640-4d28-9f1b-2026c476404c
status: experimental
description: Detects write access to Splunk MCP Server app credential storage locations by processes other than splunkd, indicating potential tampering with serialized credential data exploited in CVE-2026-76404.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-76404
- https://attack.mitre.org/techniques/T1552/
author: Security Arsenal
date: 2026/04/06
tags:
- attack.credential_access
- attack.t1552
logsource:
category: file_event
product: windows
detection:
selection:
TargetFilename|contains:
- '\Splunk\etc\apps\mcp'
- '\Splunk\var\lib\splunk\'
filter_legit:
Image|endswith:
- '\splunkd.exe'
- '\splunk.exe'
- '\python.exe'
condition: selection and not filter_legit
falsepositives:
- Administrators editing app configuration during deployment windows
level: medium
KQL Hunt (Microsoft Sentinel / Defender)
This query hunts for Splunk-spawned child processes indicative of command execution. It works against Defender endpoint telemetry (DeviceProcessEvents) and Syslog-ingested Linux data.
let suspiciousChildren = dynamic(["cmd.exe","powershell.exe","pwsh.exe","wscript.exe","cscript.exe","mshta.exe","rundll32.exe","certutil.exe","bitsadmin.exe","net.exe","whoami.exe","nltest.exe","bash","sh","curl","wget","nc","ncat","perl"]);
union isfuzzy=true
(DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where InitiatingProcessFileName has_any ("splunkd","splunk","python","python3")
| where FileName has_any (suspiciousChildren)
| where not(ProcessCommandLine has "splunk")
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, FileName, ProcessCommandLine, AccountName, InitiatingProcessAccountName
| extend Source = "Defender"),
(Syslog
| where TimeGenerated > ago(7d)
| where ProcessName has_any (suspiciousChildren)
| where SyslogMessage has "splunkd" or SyslogMessage has "mcp"
| project TimeGenerated, Computer, ProcessName, SyslogMessage, HostIP
| extend Source = "Syslog")
| order by TimeGenerated desc
Velociraptor VQL
-- Hunt for Splunk/MCP Server processes spawning suspicious child processes
-- Relevant to CVE-2026-76404 post-exploitation detection
SELECT Pid, Ppid, Name, Exe, CommandLine, Username, CreateTime,
get_member(item=pslist(pid=Ppid), field='Name') AS ParentName
FROM pslist()
WHERE (CommandLine =~ '(cmd|powershell|pwsh|certutil|bitsadmin|mshta|rundll32|bash|curl|wget|nc |ncat|/bin/sh)'
OR Name =~ '(?i)cmd.exe|powershell.exe|bash|sh$|nc$')
AND get_member(item=pslist(pid=Ppid), field='Name') =~ '(?i)splunkd|splunk|python'
Verification and Remediation Script
#!/bin/bash
# CVE-2026-76404 - Splunk MCP Server app verification and hardening check
# Run on Splunk hosts (search heads / heavy forwarders running the MCP Server app)
set -e
SPLUNK_HOME="${SPLUNK_HOME:-/opt/splunk}"
APP_DIR="$SPLUNK_HOME/etc/apps"
echo "[*] CVE-2026-76404 verification - $(hostname) - $(date)"
# 1. Locate MCP Server app installations
echo "[*] Searching for MCP Server app installations..."
FOUND=0
for dir in "$APP_DIR"/*/; do
CONF="${dir}default/app.conf"
[ -f "$CONF" ] || CONF="${dir}local/app.conf"
[ -f "$CONF" ] || continue
if grep -qi "mcp" "$CONF" 2>/dev/null || [[ "$(basename $dir)" == *"mcp"* ]]; then
FOUND=1
VERSION=$(grep -E "^version" "$CONF" | head -1 | awk -F'=' '{print $2}' | tr -d ' ')
echo " App dir : $dir"
echo " Version : ${VERSION:-unknown}"
if [[ -n "$VERSION" ]]; then
MAJOR=$(echo "$VERSION" | cut -d. -f1)
MINOR=$(echo "$VERSION" | cut -d. -f2)
PATCH=$(echo "$VERSION" | cut -d. -f3)
if [ "$MAJOR" -lt 1 ] || { [ "$MAJOR" -eq 1 ] && [ "$MINOR" -lt 2 ]; } || { [ "$MAJOR" -eq 1 ] && [ "$MINOR" -eq 2 ] && [ "$PATCH" -lt 1 ]; }; then
echo " [!!] VULNERABLE - below 1.2.1. Upgrade immediately."
else
echo " [OK] Version is 1.2.1 or later."
fi
else
echo " [??] Could not parse version - verify manually in Splunk Web (Apps > Manage Apps)."
fi
fi
done
[ "$FOUND" -eq 0 ] && echo "[+] No MCP Server app detected in $APP_DIR"
# 2. Enumerate users holding the admin role (attack surface review)
echo "[*] Listing users with admin role (review for least privilege)..."
PASSWD_CONF="$SPLUNK_HOME/etc/passwd"
if [ -f "$PASSWD_CONF" ]; then
grep -B2 ":admin" "$PASSWD_CONF" | grep "^\[" | tr -d '[]' || echo " (check via: splunk btool authorize list or REST /services/authentication/users)"
fi
# 3. Check for suspicious recent child processes of splunkd (post-exploitation canary)
echo "[*] Checking for suspicious splunkd child processes..."
ps -eo pid,ppid,comm,args | awk 'NR>1 {print}' | grep -E "(cmd|bash|sh |curl|wget|nc |ncat|perl)" | while read -r line; do
PPID=$(echo "$line" | awk '{print $2}')
PNAME=$(ps -p "$PPID" -o comm= 2>/dev/null || true)
if [[ "$PNAME" == *"splunk"* || "$PNAME" == *"python"* ]]; then
echo " [!!] Suspicious: $line (parent: $PNAME)"
fi
done
echo "[*] Done. If vulnerable, upgrade MCP Server app to >= 1.2.1 and restart Splunk."
Remediation
- Upgrade immediately. Update the Splunk MCP Server app to version 1.2.1 or later on every Splunk instance where it is installed — search heads, heavy forwarders, and standalone deployments. Verify the installed version under Apps > Manage Apps or in
etc/apps/<mcp_app>/default/app.conf. - Audit admin role membership. The exploitation prerequisite is the "admin" role. Pull the list of admin-capable users (via REST:
/services/authentication/usersorsplunk btool authorize list) and enforce least privilege. Every unnecessary admin account is a pre-positioned exploitation path. - Enforce MFA and strong credential hygiene on Splunk Web. Since this is an authenticated vulnerability, credential compromise converts it directly into OS command execution. If Splunk sits behind SSO, confirm MFA is enforced; if using native authentication, rotate admin passwords and audit for shared accounts.
- Restrict network exposure of Splunk Web and management ports. Splunk Web (default 8000) and the management port (8089) should be reachable only from authorized administrative subnets or a jump host. This is the "network-exploitable" surface — reduce it.
- Harden the Splunk service account. Command execution inherits the privileges of the Splunk process. Ensure
splunkdruns as a dedicated, non-root service account with scoped filesystem permissions. - Hunt retroactively. Deploy the Sigma rules above and run the KQL query across at least the last 7–30 days. A compromised admin credential plus this flaw may already have been used; look for shells, downloaders, and reconnaissance binaries parented by
splunkdor its Python interpreter. - Monitor NVD and Splunk advisories. Track https://nvd.nist.gov/vuln/detail/CVE-2026-76404 for KEV additions and updated exploit intelligence.
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.