作者:lywang, dannywei

0x00 背景

WinRAR 作为最流行的解压缩软件,支持多种压缩格式的压缩和解压缩功能。今天,Check Point公司的安全研究员 Nadav Grossman 公开了他在 WinRAR 中发现的一系列漏洞。其中以 ACE 解压缩模块的远程代码执行漏洞(CVE-2018-20250)最具危害力。
WinRAR 为支持 ACE 压缩文件的解压缩功能,集成了一个具有 19 年历史的动态共享库 unacev2.dll。 而此共享库自 2006 年以来再未更新过,也未开启任何漏洞利用缓解技术。Nadav Grossman 在 unacev2.dll 中发现了一个目录穿越漏洞,成功利用此漏洞可导致远程代码执行或 Net-NTLM hash 泄露。

0x01 漏洞描述

ACE 文件的解压模块 unacev2.dll 对解压缩路径进行验证时,未能正确过滤压缩文件中的“相对路径”,导致攻击者结合一些技巧可以绕过安全检查,使压缩文件中恶意构造的“相对路径”被直接用作了解压路径使用。从而可以将恶意代码静默释放到系统启动目录中,最终实现远程代码执行或 Net-NTLM hash 泄露。

0x02 漏洞成因

unacev2.dll 模块在解压 ACE 文件时,将对解压缩路径进行验证。它从压缩文件中提取待解压文件的相对路径 file_relative_path,使用 GetDevicePathLen(file_relative_path) 对其进行校验,根据返回结果进行最终解压路径的拼接。如下图所示:

(图片来源:https://research.checkpoint.com/extracting-code-execution-from-winrar/)

当 GetDevicePathLen(file_relative_path) 返回 0 时,将使用 WinRAR 提供的解压路径与压缩文件中的相对路径拼接,得到最终的解压路径:

1
sprintf(final_file_path, "%s%s", destination_folder, file_relative_path);

而当 GetDevicePathLen(file_relative_path) 返回非 0 时,仅使用压缩文件中的“相对路径”作为最终的解压路径:

1
sprintf(final_file_path, "%s%s", "", file_relative_path);

因此,若攻击者能够构造恶意的相对路径,在绕过 WinRAR 回调函数 StateCallbackProc() ,unacev2.dll!CleanPath() 等一系列路径检测和过滤函数的前提下,使 unacev2.dll!GetDevicePathLen(file_relative_path) 返回非0值,便可以使得使用恶意构造的相对路径作为最终解压路径,将恶意文件解压至指定目录中。

最终,Nadav Grossman 构造了两种攻击路径:

编号 恶意的相对路径 最终的解压路径
1 C:\C:\some_folder\some_file.ext C:\some_folder\some_file.ext
2 C:\\10.10.10.10\smb_folder_name\some_folder\some_file.ext \10.10.10.10\smb_folder_name\some_folder\some_file.ext

攻击路径 1 的危害:攻击者可以使用漏洞,将恶意文件静默释放至可能造成危害的路径中实现攻击。
攻击路径 2 的危害: 攻击者可以获取受害者的Net-NTLM hash,从而使用NTLM Relay的方式攻击受害者。

值得一提的是,由于 WinRAR 运行在普通用户权限下,使得攻击者无法将恶意文件静默释放至路径已知的系统启动目录(”C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup”)。而释放至用户启动目录(”C:\Users<user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup”)需要提前预知受害者的登陆用户名或者进行暴力猜测。
好在大多数此类攻击场景均是受害者将恶意构造的压缩文件下载至桌面(C:\Users<user name>\Desktop)或者下载目录(C:\Users<user name>\Downloads),而当压缩文件通过双击解压或右键解压缩时,当前的WinRAR的工作路径与压缩文件一致。这使得攻击者无需猜测受害者用户名,可通过目录穿越的方式将恶意文件释放至用户启动目录,待受害者系统启动时实现任意代码执行。在此前提下, Nadav Grossman 构造了如下的相对路径,使得远程代码执行攻击得以成功:

1
"C:../AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\some_file.exe"

0x03 影响范围

unacev2.dll 作为一个第三方共享库,也被其它一些支持 ACE 文件格式解压的软件所使用,这些软件也同样受到该漏洞的影响。
利用玄武实验室自研的“阿图因”系统,我们对已收录的全网 PC 软件进行了扫描,统计了 unacev2.dll 的使用情况,其版本分布情况如下图所示:

通过“阿图因”系统,我们还能够对使用了该共享库的软件进行反向溯源,目前扫描到了受影响的有 24 款国外软件,15 款国产软件。
多数受影响的软件都可以被归类为工具软件。其中至少有9款压缩软件,以及8款文件浏览器。还有其它许多软件将 unacev2.dll 作为 WinRAR 的一部分放在了自己的软件包中,作为解压模块使用。

0x04 修复建议

目前,WinRAR 已经在 5.70 Beta 1 版本中修复了这个问题。由于开发 ACE 解压模块的公司已于 2017 年 8 月关闭,而且 unacev2.dll 共享库并没有公开源码,导致漏洞无法被正确修复。因此 WinRAR 的修复方案是直接将 unacev2.dll 模块移除,并决定不再支持 ACE 文件格式的解压。

另外,360压缩在最新版本中也已经修复了这个问题,修复方案同样是移除 unacev2.dll 模块。

对于其它受影响软件的用户,我们建议您关注相关软件的修复更新情况,及时更新版本。在软件开发商主动修复之前,可以通过手动删除安装目录下的 unacev2.dll 模块来应急修复。

0x05 参考资料

[1] Extracting a 19 Year Old Code Execution from WinRAR https://research.checkpoint.com/extracting-code-execution-from-winrar/

[2] ACE (compressed file format) https://en.wikipedia.org/wiki/ACE_(compressed_file_format)