Gabriel Landau

在阴影中寻找真相

让我们讨论一下硬件堆栈保护除了预期的漏洞缓解能力之外带来的三个好处,并解释一些限制。

5 分钟阅读安全研究
Finding Truth in the Shadows

微软已开始在 Windows 10 20H1 中推出用户模式硬件堆栈保护 (HSP)。HSP 是一种漏洞缓解技术,可防止堆栈上的返回地址损坏,这是软件利用的代码重用攻击的常见组成部分。在硅芯片的支持下,HSP 使用 Intel 的控制流强制技术 (CET) 和 AMD 的影子堆栈,并结合 Yarden Shafir 和 Alex Ionescu 详细描述的软件支持。请注意,术语 HSP 和 CET 通常可以互换使用。

HSP 创建一个与常规堆栈分开的影子堆栈。它在用户模式下是只读的,并且只包含返回地址。与之形成对比的是常规堆栈,它将数据与返回地址交错排列,并且必须可写才能使应用程序正常运行。每当执行 CALL 指令时,当前指令指针(也称为返回地址)都会被推送到常规堆栈和影子堆栈中。相反,RET 指令会从两个堆栈中弹出返回地址,如果它们不匹配,则会生成异常。从理论上讲,ROP 攻击得到了缓解,因为攻击者无法将任意值写入只读的影子堆栈,并且更改影子堆栈指针 (SSP) 是一项特权操作,使得轴心是不可能的。

今天,我们将讨论 HSP 除了预期的漏洞缓解能力之外带来的三个额外好处,然后介绍一些限制。

调试

尽管 HSP 的设计目的是为了缓解漏洞,但它也为其他目的提供了有用的数据。新版本的 WinDbg 将向用户显示一个提示,说明他们可以使用 SSP 作为恢复堆栈跟踪的另一种方法。当调试覆盖返回地址的堆栈损坏错误时,这非常有用,因为影子堆栈是独立的。在堆栈展开数据不可用的情况下,它也很有用。

例如,请参见下面 WinDbg 针对进程内存转储的输出。k 命令显示常规堆栈跟踪。dps @ssp 解析它可以找到的所有符号,从 SSP 开始 - 这本质上是影子堆栈跟踪。请注意,除了第一帧之外,两个堆栈跟踪是相同的

性能

内核模式组件(如 EDR 和 ETW)通常会捕获堆栈跟踪,以便为每个事件提供其他上下文。在 x64 平台上,堆栈遍历需要捕获线程的上下文,然后为每个帧查找一个数据结构,使遍历器能够“展开”它并找到下一个帧。这些查找速度太慢,以至于 Microsoft 在添加 x64 支持时认为有必要构建一个多层缓存系统。您可以在 ReactOS 中看到近似的遍历/展开过程此处,不包括缓存。

鉴于整个影子堆栈可能驻留在单个页面上,并且不需要展开,因此影子堆栈遍历可能比传统的堆栈遍历更高效,尽管这尚未得到证实。

检测

影子堆栈提供了一个有趣的检测机会。攻击者可以使用 ThreadStackSpooferCallStackSpoofer 中演示的技术来混淆其针对线程堆栈扫描(例如 StackWalk64)和内联堆栈跟踪(如 Sysmon 打开进程事件)的存在。

通过将传统的堆栈遍历与影子堆栈遍历进行比较,我们可以检测并绕过线程堆栈欺骗。我们展示了 ShadowStackWalk,这是一个使用影子堆栈实现 CaptureStackBackTrace/StackWalk64 以捕获线程堆栈欺骗的 PoC。

当堆栈正常时,ShadowStackWalk 的功能类似于 CaptureStackBackTraceStackWalk64

ShadowStackWalk 不受诸如 ThreadStackSpoofer 等调用堆栈的有意中断的影响。其他技术遗漏的帧以绿色显示

ShadowStackWalk 不关心伪造的堆栈帧。不正确的帧以红色显示。其他技术遗漏的帧以绿色显示

限制

对 HSP 的硬件支持有限。HSP 至少需要 11 代 Intel 或 5000 系列 Ryzen CPU,这两款 CPU 均于 2020 年底发布。没有软件仿真。大多数 CPU 需要数年时间才能支持 HSP。

对 HSP 的软件支持有限。微软一直在缓慢推出它,甚至在他们自己的进程中也是如此。在一个示例 Windows 10 22H2 工作站上,它在大约 40% 的进程中启用。由于 HSP 是一种漏洞缓解措施,因此实施很可能会从常见的漏洞利用目标(如 Web 浏览器)开始,尽管如下所示,并非所有 msedge.exe 进程都受到保护。随着 HSP 的成熟和支持的改进,没有 HSP 的进程将成为值得额外审查的异常值,类似于 2023 年没有 DEP 支持的进程。目前,恶意软件可以简单地选择未启用 HSP 的进程。还值得注意的是,HSP 根本不支持 WOW64。

HSP 的设计采用了漏洞缓解威胁模型。它的设计目的并不是为了防御那些拥有代码执行权限、可以更改线程上下文并执行系统调用的攻击者。随着时间的推移,攻击者也会调整其调用堆栈操作以操纵影子堆栈。然而,影子堆栈是用户 RO 并且更改 SSP 是特权操作这一事实意味着这种篡改需要系统调用,这些系统调用(理论上)可能受到比传统堆栈篡改更严格的审查。

结论

今天,我们讨论了 Windows 硬件堆栈保护的三个潜在好处,并发布了一个 PoC,演示了如何使用它来检测和击败操纵调用堆栈的防御规避。