← Back to Feed CACHED · 2026-07-16 06:34:02 · CACHE_KEY CVE-2026-20296
CVE-2026-20296 · CWE-352 · Disclosed 2026-07-15

In Splunk Enterprise versions below 10

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

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.

"CSRF + SPL injection in Splunk Deployment Server — one admin click drains credentials and indexed data as splunk-system-user."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Identify a target Splunk admin and Splunk Web URL

Attacker enumerates the victim's Splunk Web endpoint (often 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.
Conditions required:
  • Splunk Web reachable from the victim's browser
  • Victim holds list_deployment_server capability
  • Victim has an active Splunk Web session cookie
Where this breaks in practice:
  • Most enterprises expose Splunk Web only on the management VLAN, not the internet
  • The capability is usually restricted to a handful of platform engineers
Detection/coverage: Shodan/Censys will surface external Splunk Web on port 8000; internal exposure is invisible to external scanners.
STEP 02

Deliver a CSRF payload page

The attacker hosts an HTML page containing an <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.
Conditions required:
  • 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)
Where this breaks in practice:
  • Secure email gateways strip/rewrite external URLs
  • SameSite=Strict on the Splunk session cookie would break this — check web.conf
Detection/coverage: Proxy/SWG logs will show the outbound request to the attacker's page but the CSRF request itself is same-origin to Splunk and will appear in Splunk's own web_access.log.
STEP 03

Victim clicks; browser fires the CSRF GET

When the admin's browser loads the attacker page, it issues a 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.
Conditions required:
  • Victim actively logged into Splunk Web
  • No reverse proxy stripping the request
Where this breaks in practice:
  • An idle-timeout session would already be expired
  • Some orgs front Splunk Web with an SSO proxy that enforces Sec-Fetch-Site header checks
Detection/coverage: web_access.log and audittrail index will record the search — but attribution to the victim not the attacker.
STEP 04

SPL executes as splunk-system-user

The injected SPL runs with the internal 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.
Conditions required:
  • Splunk configured with stored credentials (typical for any DBX, LDAP, HEC, or forwarder deployment)
Where this breaks in practice:
  • splunk_secret on-disk encryption means exfil requires the SPL to decrypt via /services/storage/passwords REST — which is exactly what splunk-system-user can do
Detection/coverage: Splunk's own 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.
STEP 05

Credential reuse / lateral movement

Stolen credentials — AD service accounts used for LDAP bind, cloud API keys used by DBX or HEC integrations, forwarder deployment secrets — are replayed against the source systems. In mature SOCs, Splunk is wired into ServiceNow, PagerDuty, EDR APIs; each stored password becomes a pivot into that system.
Conditions required:
  • Stored integrations exist (they always do in production Splunk)
Where this breaks in practice:
  • 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
Detection/coverage: Downstream logs (AD 4624, cloud audit trails) show the reuse — but only if you correlate them back to the Splunk breach window.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo known exploitation as of 2026-07-16. Not on CISA KEV. No public reports of active abuse.
Public PoCNo 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.
EPSSNot 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 statusNot listed. No CISA due date.
CVSS vectorCVSS: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 versionsSplunk 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 versionsEnterprise: 10.4.1, 10.2.5, 10.0.8, 9.4.13. Cloud: auto-patched by Splunk on the versions above.
Exposure dataShodan shows roughly ~9k internet-exposed Splunk Web instances on port 8000/8089; the vast majority of enterprise Splunk deployments keep Web internal-only.
DisclosureAdvisory SVD-2026-0605 class, published 2026-07-15 by Splunk PSIRT.
CreditReported through Splunk's coordinated disclosure program; specific researcher name pending advisory publication.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to HIGH (7.8/10)

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.

HIGH vulnerability mechanics and affected versions
HIGH blast radius on typical Splunk deployments
MEDIUM likelihood of near-term exploitation (no PoC yet, but trivial to weaponize)

Why this verdict

  • Role multiplier — Splunk is SIEM/detection plane: on the canonical enterprise Splunk deployment, splunk-system-user can 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 granted list_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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. Set session cookies to SameSite=Strict — In $SPLUNK_HOME/etc/system/local/web.conf, set tools.sessions.secure = True and enforce SameSite=Strict at the reverse proxy on the Splunk session cookie. A strict cookie policy prevents the CSRF GET from carrying the session at all. Deploy within 30 days.
  3. 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.
  4. 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.
  5. Force session invalidation and re-auth — Lower Splunk Web idle timeout (tools.sessions.timeout in web.conf) to 15 minutes for admin roles so that even a compromised link is unlikely to hit an active session. Deploy within 30 days.
What doesn't work
  • 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.
06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: enumerate every Splunk Enterprise instance, run the verification script, and open change tickets to upgrade to 10.4.1 / 10.2.5 / 10.0.8 / 9.4.13 on the affected branches. Per the noisgate mitigation SLA for HIGH, you have ≤30 days to land the compensating controls — SameSite=Strict on the session cookie, ACL Splunk Web to management subnets, and prune the 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

  1. Splunk PSIRT — Advisories index
  2. Splunk Vulnerability Disclosure portal
  3. THREATINT — CVE-2026-20296
  4. NVD — CVE-2026-20296
  5. CWE-352: Cross-Site Request Forgery
  6. Splunk docs — web.conf and session cookie hardening
  7. Splunk docs — Deployment Server
  8. CISA Known Exploited Vulnerabilities Catalog
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.