
Exploit DoS funcional para CVE-2021-32675 en Redis, que aprovecha cabeceras de cadenas masivas de gran tamaño para provocar el agotamiento de la memoria. Incluye instrucciones de uso y un entorno de pruebas basado en Docker.
Este repositorio contiene un exploit funcional para CVE-2021-32675, una vulnerabilidad de denegación de servicio (DoS) en Redis. La falla permite que atacantes remotos no autenticados provoquen pre-asignaciones masivas de memoria en el servidor Redis enviando cabeceras de cadenas masivas sobredimensionadas sin proporcionar datos de argumento, lo que conduce al agotamiento de la memoria y al bloqueo del servicio.
CVE-2021-32675 es una vulnerabilidad en el manejo del búfer de consultas de Redis. Al analizar comandos entrantes en el protocolo RESP (REdis Serialization Protocol), Redis lee la longitud declarada de un argumento de cadena masiva ($<length>\r\n) e inmediatamente pre-asigna un búfer SDS (Simple Dynamic String) en memoria para recibir la carga útil antes de leer cualquier byte de argumento.
Debido a que esta pre-asignación ocurre antes de recibir la carga útil del argumento, un cliente no autenticado puede declarar el tamaño máximo permitido de cadena masiva (por defecto, proto-max-bulk-len es 512 MB) y mantener la conexión abierta indefinidamente sin transmitir los datos reales. Redis retiene la memoria pre-asignada para cada conexión activa, creando una relación de amplificación de aproximadamente 32.000.000× (~16 bytes de tráfico de red resultan en una reserva de memoria de 512 MB).
Abrir múltiples conexiones concurrentes utilizando esta técnica de solo cabecera agota rápidamente la memoria disponible del servidor, causando:
maxmemory está activa.OOM command not allowed).La vulnerabilidad afecta a versiones de Redis anteriores a:
Las instancias de Redis que se ejecutan sin autenticación (requirepass no configurado) o con proto-max-bulk-len predeterminado (512 MB) son vulnerables a este exploit. Las versiones parcheadas imponen un límite estricto de 16 KB en el búfer de protocolo para clientes no autenticados antes de que se realice la pre-asignación.
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Python 3.8+
Instancia de Redis vulnerable (versiones anteriores a 6.2.6 / 6.0.16 o instancias no autenticadas)
python3 exploit.py --host <IP> --port <PUERTO> [opciones]
| Opción | Tipo | Predeterminado | Descripción |
|---|---|---|---|
--host | str | Requerido | Hostname o dirección IP de Redis de destino |
--port | int | 6379 | Número de puerto |
--connections | int | 10 | Número de conexiones maliciosas a abrir |
--size | int | 512 | Tamaño declarado del búfer de cadena masiva en MB |
--hold | int | 5 | Segundos para mantener las conexiones abiertas antes de la limpieza |
--password, --auth | str | None | Contraseña para la autenticación de Redis (si es necesaria) |
python3 exploit.py --host 127.0.0.1 --port 6379 --connections 10 --size 512 --hold 5
Puede lanzar un laboratorio de pruebas local utilizando la configuración de Docker Compose incluida:
# Iniciar Redis vulnerable (puerto 6380) y Redis mitigado (puerto 6381)
docker compose -f conf/docker-compose.yml up -d
# Probar contra la instancia vulnerable
python3 exploit.py --host 127.0.0.1 --port 6380 --connections 10 --size 512
# Probar contra la instancia mitigada
python3 exploit.py --host 127.0.0.1 --port 6381 --password "L4bS3cur3!2024" --connections 10 --size 512
# Detener los contenedores
docker compose -f conf/docker-compose.yml down
Esta Prueba de Concepto se proporciona únicamente con fines educativos, de investigación y de verificación de seguridad. El autor no es responsable de ningún uso indebido, daño o prueba no autorizada contra sistemas sin permiso explícito.