
Exploit DoS fonctionnel pour CVE-2021-32675 dans Redis, exploitant des en-têtes de chaînes volumineuses surdimensionnés pour déclencher un épuisement de la mémoire. Inclut des instructions d'utilisation et un environnement de test basé sur Docker.
Ce dépôt contient un exploit fonctionnel pour CVE-2021-32675, une vulnérabilité de déni de service (DoS) dans Redis. La faille permet à des attaquants distants non authentifiés de déclencher des pré-allocations massives de mémoire sur le serveur Redis en envoyant des en-têtes de chaînes volumineuses sans fournir les données d'argument, entraînant l'épuisement de la mémoire et le crash du service.
CVE-2021-32675 est une vulnérabilité dans la gestion du tampon de requêtes de Redis. Lors de l'analyse des commandes entrantes dans le protocole RESP (REdis Serialization Protocol), Redis lit la longueur déclarée d'un argument de chaîne volumineuse ($<longueur>\r\n) et pré-alloue immédiatement un tampon SDS (Simple Dynamic String) en mémoire pour recevoir la charge utile avant de lire les octets de l'argument.
Comme cette pré-allocation se produit avant la réception de la charge utile de l'argument, un client non authentifié peut déclarer la taille maximale autorisée de chaîne volumineuse (par défaut, proto-max-bulk-len est de 512 Mo) et maintenir la connexion ouverte indéfiniment sans transmettre les données réelles. Redis conserve la mémoire pré-allouée pour chaque connexion active, créant un ratio d'amplification d'environ 32 000 000× (~16 octets de trafic réseau entraînent une réservation mémoire de 512 Mo).
L'ouverture de plusieurs connexions simultanées utilisant cette technique d'en-tête uniquement épuise rapidement la mémoire disponible du serveur, provoquant :
maxmemory est active.OOM command not allowed).La vulnérabilité affecte les versions de Redis antérieures à :
Les instances Redis exécutées sans authentification (requirepass non configuré) ou avec le proto-max-bulk-len par défaut (512 Mo) sont vulnérables à cet exploit. Les versions corrigées imposent une limite stricte de 16 Ko du tampon de protocole pour les clients non authentifiés avant que la pré-allocation n'ait lieu.
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Python 3.8+
Instance Redis vulnérable (versions antérieures à 6.2.6 / 6.0.16 ou instances non authentifiées)
python3 exploit.py --host <IP> --port <PORT> [options]
| Option | Type | Défaut | Description |
|---|---|---|---|
--host | str | Requis | Nom d'hôte ou adresse IP Redis cible |
--port | int | 6379 | Numéro de port |
--connections | int | 10 | Nombre de connexions malveillantes à ouvrir |
--size | int | 512 | Taille déclarée du tampon de chaîne volumineuse en Mo |
--hold | int | 5 | Secondes de maintien des connexions ouvertes avant nettoyage |
--password, --auth | str | None | Mot de passe pour l'authentification Redis (si nécessaire) |
python3 exploit.py --host 127.0.0.1 --port 6379 --connections 10 --size 512 --hold 5
Vous pouvez lancer un laboratoire de test local à l'aide de la configuration Docker Compose incluse :
# Démarrer Redis vulnérable (port 6380) et Redis corrigé (port 6381)
docker compose -f conf/docker-compose.yml up -d
# Tester contre l'instance vulnérable
python3 exploit.py --host 127.0.0.1 --port 6380 --connections 10 --size 512
# Tester contre l'instance corrigée
python3 exploit.py --host 127.0.0.1 --port 6381 --password "L4bS3cur3!2024" --connections 10 --size 512
# Arrêter les conteneurs
docker compose -f conf/docker-compose.yml down
Cette preuve de concept est fournie à des fins éducatives, de recherche et de vérification de sécurité uniquement. L'auteur n'est pas responsable de toute utilisation abusive, de tout dommage ou de tout test non autorisé contre des systèmes sans autorisation explicite.