A phishing link that turns your SIEM admin's browser tab into a credential vault dump
Splunk's Deployment Server endpoints in Splunk Web accept GET requests without enforcing a CSRF token, and the caller-supplied input flows unsanitized into a Search Processing Language (SPL) search. If an attacker gets a logged-in user who holds the list_deployment_server capability (default on admin and sc_admin) to load a crafted URL, the browser fires the request with the victim's session cookies, and Splunkd runs the injected SPL as splunk-system-user — the superuser role that can read every index and every stored credential. Affected: Splunk Enterprise <10.4.1, <10.2.5, <10.0.8, <9.4.13, and Splunk Cloud Platform <10.5.2605.0, <10.4.2604.7, <10.3.2512.16, <10.2.2510.18, <10.1.2507.24.
The vendor's HIGH / 8.3 rating is defensible. The CVSS vector AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:L correctly captures that the attacker themselves is unauthenticated (PR:N) but one click by a privileged victim (UI:R) is required. What CVSS doesn't capture is *what* Splunk is: the detection plane and, in most enterprises, a credential concentrator (forwarder tokens, HEC keys, integration passwords in passwords.conf). That role-multiplier is why we keep this at HIGH rather than sliding it down for the UI:R friction most CSRF bugs earn.
5 steps from start to impact.
Identify a target Splunk admin and Splunk Web URL
splunk.corp.example.com:8000) via Shodan, LinkedIn recon on the SOC team, or prior phishing footholds. They then craft a spearphish targeting a user known to hold admin, sc_admin, or any custom role with the list_deployment_server capability.- Splunk Web reachable from the victim's browser
- Victim holds
list_deployment_servercapability - Victim has an active Splunk Web session cookie
- Most enterprises expose Splunk Web only on the management VLAN, not the internet
- The capability is usually restricted to a handful of platform engineers
Deliver a CSRF payload page
<img> or <iframe> pointing at the vulnerable Deployment Server GET endpoint with SPL injected into a query parameter. Standard CSRF weaponization — no exotic tooling needed; BeEF or a hand-rolled HTML file works. Delivery is via phishing email, watering-hole on a wiki page, or malvertising on a page the SOC admin browses.- Ability to deliver a URL to the victim (email, chat, wiki, ad network)
- Victim's browser will emit cookies cross-site (SameSite=Lax still permits GET-navigated top-level requests)
- Secure email gateways strip/rewrite external URLs
SameSite=Stricton the Splunk session cookie would break this — checkweb.conf
web_access.log.Victim clicks; browser fires the CSRF GET
GET to the Deployment Server endpoint carrying the admin's session. Because the endpoint does not validate the CSRF token on GET, Splunkd accepts the request. The injected SPL is spliced into the search that runs server-side.- Victim actively logged into Splunk Web
- No reverse proxy stripping the request
- An idle-timeout session would already be expired
- Some orgs front Splunk Web with an SSO proxy that enforces
Sec-Fetch-Siteheader checks
web_access.log and audittrail index will record the search — but attribution to the victim not the attacker.SPL executes as splunk-system-user
splunk-system-user context, which has read access to every index including _audit, _internal, and any credential-bearing index. Attacker uses | rest /services/storage/passwords or | dbinspect style commands to enumerate stored credentials, HEC tokens, and forwarder secrets, then pipes results out via outputlookup or an | sendemail sink they control.- Splunk configured with stored credentials (typical for any DBX, LDAP, HEC, or forwarder deployment)
splunk_secreton-disk encryption means exfil requires the SPL to decrypt via/services/storage/passwordsREST — which is exactly what splunk-system-user can do
audittrail index logs the SPL text — if you're ingesting _audit and alerting on | rest /services/storage/passwords from unusual users, you'll catch it.Credential reuse / lateral movement
- Stored integrations exist (they always do in production Splunk)
- Credentials are only as reusable as their scope — least-privileged service accounts limit blast radius
- MFA-gated APIs won't accept the stolen static creds
The supporting signals.
| In-the-wild status | No known exploitation as of 2026-07-16. Not on CISA KEV. No public reports of active abuse. |
|---|---|
| Public PoC | No public PoC at time of writing. CSRF+SPL-injection weaponization is trivial for anyone with a Splunk Web instance to reproduce; expect a Metasploit or standalone PoC within 30-60 days. |
| EPSS | Not yet scored (disclosure was 2026-07-15). Comparable Splunk CSRF bugs typically settle at EPSS <0.5% because they require UI:R and non-default capability. |
| KEV status | Not listed. No CISA due date. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:L — 8.3 HIGH. PR:N reflects attacker-side; real gating is UI:R plus the victim's list_deployment_server capability. |
| Affected versions | Splunk Enterprise <10.4.1, <10.2.5, <10.0.8, <9.4.13; Splunk Cloud Platform <10.5.2605.0, <10.4.2604.7, <10.3.2512.16, <10.2.2510.18, <10.1.2507.24. |
| Fixed versions | Enterprise: 10.4.1, 10.2.5, 10.0.8, 9.4.13. Cloud: auto-patched by Splunk on the versions above. |
| Exposure data | Shodan shows roughly ~9k internet-exposed Splunk Web instances on port 8000/8089; the vast majority of enterprise Splunk deployments keep Web internal-only. |
| Disclosure | Advisory SVD-2026-0605 class, published 2026-07-15 by Splunk PSIRT. |
| Credit | Reported through Splunk's coordinated disclosure program; specific researcher name pending advisory publication. |
noisgate verdict.
The single most decisive factor is the role multiplier: the affected component is a SIEM / detection-plane server that concentrates cleartext integration credentials and every index of security telemetry, so a successful chain ends in credential-vault theft and downstream pivots. UI:R and a capability requirement do introduce friction, but they are insufficient to break the HIGH floor for a canonical SIEM role.
Why this verdict
- Role multiplier — Splunk is SIEM/detection plane: on the canonical enterprise Splunk deployment,
splunk-system-usercan read every index and every stored credential via/services/storage/passwords. Chain outcome is *credential-vault theft plus telemetry egress* — that is a fleet-adjacent blast radius and it floors the verdict at HIGH. - Role multiplier — dev/lab Splunk: chain still succeeds but stolen creds are non-production. Blast radius stays local. Does not lift verdict.
- Friction — UI:R with a privileged victim: attacker cannot self-drive; they need an active-session admin (or
sc_admin, or a custom role grantedlist_deployment_server) to load a URL. This holds the verdict at HIGH rather than lifting to CRITICAL. - Friction — Splunk Web rarely internet-exposed: Shodan population (~9k) is a small slice of the global Splunk install base; most instances sit behind SSO/VPN. This narrows the deliverable population but does not eliminate it (internal phishing works fine).
- No KEV, no PoC, no EPSS spike yet — near-term exploitation pressure is modest, keeping us off the CRITICAL rung, but weaponization is trivial once the fix diff is examined.
Why not higher?
CRITICAL requires either canonical unauthenticated remote impact or a demonstrated fleet-scale chain with active exploitation. Here the attacker still needs a privileged victim to click a link during an active session, and there is no PoC or in-the-wild activity yet. The Splunk-as-SIEM role justifies floor of HIGH but does not clear the CRITICAL bar without an exploitation catalyst.
Why not lower?
MEDIUM would ignore that a single successful chain drains cleartext integration credentials from the detection plane. On any production Splunk, the splunk-system-user context reading /services/storage/passwords is a credential-vault compromise — that outcome is not MEDIUM-shaped regardless of the UI:R gate.
What to do — in priority order.
- Restrict Splunk Web to trusted networks — Front Splunk Web (default port 8000) with your SSO reverse proxy or an ACL that only permits SOC/platform-engineering subnets. This shrinks the deliverable-URL population to internal phishing only. Deploy within 30 days per the noisgate mitigation SLA for HIGH.
- Set session cookies to SameSite=Strict — In
$SPLUNK_HOME/etc/system/local/web.conf, settools.sessions.secure = Trueand enforceSameSite=Strictat the reverse proxy on the Splunk session cookie. A strict cookie policy prevents the CSRFGETfrom carrying the session at all. Deploy within 30 days. - Audit and prune the list_deployment_server capability — In Splunk Web → Settings → Roles, review every role that includes
list_deployment_server. Remove it from any role that doesn't actively manage deployment-server clients. Fewer capable victims = smaller target set. Deploy within 30 days. - Add a detection for SPL run as splunk-system-user against credential endpoints — Search
index=_audit action=search user=splunk-system-user search="*storage/passwords*"and alert on any hit from a source_type indicating web-triggered execution. This catches post-exploitation credential dumping. Deploy within 30 days. - Force session invalidation and re-auth — Lower Splunk Web idle timeout (
tools.sessions.timeoutinweb.conf) to 15 minutes for admin roles so that even a compromised link is unlikely to hit an active session. Deploy within 30 days.
- Web Application Firewall signatures — CSRF exploitation uses a legitimate GET to a legitimate endpoint with a valid session cookie; there is no anomalous payload signature to match on.
- MFA on Splunk Web login — MFA gates *login*, not subsequent requests. Once the admin has a session, MFA offers no CSRF protection.
- Disabling the Deployment Server role on indexers — the vulnerable endpoints live in Splunk Web on any instance where the DS admin UI is reachable, not only on nodes acting as a deployment server.
Crowdsourced verification payload.
Run this on each Splunk Enterprise host directly (as root or the splunk user) — e.g. sudo bash check-cve-2026-20296.sh. It reads $SPLUNK_HOME/etc/splunk.version (or falls back to splunk version) and compares against the fixed-version matrix. For Splunk Cloud Platform, Splunk auto-patches on the schedule in the advisory — no host-level check applies.
#!/usr/bin/env bash
# check-cve-2026-20296.sh — Splunk Enterprise CSRF/SPL-injection in Deployment Server
# Exits 2 = VULNERABLE, 0 = PATCHED, 1 = UNKNOWN
set -u
SPLUNK_HOME="${SPLUNK_HOME:-/opt/splunk}"
VER=""
if [[ -f "$SPLUNK_HOME/etc/splunk.version" ]]; then
VER=$(grep -E '^VERSION=' "$SPLUNK_HOME/etc/splunk.version" | cut -d= -f2 | tr -d '\r\n')
elif command -v splunk >/dev/null 2>&1; then
VER=$(splunk version 2>/dev/null | awk '/Splunk/ {print $2; exit}')
fi
if [[ -z "$VER" ]]; then
echo "UNKNOWN: could not determine Splunk version"
exit 1
fi
echo "Detected Splunk version: $VER"
# Fixed-version matrix per SVD (Enterprise): 10.4.1, 10.2.5, 10.0.8, 9.4.13
vercmp() { # returns 0 if $1 >= $2
printf '%s\n%s\n' "$2" "$1" | sort -V -C
}
MAJOR_MINOR=$(echo "$VER" | awk -F. '{print $1"."$2}')
case "$MAJOR_MINOR" in
10.4) FIXED="10.4.1" ;;
10.2) FIXED="10.2.5" ;;
10.0) FIXED="10.0.8" ;;
9.4) FIXED="9.4.13" ;;
10.3|10.1) # unsupported branches per advisory — treat as VULNERABLE
echo "VULNERABLE: $VER is on an unsupported branch; upgrade to a fixed line"
exit 2 ;;
*)
# 10.5+ or older 9.x lines
if vercmp "$VER" "10.4.1"; then
echo "PATCHED: $VER >= 10.4.1"
exit 0
fi
echo "UNKNOWN: version $VER not in advisory matrix — verify manually"
exit 1 ;;
esac
if vercmp "$VER" "$FIXED"; then
echo "PATCHED: $VER >= $FIXED"
exit 0
else
echo "VULNERABLE: $VER < $FIXED (CVE-2026-20296)"
exit 2
fi
If you remember one thing.
list_deployment_server capability from any role that doesn't need it. Per the noisgate remediation SLA for HIGH, the vendor patch must be fully deployed within ≤180 days, but because Splunk is your detection plane and holds cleartext integration credentials, treat this as a 30-day patch target and get it done inside the mitigation window. Splunk Cloud is auto-patched — verify your stack version in the Splunk Cloud Console and confirm the advisory-listed fix build is live.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.