本仓库包含针对 CVE-2021-32675 的功能性利用代码,该漏洞是 Redis 中的拒绝服务(DoS)漏洞。该缺陷允许未经身份验证的远程攻击者通过发送超大体积的批量字符串头部而不提供参数数据,触发 Redis 服务器进行大规模内存预分配,从而导致内存耗尽和服务崩溃。
CVE-2021-32675 是 Redis 查询缓冲区处理中的一个漏洞。在解析 RESP(REdis 序列化协议)协议中的传入命令时,Redis 会读取批量字符串参数声明的长度($<length>\r\n),并在读取任何参数字节之前立即在内存中预分配一个 SDS(简单动态字符串)缓冲区来接收负载。
由于此预分配发生在接收参数负载之前,未经身份验证的客户端可以声明最大允许的批量字符串大小(默认情况下,proto-max-bulk-len 为 512 MB),并无限期保持连接打开而不传输实际数据。Redis 为每个活动连接保留预分配的内存,形成约 32,000,000× 的放大比(约 16 字节的网络流量即可导致 512 MB 的内存预留)。
使用这种仅头部技术打开多个并发连接会迅速耗尽服务器可用内存,导致:
maxmemory 策略,则强制驱逐键。OOM command not allowed)造成拒绝服务。该漏洞影响以下版本之前的 Redis:
未配置身份验证(requirepass)或以默认 proto-max-bulk-len(512 MB)运行的 Redis 实例容易受到此利用的影响。已修补版本在预分配发生之前,对未经身份验证的客户端强制执行严格的 16 KB 协议缓冲区限制。
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Python 3.8+
存在漏洞的 Redis 实例(6.2.6 / 6.0.16 之前的版本或未经身份验证的实例)
python3 exploit.py --host <IP> --port <PORT> [options]
python3 exploit.py --host 127.0.0.1 --port 6379 --connections 10 --size 512 --hold 5
您可以使用附带的 Docker Compose 配置启动本地测试环境:
# 启动存在漏洞的 Redis(端口 6380)和已修补的 Redis(端口 6381)
docker compose -f conf/docker-compose.yml up -d
# 针对存在漏洞的实例进行测试
python3 exploit.py --host 127.0.0.1 --port 6380 --connections 10 --size 512
# 针对已修补的实例进行测试
python3 exploit.py --host 127.0.0.1 --port 6381 --password "L4bS3cur3!2024" --connections 10 --size 512
# 停止容器
docker compose -f conf/docker-compose.yml down
此概念验证仅用于教育、研究和安全验证目的。作者不对任何滥用、损害或未经明确许可对系统进行的未经授权测试负责。
| 选项 | 类型 | 默认值 | 描述 |
|---|
--host | str | 必填 | 目标 Redis 主机名或 IP 地址 |
--port | int | 6379 | 端口号 |
--connections | int | 10 | 要打开的恶意连接数 |
--size | int | 512 | 声明的批量字符串缓冲区大小(MB) |
--hold | int | 5 | 清理前保持连接打开的秒数 |
--password, --auth | str | None | Redis 身份验证密码(如需要) |