
Execução remota de código confiável a partir de um único RESTORE malicioso no Redis com jemalloc —
sem o comando DEBUG, sem /proc, sem gdb, sem ROP, ASLR ativado. Executa o comando do atacante como o
processo redis (root em imagens padrão).
🔒 Repositório privado — apenas pesquisa de segurança autorizada / divulgação coordenada. Não redistribua. O bug foi corrigido upstream (6.2.22 / 7.2.14 / 7.4.9 / 8.2.6 / 8.4.3 / 8.6.3, commit
b9dde6fc); isto visa o caminho anterior à correção.
A técnica está comprovada de ponta a ponta — uma execução nova no harness de referência disparou
system("id") → uid=0(root) (ASLR ativado, enable-debug-command no), confirmado em 2026-07-02.
Neste reempacotamento de arquivo único, os estágios iniciais estão confirmados funcionando (double-free, overlap,
arb-read → PIE e libc/system ambos recuperados corretamente), mas o vazamento final —
blob_base via OFF_BLOBROBJ — é sensível à sequência de alocação e a constante enviada não foi
transferida de forma limpa para o groom de exploit.py (repetidos blob_read_short). Re-calibre OFF_BLOBROBJ
para sua combinação exata de build+sequência (WRITEUP.md §7) antes de confiar nele; o código de disparo de referência é
o harness de desenvolvimento pwn.py/pwnd.py. Todo o resto está validado.
exploit.py — PoC autocontido (apenas stdlib). Defina os offsets no dicionário PROFILE no topo.WRITEUP.md — análise técnica completa (bug, groom, arb-read sem DEBUG, determinismo, conclusão).python3 exploit.py --host <target> --port 6379 --cmd 'id' --tries 40
# fires system("<cmd>") as the redis process; verify out-of-band or use a reverse-shell --cmd.
Validado no Redis 8.6.2 (8a8f1a3bb), jemalloc-5.3.0, x86-64, glibc bookworm, ASLR=2,
enable-debug-command no. Para um build diferente, recalibre os offsets de PROFILE — veja
WRITEUP.md §7.
EVAL→clo → arb-read PIE (clo+33) → arb-read system (free@GOT) + blob_base (blob_robj)
→ colocar dictType{hashFunction=system} falso em um blob de 16 MB → forjar h2->dict->type → HGET h2 "<cmd>"
== system("<cmd>").