【漏洞补丁绕过预警】RedisCVE-2026-23479变种高危漏洞,EXP已公开

admin 2026-08-23 04:31:58 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文披露RedisCVE-2026-23479变种补丁绕过原理。漏洞因阻塞客户端处理中内存淘汰导致UAF,攻击者借此实现任意地址减法,结合CONFIGGET回显转为任意读,再通过Lua泄漏基址篡改命令表哈希回调为system,实现纯TCP的RCE。建议升级至8.8.2或禁用高危命令。 综合评分: 89 文章分类: 漏洞分析,漏洞预警,漏洞POC,渗透测试


【漏洞补丁绕过预警】Redis CVE-2026-23479变种高危漏洞,EXP已公开

YGnight YGnight

night安全

2026年8月22日 09:00 四川

在小说阅读器读本章

去阅读

一、漏洞描述

这个漏洞的补丁在5月份的时候官方就公布了,近期出现了对这个补丁的绕过利用,下面会简单讲一下这个漏洞变种的产生原理

| | | | — | — | | CVE 编号 | CVE-2026-23479变种 补丁绕过 | | 漏洞类型 | 堆使用后释放 UAF / 远程命令执行 | | 影响组件 | Redis 阻塞客户端处理路径 handleClientsBlockedOnKey | | 受影响版本 | Redis 8.8.0 | | 修复版本 | Redis 8.8.2,对应 PR #15594 | | 利用条件 | 能连上 Redis 且有权限执行链中用到的命令,其中必须包括 CONFIG SET;PoC 实验环境用的是默认无认证账号 | | 利用通道 | 纯 TCP 命令面,在开了完整 RELRO、GOT 表不可写的官方镜像上也能落地 | | 不依赖 | 模块加载、文件写入、调试器或服务重启 |

二、漏洞原理

简单说一下漏洞的原理,Redis  在处理某个 key 上的阻塞客户端的时候会用一个链表迭代器遍历  db->blocking_keys[key],过程中会重新执行被阻塞客户端那一条命令。问题就在这里,重新执行可能触发内存淘汰evictClients(),把队列里另一个被阻塞的客户端连同它的链表节点一起释放掉。外层迭代器不知道节点已经没了,下一次取值的时候就把那块回收过的内存当成正常  client  结构使用了。而之前公布的CVE-2026-23479漏洞补丁只保护当前正在执行的客户端,没有管旁边那个相邻客户端,所以就导致了绕过补丁的问题。

利用这块被回收又被重新占用的内存,攻击者把自己构造的假客户端数据塞进释放出来的 1280 字节堆块。假数据里填充的字段对应真实结构体 last_memory_type 和 last_memory_usage

put(0x330, p64(lmu_))               # 控制的减数
put(0x338, struct.pack("<i", lmt_)) &nbsp; # 控制的 server 相对下标

Redis  统计客户端内存时调updateClientMemoryUsage(),按 last_memory_type  给的下标去全局server.stat_clients_type_memory[] 数组里减掉  last_memory_usage。下标和减数都攥在攻击者手里,相当于在全局 server 这块内存上做一次「任意位置 -= 任意值」。

但减法只能写,改不了函数指针,也没法把写进去的值读出来。于是脚本找了一个原本是 NULL、又能通过CONFIG GET 回显的字段 server.bind_source_addr,把它当作减法的落脚点:

OFF_STAT = 0xc18 &nbsp; &nbsp; &nbsp; &nbsp;# stat_clients_type_memory[0],减法基址
OFF_BIND = 0x1d8 &nbsp; &nbsp; &nbsp; &nbsp;# bind_source_addr,原本 NULL
LMT_BIND = (OFF_BIND - OFF_STAT) // 8

要读某个地址T的时候,触发一次减法把 bind_source_addr 写成 T,紧接着发 CONFIG GET bind-source-addr,Redis 会把这个指针当字符串原样回显。能写不能读的减法,就此变成了任意地址读。

有了任意读,剩下的就是定位 system 的地址并改写命令表的哈希回调。脚本先通过 Lua 泄漏 redis.call 闭包的稳定地址:

EVAL "return tostring(redis.call)" 0

第一次读闭包里的函数指针,减去已知偏移  IMG[“luacall”],算出 Redis 主程序加载基址。第二次拿这个基址加上 umask@GOT 偏移,读出 glibc 里  umask 的真实地址,再推算 libc 基址和 system 的地址。第三次用减法把命令表里那个算哈希的回调——原本是  dictSdsCaseHash——直接改写成 system。核心两行:

ex.trigger(lmt_hashfn, (cur - system) & MASK) &nbsp; # 第三次:回调改 system
r = ex.call(shellcmd, t=8.0) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # shell 命令作为命令名发出

改完之后,攻击者把要执行的 shell 命令当作「命令名」发过去。Redis 查找命令表时会拿命令名去调哈希函数,此时哈希函数已经是 system,等价于执行 system(命令名)。命令以 redis-server 进程身份在目标机器上跑起来。

三、修复建议

  1. 升级到 Redis 8.8.2或更高版本
  2. 如果展示不能升级就先禁用高危命令,对Redis 端口加上访问控制。

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:night安全 YGnight YGnight《【漏洞补丁绕过预警】Redis CVE-2026-23479变种高危漏洞,EXP已公开》

    评论:0   参与:  0