嘿!这是我做的一个简单工具,用来帮助人们检查他们的 Redis 服务器是否存在此漏洞。它并非用于实际攻击——仅用于学习和保护你自己的东西。
好的,亲爱的朋友们,这是 2025 年最有趣的重大失误之一,CVE-2025-49844。本质上,如果有人能在你的 Redis 服务器上运行 Lua 脚本,他们就能访问内存。
# 首先,准备好 Go 环境
cd scanner
go mod tidy
# 然后构建扫描器
go build -o rscan redis-scanner.go
# 检查单台服务器
./rscan -host your-server.com -port 6379
# 使用密码检查(如果有的话)
./rscan -host your-server.com -port 6379 -auth yourpassword
# 同时检查多台服务器
./rscan -host server1.com,server2.com,server3.com
# 或者从文件读取服务器列表
./rscan -file hosts.txt
# 关闭 Lua 脚本功能(这能阻止攻击)
redis-cli ACL SETUSER default -@scripting
# 或者直接将 Redis 更新到最新版本
这就是所谓的"释放后使用"(use-after-free)漏洞。本质上,Redis 的内存管理系统有时会对自己已经清理过的内存产生混淆。
正常情况应该是:
实际情况(漏洞):
EVAL 和 EVALSHA(用于运行 Lua 脚本)# 关闭 Lua 脚本(这能阻止攻击)
redis-cli ACL SETUSER default -@scripting
# 或者编辑你的 redis.conf 文件并添加这一行:
disable-commands eval evalsha
# 然后重启 Redis
sudo systemctl restart redis
# 只允许特定 IP 连接 Redis
iptables -A INPUT -p tcp --dport 6379 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP
# 让 Redis 只监听特定的网络接口
bind 127.0.0.1 10.0.0.100
# 设置强密码
redis-cli CONFIG SET requirepass "fuckredis1234ilovehacking!"
# 创建权限受限的用户
redis-cli ACL SETUSER appuser on >password +@read +@write -@scripting
redis-cli ACL SETUSER readonly on >password +@read -@scripting
# 先备份数据(始终如此!)
sudo cp -r /var/lib/redis /var/lib/redis.backup.$(date +%Y%m%d)
# 更新到已修复的版本
# 在 Ubuntu/Debian 上:
sudo apt update && sudo apt install redis-server=8.2.2*
# 在 CentOS/RHEL 上:
sudo yum update redis
# 确认更新成功
redis-server --version
# 如果修复生效,以下命令应该失败
redis-cli -a "YourPassword" EVAL "return 'test'" 0
# 应该显示:(error) ERR unknown command 'EVAL'
# 查看 Redis 是否可从网络访问
nmap -p 6379 your-redis-server
# 测试是否需要密码
redis-cli -h your-redis-server -p 6379 ping
# 应该要求输入密码
# 查找异常的 Lua 脚本活动
grep -i "eval\|evalsha" /var/log/redis/redis.log
# 检查失败的登录尝试
grep -i "auth" /var/log/redis/redis.log
# 查找脚本错误
grep -i "script" /var/log/redis/redis.log
eval 和 evalsha 命令)漏洞发生在以下情况:
-- 这只是为了展示结构
local function create_memory_pattern()
-- 创建干扰 Redis 内存清理的对象
local objects = {}
for i = 1, 1000 do
objects[i] = {data = "pattern_" .. i}
end
return objects
end
local function trigger_gc()
-- 迫使 Redis 在错误的时间清理内存
collectgarbage("collect")
-- 内存漏洞就发生在这里
end
-- 主要攻击结构
local objects = create_memory_pattern()
-- 干扰内存引用
-- 强制垃圾回收
-- 利用被破坏的内存运行代码
如果你想在不破坏任何真实系统的情况下看看这是如何运作的,可以使用 Docker:
# 启动一个测试用 Redis(这个是有漏洞的)
docker run -d --name redis-test -p 6379:6379 redis:6.0
# 测试它
cd scanner
./rscan -host localhost -port 6379
# 停止有漏洞的版本,启动一个已修复的版本
docker stop redis-test
docker run -d --name redis-fixed -p 6379:6379 redis:6.0 redis-server --rename-command EVAL "" --rename-command EVALSHA ""
./rscan -host localhost -port 6379
# 完成后清理
docker stop redis-fixed && docker rm redis-fixed
cd scanner
./rscan --help
创建一个这样的 hosts.txt 文件:
# 把你的服务器放在这里
server1.com
server2.com:6380
192.168.1.100
redis.example.com:6379
# 使用更多工作线程来加快扫描(如果你有很多服务器)
./rscan -host server1.com,server2.com -workers 20
# 回滚到你的备份
sudo systemctl stop redis
sudo rm -rf /var/lib/redis
sudo cp -r /var/lib/redis.backup.$(date +%Y%m%d) /var/lib/redis
sudo systemctl start redis
这只是为了学习和保护你自己的东西。不要用它去攻击别人的服务器——那是违法的。别犯傻。