
Exploit funcional de DoS para CVE-2021-32675 no Redis, aproveitando cabeçalhos de strings em massa superdimensionados para provocar esgotamento de memória. Inclui instruções de uso e ambiente de teste baseado em Docker.
Este repositório contém um exploit funcional para CVE-2021-32675, uma vulnerabilidade de negação de serviço (DoS) no Redis. A falha permite que atacantes remotos não autenticados acionem pré-alocações massivas de memória no servidor Redis ao enviar cabeçalhos de strings em massa superdimensionados sem fornecer dados de argumento, levando ao esgotamento de memória e à queda do serviço.
CVE-2021-32675 é uma vulnerabilidade no tratamento do buffer de consulta do Redis. Ao analisar comandos recebidos no protocolo RESP (REdis Serialization Protocol), o Redis lê o comprimento declarado de um argumento de string em massa ($<length>\r\n) e imediatamente pré-aloca um buffer SDS (Simple Dynamic String) na memória para receber o payload antes de ler qualquer byte de argumento.
Como essa pré-alocação ocorre antes de receber o payload do argumento, um cliente não autenticado pode declarar o tamanho máximo permitido de string em massa (por padrão, proto-max-bulk-len é 512 MB) e manter a conexão aberta indefinidamente sem transmitir os dados reais. O Redis retém a memória pré-alocada para cada conexão ativa, criando uma taxa de amplificação de aproximadamente 32.000.000× (~16 bytes de tráfego de rede resultam em uma reserva de memória de 512 MB).
Abrir múltiplas conexões concorrentes usando essa técnica somente de cabeçalho esgota rapidamente a memória disponível do servidor, causando:
maxmemory estiver ativa.OOM command not allowed).A vulnerabilidade afeta versões do Redis anteriores a:
Instâncias Redis executando sem autenticação (requirepass não configurado) ou com proto-max-bulk-len padrão (512 MB) são vulneráveis a este exploit. Versões corrigidas impõem um limite estrito de 16 KB no buffer de protocolo para clientes não autenticados antes que a pré-alocação ocorra.
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Python 3.8+
Instância Redis vulnerável (versões anteriores a 6.2.6 / 6.0.16 ou instâncias não autenticadas)
python3 exploit.py --host <IP> --port <PORT> [options]
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
--host | str | Obrigatório | Hostname ou endereço IP do Redis alvo |
--port | int | 6379 | Número da porta |
--connections | int | 10 | Número de conexões maliciosas a abrir |
--size | int | 512 | Tamanho declarado do buffer de string em massa em MB |
--hold | int | 5 | Segundos para manter conexões abertas antes da limpeza |
--password, --auth | str | None | Senha para autenticação Redis (se necessário) |
python3 exploit.py --host 127.0.0.1 --port 6379 --connections 10 --size 512 --hold 5
Você pode iniciar um laboratório de teste local usando a configuração Docker Compose incluída:
# Iniciar Redis vulnerável (porta 6380) e Redis mitigado (porta 6381)
docker compose -f conf/docker-compose.yml up -d
# Testar contra a instância vulnerável
python3 exploit.py --host 127.0.0.1 --port 6380 --connections 10 --size 512
# Testar contra a instância mitigada
python3 exploit.py --host 127.0.0.1 --port 6381 --password "L4bS3cur3!2024" --connections 10 --size 512
# Parar os contêineres
docker compose -f conf/docker-compose.yml down
Esta Prova de Conceito é fornecida apenas para fins educacionais, de pesquisa e verificação de segurança. O autor não é responsável por qualquer uso indevido, dano ou teste não autorizado contra sistemas sem permissão explícita.