Redis 8.4.7 / 8.4.8 集群安全修复:总线端口无认证,以及 4GB PUBLISH 的堆溢出
Redis 在 8.4 线上连发两个 SECURITY 级别的小版本:8.4.7(9 月 17 日)处理 cluster bus 认证缺失、事务 ACL 回收绕过、TimeSeries 与 Vector Set 崩溃;8.4.8(10 月 26 日)补掉 cluster bus 传播超大 PUBLISH 时的堆溢出。两个版本都是替换式升级,没有新特性,改动集中在集群通信和反序列化路径。
Release notes: https://github.com/redis/redis/blob/8.4/00-RELEASENOTES
8.4.8:cluster bus 上传播 >4GB 消息的堆溢出
集群模式下,PUBLISH / SPUBLISH 消息会通过 cluster bus 转发到其他节点。当单条消息大于 4GB 时,8.4.8 之前的实现在传播路径上会发生堆缓冲区溢出。触发条件要求业务真的往频道里塞 4GB 以上的载荷,正常使用很难碰到;但一旦集群里有发布端能构造这种消息,影响面就是节点级的内存破坏。
如果集群对外开放了 PUBLISH,或者有不受信任的客户端能连到任意节点,这个补丁应当尽快应用。
8.4.7:cluster bus 协议本身没有认证
这是本轮最需要运维关注的一条。cluster bus 协议自身不带认证机制,除非显式开启 tls-cluster。也就是说,任何能网络可达某节点总线端口的机器,都可以参与集群握手并加入集群,进而对集群构成威胁。
8.4.7 做了两件事:
- 集群节点启动时,如果总线端口处于未认证状态,会打印警告。这是提示,不阻断启动。
- 新增配置项
cluster-bus-port-protected-mode,默认no。设为yes后,节点只有在tls-cluster对总线完成认证时才允许启动,把「拒绝在未认证状态下运行」变成一个显式选择。
默认值保持 no,是为了不破坏现有部署;安全姿态的提升需要运维主动打开。
8.4.7 的另外三项修复
- #15673 事务内的 ACL 越权:事务中已排队的命令,在事务真正执行前如果对应 key 的 ACL 权限被回收,旧实现仍然能访问这些 key。修复后会在执行阶段重新校验。
- TimeSeries:从畸形 RDB 载荷恢复出来的压缩 Time Series key,再写入样本时会导致 Redis 崩溃。
- Vector Sets:查询中使用深层嵌套 JSON 会让服务端崩溃。这两个都属于「只要持久化文件或查询输入不可信就可能触发」的类别。
运维检查步骤
1. 确认 tls-cluster 状态
redis-cli -p 6379 CONFIG GET tls-cluster
redis-cli -p 6379 CONFIG GET cluster-bus-port-protected-mode
返回 tls-cluster 为 yes,说明总线已走 TLS 认证;为空或 no,则总线是明文、无认证的。
2. 确认总线端口的暴露面
总线端口默认是客户端端口 +10000(可用 cluster-port 覆盖),它不应出现在任何对公网或对非可信网段开放的规则里。检查监听地址与防火墙:
ss -lntp | grep -E ':(6379|16379)\b'
redis-cli -p 6379 CONFIG GET cluster-announce-ip cluster-announce-port cluster-announce-bus-port
如果节点只在内网互信网段通信,风险可控;如果有跨网段、跨租户或云上安全组放通了高位端口段,优先收敛访问控制。
3. 升级顺序
按节点滚动升级,一次一个节点,确认 cluster_state:ok 且 cluster_nodes 里该节点回到正常角色后再动下一个。先在从节点上升级,再升级主节点,保证升级期间仍有故障转移能力。升完之后集群保持原拓扑,无需重建。
4. protected-mode 设 yes 之前先配好 TLS
tls-cluster yes
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt
cluster-bus-port-protected-mode yes
顺序错了会直接导致节点启动失败:cluster-bus-port-protected-mode yes 加上 tls-cluster no,节点拒绝启动,正在滚动的集群可能起不来。做法是先补齐 TLS 配置、确认节点间总线握手正常、集群状态稳定,再把这个开关设为 yes 并逐个节点重启验证。
更早版本的相关修复
- 8.4.6:CVE-2026-62356(CMSketch RDB 堆越界写);#15478
SORT/GEORADIUS/GEORADIUSBYMEMBER/XREAD/XREADGROUP的 ACL key 权限绕过(ACL 校验的 key 与命令实际访问的 key 可能不一致);#14847 在 arity 错误时检查KEYNUM类命令(如EVAL)ACL 权限的 argv 越界访问;带越界SLOT_INFOslot id 的恶意 RDB 导致内存破坏、可能 RCE;Vector Sets 相关问题;#15594 阻塞客户端链表中的 use-after-free。 - 8.4.4(2026 年 6 月):#15188
cluster-announce-ip拒绝主机名(回归);#14667 / #14886 潜在 TCP 停顿与死锁;#14848 副本全量同步期间处理命令时崩溃。
从 8.4.4 一路补到 8.4.8,跨版本升级时建议直接落到 8.4.8,中间版本不必逐个停留。