起因

在摸鱼的时候看到先知上的一篇文章:WinRAR目录穿越漏洞,发现 WinRAR 爆出了一个惊天大洞(误),虽然称不上用处巨大,但是非常好玩。漏洞介绍如下:

WinRAR在解压处理ACE格式的文件的过程中存在一处目录穿越漏洞,该漏洞允许解压过程中向任意目录写入文件,利用该漏洞可以向开机启动目录中写入恶意文件导致机器开机时执行恶意代码。

再贴一段国外研究者的介绍:

The exploit works by just extracting an archive, and puts over 500 million users at risk. This vulnerability has existed for over 19 years(!) and forced WinRAR to completely drop support for the vulnerable format.

exploit

先贴一份 Exploit 地址,感兴趣的朋友可以直接本地复现

https://github.com/WyAtu/CVE-2018-20250

这里有一份本人的 demo,感兴趣的朋友可以下载,解压成功后会在 C:\114514 路径多出一个 oc.txt

分析

根据报告所描述,可以看到漏洞的起因主要在于 WinRAR 所使用的 UNACEV2.dll 编译的时间极早(可以追随到 2006 年),也没有开启任何的保护措施(如 ASLR, DEP),由此被研究者注意到,并成功通过 fuzz 发现了一个 Absolute Path Traversal(任意路径穿越)漏洞。

运行 acefile.py 脚本,我们能显示 ace 文件的结构:

# python acefile.py --headers demo.rar
volume
    filename    demo.rar
    filesize    208
    headers     MAIN:1 FILE:2 others:0
header
    hdr_crc     0x286b
    hdr_size    49
    hdr_type    0x00        MAIN
    hdr_flags   0x9000      ADVERT|SOLID
    magic       b'**ACE**'
    eversion    20          2.0
    cversion    20          2.0
    host        0x02        Win32
    volume      0
    datetime    0x4e561810  2019-02-22 03:00:32
    reserved1   97 4f f6 aa 00 00 00 00
    advert      b'*UNREGISTERED VERSION*'
    comment     b''
    reserved2   b''
header
    hdr_crc     0xe4ea
    hdr_size    39
    hdr_type    0x01        FILE32
    hdr_flags   0x8001      ADDSIZE|SOLID
    packsize    36
    origsize    36
    datetime    0x4e55b063  2019-02-21 22:03:06
    attribs     0x00000020  ARCHIVE
    crc32       0x772b6618
    comptype    0x00        stored
    compqual    0x03        normal
    params      0x000a
    reserved1   0x4554
    filename    b'hint.txt'
    comment     b''
    ntsecurity  b''
    reserved2   b''
header
    hdr_crc     0xb652
    hdr_size    50
    hdr_type    0x01        FILE32
    hdr_flags   0x8001      ADDSIZE|SOLID
    packsize    22
    origsize    22
    datetime    0x4e55b063  2019-02-21 22:03:06
    attribs     0x00000020  ARCHIVE
    crc32       0x69e27254
    comptype    0x00        stored
    compqual    0x03        normal
    params      0x000a
    reserved1   0x4554
    filename    b'C:\\C:\\114514\\oc.txt'
    comment     b''
    ntsecurity  b''
    reserved2   b''

PS:\\ 代表着的是 \,由于 python 的转义原因这里显示成 \\

可以很明显地发现 filename 属性是携带路径信息的,作为一个安全研究人员,很容易就应该想到这里可能隐藏着的路径穿越的风险。

然后就是一大段逆向 + fuzz 测试的神操作,这里贴一下国外研究者的思路(清晰明确,值得学习):

首先,解压路径有两种可能的选择方式: sprintf(final_file_path, "%s%s", "", file_relative_path); 以及 sprintf(final_file_path, "%s%s", destination_folder, file_relative_path);,其中第一种以绝对路径展开,第二种以相对路径展开,而第二种很明显会被 destination_folder 变量所控制,因此我们想要进行目录穿越的话,需要控制程序的执行流,使其执行第一种函数。

而如何选择的方式取决于 GetDevicePathLen 函数的执行结果,只有该函数的返回值大于 0 的时候才会进入函数一。

暗戳戳贴一下大佬的伪代码:

GetDevicePathLen

再贴段说明: 如果参数如 C:\some_folder\some_file.ext,则函数返回 3 如果参数如 \some_folder\some_file.ext,则函数返回 1 如果参数如 \\LOCALHOST\C$\some_folder\some_file.ext,则函数返回 15 如果参数如 \\?\Harddisk0Volume1\some_folder\some_file.ext,则函数返回 21 如果参数如 some_folder\some_file.ext,则函数返回 0

因此我们很明显有两种选择可以作为 payload:

  1. C:\some_folder\some_file.ext
  2. \some_folder\some_file.ext (The first slash represents the current drive.)

然而,在执行该函数之前,我们需要绕过过滤函数 CleanPath 的检验,该函数的伪代码如下图:

CleanPath

该函数会删除选项 1 前的 C:\,因此我们需要再额外修改一下 payload C:\C:\some_folder\some_file.ext,此时该路径在被过滤后得到 C:\some_folder\some_file.ext

跟着执行流程往下走,可以发现回到 WinRAR 的代码内,会继续校验相应参数,此时 \ 会被认为是相对路径而中断执行。但此时 payload1 是以 C:\ 开头,所以不会被 WinRAR 的代码阻止,仍然有效,目录穿越成功!

缺陷

由于该目录只是任意写的问题,所以不能直接导致代码执行。但攻击者巧妙地利用了 Windows 的机制,在 Windows 重启后全局启动项目录里的程序会被执行,因此可以向全局启动目录写入恶意程序的方式,在用户重启后控制用户电脑。

再贴一下研究者推测的两种攻击思路:

  1. C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
  2. C:\Users<user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

其中第一种可以写绝对路径,相对高效,但在 UAC 打开的情况下会失效(权限问题),而第二种没有权限限制的问题但需要知道用户的用户名。

但俗话说得好,方法总比困难多,在研究者的不懈努力下,发现 C:\C:C:../AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\some_file.exe 在被 CleanPath 过滤后会得到 C:../AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\some_file.exe,完美地定位到了第二种攻击需要的启动目录下,攻击成功!

影响 && 修复

由于该漏洞是由于动态链接库 UNACEV2.dll 所造成的,所以一旦该动态链接被被其他压缩软件所使用的话,同样能存在相同的安全隐患。

可能存在风险的软件如下:

  • WinRAR < 5.70 Beta 1
  • Bandizip < = 6.2.0.0
  • 好压(2345 压缩) < = 5.9.8.10907

修复方式:将使用的压缩软件更新到最新版或直接删除 UNACEV2.dll 文件

思考

关于该漏洞影响的严重性,这个问题之前在某群聊里也引起过群友的讨论,关于该漏洞能否称之为代码执行尚待商榷,但不可否认的是,在适当的条件下,本漏洞带来的任意文件写可能引发极大的安全隐患。比如当攻击者掌握另一个漏洞能触发系统崩溃的时候,此时任意文件写的作用就体现出来了。攻击者可以先将恶意程序写到系统的启动目录再触发系统崩溃,系统自动重启后就会执行该恶意程序,代码执行,完美(理想情况)。或者另一种利用思路是 dll 劫持,即通过覆盖相应 dll 的方式将攻击者编写的恶意 dll 覆盖系统 dll 进而攻击用户。

在写博客的时候发现了最新的报告 垃圾邮件利用WinRAR ACE漏洞安装后门程序,可以看出攻击者也是别出心裁(丧心病狂)了。

以及再暗暗立个 flag,改天我也要学会用 fuzz 然后 fuzz 出洞来,看大佬一波操作真的酸的不行🍋

参考链接