Redis 8.4.6 安全修复:ACL 键校验绕过与恶意 RDB 的 RCE 路径
版本:Redis Open Source 8.4.6(2026-08),Update urgency: SECURITY。来源:Redis Open Source 8.4 release notes。
这轮更新里,两处问题最值得单独看:一是 ACL 对键的权限校验和命令实际访问的键不一致,二是恶意 RDB 载荷可以在加载阶段打出内存破坏,直至远程代码执行。
8.4.6 修复清单
- (CVE-2026-62356) CMSketch RDB 加载时缓冲区大小计算错误,可能导致堆越界写。
- TopK 堆清理路径越界访问(MOD-15410)。
- 一条命令关闭另一个 pending 连接时,TLS pending-data 链表出现 use-after-free。
- #15478 ACL 键权限绕过,影响
SORT、GEORADIUS/GEORADIUSBYMEMBER与XREAD/XREADGROUP:ACL 校验的键可能与命令实际访问的键不同。 - #14847 检查 KEYNUM keyspec 命令(例如
EVAL)的 ACL 权限、且参数个数错误时,键提取过程中出现越界 argv 访问。 - 恶意 RDB 载荷带越界的
SLOT_INFOslot id,RDB 加载期间造成内存破坏,可能导致远程代码执行。 - Vector Sets:从 RDB 加载 vector set 时缺少节点级校验,可能导致越界访问。
- Vector Sets:
VREM在后台VSIM线程仍在运行时修改 HNSW 图,出现 use-after-free。 - Vector Sets:
hnsw_search()返回负数被当作巨大的无符号计数,读取超出结果数组末尾。 - #15594 重新处理一条命令导致另一个阻塞在同一键上的客户端被驱逐时,blocked-client 链表出现 use-after-free。
ACL:校验的键和实际访问的键不是同一个
#15478 的核心是键提取结果与命令真正读写的键对不上。受影响命令集中在 SORT、GEORADIUS/GEORADIUSBYMEMBER 和 XREAD/XREADGROUP。在多租户环境下,一个用户被 ACL 限制在 tenant:a:*,但通过上述命令的键参数形式,可能让服务端校验一个键、实际访问另一个键,从而读到不属于自己的数据。
#14847 发生在 ACL 检查 KEYNUM keyspec 命令的路径上,典型命令是 EVAL。当参数个数错误时,键提取过程会越界访问 argv。它和 #15478 同属 ACL 键处理链路,一个是“校验错键”,一个是“键还没取对就越界”。
同一版本线里还有一条相关记录:8.4.4 修过 #14659,MSETEX 上的 ACL key-pattern 绕过。如果 ACL 规则按 key pattern 做租户隔离,需要把这几条放在一起看。
恶意 RDB:从 SLOT_INFO 越界到 Vector Sets UAF
RDB 加载是这轮远程代码执行风险的主要入口。SLOT_INFO 中越界的 slot id 会在加载期间直接造成内存破坏,攻击者可以构造 RDB 文件,让实例在恢复数据时触发问题。
RESTORE 链路在 8.4.5 已经修过一轮:
- 通过
RESTORE加载 stream consumer group 时的 use-after-free,可能导致 RCE。 - RedisBloom/RedisBloom#1039:在 RedisBloom 与 TDigest 中构造的
RESTORE载荷可能触发越界写,可能导致 RCE。
8.4.3 还有 (CVE-2026-25243) RESTORE 非法内存访问可能 RCE、(CVE-2026-25588) Time Series RESTORE、(CVE-2026-25589) Probabilistic RESTORE。如果实例允许不可信来源调用 RESTORE,或者会加载外部传入的 RDB 文件,这些路径需要一并封住。
Vector Sets 在 8.4.6 修了三处:RDB 加载缺少节点级校验导致越界访问;VREM 在后台 VSIM 线程运行时修改 HNSW 图导致 use-after-free;hnsw_search() 返回负数被当作巨大无符号计数,读取超出结果数组末尾。前两条都和“加载/并发修改图结构”有关,第三条是搜索结果计数处理错误。
多租户加固清单
- 不要给不可信用户
SORT、GEORADIUS、GEORADIUSBYMEMBER权限。需要地理查询时,优先用GEOSEARCH一类不在此次受影响列表里的命令,或在应用层做键前缀校验。 - 禁用普通业务账号的
RESTORE权限。RESTORE只留给可信的迁移/运维账号,且这些账号不应同时具备CONFIG、MODULE等管理权限。 - 限制
CONFIG。CONFIG SET可以改dir、dbfilename、复制与持久化参数,在多租户里不应开放给业务用户。用 ACL 分类控制,例如只给+@read、+@write等必要类别,不要给+@admin、+@dangerous。 - 用 ACL 分类和 key pattern 做租户隔离,但要意识到 pattern 校验曾出现绕过(#15478、#14659)。升级到 8.4.6 后再依赖 pattern 做强隔离,并对关键租户做交叉读写测试。
- Vector Sets 慎用。尤其在
VSIM后台线程运行期间避免并发VREM,升级前不要加载来源不明的含 vector set 的 RDB。 - RDB 文件来源要可信。限制数据目录写权限,不接受外部上传的 RDB,复制链路和备份恢复流程按可信边界处理。
- 关闭或限制
DEBUG、MODULE LOAD等能直接操作内存和加载代码的命令。
升级到 8.4.6 的检查顺序
- 确认当前版本:
INFO server或redis-server --version,记录 8.4.x 小版本,确认是否已包含 8.4.4/8.4.5 的修复。 - 审计 ACL:
ACL LIST、ACL GETUSER,找出拥有SORT、GEORADIUS、GEORADIUSBYMEMBER、XREAD、XREADGROUP、EVAL、RESTORE的用户,先临时收回高风险命令权限。 - 检查 RDB/RESTORE 入口:确认是否有外部 RDB 加载、跨租户
RESTORE、模块数据恢复流程;不可信来源的 RDB 在升级前不要加载。 - 升级实例:副本先升、主后升;集群按 slot 滚动。同步对齐模块版本(RedisBloom、RediSearch、Time Series),避免模块侧
RESTORE路径仍停留在旧版本。 - 升级后验证:用受限 ACL 用户跑一遍跨 key pattern 的
SORT/GEORADIUS/XREADGROUP用例;用测试载荷验证RESTORE权限已被拒绝;对 Vector Sets 做VADD/VSIM/VREM并发与 RDB 重载测试。 - 复核
CONFIG与危险命令限制,确认业务账号没有+@admin、+@dangerous分类。
版本基线
- 8.4.5(2026-07):SECURITY。
RESTORE加载 stream consumer group 的 use-after-free、RedisBloom/TDigestRESTORE载荷越界写。Bug fix:RedisBloom/RedisBloom#1020 复制CF.LOADCHUNK数据块,避免 failover 时 Cuckoo Filter 静默丢数据。 - 8.4.4(2026-06):HIGH。含 #15175/RediSearch#9262 AArch64 无法启动、#15163 MULTI 队列内存统计错误、#14537
SCAN恢复原始过滤器顺序、#14659MSETEXACL key-pattern 绕过、#14623XTRIM/XADD在 approximate(~)模式下不按 DELREF/ACKED 策略删除条目、#15188cluster-announce-ip拒绝主机名、#14667/#14886 潜在 TCP stall/死锁、RediSearch#9635 大索引上EXPIRE/EXPIREAT与查询并发的延迟尖刺。 - 8.4.3(2026-05):SECURITY,含 (CVE-2026-23479) unblock client 流程 UAF 可能 RCE、(CVE-2026-25243)
RESTORE非法内存访问可能 RCE、(CVE-2026-23631) Lua UAF、(CVE-2026-25588) Time SeriesRESTORE、(CVE-2026-25589) ProbabilisticRESTORE,以及VADD大 REDUCE 值崩溃/缓冲区溢出、VSET巨大分配崩溃。 - 8.4.2(2026-02):SECURITY,用户可通过在 Redis 错误回复中注入
\r\n序列操纵连接读取的数据。 - 8.4.0 GA(2025-11-18):
DIGEST、DELEX、SET扩展(原子 compare-and-set / compare-and-delete)、MSETEX、XREADGROUP的 CLAIM 选项、CLUSTER MIGRATION(原子 slot 迁移)、CLUSTER SLOT-STATS(每 slot 的 key 数、CPU 时间、网络 I/O)、FT.HYBRID混合检索与融合打分、Redis query engine 的FT.*I/O 线程、I/O 线程整体吞吐提升、JSON 同构数组内存最多降低 91%。配置项:lookahead(默认 16)、aof-load-corrupt-tail-max-size、decode_array_with_array_mt、search-default-scorer(新默认 BM25STD)、search-on-oom(IGNORE / FAIL / RETURN,默认 RETURN)、search-io-threads(默认 20)。已知限制:原子 slot 迁移期间FT.SEARCH、FT.AGGREGATE、FT.CURSOR、FT.HYBRID与TS.MGET、TS.MRANGE、TS.MREVRANGE、TS.QUERYINDEX可能返回部分结果或重复项;FT.PROFILE/FT.EXPLAIN/FT.EXPLAINCLI不包含FT.HYBRID选项;FT.HYBRID指标不出现在FT.INFO与INFO;FT.HYBRID尚不支持EXPLAINSCORE、SHARD_K_RATIO、YIELD_DISTANCE_AS、WITHCURSOR;COMBINE之后的FILTER后置过滤不支持。