Lua chunk 名称的 GC 竞争条件导致 Redis 8.2.1 释放后使用及远程代码执行。
Redis 内嵌 Lua 5.1 用于脚本执行。在 8.2.1 及之前的版本中,luaY_parser 函数在调用词法分析器之前,并未将 chunk 名称字符串锚定在 Lua 栈上。恶意构造的脚本可在解析器仍引用已释放字符串时触发垃圾回收,从而产生释放后使用(UAF),导致原生代码执行。
redis-cliCVE-2025-49844.lua – 通过数千次 loadstring 调用及启用垃圾回收的 chunk 名称来反复冲击解析器,以赢得该竞争条件。while redis-cli -h localhost -p 6379 --eval CVE-2025-49844.lua >/dev/null; do
printf '.'
done
预期结果:
在受影响版本上,Redis 进程最终会崩溃或断开连接。已修复的 8.2.2 版本(提交 d5728cb5795c966c5b5b1e0f0ac576a7e69af539)会将 chunk 名称锚定,脚本则可无害运行。
升级至 Redis 8.2.2 或更高版本,或对不受信任的用户禁用 Lua 脚本功能。