CVE-2025-49844CVE-2025-49844是Redis数据库中存在的一个严重安全漏洞,CVSS评分为9.9,属于危急级别。该漏洞存在于所有启用Lua脚本功能的Redis版本中(8.2.1及以下版本),允许经过身份验证的攻击者通过精心构造的恶意Lua脚本来操纵Lua垃圾回收器(Garbage Collector),触发释放后使用(Use-After-Free)漏洞,进而可能导致远程代码执行(RCE)。
Redis作为一款广泛使用的开源内存数据结构存储系统,常被用作数据库、缓存和消息中间件。其内置的Lua脚本引擎允许用户在服务器端执行复杂的原子操作,但这同时也成为了安全攻击的潜在入口。该漏洞的危害程度极高,因为攻击者只需拥有Redis的低权限认证凭据(PR:L),即可通过网络远程发起攻击,无需用户交互(UI:N),且对机密性、完整性和可用性均产生高影响(C:H/I:H/A:H)。
该漏洞的影响范围广泛,涵盖了所有启用Lua脚本功能的Redis部署实例。由于许多生产环境中Redis实例对外开放或仅配置弱口令认证,该漏洞的实际威胁尤为突出。成功利用此漏洞的攻击者可以在Redis服务器上执行任意代码,从而完全控制受影响的服务器,可能导致敏感数据泄露、数据篡改、恶意软件植入等严重后果。该漏洞已于2025年10月3日公开披露,Redis官方已在8.2.2版本中修复此问题。
该漏洞的核心在于Redis内置的Lua脚本引擎与垃圾回收器之间的交互缺陷。Lua虚拟机使用垃圾回收机制自动管理内存,当Lua对象(如字符串、表、函数等)不再被引用时会被自动回收。然而,Redis的Lua脚本执行环境中存在对象生命周期管理的缺陷。
攻击者可以构造特殊的Lua脚本,利用以下技术触发Use-After-Free漏洞:
1. **对象引用操纵**:通过创建Lua对象并利用Redis的API(如redis.call())进行操作,在对象引用关系中制造复杂的循环或交叉引用,使得垃圾回收器在回收过程中出现逻辑错误。
2. **垃圾回收时机控制**:利用collectgarbage()函数强制触发垃圾回收,在特定的时间点操纵对象的生命周期。当一个对象被垃圾回收器释放后,如果Redis内部仍然保留着对该对象的引用,就会形成悬垂指针(Dangling Pointer)。
3. **内存重用与代码执行**:通过后续的内存分配操作重用已释放的内存区域,攻击者可以控制被释放对象所在内存的内容。当Redis后续访问该悬垂指针时,就会执行攻击者控制的内存数据,从而实现远程代码执行。
具体利用方式通常涉及以下步骤:
(1)创建特定的Lua数据结构(如嵌套表、cdata对象等);
(2)通过redis.call()调用Redis命令,触发内部对象处理逻辑;
(3)利用collectgarbage()强制回收,控制回收时机;
(4)通过新的内存分配覆盖已释放对象的内存空间;
(5)触发Redis对悬垂指针的访问,实现代码执行。
该漏洞的成功利用可导致在Redis服务器进程中执行任意代码,攻击者可以读写文件、执行系统命令、建立反向连接等,从而完全控制Redis服务器。