1 |背景
2023年8月23日,Group-IB的研究人员披露了利用WinRAR任意执行漏洞CVE-2023-38831的攻击活动。研究人员表示,该漏洞最早于2023年4月被利用,于2023年7月被该组织发现并提交至RARLAB,最终于2023年8月2日由RARLAB发布修复了该漏洞的WinRAR v6.23正式版本。
9月14日,知道创宇404高级威胁情报团队发表了APT组织利用该漏洞的报告——《Konni APT 利用 WinRAR 漏洞(CVE-2023-38831)攻击数字货币行业》。报告中,表示首次发现有APT组织(Konni组织)利用WinRAR任意执行漏洞CVE-2023-38831进行攻击活动。
本次漏洞影响范围为WinRAR低于v6.23的所有版本,以下是该漏洞的基本信息:
CVE ID |
CVE-2023-38831 |
公布时间 |
2023-08-24 |
类型 |
代码执行 |
等级 |
高危 |
攻击向量 |
本地 |
所需权限 |
无 |
攻击复杂度 |
低 |
用户交互 |
需要 |
PoC/EXP |
已公开 |
在野利用 |
已发现 |
表1-1 CVE-2023-38831基本信息
WinRAR工具发展历史悠久,拥有庞大的用户团体,白泽安全实验室在调查中发现存在安全缺陷的WinRAR仍被大量Windows用户使用,这无疑给了攻击者可乘之机。本文对该漏洞的原理进行了介绍,旨在为普通用户进行提醒和安全科普,为分析人员研究工作提供一定参考。
2 |漏洞简介
WinRAR是一款功能强大的文件压缩和解压缩工具,常用于Windows操作系统,其具备高效的压缩算法、密码保护、分卷压缩、恢复记录等特性,同时支持多种压缩格式,提供图形和命令行界面,以及自解压缩功能,为用户提供了方便、安全的文件管理和传输工具。
zip文件格式是一种数据压缩和文档储存的文件格式。该文件格式使用了三种数据结构对压缩包文件内容进行管理,其中有一个名为ZIPDIRENTRY的数据结构,zip文件为压缩包内每个文件和文件夹都存储了一个这样的结构体,该结构体指明了文件/文件夹的名称、名称长度和修改日期等多项数据。
WinRAR压缩文件管理工具支持用户预览并执行压缩包内文件,当用户打开zip格式的压缩包并执行其中的文件时,WinRAR工具会遍历zip文件的ZIPDIRENTRY结构体,比较用户选择的文件名和每个结构体内存储的文件名,比较成功的文件会被WinRAR释放至临时目录下并在稍后执行。然而由于WinRAR在比较文件名的代码部分存在问题,导致非用户所选目标文件的释放。
WinRAR使用了ShellExecuteExW启动目标文件,ShellExecuteExW是Windows系统的一个API函数,可根据传入参数对目标文件进行操作。该API执行时会对文件的路径进行检查,当路径字符串末尾存在空格时,该API会在文件路径末尾加上通配符“.*”并搜索目标路径下匹配的文件来执行。
当打开经过特殊构造zip压缩包内的文件时,WinRAR会错误的释放非目标文件并由ShellExecuteExW执行。综上所述,该漏洞的触发包含两个环节:
-
文件释放:在使用WinRAR执行压缩包内文件时,由于文件名字符串比较的问题,导致了非目标文件的释放;
-
文件执行:释放文件后,WinRAR使用ShellExecuteExW执行目标文件,当为API传入的路径字符串末尾有空格时,会导致路径下其他特定文件的执行。
3 |漏洞详情
本节以WinRAR v6.11(x64)为例,分析漏洞的实现原理和过程。
3.1 文件释放
zip文件使用三种数据结构管理压缩包内容:ZIPFILERECORD, ZIPDIRENTRY和ZIPENDLOCATOR,其中ZIPDIRENTRY是我们要重点关注的对象,zip压缩包内对每个文件和文件夹都存储了一个这样的数据结构,该数据结构下有一个名为deFileName的成员,存储了目标文件/文件夹的名称,下文将该字符串简称为entryName。
构建一个zip格式的压缩包,其源文件结构和zip文件结构如下所示:
图3-1 压缩文件的源文件结构
图3-2 压缩文件的数据结构
当在WinRAR工具内点击目标文件test.txt时,程序会遍历所有ZIPDIRENTRY结构体,并比较字符串test.txt和entryName,文件名比较部分的代码如下所示。
图3-3 WinRAR比较文件名的代码
从图中代码可以看出:(1)函数会计算目标文件名的长度,并以此长度为限制调用字符串比较函数进行比较;(2)字符串比较成功时,函数会对entryName未被比较的首个字符进行检查,当该字符为正反斜杠(/ 和 )或字符串结束符时,返回1(表示文件名匹配成功)。
根据此处代码的比较逻辑,当以test.txt为目标文件名时,除了test.txt本身以外,其他任何形如test.txt/*或test.txt*的文件名(这里*表示任意字符串)都会被匹配成功。为验证此结论,我们修改zip的ZIPDIRENTRY结构体,将其中一个entryName改为下图形式:
图3-4 经特殊修改后的zip文件
当在WinRAR内点击test.txt执行,正常情况下WinRAR只会解压目标文件test.txt,而此处WinRAR释放了两个文件,test.txt和被修改过entryName的test2.tx,如下所示:
图3-5 被释放的多个文件
3.2 文件执行
如上节所述,WinRAR在释放目标文件后会使用ShellExecuteExW执行目标文件,该Windows API会对传入的文件路径进行处理,包括使用PathFindExtensionW提取目标文件路径的扩展名,从ShellExecuteExW到PathFindExtensionW的函数调用关系如下图所示:
图3-6 ShellExecuteExW到PathFindExtensionW的调用关系
PathFindExtensionW能对传入的文件路径字符串进行处理,并返回文件扩展名所在位置的指针。提取文件扩展名所在位置指针的功能由其子函数PathCchFindExtension实现,对该函数进行分析可以发现:当路径的最后一个‘.’字符之后存在字符反斜杠和空格(‘’和‘ ’)时,PathCchFindExtension函数会返回路径字符串的末尾指针(可以看作是一个空字符串指针)。以下为该函数的代码和调试情况:
图3-7 PathFindExtensionW函数
图3-8 PathFindExtensionW的子函数PathCchFindExtension
图3-9 调试中函数PathCchFindExtension的传出值情况
PathFindExtensionW返回空字符串后,函数CShellExecute::_PerformantBindCtx会调用一个函数在字符串末尾拼接通配符“.*”并查找当前路径下满足条件的文件。该通配符的匹配顺序依次为“.pif”、“.com”、“.exe”、“.bat”、“.lnk”、“.cmd”,成功匹配到其中一个时,函数返回。
图3-10 添加通配符并匹配文件的代码
举例来说,当传入的文件路径为“C:test.txt ”时(注意在文件名后有空格),该函数会在路径后添加通配符(“C:test.txt .*”),并在路径“C:”下查找满足该条件的文件(如“C:test.txt .exe”、“C:test.txt .cmd”等)。
随后匹配到的文件会被执行。
图3-11 添加通配符后匹配到的文件被执行
3.3 流程总结
文件释放的执行流程总体如下图所示,其中标红字体为导致漏洞的关键部分:
图3-12 文件释放漏洞的大致触发流程
文件执行的执行流程总体如下图所示,其中标红字体为导致漏洞的关键部分:
图3-13 文件执行漏洞的大致触发流程
4 |漏洞验证
根据对该漏洞的触发原理的分析,可以构造具有特殊结构的zip压缩包,下图为构造的压缩包结构:
图4-1 经过特殊构造的zip压缩包
其中a1.txt .cmd的文件内容如下,其执行的命令行功能为打开计算器:
图4-2 cmd文件的内容
使用WinRAR打开该压缩包并执行文件“a1.txt ”,可以观察到计算器被启动,并且在temp目录下可以看到被释放的文件除了“a1.txt”以外,还有“a1.txt .cmd”和“b.txt”。
图4-3 漏洞触发的演示
5 |总结
CVE-2023-38831漏洞严重威胁到了使用WinRAR工具的用户信息安全,该漏洞触发条件极为简单,影响范围极广,并且已经有APT组织使用该漏洞进行攻击活动。在此白泽安全实验室提醒各位用户:
-
保持软件和系统更新:及时升级WinRAR软件版本或更换其他同类型工具,定期更新您的操作系统、应用程序和防病毒软件,以确保它们具有最新的安全补丁和防护机制;
-
不要点击未知的链接或附件:不要打开来自未知发件人的电子邮件,尤其是那些包含附件或链接的电子邮件;
-
定期备份数据:定期备份重要数据,以便在遭受攻击时可以恢复数据;
6 |参考链接
[1] https://www.group-ib.com/blog/cve-2023-38831-winrar-zero-day/
[2] https://www.rarlab.com/rarnew.htm
[3] https://www.secrss.com/articles/58122
[4] https://paper.seebug.org/3032/
原文始发于微信公众号(白泽安全实验室):WinRAR或成APT组织“得力攻击武器”?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论