
jemalloc ベースの Redis に対して、細工した RESTORE を 1 回送るだけで確実なリモートコード実行を実現 —
DEBUG コマンドなし、/proc なし、gdb なし、ROP なし、ASLR は有効のまま。攻撃者のコマンドが
redis プロセスとして実行されます(デフォルトイメージでは root)。
🔒 非公開リポジトリ — 許可されたセキュリティ研究 / 協調的な情報開示のみを対象としています。再配布は しないでください。このバグは上流で修正済みです(6.2.22 / 7.2.14 / 7.4.9 / 8.2.6 / 8.4.3 / 8.6.3、 コミット
b9dde6fc)。これは修正前のパスを対象としています。
この手法はエンドツーエンドで実証済みです — リファレンスハーネスでの新規実行で
system("id") → uid=0(root) が発火しました(ASLR 有効、enable-debug-command no、2026-07-02 確認済み)。
この単一ファイル再パッケージ版では、初期段階は動作確認済みです(double-free、オーバーラップ、
arb-read → PIE と libc/system の両方が正しく取得されました)。ただし、最終リーク —
OFF_BLOBROBJ 経由の blob_base — はアロケーション順序に依存しており、同梱の定数は
exploit.py のグルーミング(blob_read_short の繰り返し)にきれいに引き継がれませんでした。
それに依存する前に、OFF_BLOBROBJ を実際のビルド+シーケンスに合わせて再調整してください
(WRITEUP.md §7)。リファレンスの発火コードは開発用ハーネス pwn.py/pwnd.py です。その他はすべて検証済みです。
exploit.py — 自己完結型の PoC(標準ライブラリのみ)。先頭の PROFILE ディクショナリでオフセットを設定します。WRITEUP.md — 完全な技術分析(バグ、グルーミング、DEBUG 不要の arb-read、決定性、仕上げ)。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.
Redis 8.6.2(8a8f1a3bb)、jemalloc-5.3.0、x86-64、glibc bookworm、ASLR=2、
enable-debug-command no で検証済み。異なるビルドの場合は、PROFILE オフセットを再調整してください —
WRITEUP.md §7 を参照。
EVAL→clo → arb-read PIE (clo+33) → arb-read system (free@GOT) + blob_base (blob_robj)
→ 16 MB の blob に偽の dictType{hashFunction=system} を配置 → h2->dict->type を偽装 → HGET h2 "<cmd>"
== system("<cmd>").