
Exploit affidabile di esecuzione remota di codice per CVE-2026-25243 che mira a jemalloc Redis. Esegue comandi arbitrari tramite un singolo comando RESTORE appositamente creato senza DEBUG, /proc o ROP. Include grooming completo dell'heap e catena arb-read per il bypass di ASLR.
Esecuzione di codice remoto affidabile da un singolo RESTORE appositamente costruito su Redis con jemalloc —
niente comando DEBUG, niente /proc, niente gdb, niente ROP, ASLR attivo. Esegue il comando dell'attaccante come
processo redis (root nelle immagini di default).
🔒 Repository privato — solo ricerca di sicurezza autorizzata / divulgazione coordinata. Non ridistribuire. Il bug è stato corretto upstream (6.2.22 / 7.2.14 / 7.4.9 / 8.2.6 / 8.4.3 / 8.6.3, commit
b9dde6fc); questo codice punta al percorso pre-fix.
La tecnica è provata end-to-end — un'esecuzione pulita sull'harness di riferimento ha lanciato
system("id") → uid=0(root) (ASLR attivo, ), confermato il 2026-07-02.
In questo , le fasi iniziali sono confermate funzionanti (double-free, overlap,
arb-read → e recuperati correttamente), ma la leak finale —
tramite — è e la costante inclusa non si è
trasferita correttamente al groom di (ripetuto ). (WRITEUP.md §7) prima di farvi affidamento; il codice di lancio di riferimento è
l'harness di sviluppo /. Tutto il resto è validato.
enable-debug-command nosystemblob_baseOFF_BLOBROBJexploit.pyblob_read_shortOFF_BLOBROBJ
per la propria build+sequenza esattapwn.pypwnd.pyexploit.py — PoC autonomo (solo stdlib). Definire gli offset nel dict PROFILE in cima.WRITEUP.md — analisi tecnica completa (bug, groom, arb-read senza DEBUG, determinismo, finale).python3 exploit.py --host <target> --port 6379 --cmd 'id' --tries 40
# fires system("<cmd>") as the redis process; verify out-of-band or use a reverse-shell --cmd.
Validato su Redis 8.6.2 (8a8f1a3bb), jemalloc-5.3.0, x86-64, glibc bookworm, ASLR=2,
enable-debug-command no. Per una build diversa, ricalibrare gli offset di PROFILE — vedere
WRITEUP.md §7.
EVAL→clo → arb-read PIE (clo+33) → arb-read system (free@GOT) + blob_base (blob_robj)
→ posizionare un falso dictType{hashFunction=system} in un blob da 16 MB → forgiare h2->dict->type → HGET h2 "<cmd>"
== system("<cmd>").