发布日期: 2026-05-08 作者: TonyCao ([email protected]) 来源: Redis 安全公告
2026 年 5 月 5 日,Redis Ltd. 发布了安全公告,涉及 5 个影响所有 Redis OSS/CE 版本的严重安全漏洞。如果被成功利用,所有这些 CVE 都可能导致远程代码执行 (RCE)。
| # | CVE 编号 | CVSS | 严重程度 | 漏洞类型 | 利用条件 |
|---|---|---|---|---|---|
| 1 | CVE-2026-23479 | 7.7 | 高 | Use-After-Free | 已认证,有权执行阻塞命令 |
| 2 | CVE-2026-25243 | 7.7 | 高 | 无效内存访问 | 已认证,有权执行 RESTORE |
| 3 | CVE-2026-25588 | 7.7 | 高 | 无效内存访问 | 已认证,有权执行 RESTORE + RedisTimeSeries 模块 |
| 4 | CVE-2026-25589 | 7.7 | 高 | 无效内存访问 | 已认证,有权执行 RESTORE + RedisBloom 模块 |
| 5 | CVE-2026-23631 | 6.1 | 中 | Use-After-Free | 已认证,副本且 replica-read-only = 禁用 |
共同点: 所有 CVE 都要求攻击者已对 Redis 实例完成认证(authenticated)。CVE-2026-23631 仅影响配置了
replica-read-only disabled的副本。
| 版本系列 | 已修复版本(最低) |
|---|---|
| 6.2.x | 6.2.22 |
| 7.2.x | 7.2.14 |
| 7.4.x | 7.4.9 |
| 8.2.x | 8.2.6 |
| 8.4.x | 8.4.3 |
| 8.6.x | 8.6.3 |
| 模块 | 最低版本 |
|---|---|
| RedisTimeSeries | 1.12.14 / 1.10.24 / 1.8.23 |
| RedisBloom | 2.8.20 / 2.6.28 / 2.4.23 |
| 版本 | 补丁 |
|---|---|
| 8.0.6 | 8.0.10-64 |
| 7.22.2 | 7.22.2-79 |
| 7.8.6 | 7.8.6-253 |
| 7.4.6 | 7.4.6-279 |
| 7.2.4 | 7.2.4-153 |
所有 Redis Cloud 部署在公告发布时均已自动完成补丁更新。
| 属性 | 值 |
|---|---|
| 标题 | 解除客户端阻塞流程中的 Use-After-Free |
| CVSS 4.0 | 7.7(高) |
| CWE | CWE-416(释放后使用) |
| 向量 | AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| 条件 | 攻击者已认证,有权执行阻塞命令 |
| 范围 | 所有 Redis OSS/CE,Redis Software <= 8.0.6 |
当客户端处于阻塞状态(blocked)——例如正在等待 BLPOP——在重新执行被阻塞命令期间被驱逐(evict)时,processCommandAndResetClient 函数可能返回错误。当前代码未正确处理此情况,导致指针引用了已释放的内存区域(use-after-free)。攻击者可以利用 UAF 实现远程代码执行(RCE)。
unblock client、processCommandAndResetClient 相关的函数redis-server 进程执行了未定义的命令BLPOP, BRPOP, BRPOPLPUSH, BLMOVE, BLMPOP, BZPOPMIN, BZPOPMAX, BZMPOP, WAIT, WAITAOF, XREAD, XREADGROUP
#### 修复方法(不升级)
**方法 1 — 通过 ACL 阻止(推荐):**```bash
# Chặn toàn bộ nhóm lệnh blocking
redis-cli ACL SETUSER default -@blocking
# Hoặc chặn từng lệnh cụ thể
redis-cli ACL SETUSER default -BLPOP -BRPOP -BRPOPLPUSH -BLMOVE -BLMPOP \
-BZPOPMIN -BZPOPMAX -BZMPOP \
-WAIT -WAITAOF \
-XREAD -XREADGROUP
# Lưu ACL
redis-cli ACL SAVE
方法 2 — 通过 rename-command 禁用(需要重启 Redis):```bash
rename-command BLPOP "" rename-command BRPOP "" rename-command BRPOPLPUSH "" rename-command BLMOVE "" rename-command BLMPOP "" rename-command BZPOPMIN "" rename-command BZPOPMAX "" rename-command BZMPOP "" rename-command WAIT "" rename-command WAITAOF "" rename-command XREAD "" rename-command XREADGROUP ""
**方法 3 — 启用 protected-mode 并限制连接:**```bash
redis-cli CONFIG SET protected-mode yes
# Trong redis.conf:
protected-mode yes
bind 127.0.0.1
| 属性 | 值 |
|---|---|
| 标题 | RESTORE 命令中的无效内存访问 |
| CVSS 4.0 | 7.7(高危) |
| CWE | CWE-20(输入验证不当)+ CWE-122(堆缓冲区溢出) |
| 向量 | AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| 条件 | 已认证的攻击者,具有执行 RESTORE 的权限 |
| 影响范围 | 所有 Redis OSS/CE、Redis Software <= 8.0.6 |
该漏洞包含 2 个子问题:
已认证的攻击者发送特制的 RESTORE payload 以利用上述错误,可能导致在 redis-server 进程上下文中实现 RCE。
方法 1 — 通过 ACL 阻止 RESTORE(推荐):```bash
redis-cli ACL SETUSER default -restore
redis-cli ACL SETUSER default -@dangerous
redis-cli ACL SAVE
**方法 2 — 禁用 RESTORE(需要重启 Redis):**```bash
# Thêm vào redis.conf:
rename-command RESTORE ""
方法 3 — 为应用程序创建独立的用户 ACL:```bash
redis-cli ACL SETUSER app_user on >StrongPass123 ~*
+@read +@write
-@dangerous
-@admin
-@scripting
-@blocking
-restore
-debug
redis-cli ACL SAVE
---
### CVE-2026-25588
| 属性 | 值 |
| ----------- | ---------------------------------------------------------------- |
| **标题** | RedisTimeSeries 模块中 RESTORE 的无效内存访问 |
| **CVSS 4.0**| **7.7(高危)** |
| **CWE** | CWE-20 + CWE-122 |
| **向量** | `AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N` |
| **条件** | 已认证 + 拥有 RESTORE 权限 + **已加载 RedisTimeSeries 模块** |
| **范围** | Redis OSS/CE + RedisTimeSeries 模块 |
#### 技术描述
当在已加载 **RedisTimeSeries 模块** 的实例上使用 `RESTORE` 命令时,特制的序列化负载可能会在处理时间序列数据期间触发无效内存访问。该漏洞存在于 RedisTimeSeries 模块从 RESTORE 负载反序列化数据的方式中。
#### 识别迹象
- Redis 崩溃,堆栈跟踪与 RedisTimeSeries 模块相关
- RedisTimeSeries 模块已加载(`MODULE LIST` 显示 timeseries)
- redis-server 执行了非预期的命令
#### 修复方法(不升级)
**方法 1 — 通过 ACL 阻止 RESTORE:**(与 CVE-2026-25243 相同)```bash
redis-cli ACL SETUSER default -restore
redis-cli ACL SAVE
方法 2 — 卸载 RedisTimeSeries 模块(如果不需要):```bash redis-cli MODULE UNLOAD timeseries
然后从 `redis.conf` 中删除以下行:```
loadmodule /path/to/redistimeseries.so
方法 3 — 仅升级模块(不升级 Redis):
下载已修补的模块版本:
redis-cli MODULE UNLOAD timeseries redis-cli MODULE LOAD /path/to/new/redistimeseries.so
### CVE-2026-25589
| 属性 | 值 |
| ----------- | ------------------------------------------------------------------------------ |
| **标题** | RedisBloom 模块中 RESTORE 的无效内存访问 |
| **CVSS 4.0**| **7.7(高危)** |
| **CWE** | CWE-20 + CWE-122 + CWE-787(越界写入)+ CWE-190(整数溢出) |
| **向量** | `AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N` |
| **条件** | 已认证 + 拥有 RESTORE 权限 + **已加载 RedisBloom 模块** |
| **范围** | Redis OSS/CE + RedisBloom 模块 |
#### 技术描述
该漏洞包含 RedisBloom 模块在处理 RESTORE 负载时的多个子问题:
1. **越界读/写**(Daniel Firer)——在已分配内存范围之外进行读/写
2. **整数溢出、堆缓冲区溢出和越界读/写**(Joseph Surin)——整数溢出导致堆缓冲区溢出
当 RedisBloom 模块被加载时,攻击者可以发送特制的 RESTORE 负载,利用上述错误在反序列化 Bloom filter、Cuckoo filter、Count-Min Sketch 或 Top-K 数据时进行攻击。
#### 识别迹象
- Redis 崩溃并出现与 RedisBloom 模块相关的堆栈跟踪
- RedisBloom 模块正在加载(`MODULE LIST` 显示 bf/bloom)
- Bloom filter 中的数据损坏或出现异常变化
#### 修复方法(不升级)
**方法 1 — 通过 ACL 阻止 RESTORE:**(与 CVE-2026-25243 相同)```bash
redis-cli ACL SETUSER default -restore
redis-cli ACL SAVE
方法 2 — 卸载 RedisBloom 模块(如果不需要):```bash redis-cli MODULE UNLOAD bf
Sau đó xóa dòng sau khỏi `redis.conf`:```
loadmodule /path/to/redisbloom.so
方法 3 — 仅升级模块(不升级 Redis):
下载已修补的模块版本:
### CVE-2026-23631
| 属性 | 值 |
| ----------- | ----------------------------------------------------------------- |
| **标题** | 通过主从同步触发的 Lua 释放后使用漏洞 |
| **CVSS 4.0**| **6.1(中危)** |
| **CWE** | CWE-416(释放后使用) |
| **向量** | `AV:N/AC:H/AT:N/PR:L/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N` |
| **条件** | 已认证 + **从节点**且 `replica-read-only` = **disabled** |
| **影响范围**| 所有启用 Lua 脚本的 Redis OSS/CE,仅影响从节点 |
| **代号** | "DarkReplica"(Yoni Shiraz,Wiz Zeroday Cloud) |
#### 技术描述
已认证的攻击者可以利用主从同步机制发送特制的 Lua 脚本,在从节点的 Lua 引擎中触发释放后使用漏洞。
**关键条件:** 该漏洞**仅影响**配置了 `replica-read-only disabled`(即从节点可写)的从节点。这**不是**默认配置——默认情况下 `replica-read-only` = `yes`。
如果从节点配置为只读模式(默认),则该实例**不受影响**。
#### 识别特征
- 从节点 Redis 崩溃,堆栈跟踪来自 Lua 引擎
- 从节点上 `replica-read-only` 配置为 `no`
- 从节点上执行了未知命令
- 存在未经授权的网络连接到从节点
#### 修复方法(无需升级)
**方法 1 — 启用 replica-read-only(推荐,此为默认配置):**```bash
# Runtime
redis-cli CONFIG SET replica-read-only yes
# Trong redis.conf:
replica-read-only yes
方法 2 — 通过 ACL 阻止 Lua 脚本:```bash redis-cli ACL SETUSER default -@scripting redis-cli ACL SETUSER default -eval -evalsha -script -function -fcall -fcall_ro redis-cli ACL SAVE
**方法 3 — 禁用 Lua 命令(需要重启 Redis):**```bash
# Thêm vào redis.conf:
rename-command EVAL ""
rename-command EVALSHA ""
rename-command SCRIPT ""
rename-command FUNCTION ""
rename-command FCALL ""
rename-command FCALL_RO ""
--scan → 诊断并检查所有 CVE--fix-... → 为特定 CVE 应用修复措施```
$ ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh
→ hiển thị banner + HELP + thoát### 系统要求
- **操作系统:** Linux(Ubuntu、Debian、CentOS、RHEL 等)
- **工具:** `redis-cli`(通常包含在 `redis-tools` 或 `redis` 软件包中)
- **权限:** 对 `redis.conf` 文件的读写权限(用于修复)
- **连接:** 能够访问需要检查的 Redis 实例的网络
### 安装 redis-cli(如果尚未安装)```bash
# Ubuntu/Debian
sudo apt update && sudo apt install -y redis-tools
# CentOS/RHEL 7
sudo yum install -y redis
# CentOS/RHEL 8+/Fedora
sudo dnf install -y redis
# Hoặc từ source
wget https://download.redis.io/releases/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable && make redis-cli
sudo cp src/redis-cli /usr/local/bin/
chmod +x CVE-2026-25589-25588-25243-23631-23479-REDIS.sh
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --help
#### 2. 扫描检查全部 CVE(诊断)```bash
# Local Redis
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan
# Redis từ xa
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-H 192.168.1.100 -p 6379 -a "your_password"
# Với ACL user
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-H 10.0.0.50 -p 6380 -u admin -a "admin_password"
# Qua Unix socket
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-s /var/run/redis/redis-server.sock
# Kèm xuất báo cáo
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-o redis_cve_report_$(date +%Y%m%d).txt
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-cve-23479 ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-cve-25243 -H 10.0.0.1 -a mypassword ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-cve-25588 ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-cve-25589 ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-cve-23631 -c /etc/redis/redis.conf
#### 4. 按组快速修复(推荐)```bash
# Chan RESTORE → bao ve 3/5 CVE (25243 + 25588 + 25589)
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-restore
# Chan blocking commands → bao ve CVE-2026-23479
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-blocking
# Chan Lua + bat replica-read-only → bao ve CVE-2026-23631
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-lua
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-all
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-all
-c /etc/redis/redis.conf
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-all --no-backup
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --fix-all
-H 10.0.0.1 -p 6379 -a mypassword
### 完整参数表
#### 操作参数(ACTION)— 必填
| 参数 | 功能 | 受保护的 CVE 数量 |
| ----------------- | -------------------------------------------- | ----------------------------- |
| *(无参数)* | 显示使用说明 | — |
| `--scan` | 全面诊断扫描 5 个 CVE | — |
| `--fix-all` | 修复所有 CVE | **5/5** |
| `--fix-restore` | **[快速]** 仅阻止 RESTORE 命令 | **3/5** (25243, 25588, 25589) |
| `--fix-blocking` | **[快速]** 仅阻止阻塞命令 | **1/5** (23479) |
| `--fix-lua` | **[快速]** 阻止 Lua + 启用 replica-read-only | **1/5** (23631) |
| `--fix-cve-23479` | 修复 CVE-2026-23479 | 1/5 |
| `--fix-cve-25243` | 修复 CVE-2026-25243 | 1/5 |
| `--fix-cve-25588` | 修复 CVE-2026-25588 | 1/5 |
| `--fix-cve-25589` | 修复 CVE-2026-25589 | 1/5 |
| `--fix-cve-23631` | 修复 CVE-2026-23631 | 1/5 |
#### 连接参数
| 参数 | 描述 | 默认值 |
| ------------------- | --------------------- | ----------- |
| `-H, --host HOST` | Redis 主机地址 | `127.0.0.1` |
| `-p, --port PORT` | Redis 端口 | `6379` |
| `-a, --pass PASS` | Redis 密码 | *(空)* |
| `-u, --user USER` | ACL 用户名 | `default` |
| `-s, --socket PATH` | Unix socket 路径 | *(空)* |
#### 附加参数
| 参数 | 描述 | 默认值 |
| ------------------- | -------------------------------------- | ----------------------- |
| `-h, --help` | 显示帮助 | — |
| `-c, --config FILE` | redis.conf 路径 | `/etc/redis/redis.conf` |
| `-o, --output FILE` | 将报告写入文件(仅与 `--scan` 配合使用) | *(空)* |
| `--redis-cli PATH` | redis-cli 二进制文件路径 | `redis-cli`(来自 PATH) |
| `--no-backup` | 修改前不备份配置 | `false` |
### 退出代码(Exit Codes)
| 代码 | 含义 |
| --- | ----------------------------------------------------- |
| `0` | 成功 — 未检测到 CVE 或修复完成 |
| `1` | 错误:未找到 redis-cli 或无法连接 |
| `2` | `--scan` 检测到至少 1 个 CVE — 需要修复 |
### 扫描输出结果(`--scan`)```
╔══════════════════════════════════════════════════════════════════════╗
║ REDIS CVE SCANNER & MITIGATION TOOL ║
╚══════════════════════════════════════════════════════════════════════╝
[*] THONG TIN REDIS INSTANCE
Host:Port : 127.0.0.1:6379
Version : 7.2.5
Mode : standalone
Role : master
Modules : timeseries bf
═══════════════════════════════════════════════════════════════════════
[1/5] CVE-2026-23479 - Use-after-free trong Unblock Client Flow
CVSS 7.7 (HIGH) | RCE
═══════════════════════════════════════════════════════════════════════
[✗] CO KHA NANG BI ANH HUONG - Redis 7.2.5 (can >= 7.2.14)
... (CVE 2-5 tuong tu)
╔══════════════════════════════════════════════════════════════════════╗
║ TOM TAT KET QUA ║
╚══════════════════════════════════════════════════════════════════════╝
[✗] CVE-2026-23479 - VULNERABLE
[✗] CVE-2026-25243 - VULNERABLE
[✗] CVE-2026-25588 - VULNERABLE
[✗] CVE-2026-25589 - VULNERABLE
[✓] CVE-2026-23631 - OK
Ket qua: 1 PASS / 4 VULNERABLE
═══════════════════════════════════════════════════════════════════════
[!] Phat hien 4 CVE. Su dung cac tuy chon --fix-... de khac phuc.
VD: ./script.sh --fix-restore # Chan RESTORE (3 CVE)
VD: ./script.sh --fix-blocking # Chan blocking (1 CVE)
VD: ./script.sh --fix-lua # Chan Lua (1 CVE)
VD: ./script.sh --fix-all # Khac phuc toan bo
═══════════════════════════════════════════════════════════════════════
--fix-restore)```╔══════════════════════════════════════════════════════════════════════╗ ║ REDIS CVE SCANNER & MITIGATION TOOL ║ ╚══════════════════════════════════════════════════════════════════════╝
[*] THONG TIN REDIS INSTANCE Host:Port : 127.0.0.1:6379 Version : 7.2.5 ...
╔══════════════════════════════════════════════════════════════════════╗ ║ FIX NHANH: Chan RESTORE (CVE-2026-25243 + 25588 + 25589) ║ ╚══════════════════════════════════════════════════════════════════════╝ Bao ve 3/5 CVE chi voi 1 lenh chan RESTORE
[+] Da backup redis.conf toi: /etc/redis/redis.conf.cve-backup-20260508_120000 [*] Chan RESTORE qua ACL (khong can restart) => ACL SETUSER default -restore ... OK => ACL SAVE ... OK
[*] rename-command RESTORE "" (can restart) => Vo hieu hoa: rename-command RESTORE "" [!] CAN RESTART REDIS de rename-command co hieu luc
[✓] Da chan RESTORE. Cac CVE duoc bao ve:
---
## 通用修复方法
### 方法 1:ACL(Redis >= 6.0)— 推荐
这是**最安全且最灵活**的方法,无需重启 Redis。```bash
# Tao ACL user an toan cho ung dung
redis-cli ACL SETUSER app_user on >StrongPassword123 ~* \
+@read \ # Quyen doc du lieu
+@write \ # Quyen ghi du lieu
-@dangerous \ # CHAN tat ca lenh nguy hiem (gồm RESTORE)
-@admin \ # CHAN lenh quan tri
-@scripting \ # CHAN Lua scripting
-@blocking \ # CHAN blocking commands
-@keyspace \ # CHAN keyspace notifications
-@pubsub # CHAN pub/sub (neu khong dung)
# Vo hieu hoa default user
redis-cli ACL SETUSER default off
# Luu ACL vinh vien
redis-cli ACL SAVE
将以下行添加到 redis.conf 中:```conf
rename-command RESTORE ""
rename-command BLPOP "" rename-command BRPOP "" rename-command BRPOPLPUSH "" rename-command BLMOVE "" rename-command BLMPOP "" rename-command BZPOPMIN "" rename-command BZPOPMAX "" rename-command BZMPOP "" rename-command XREAD "" rename-command XREADGROUP ""
rename-command EVAL "" rename-command EVALSHA "" rename-command SCRIPT "" rename-command FUNCTION "" rename-command FCALL "" rename-command FCALL_RO ""
然后重启 Redis:```bash
sudo systemctl restart redis-server
# hoặc
sudo service redis-server restart
protected-mode yes bind 127.0.0.1 192.168.1.10 # Chi lang nghe IP tin cay
iptables -A INPUT -p tcp --dport 6379 -s 127.0.0.1 -j ACCEPT iptables -A INPUT -p tcp --dport 6379 -s 10.0.0.0/8 -j ACCEPT iptables -A INPUT -p tcp --dport 6379 -j DROP
iptables-save > /etc/iptables/rules.v4
### 方法 4:以最小权限运行 Redis```bash
# Tao user redis khong co shell
sudo useradd -r -s /bin/false redis
# Chown thu muc Redis
sudo chown -R redis:redis /var/lib/redis
sudo chown -R redis:redis /etc/redis
# Chay Redis duoi user redis
sudo -u redis redis-server /etc/redis/redis.conf
redis-cli MODULE LIST
redis-cli MODULE UNLOAD timeseries # CVE-2026-25588 redis-cli MODULE UNLOAD bf # CVE-2026-25589
---
## 风险评估 — 内部 Redis 系统 / Sentinel
本节适用于运行在内部网络中的 **Redis Sentinel** 或独立 Redis 集群,受防火墙(Fortinet、iptables 等)保护,且**无法直接连接互联网**。
### 摘要
| 现有保护级别 | 是否降低风险? | 是否需要升级? |
| ------------------------------- | -------------------------------------------------------------- | ---------------------------------------- |
| 无法访问互联网 | **是** — 排除外部攻击者 | 无需紧急处理 |
| Fortinet 防火墙(含 IPS/DPI) | **是** — 过滤源 IP,IPS 可检测异常载荷 | 无需紧急处理 |
| iptables(限制源 IP) | **是** — 仅允许授权的 IP 连接 Redis 端口 | 无需紧急处理 |
| **上述三项措施组合** | **将利用概率降至极低** | **无需紧急处理,但应有计划** |
### 关键点:为什么防火墙还不够?
所有 5 个 CVE 都有一个共同点:攻击者必须**已通过 Redis 身份验证**(PR:L — CVSS 向量中权限要求:低)。防火墙会阻止来自未授权 IP 的连接,但**无法防御**以下威胁:
| 威胁 | 发生可能性 | 被利用后的后果 |
| ------------------------------------------------------------------------------------------------------------------ | ----------------------------- | ---------------------------------------------------------------------------- |
| **恶意内部员工** — 拥有内部网络访问权限 + 知道 Redis 密码 | 低但无法排除 | **RCE** 于 Redis 服务器,权限提升,数据窃取 |
| **内部机器被接管(横向移动)** — 攻击者入侵网络中任意一台机器,进而攻击 Redis | 中等 | 所有 Redis 数据被窃取/篡改/删除;攻击者可安装后门 |
| **防火墙配置错误** — 因规则变更失误意外将 Redis 端口暴露到外部 | 低 | 等同于直接暴露到互联网 |
| **供应链 / 第三方** — 合作伙伴、供应商通过 VPN 连接内部网络 | 低 | RCE、数据外泄 |
| **防火墙/网络本身的漏洞** — 攻击者通过其他漏洞绕过防火墙 | 极低 | 整个内部系统受影响 |
### 定量风险分析```
Rủi ro = Xác suất khai thác × Hậu quả
Với firewall + air-gap:
= (RẤT THẤP: 0.5% - 2%/năm) × (NGHIÊM TRỌNG: RCE toàn hệ thống, mất toàn bộ dữ liệu)
= RỦI RO TRUNG BÌNH — vẫn đáng quan tâm
Redis Sentinel 集群存在额外的自身风险:
| Sentinel 攻击向量 | 描述 | 相关 CVE |
|---|---|---|
| Sentinel 接管 — 攻击者控制 Sentinel 节点,从而故障转移到恶意副本 | Sentinel 通过专用端口(通常为 26379)通信,若未单独保护 | CVE-2026-23631(若副本设置了 replica-read-only no) |
| 副本提升 — 被控制的副本被提升为主节点 | 整个集群的数据被篡改 | 所有 RESTORE CVE(25243、25588、25589) |
| 主从同步 — 攻击者拦截同步流量 | 同步过程中数据被窃取 | CVE-2026-23631 |
| 优先级 | 操作 | 执行时间 | 是否需要停机? |
|---|---|---|---|
| P0 — 立即 | 运行脚本检查所有节点(主节点 + 副本 + Sentinel):./CVE-...sh -H <ip> -p <port> -a <pass> | 2-5 分钟 / 节点 | 否 |
| P0 — 立即 | 检查所有副本上的 replica-read-only yes:redis-cli CONFIG GET replica-read-only | 1 分钟 / 节点 | 否 |
| P1 — 本周内 | 通过 ACL 阻止 RESTORE(无需重启):redis-cli ACL SETUSER default -restore; redis-cli ACL SAVE | 2 分钟 / 节点 | 否 |
| P1 — 本周内 | 通过 ACL 阻止 @blocking 命令(CVE-2026-23479) | 2 分钟 / 节点 | 否 |
| P1 — 本周内 | 若未使用 Lua,通过 ACL 阻止 @scripting 命令(CVE-2026-23631) | 2 分钟 / 节点 | 否 |
| P2 — 下次维护窗口 | 在 redis.conf 中添加 rename-command RESTORE ""、rename-command EVAL "" 等 | 10 分钟(需重启) | 是(重启 Redis) |
| P2 — 下次维护窗口 | 将 Redis 升级到已修补版本(6.2.22、7.2.14、7.4.9、8.2.6、8.4.3、8.6.3) | 30-60 分钟 / 集群 | 是(重启整个集群) |
redis-cli -h <node_ip> -p 6379 -a ACL SETUSER app_user on >StrongPass123 ~*
+@read +@write
-@dangerous -@admin -@scripting -@blocking
-restore -debug
redis-cli -h <node_ip> -p 6379 -a ACL SETUSER default off
redis-cli -h <node_ip> -p 6379 -a ACL SAVE
redis-cli -h <node_ip> -p 6379 -a --user app_user --pass StrongPass123 PING
Tôi không thể dịch nội dung này vì không có văn bản đầu vào nào được cung cấp trong phần INPUT. Vui lòng cung cấp nội dung Markdown cần dịch.```bash
# ============================================
# Chay tren TUNG node Sentinel (port 26379)
# ============================================
# Sentinel thuong khong can RESTORE/EVAL — chan toan bo lenh nguy hiem
redis-cli -h <sentinel_ip> -p 26379 -a <sentinel_pass> ACL SETUSER default \
-@dangerous -@admin -@scripting -@blocking -restore
redis-cli -h <sentinel_ip> -p 26379 -a <sentinel_pass> ACL SAVE
Hệ thống Redis của bạn có public-facing không? ├── CÓ → NÂNG CẤP NGAY hoặc áp dụng workaround TRONG 24H └── KHÔNG (nội bộ / air-gapped) ├── Có dùng Lua scripting (EVAL/EVALSHA)? │ ├── CÓ → CVE-2026-23631: Kiểm tra replica-read-only, chặn @scripting qua ACL │ └── KHÔNG → Rủi ro thấp hơn ├── Có dùng RedisTimeSeries hoặc RedisBloom module? │ ├── CÓ → CVE-2026-25588/25589: Chặn RESTORE qua ACL, nâng cấp module │ └── KHÔNG → Không bị ảnh hưởng bởi 25588/25589 ├── Có dùng blocking commands (BLPOP, XREAD, ...)? │ ├── CÓ → CVE-2026-23479: Chặn @blocking qua ACL hoặc rename-command │ └── KHÔNG → Chặn @blocking để an toàn (không ảnh hưởng) └── KẾT LUẬN: ├── Áp dụng ACL workaround NGAY TRONG TUẦN (không downtime) └── Lên kế hoạch nâng cấp TRONG MAINTENANCE WINDOW TIẾP THEO
### 结论
> **防火墙 + 网络隔离将利用成功率降至极低,但一旦被利用,后果仍是整个系统的 RCE。** 由于修复成本几乎为零(添加几行 ACL 无需重启),采取防护措施在风险管理上是明智的决定。**无需恐慌性紧急升级**,但**应在本周内应用 ACL 变通方案**,并在下一个维护窗口安排升级。
---
## ACL 参考
### 重要的命令组
| 组 | 描述 | CVE 影响 |
| ------------- | -------------------------------------------------------------------------------- | ---------------------------- |
| `@dangerous` | 危险命令(包括 RESTORE、FLUSHDB、FLUSHALL、KEYS、SHUTDOWN、DEBUG、CONFIG) | CVE-2026-25243、25588、25589 |
| `@blocking` | 阻塞命令(BLPOP、BRPOP、BZPOPMIN、XREAD、WAIT 等) | CVE-2026-23479 |
| `@scripting` | Lua 脚本(EVAL、EVALSHA、SCRIPT、FUNCTION、FCALL) | CVE-2026-23631 |
| `@admin` | 管理命令(CONFIG、ACL、CLIENT、CLUSTER、MONITOR、SHUTDOWN 等) | 通用防护 |
| `@keyspace` | 与 keyspace 相关的命令(KEYS、SCAN、FLUSHDB、FLUSHALL 等) | 通用防护 |
| `@read` | 数据读取命令(GET、HGET、LRANGE、SMEMBERS、ZRANGE 等) | 安全 |
| `@write` | 数据写入命令(SET、HSET、LPUSH、SADD、ZADD 等) | 安全 |
### 完整 ACL 配置示例```bash
# 1. Tao admin user (day du quyen)
redis-cli ACL SETUSER admin on >AdminPass123 ~* +@all
# 2. Tao app user (quyen gioi han)
redis-cli ACL SETUSER app on >AppPass123 ~* \
+@read \
+@write \
-@dangerous \
-@admin \
-@scripting \
-@blocking \
-restore \
-debug
# 3. Tao readonly user (chi doc)
redis-cli ACL SETUSER reader on >ReaderPass123 ~* \
+@read \
-@dangerous \
-@admin \
-@scripting
# 4. Vo hieu hoa default user
redis-cli ACL SETUSER default off
# 5. Luu ACL
redis-cli ACL SAVE
# 6. Kiem tra ACL
redis-cli ACL LIST
redis-cli ACL LIST
redis-cli ACL GETUSER app
redis-cli ACL WHOAMI
redis-cli ACL LOG
---
## 定期检查流程
### 1. 一次性检查(临时)```bash
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-H <redis_host> -p <port> -a <password> \
-o report_$(date +%Y%m%d_%H%M%S).txt
创建文件 redis_hosts.txt:```
10.0.0.1:6379:pass1:default 10.0.0.2:6379:pass2:default 10.0.0.3:6380:pass3:admin
批量检查脚本:```bash
#!/bin/bash
# File: batch_check.sh
BATCH_RESULT="batch_result_$(date +%Y%m%d_%H%M%S).txt"
while IFS=':' read -r host port pass user; do
[[ "$host" =~ ^#.* ]] && continue # Bo qua comment
[[ -z "$host" ]] && continue # Bo qua dong trong
echo "============================================" | tee -a "$BATCH_RESULT"
echo "Kiem tra: $host:$port" | tee -a "$BATCH_RESULT"
echo "============================================" | tee -a "$BATCH_RESULT"
./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-H "$host" -p "${port:-6379}" \
-a "${pass:-}" -u "${user:-default}" \
2>&1 | tee -a "$BATCH_RESULT"
echo "" | tee -a "$BATCH_RESULT"
done < redis_hosts.txt
echo "Bao cao tong hop: $BATCH_RESULT"
0 7 * * * /opt/scripts/CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan
-H 127.0.0.1 -p 6379 -a mypassword
-o /var/log/redis/cve_report_$(date +%Y%m%d).txt
> /dev/null 2>&1
### 4. 集成到 CI/CD 流水线中```yaml
# GitLab CI example
redis-security-scan:
stage: security
image: redis:7-alpine
script:
- chmod +x CVE-2026-25589-25588-25243-23631-23479-REDIS.sh
- ./CVE-2026-25589-25588-25243-23631-23479-REDIS.sh --scan \
-H $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS \
-o cve_report.txt
artifacts:
paths:
- cve_report.txt
when: always
allow_failure: true
--fix-... 之后,我需要重启 Redis 吗?答: 是的,对于 rename-command 的更改——它们只有在重启 Redis 之后才会生效。通过 CONFIG SET 进行的更改(如 protected-mode、replica-read-only)会立即生效。通过 ACL SETUSER + ACL SAVE 进行的更改会立即生效,无需重启。如果只使用 ACL(--fix-restore、--fix-blocking、--fix-lua),则不需要重启。脚本总是同时应用 ACL(运行时)和 rename-command(需要重启),以实现多层保护。
答: RESTORE 命令通常只在以下情况下使用:
如果您的应用程序不使用 RESTORE,阻止该命令是安全的。如果确实使用,请创建一个具有 RESTORE 权限的专用 ACL 用户,并且仅用于管理目的。
答: 对于 Redis < 6.0,您只能使用 rename-command 来禁用命令。步骤如下:
rename-command RESTORE ""rename-command 指令protected-mode yesrequirepass答: 运行以下命令:```bash redis-cli MODULE LIST
输出将显示已加载模块的列表及版本。如果看不到 `timeseries` 或 `bf`,则说明模块未加载。
### 问:`--fix-all` / `--fix-restore` / `--fix-...` 对生产环境安全吗?
**答:** 修复命令执行的是安全更改:
- 修改前备份 redis.conf(除非使用 `--no-backup`)
- **ACL**(`-restore`、`-@blocking`、`-@scripting`):立即生效,无停机时间,易于回滚
- **rename-command**:需要重启 Redis 才能生效
- **CONFIG SET**:运行时生效,若未写入 redis.conf,重启后丢失
建议:对于生产环境,优先使用 `--fix-restore`、`--fix-blocking`、`--fix-lua`(仅 ACL,无需重启)。然后安排维护窗口,配合 `rename-command` 重启。
### 问:如何回滚(rollback)`--fix-...` 所做的更改?
**答:**
1. 如果已备份:将备份文件复制覆盖 redis.conf,然后重启 Redis
2. 如果使用了 `CONFIG SET`:重启 Redis 将从文件恢复配置
3. 如果使用了 `ACL SETUSER`:使用 `ACL SETUSER <user> +<cmd>` 恢复权限
### 问:我应该升级 Redis 吗?
**答:** **是的,如果可能的话。** 升级到已修补的版本是最彻底的解决方案。此脚本适用于以下情况:
- 由于应用限制无法立即升级
- 需要时间测试新版本
- 在等待维护窗口期间需要临时保护措施
### 问:Redis 在内部运行,不连接互联网,有防火墙保护——还需要升级吗?
**答:** **不需要紧急升级**,但**应应用 workaround 并制定升级计划**,因为:
- 防火墙只能降低被攻击的**概率**,不能完全消除风险
- 来自内网的攻击者(恶意员工、被入侵的机器、横向移动)仍可利用漏洞
- 若被利用,后果是**整个系统的 RCE**——严重程度最高
- **workaround 成本极低**:添加 ACL `-restore -@blocking -@scripting` 只需 2 分钟,无停机时间
**建议路线图:**
1. **本周:** 应用 ACL workaround(无停机时间)
2. **下一个维护窗口:** 升级 Redis + 添加 `rename-command`
详见 [风险评估 — 内部 Redis 系统 / Sentinel](#đánh-giá-rủi-ro--hệ-thống-redis-nội-bộ--sentinel)。
---
## 参考资料
- [Redis 官方安全公告](https://redis.io/blog/security-advisory-cve202623479-cve202625243-cve-2026-25588-cve202625589-cve-2026-23631/)
- [GitHub Advisory — CVE-2026-25243 (RESTORE RCE)](https://github.com/redis/redis/security/advisories/GHSA-c8h9-259x-jff4)
- [GitHub Advisory — CVE-2026-23631 (Lua UAF)](https://github.com/redis/redis/security/advisories/GHSA-8ghh-qpmp-7826)
- [Redis ACL 文档](https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/)
- [Redis rename-command 文档](https://redis.io/docs/latest/operate/oss_and_stack/management/security/#disable-specific-commands)
- [NVD — CVE-2026-25243](https://nvd.nist.gov/vuln/detail/CVE-2026-25243)
- [NVD — CVE-2026-25588](https://nvd.nist.gov/vuln/detail/CVE-2026-25588)
- [OpenCVE — CVE-2026-23479](https://app.opencve.io/cve/CVE-2026-23479)
- [Tenable — CVE-2026-23631](https://www.tenable.com/cve/CVE-2026-23631)
---
> **免责声明:** 本文档基于 Redis 安全公告和 NVD 等公开信息编写。用户在应用前有责任检查并确认适合自身环境的修复措施。