Redis再曝高危漏洞:CVE-2026-25243补丁绕过,可从认证用户到远程代码执行

admin 2026-08-04 07:51:27 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: RedisStream相关漏洞CVE-2026-25243补丁绕过,攻击者利用RDB加载时nack对象共享缺陷,触发useafterfree和doublefree,通过jemalloc实现任意地址读写,最终劫持函数指针获得远程代码执行。影响Redis6.2.22、7.4.9、8.6.4等版本,8.8.0修复。防御建议包括升级、限制危险命令、不暴露公网、强化认证。 综合评分: 100 文章分类: 漏洞分析,红队,应急响应,漏洞预警


cover_image

Redis 再曝高危漏洞:CVE-2026-25243 补丁绕过,可从认证用户到远程代码执行

云梦DC 云梦DC

云梦安全

2026年7月28日 11:36 日本

在小说阅读器读本章

去阅读

近日,安全研究人员公开分析了一枚 Redis Stream 相关漏洞。

这个漏洞比较特殊:

它不是一个普通的新漏洞,而是CVE-2026-25243 的补丁绕过版本。

攻击者无需 Redis 管理权限,只需要拥有有效认证凭据,并且目标允许执行部分高危命令,就可能通过精心构造的数据触发:

堆双重释放(Double Free) → 任意地址读写 → 函数指针劫持 → Redis 远程代码执行(RCE)

漏洞影响多个 Redis 版本,包括:

Redis 6.2.22

Redis 7.4.9

Redis 8.6.4

目前 Redis 8.8.0 通过代码重构修复了这一攻击面。


一、从 Redis Stream 消费者组说起

很多 Redis 用户熟悉:

String

Hash

List

Set

但 Redis 也提供了一套消息流机制:

Redis Stream。

它类似一个轻量级消息队列。

例如:

producer

|

Redis Stream

|

consumer group

多个消费者可以共同处理消息。

为了保证消息可靠消费,Redis 引入了:

Pending Entries List(PEL)

也就是:

待确认消息列表。

当消费者读取消息后,如果没有执行 ACK:

这条消息会进入 PEL。

Redis 会记录:

哪个消费者领取了消息;

消息 ID;

投递次数;

状态信息。

问题,也正出现在这里。


二、漏洞核心:两个消费者共享了一块内存

正常情况下:

消费者 A:

PEL

|

+– streamNACK 对象 A

消费者 B:

PEL

|

+– streamNACK 对象 B

两个消费者应该拥有独立的 NACK 结构。

但是在 Redis 加载 RDB 数据时:

出现了一个逻辑错误。

当 Redis 从 RDB 文件恢复 Stream 消费者组数据时:

如果两个消费者引用同一条消息 ID:

Redis 没有创建新的 NACK 对象。

而是:

直接复用了之前创建的对象。

结果:

消费者 A

|

|

streamNACK C

|

|

消费者 B

两个消费者指向了同一块内存。


三、为什么共享对象会造成漏洞?

问题在于:

Redis 后续会认为:

这个对象属于每个消费者独立管理。

于是:

攻击者执行:

XGROUP DELCONSUMER

删除消费者 A。

Redis:

释放 NACK C。

此时:

消费者 B:

仍然保存:

streamNACK C

但这块内存已经被释放。

形成:

Use After Free(释放后使用)

随后:

攻击者再次删除消费者 B。

Redis:

再次释放 C。

于是:

出现:

Double Free(双重释放)


四、从内存错误到 RCE:攻击链如何形成?

很多人看到 Double Free 会问:

释放一次内存,为什么能执行命令?

关键在于:

Redis 使用的内存分配器:

jemalloc。

jemalloc 存在:

tcache 缓存机制。

简单理解:

释放的内存块不会立即销毁。

而是进入缓存:

free()

tcache

下一次 malloc()

如果攻击者能够控制:

释放后的内存再次被分配给自己。

就可以制造:

内存复用。


整个利用过程大致分为几个阶段。


阶段 1:利用 UAF 获取任意读能力

攻击者首先构造恶意 Stream 数据。

通过:

RESTORE

加载特殊 RDB 数据。

让两个消费者共享 NACK。

然后:

XGROUP DELCONSUMER

触发释放。

之后攻击者通过堆喷:

覆盖已经释放的内存区域。

构造假的 Redis 对象。

最终实现:

读取 Redis 进程任意地址。


阶段 2:Double Free 建立任意读写

双重释放之后:

同一个内存块可能被 jemalloc 返回两次。

攻击者利用这一点:

构造:

fake dictEntry

fake robj

fake sds

让 Redis 的数据结构指向攻击者控制的位置。

最终获得:

任意地址读写能力。


阶段 3:泄露关键地址

现代 Linux 环境存在:

ASLR。

攻击者不能直接知道:

Redis:

PIE 地址

libc 地址

内存结构地址

因此需要先泄露地址。

利用任意读能力:

攻击者可以获取:

Redis binary base

libc base

内部数据结构地址

为后续代码执行准备条件。


五、最终 RCE:劫持 Redis 函数指针

Redis 内部大量使用函数指针。

其中:

dictType:

负责哈希表操作。

包含:

hashFunction

keyCompare

等函数。

攻击者通过任意写:

修改:

dictType.hashFunction

指向:

system()

之后:

Redis 执行哈希计算时:

调用:

hashFunction(command)

实际变成:

system(command)

最终:

攻击者获得 Redis 用户权限下的代码执行。


六、为什么说这是 CVE-2026-25243 的补丁绕过?

原漏洞修复重点:

解决某些场景下:

NACK 对象异常共享。

但是研究人员发现:

RDB 加载路径仍存在遗漏。

也就是说:

旧补丁修复的是:

某一个入口

而攻击者找到的是:

另一个代码路径

这也是很多补丁绕过漏洞的共同特点:

修复了攻击方法,但没有消除产生问题的根因。


七、漏洞利用条件

虽然漏洞危险,但并不是远程匿名攻击。

攻击者需要满足:

  1. 拥有 Redis 认证凭据

例如:

requirepass

泄露。


  1. 目标开放危险命令

包括:

RESTORE

XGROUP

EVAL

等。


  1. 可以访问 Redis 服务

例如:

公网暴露:

6379/tcp

或者内部网络可达。


八、哪些版本受影响?

受影响:

| Redis版本 | 状态 | | — | — | | Redis 6.2.22 | 受影响 | | Redis 7.4.9 | 受影响 | | Redis 8.6.4 | 受影响 |

修复:

Redis 8.8.0+

该版本通过 PR#15081重构相关代码路径,从根本上避免 NACK 对象共享。


九、防御建议

  1. 优先升级 Redis

建议升级:

Redis >= 8.8.0

这是最有效的方式。


  1. 限制危险命令

如果业务不需要:

建议限制:

RESTORE

EVAL

XGROUP

等命令。

可以通过 ACL:

限制普通账号权限。


  1. 不要暴露 Redis 到公网

Redis 服务:

不要直接开放:

0.0.0.0:6379

建议:

内网访问;

防火墙限制;

安全组控制来源。


  1. 强化认证

避免:

弱密码:

redis123

admin123

同时开启:

ACL 用户隔离。


十、总结

CVE-2026-25243 补丁绕过再次证明:

内存安全漏洞往往不是简单修一个判断条件就能结束。

Redis 这次的问题:

从一个看似普通的数据结构共享错误开始:

NACK对象共享

Use After Free

Double Free

任意读写

函数指针劫持

RCE

整个攻击链展示了现代堆利用的复杂性。

对于企业来说,Redis 最大的风险并不只是漏洞本身。

更重要的是:

不要让一个存储服务同时暴露公网、开放危险命令、使用弱认证。

因为一旦认证凭据泄露,一个看似普通的 Redis 实例,可能直接成为攻击者进入服务器的入口。


免责声明:

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

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

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

本文转载自:云梦安全 云梦DC 云梦DC《Redis 再曝高危漏洞:CVE-2026-25243 补丁绕过,可从认证用户到远程代码执行》

评论:0   参与:  0