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格式文件。解压过程中存在目录穿越漏洞,允许攻击者将文件写入系统启动项,实现代码执行。

环境准备

  1. 下载安装WinACE(默认安装即可)
  2. 创建测试文件夹和文件:
    • 新建"demo"文件夹
    • 创建"test.txt"文件,内容为"hello world"
  3. 使用WinACE创建ACE压缩包:
    • 打开WinACE
    • File → Create
    • 下拉框选择"store full path"
    • 点击"Add"生成test.ace

ACE文件格式分析

使用010Editor或WinHex等16进制编辑器打开test.ace文件,关键结构如下:

  1. 文件头信息

    • hdr_crc:头部CRC校验值,校验失败会中断提取
    • 文件名:包含相对路径,提取时会创建路径中所有目录
    • advert:未注册版WinACE创建时会自动添加广告字段
    • 文件内容:
      • origsize:内容大小
      • hdr_size:头部大小
  2. 关键参数示例

    • CRC值:0xc5e9(16进制编辑器显示为e9c5,小端序)
    • 文件大小:63(十进制)= 0x3f(16进制,编辑器显示为3f00)
    • 文件名长度:0x20(16进制编辑器显示为2000)

构造恶意ACE文件

  1. 修改文件内容

    • 将"hello world"改为"bye world"
    • 文件名改为"evil.txt"
  2. 调整相关参数

    • 文件名长度:新长度为0x1b → 修改为1b00
    • 文件大小:新大小为0x3a → 修改为3a00
    • CRC校验值:需要重新计算
  3. 计算新CRC值
    使用acefile.py工具(Python3编写):

    git clone https://github.com/droe/acefile
    

    修改acefile.py代码,在CRC校验处添加打印语句:

    print(hex(ace_crc16(buf)))  # 添加在抛出CRC错误前
    

    运行后会输出新CRC值(如0x8cd2),在文件中需存储为d28c(小端序)

攻击执行

受害者解压恶意ACE文件时,文件会被解压到攻击者预设的路径(如启动目录),实现持久化攻击。

防御措施

  1. 升级WinRAR

    • 32位:http://win-rar.com/fileadmin/winrar-versions/wrar57b1.exe
    • 64位:http://win-rar.com/fileadmin/winrar-versions/winrar-x64-57b1.exe
  2. 删除漏洞组件

    • 右键WinRAR快捷方式 → 打开文件所在位置
    • 删除UNACEV2.dll文件

技术原理深度解析

  1. 目录穿越机制

    • ACE格式允许在文件名中包含相对路径(如..\..\startup\evil.exe
    • UNACEV2.dll未正确校验路径,允许跳出解压目录
  2. 持久化技术

    • Windows启动目录:C:\Users\[用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
    • 系统启动时自动执行该目录下的可执行文件
  3. 漏洞利用链

    • 构造恶意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
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编写): 修改acefile.py代码,在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未正确校验路径,允许跳出解压目录 持久化技术 : Windows启动目录: C:\Users\[用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\ 系统启动时自动执行该目录下的可执行文件 漏洞利用链 : 构造恶意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