Windows 错误报告服务在最近的安全更新中修复了两个权限提升漏洞,分别标记为 CVE-2020-0753 和 CVE-2020-0754。这两个漏洞都利用了该服务文件系统操作中的竞争条件。但由于竞争窗口较小且文件落点不确定,这两个漏洞并不容易利用。我们在这里分享利用它们的技巧。
我们报告中给出了这两个竞争缺陷的根本原因,实际原因可以概括为 可预测即意味着脆弱。当 WER 服务处理临时文件时,它操作的文件位置是 C:\ProgramData\Microsoft\Windows\WER\Temp,这是一个对经过身份验证的用户具有读写权限的目录。这意味着中等完整性级别的普通用户可以覆盖 WER 服务创建的文件,甚至将其转换为文件系统链接,从而损坏或删除原本无法触及的文件。
为了保证文件操作安全,WER 服务依赖于一个名为 GetTempFileNameW 的标准 API,并通过 wersvc.dll->UtilGetTempFile 对其进行了封装。该 API 帮助 WerSvc 以 "WER****.tmp" 的形式生成不重复的随机文件名。
文件名的随机部分由一个 4 字节的十六进制数生成,范围从 0000 到 FFFF。如果某个数字已被用于创建文件,API 会选取另一个随机文件名。
这种策略显然存在缺陷:如果用户创建了 65535 个从 WER0000.tmp 到 WERFFFE.tmp 的文件,API 会选取一个随机数并测试该文件名是否存在(例如 WERA560.tmp)。当发现文件已存在时,它会继续从 WERA560.tmp 测试到 WERFFFF.tmp。在测试过程中,出现了一个可被利用的窗口,因为我们找到了一种方法,使 WerSvc 在 GetTempFileNameW 调用上卡住 4-5 秒,这提供了相当大的时间间隔。与此同时,我们强制服务使用固定的文件名 WERFFFF.tmp 创建临时文件。
服务创建名为 WERFFFF.tmp 的临时文件后,API 会自动关闭它持有的文件句柄,并将文件名返回给服务以便进一步操作,这正是引入漏洞的地方。此时满足三个条件:
在此,服务会 向文件中写入内容并删除它。利用文件系统链接和特定的利用技术,写入和删除操作都可能导致权限提升。
为了将这个漏洞转化为任意文件删除,我们创造性地利用多重目录交汇点来完成利用。我们的利用包含以下步骤:
WER***.tmp 文件放入 $pwd\1\,并建立交汇点 $pwd\2\ -> $pwd\1\;$pwd\2\ 触发该函数,并创建另一个进程持续执行命令 SetOplock $pwd\1\WERFFFF.tmp;$pwd\2\ 重新定向到 \RPC CONTROL\,然后创建对象符号链接 \RPC CONTROL\WERFFFF.tmp -> $target 和 \RPC CONTROL\WERFFFF.tmp.etl -> $target;详细的利用和 PoC 在 WERReport-CVE-2020-0753 中提供。
通过利用 GetTempFileNameW 中的缺陷,我们获得了服务将操作的、可预测的位置;通过利用多层文件系统交汇点,我们使得竞争条件变得可靠地可利用。
同时,我们注意到这种竞争错误也可能导致可能的文件覆盖问题,从而在某些情况下可能导致权限提升漏洞。
要解释为何任意文件破坏(如果能够控制文件内容中非常小的部分:少于 63 字节)可以转化为 EoP,我们需要关注 Windows Defender 的工作机制。
Windows Defender 拥有恶意软件签名数据库。如果某个文件包含某些恶意软件签名,Defender 会将其视为恶意软件并删除。然而,此功能会导致额外的攻击面。例如,在 WCTF2019 中,来自 tokyowesterns 的 @icchy 设计了一个名为 "Gyotaku The Flag" 的 Windows CTF 挑战,它利用此功能作为 Oracle 来泄露信息。
在这里,我们利用 Windows Defender 的这一特性,在拥有受部分控制的任意文件破坏能力时实现任意文件删除。我们只需向文件中写入一个恶意软件签名,并触发 Windows Defender 的默认扫描,该文件就会被放入 Defender 的隔离区,普通用户(即中等完整性级别的非管理员用户)只需触发两次扫描操作即可删除它。
因此,只要能够利用漏洞将恶意软件签名字符串放入目标文件中,任意文件破坏漏洞就可以转化为任意文件删除。
利用漏洞破坏目标文件,并向其中插入一个 Windows Defender 可识别的特征字符串。
触发 Windows Defender 扫描目标文件,使其隔离。
再次触发扫描,目标文件被删除。
通过这种技术,我们在 Defender 的帮助下实现了任意文件删除。
任意文件删除可以更容易地被利用来获得进一步的权限。
Microsoft OneDrive 是一个提供个人云存储服务的应用程序包。自 Windows 8 以来,该应用程序作为默认安装选项集成到 Windows 中。在我们的研究过程中,发现了 OneDrive 的维护计划任务中的 6 个漏洞,并已提交给 MSRC。
以下是我们将要披露的 Microsoft OneDrive 相关计划任务中的漏洞表:
所有这 6 个漏洞都是由服务在普通用户可控制的位置上操作时,不正确地处理硬链接和符号链接导致的。在利用这些漏洞时,一个困难在于文件名通常包含当前进程的 PID 或文件操作的时间戳。两者都可以通过在触发服务运行时,对服务将尝试加载的独特 dll 文件设置 OpLock 来解决,这样我们就能获得预测服务稍后将操作的文件名所需的所有信息。在 FileSyncConfigTemp_hardlink 目录中提供了一个 PoC 示例。
上述所有 6 个漏洞均提供了完整的报告和 PoC 程序。尽管大多数漏洞最初仅导致任意文件破坏,但这种漏洞仍然可能导致系统崩溃(通过覆盖关键系统配置文件),并且所有情况都需要重新安装 Windows。因此符合 Windows 系统拒绝服务漏洞类型标准。
此外,这种漏洞在特定上下文中实际上可能导致权限提升。我们已经讨论了利用技术,该技术可以将任意文件覆盖问题转化为任意文件删除原语,从而可以实现权限提升。
2020年02月02日: 提交漏洞报告
2020年02月08日: MSRC 调查并回复了我们提交的 OneDrive 6 个漏洞,结论是由于 需要过多的用户交互/难以构建可靠的利用 而不修复。
2020年02月08日: 我们回复:不需要用户交互。只需等待计划任务运行即可。因此,这种情况是典型的。
2020年02月11日: MSRC 回复:你如何获取用户机器上的特定文件?你是否将该文件的每种排列都放在该文件夹中?它必须精确匹配日期/小时/PID 吗?由于这些原因,这似乎需要过多的用户努力。
2020年02月11日: 我们回复:我们的 PoC 是一个简化版本。为了减少预测文件名的努力。实际上,你只需要设置一个 OpLock。然后你就可以获取所有 {pid}、{hour}、{date}。因此,不需要用户交互。
2020年02月12日: 询问是否可以发布这 6 个漏洞的 writeup。
2020年02月13日: MSRC 回复:你可以发表 writeup。
2020年02月22日: 细节公开。
尽管硬链接问题在 Windows Insider Preview 版本中已经修复,但在最新的 Windows 发行版中仍未修复,而且似乎没有计划向后移植到所有受支持的系统中 :( 。拒绝修复这些漏洞看起来并不像是一个负责任的行动。
| 漏洞程序 | 类型 | 提供 PoC |
|---|
| FileSyncConfig.exe | HardLink | 是 |
| FileSyncHelper.exe | HardLink | 是 |
| OneDriveFileSyncConfig.exe | SymLink | 是 |
| OneDriveSetup.exe | HardLink | 是 |
| OneDriveSetup.exe | HardLink | 是 |
| OneDriveStandaloneUpdater.exe | HardLink | 是 |