
Exploit DoS funzionale per CVE-2021-32675 in Redis, che sfrutta intestazioni di stringhe bulk sovradimensionate per innescare l'esaurimento della memoria. Include istruzioni per l'uso e un ambiente di test basato su Docker.
Questo repository contiene un exploit funzionante per CVE-2021-32675, una vulnerabilità di denial-of-service (DoS) in Redis. La falla consente ad attaccanti remoti non autenticati di innescare massicce pre-allocazioni di memoria sul server Redis inviando intestazioni di bulk string sovradimensionate senza fornire i dati degli argomenti, portando all'esaurimento della memoria e al crash del servizio.
CVE-2021-32675 è una vulnerabilità nella gestione del buffer delle query di Redis. Durante l'analisi dei comandi in arrivo nel protocollo RESP (REdis Serialization Protocol), Redis legge la lunghezza dichiarata di un argomento bulk string ($<length>\r\n) e pre-alloca immediatamente un buffer SDS (Simple Dynamic String) in memoria per ricevere il payload prima di leggere qualsiasi byte dell'argomento.
Poiché questa pre-allocazione avviene prima di ricevere il payload dell'argomento, un client non autenticato può dichiarare la dimensione massima consentita per una bulk string (per impostazione predefinita, proto-max-bulk-len è 512 MB) e mantenere la connessione aperta indefinitamente senza trasmettere i dati effettivi. Redis conserva la memoria pre-allocata per ogni connessione attiva, creando un rapporto di amplificazione di circa 32.000.000× (~16 byte di traffico di rete comportano una riserva di memoria di 512 MB).
L'apertura di più connessioni concorrenti utilizzando questa tecnica basata solo sull'intestazione esaurisce rapidamente la memoria disponibile del server, causando:
maxmemoryOOM command not allowed).La vulnerabilità interessa le versioni di Redis precedenti a:
Le istanze Redis eseguite senza autenticazione (requirepass non configurato) o con il proto-max-bulk-len predefinito (512 MB) sono vulnerabili a questo exploit. Le versioni patchate impongono un limite rigoroso di 16 KB per il buffer di protocollo per i client non autenticati prima che avvenga la pre-allocazione.
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Python 3.8+
Istanza Redis vulnerabile (versioni precedenti a 6.2.6 / 6.0.16 o istanze non autenticate)
python3 exploit.py --host <IP> --port <PORT> [options]
| Opzione | Tipo | Predefinito | Descrizione |
|---|---|---|---|
--host | str | Obbligatorio | Hostname o indirizzo IP del Redis di destinazione |
--port | int | 6379 | Numero di porta |
--connections | int | 10 | Numero di connessioni dannose da aprire |
--size | int | 512 | Dimensione dichiarata del buffer bulk string in MB |
--hold | int | 5 | Secondi per mantenere aperte le connessioni prima della pulizia |
--password, --auth | str | None | Password per l'autenticazione Redis (se necessaria) |
python3 exploit.py --host 127.0.0.1 --port 6379 --connections 10 --size 512 --hold 5
Puoi avviare un laboratorio di test locale utilizzando la configurazione Docker Compose inclusa:
# Avvia Redis vulnerabile (porta 6380) e Redis mitigato (porta 6381)
docker compose -f conf/docker-compose.yml up -d
# Test contro l'istanza vulnerabile
python3 exploit.py --host 127.0.0.1 --port 6380 --connections 10 --size 512
# Test contro l'istanza mitigata
python3 exploit.py --host 127.0.0.1 --port 6381 --password "L4bS3cur3!2024" --connections 10 --size 512
# Arresta i container
docker compose -f conf/docker-compose.yml down
Questa Proof of Concept è fornita esclusivamente a scopo educativo, di ricerca e di verifica della sicurezza. L'autore non è responsabile per qualsiasi uso improprio, danno o test non autorizzato contro sistemi senza esplicita autorizzazione.