WinRAR目录穿越神洞复现及防御
字数 1668 2025-08-29 08:31:53
WinRAR目录穿越漏洞复现及防御指南
漏洞背景
2019年2月20日,安全研究员Nadav Grossman披露了WinRAR中存在19年的逻辑漏洞,可导致代码执行。相关CVE编号包括:
- CVE-2018-20250
- CVE-2018-20251
- CVE-2018-20252
- CVE-2018-20253
漏洞根源在于WinRAR使用的陈旧动态链接库UNACEV2.dll(2006年编译),该库缺乏基础保护机制(如ASLR、DEP等),用于处理ACE格式文件。解压过程中存在目录穿越漏洞,允许攻击者将文件写入系统启动项,实现代码执行。
环境准备
- 下载安装WinACE(默认安装即可)
- 创建测试文件夹和文件:
- 新建"demo"文件夹
- 创建"test.txt"文件,内容为"hello world"
- 使用WinACE创建ACE压缩包:
- 打开WinACE
- File → Create
- 下拉框选择"store full path"
- 点击"Add"生成test.ace
ACE文件格式分析
使用010Editor或WinHex等16进制编辑器打开test.ace文件,关键结构如下:
-
文件头信息:
hdr_crc:头部CRC校验值,校验失败会中断提取- 文件名:包含相对路径,提取时会创建路径中所有目录
advert:未注册版WinACE创建时会自动添加广告字段- 文件内容:
origsize:内容大小hdr_size:头部大小
-
关键参数示例:
- CRC值:0xc5e9(16进制编辑器显示为e9c5,小端序)
- 文件大小:63(十进制)= 0x3f(16进制,编辑器显示为3f00)
- 文件名长度:0x20(16进制编辑器显示为2000)
构造恶意ACE文件
-
修改文件内容:
- 将"hello world"改为"bye world"
- 文件名改为"evil.txt"
-
调整相关参数:
- 文件名长度:新长度为0x1b → 修改为1b00
- 文件大小:新大小为0x3a → 修改为3a00
- CRC校验值:需要重新计算
-
计算新CRC值:
使用acefile.py工具(Python3编写):git clone https://github.com/droe/acefile修改acefile.py代码,在CRC校验处添加打印语句:
print(hex(ace_crc16(buf))) # 添加在抛出CRC错误前运行后会输出新CRC值(如0x8cd2),在文件中需存储为d28c(小端序)
攻击执行
受害者解压恶意ACE文件时,文件会被解压到攻击者预设的路径(如启动目录),实现持久化攻击。
防御措施
-
升级WinRAR:
- 32位:http://win-rar.com/fileadmin/winrar-versions/wrar57b1.exe
- 64位:http://win-rar.com/fileadmin/winrar-versions/winrar-x64-57b1.exe
-
删除漏洞组件:
- 右键WinRAR快捷方式 → 打开文件所在位置
- 删除UNACEV2.dll文件
技术原理深度解析
-
目录穿越机制:
- ACE格式允许在文件名中包含相对路径(如
..\..\startup\evil.exe) - UNACEV2.dll未正确校验路径,允许跳出解压目录
- ACE格式允许在文件名中包含相对路径(如
-
持久化技术:
- Windows启动目录:
C:\Users\[用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\ - 系统启动时自动执行该目录下的可执行文件
- Windows启动目录:
-
漏洞利用链:
- 构造恶意ACE文件 → 诱骗用户解压 → 文件写入启动目录 → 用户重启后执行恶意代码
参考资源
- 原始研究报告:https://research.checkpoint.com/extracting-code-execution-from-winrar/
- acefile项目:https://github.com/droe/acefile
- CVE详细信息:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-20250