保护 Windows 受保护进程
这篇简短的博客是一个分为两部分的系列中的第一篇,讨论一个最初由 James Forshaw 和 Alex Ionescu 公开披露的用户态 Windows 漏洞利用。该漏洞可使攻击者执行通常需要内核驱动程序才能完成的高权限操作。
受保护的轻量级进程 (PPL)
Windows 8.1 引入了受保护的轻量级进程 (Protected Process Light, PPL) 的概念,它使经过特殊签名的程序能够以一种不受篡改和终止的方式运行,即使是管理员用户也无法对其进行操作。其目标是防止恶意软件肆意妄为——篡改关键系统进程并终止反恶意软件应用程序。PPL 存在“级别”层次结构,高权限级别不受低权限级别的篡改,反之则不然。
有关 PPL 流程的更多信息,请参阅以下资源:
漏洞利用
从宏观层面来看,该漏洞利用是一种缓存中毒攻击,攻击者可以将 DLL 添加到 KnownDlls 缓存中——这是一个受信任的 Windows DLL 列表。KnownDlls 仅能由 WinTcb 进程写入,这是 PPL 的最高形式……但 DefineDosDevice API 实现中的一个错误允许攻击者诱骗 WinTcb 进程 CSRSS 代表他们创建缓存条目。KnownDlls 受 Windows 加载程序信任,因此在加载 KnownDlls 时不会执行额外的安全检查,即使在 PPL 进程内也是如此。在缓存中毒后,攻击者启动一个受保护的进程,该进程最终会加载他们的 DLL 并执行其有效负载。
由于此漏洞使攻击者能够将他们选择的 DLL 注入到 PPL 进程中,因此他们可以使用 WinTcb 权限执行任何操作。Microsoft 已表示他们无意修复此漏洞。经确认,该漏洞适用于 Windows 10 21H1 版本 10.0.19043.985。
开源
我们所知的第一个公开漏洞利用 POC 是最近发布的 PPLDump,这是一款工具,可以转储任何 PPL 进程,例如 RunAsPPL 模式下的 LSASS。在 PPLDump 发布几周后,Sealighter-TI 问世,它重用了 PPLDump 的漏洞利用代码,以获取对威胁情报 ETW 源的访问权限,而该源通常仅限于签署保密协议 (NDA) 的反恶意软件公司访问。Sealighter-TI 的快速迭代表明,重新利用漏洞利用代码来执行新的有效载荷是多么容易。
随着漏洞利用代码的公开,我们预计攻击性工具将迅速利用它,以 WinTcb PPL 身份运行有效负载。这将使它们能够:
- 转储企业凭据,即使在 LSASS 被强化为以 PPL 方式运行时也是如此。
- 终止或静默禁用 PPL 进程,例如安全产品。
- 将整个植入程序作为 WinTcb PPL 进程运行。这些植入程序无法被用户模式的安全产品检查或终止。Microsoft 将安全产品限制为 AntiMalware PPL,其权限低于 WinTcb。
- 将代码注入到现有的 PPL 进程中。想象一下在 Windows Defender 内部运行 Cobalt Strike 的 beacon 有效负载。
填补漏洞
鉴于该漏洞目前没有公开的缓解措施,我们发布了一个名为 PPLGuard 的工具来填补它。PPLGuard 在获得许可的情况下基于 PPLDump 代码库构建,它首先利用该漏洞提升至 WinTcb PPL 权限,然后应用 DACL 将 KnownDlls 对象目录设置为只读。这通过防止 CSRSS 添加新条目(这是攻击链中的关键步骤)来阻止该漏洞利用。此 DACL 仅存在于内存中,因此重启后会被清除。
由于 PPLGuard 关闭了该漏洞利用所依赖的漏洞,后续的执行将会失败。
C:\git\PPLGuard>x64\Release\PPLGuard.exe [+] KnownDlls 加固成功!:) C:\git\PPLGuard>x64\Release\PPLGuard.exe [-] DefineDosDevice 失败,错误代码 5 - 访问被拒绝。
PPLGuard 概念验证工具可以在此处找到。
结论
在本篇博文中,我们介绍了 Windows 权限提升漏洞利用,并提供了一个可缓解该漏洞的开源工具。在本博文的第 2 部分中,我们将介绍如何使用 Elastic Security 来搜寻此类攻击。敬请期待。
在此期间,欢迎体验我们最新版本的 Elastic Cloud 上的 Elasticsearch Service。也请务必充分利用我们的快速入门培训,为您的成功保驾护航。
更新 2021 年 06 月 03 日:本文撰写后,有人将 PPLDump 漏洞利用程序移植到了 .NET,以运行 Cobalt Strike 信标作为 WinTCB PPL。