
Redis 2年旧RCE漏洞被AI工具发现
Redis 中编号为 CVE-2026-23479 的已认证使用后释放漏洞自 7.2.0 引入后潜伏两年多,直到 5 月 5 日修复。利用链可借助 Lua、stream 与内存回收最终实现远程代码执行。建议尽快升级到修复版本,并收紧 ACL、避免单一角色同时具备 CONFIG 和脚本权限。
记录为 CVE-2026-23479 的这个漏洞是在 Redis 7.2.0 中引入的,并在 5 月 5 日的修复前一直存在于所有稳定分支中,长达两年多都未被发现。NVD 按 CVSS 3.1 将其评为 8.8;Redis 按 CVSS 4.0 将其评为 7.7。该漏洞由 Team Xint Code 报告,目前完整技术分析已经公开。
云环境中的部署情况让问题更加严重。Wiz 与利用分析报告一起发布的分析显示,Redis 出现在绝大多数云环境中,其中大多数实例都未设置密码。该利用链需要一个已认证会话,但在默认部署中,默认用户已经拥有该链所需的所有权限。
漏洞位于 src/blocked.c 中的 unblockClientOnKey(),该函数会在某个键事件唤醒被阻塞命令时触发。该函数通过 processCommandAndResetClient() 分发队列中的命令,然后继续使用同一个客户端指针。问题在于:该函数可能会把客户端作为副作用释放,而它自己的头部注释也说明了这一点。调用方忽略返回值,仍然读取已被释放的结构体,因此形成了使用后释放(CWE-416)。
根据 Wiz 的分析,这个漏洞是由两个提交共同造成的。2023 年 1 月的一次重构(PR #11012)加入了未检查的调用。2023 年 3 月的一个改动(PR #11568)又在其后增加了更多客户端访问。单独看这两个改动都不危险,但合在一起后,它们进入了 7.2.0 的正式发布,并在多轮安全审查中存活了下来。
这条利用链从泄露堆地址开始。随后,它释放一个客户端,并把一个伪造客户端放进同一块内存,再利用 Redis 自身的内存计账机制去覆盖一个函数指针。
公开的利用版本分为三个阶段。
第一步,一个单行 Lua 脚本(EVAL "return tostring(redis.call)" 0)泄露一个堆指针。
第二步,攻击者调整客户端内存限制,把一个体积较大的客户端挂在 stream 上,然后取消限制并唤醒它。Redis 在调用过程中释放这个被阻塞的客户端,而一个流水线化的 SET 会立即重新占用这块已释放的内存,并写入一个伪造的客户端结构。
第三步,Redis 在 updateClientMemoryUsage() 中的常规内存计账会使用攻击者可控字段执行一次越界递减,目标指向全局偏移表(Global Offset Table),把 strcasecmp() 重定向到 system()。随后 Redis 解析的下一个命令就会作为 shell 命令执行。
官方的 Redis Docker 镜像让最后一步更容易实现。它只启用了部分 RELRO,因此 GOT 在运行时仍可写。ASLR 和 PIE 在这里并不能提供帮助,因为写入是相对于一个全局变量进行的,而该全局变量的偏移在编译时就已固定。
完整利用链需要一个已认证会话,并使用 CONFIG SET、EVAL、stream 命令(XREAD/XADD)以及基本的 SET/GET,这对应 ACL 分类中的 @admin、@scripting、@stream 和 @read/@write。
默认用户拥有这些权限,而在大多数部署中,这些权限又被组合进同一个共享应用或运维角色。直接拒绝 CONFIG 会破坏这条特定利用链,但不会消除底层的使用后释放漏洞。
Team Xint Code 在去年 12 月于伦敦举行的 Wiz 黑客竞赛 ZeroDay.Cloud 2025 上演示了可工作的远程代码执行。Theori 将 Xint Code 描述为一款自主式 AI 安全工具,专门用于在大型代码库中寻找漏洞。
Redis 表示,其自身环境或客户环境中没有看到被利用的证据,并且截至发布时也没有公开的实战攻击报告。不过,完整技术链已经公开,这会增加后续被利用的风险。
请升级到对应系列的已修复小版本:7.2.14、7.4.9、8.2.6、8.4.3 或 8.6.3,这些版本都已于 5 月 5 日发布。同一系列内的小版本升级设计为可直接替换。托管型 Redis 服务会按各自时间表修补,而 Redis 表示 Redis Cloud 已经完成修复。
如果暂时无法打补丁:请将 Redis 置于公网之外并放在 TLS 之后,收紧 ACL,确保没有任何单一角色同时持有 @admin、CONFIG 和 @scripting;如果你并不使用 Lua,则拒绝 @scripting,这可以阻断第一阶段的泄露。
应优先处理暴露在互联网的实例、共享应用凭据,以及任何同时组合了 CONFIG、脚本和 stream 访问权限的角色。与此同时,也应轮换任何广泛共享的 Redis 凭据。
CVE-2026-23479 是上个月披露的五个 RCE 级 Redis 漏洞之一,并且延续了 Redis 在 2025 年的 RediShell 漏洞,后者同样是一个与 Lua 脚本相关的已认证使用后释放漏洞。它也是被 AI 工具发现的那个漏洞。两个提交埋下它,两年时间掩盖了它,而它一直存在于最常部署的数据库之一中,直到一场黑客竞赛才把它暴露出来。代码审查没有发现它。