内核模式威胁的最新技术与防御方式(第三部分)

传送门

内核模式威胁的最新技术与防御方式(第一部分)
https://www.anquanke.com/post/id/160412

内核模式威胁的最新技术与防御方式(第二部分)
https://www.anquanke.com/post/id/160697

 

防御内核模式威胁

首先,要防御内核模式威胁,就要确保驱动程序的安全。目前,有很多可以使用的安全工具,包括SysInternals Sysmon和审计模式下的Windows Defender Application Control。管理员应该重点关注存在已知漏洞利用方式的驱动程序或不常见的驱动程序。

如果可以,最好能建立起一个基线。众所周知,在开始寻找攻击者之前,首先需要对公司的资产和基础设施有全面的了解。这一点,同样适用于内核模块。

如果可以,我们建议管理员应该部署程序代码完整性策略(HVCI),从而将大多数已知存在漏洞的驱动程序拒之门外。从Windows 10 Redstone 5开始,如果启用HVCI,Windows将会默认阻止许多存在漏洞的驱动程序。HVCI这一机制对于特定用户群体来说非常有用,但却不能帮助使用早期版本Windows的用户,以及使用Redstone 5版本但无法启用HVCI的用户。

开源防御:内核攻击面减少(KASR)

为了帮助减轻内核模式威胁带来的风险,我们发布了KASR( https://www.endgame.com/tools ),这是一个免费的工具,可以阻止已知存在漏洞的驱动程序。

KASR能够对一般水平的攻击者增加障碍,但我们也知道,KASR的黑名单不会扩展。

因此,这一工具无法阻止能够在内核驱动程序中查找并利用漏洞的攻击者,只能防范脚本小子进行的漏洞利用。Microsoft正在确定RS5的驱动程序黑名单,在他们完成这项工作后,我们也会将其纳入KASR的未来版本中。

内核搜索

回顾我们红蓝对抗的过程,其实是需要一种更好的方式,来寻找例如DoublePulsar或者无文件植入物这样的内核模式威胁。

传统的取证技术,往往由完整内存采集和离线分析组成,而这样的取证方式不适用于我们所说的这几种威胁。为了解决这个问题,我们没有获取内存,而是直接在终端上进行分析,类似于“Blackbox” Rootkit扫描器的工作原理。这也就意味着,我们可以在几毫秒内完成扫描。

有几种技术可用来读取Windows主机的物理内存,包括PhysicalMemory设备和基于MDL的API。其中,我们最喜欢的技术是页表项重映射(Page Table Entry Remapping,如上所示, http://www.academia.edu/12257508/Anti-forensic_resilient_memory_acquisition ),因为该技术操作简单,并且具有良好的性能。

要实现的目标是常规化地检测未经签名的DoublePulsar。可以通过扫描内核池/堆内存,寻找类似于Shellcode的内存Blob来实现。不幸的是,在Windows 7上,整个NonPagedPool都是可执行的,这样一来搜索的范围就变得巨大,留下了相当大的搜索空间,似乎更加容易出现误报的情况。相反,如果专注于识别函数指针的挂钩,可能是一种更为有效的方式。

在这里,第一个问题是如何确定内存中函数指针的位置。由于函数指针是绝对地址,所以如果要重新定位映像,就也需要对函数指针进行重新定位。为了找到函数指针,需要遍历所有已加载驱动程序的PE重定位表。随后,检查重定位的值是否指向原始磁盘副本中驱动程序的可执行部分。

接下来,检查它是否不包含在内存中加载的驱动程序之内。最后,如果它指向的内存区域是可执行的,就可以视为命中。通过这种技术,能够有效检测到我们此前在内核模式植入安装的DoublePulsar和套接字处理程序挂钩。

随即,我们发布了Marta( https://www.endgame.com/tools ),该工具以上述技术为原理,扫描系统上的所有驱动程序(通常扫描时间以毫秒为单位),并识别出任何活动的感染情况。Marta Burgay是第一位发现双脉冲星的天文学家,因此我们将这一免费工具命名为Marta。在下面的演示中可以看到,Marta能很快识别出DoublePulsar感染。

 

实时保护

能做到按需扫描,已经是一个非常棒的成果了。但进无止境,我们还想看看能不能针对这种类型的攻击做到实时捕获。Endgame团队在开发HA-CFI产品之后,已经非常熟悉大多数现代CPU上的性能监控单元(Performance Monitoring Unit,PMU, https://www.blackhat.com/docs/us-16/materials/us-16-Pierce-Capturing-0days-With-PERFectly-Placed-Hardware-Traps.pdf )。

PMU是CPU上的一个组件,我们对其进行编程,以计算出每个内核上发生特定低级别事件的次数。在这种情况下,我们使用间接转移预测技术(Indirect Near Call Branch Misprediction)。

当其中一个事件发生时,PMU会产生一个中断,并执行我们的中断服务程序。在这个例程中,我们能够对其进行验证并实施这一策略。这一视频展示了我们在系统被感染时,就能够检测到DoublePulsar的实时方法: https://youtu.be/30k4Ap6oWnM

为了检测不支持的代码执行,我们保留一个与加载的驱动程序相对应的内存范围列表,并验证指令指针是否在该范围之内。然而,我们的概念证明存在一些缺点,具体如下:

  1. PatchGuard本身使用了未受支持的页,试图以此对抗逆向工程。尽管捕获到PatchGuard很有趣,但我们需要用一种可靠的方式来尽量避免此类误报。但由于PatchGuard没有文档并且随时可能发生变化,这一点很难实现。
  2. 内核代码具有对PMU进行编程的能力。如果攻击者清楚这一点,那么他完全可以对PMU进行重新编程,或禁用中断。
  3. 与所有内核驱动程序一样,这种检测驱动程序容易受到数据攻击,例如IAT修复或对策略结构进行攻击。

正如我们在前文所提到的,目前还没有针对ROP(Rear Flow CFG)的内核保护机制。Microsoft要想制定有效的ROP防御计划,还需要Intel控制流强制技术(Intel Control-flow Enforcement Technology,CET)的支持。尽管这一技术可能非常有效,但到目前为止,CET还没有在任何生产的处理器中实现过。

为了缓解这一问题,我们提出了一种基于PMU的保护系统,可以检测Rear Flow控制流的策略违规。通过配置CPU最后一个分支记录(Last Branch Recorded,LBR)机制,可以将内核中的每个返回内容记录到循环的缓冲区中。

我们可以通过扫描所有加载的驱动程序并识别调用指令,来生成控制流策略。这些调用指令之后立即就是相应的返回站点。我们的策略就是列出这些有效返回站点的位图。在系统启动时会生成这一策略,在加载新驱动程序时会对该策略进行更新。

如果为每个返回指令都产生中断,其代价太高。相反,我们利用ROP产生大量分支误预测的实时,将PMU编程为只针对误预测的分支生成中断。当中断触发时,会验证LBR中记录的每个返回地址。

如果其中有任何一个不在上述策略中(也就是先前没有调用过),我们就认为这一控制流是违规的。这个系统虽然有效,但如果没有正确对其进行调整,会产生过多的中断,从而对系统性能造成严重影响。

如演示中所示,经过适当的调整,我们看到JetStream浏览器基准性能测试得分大概减少了1%,但该系统的检测率仍维持在100%。我们最终的系统能准确检测出内核模式ROP。
演示视频:https://youtu.be/hlakLdY2Xo8

 

总结

在过去十年中,Windows平台的安全性已经得到了很大的改进,但内核模式威胁仍然是一个大问题。要充分利用Microsoft的最新防御机制,就必须要将系统升级到最新的Windows 10,并且要启用尽可能多的保护,例如Secure Boot、VBS、HVCI等。从内核模式攻击者的角度来看,基于虚拟化的安全性(VBS)是他们最大的痛点。

但是,这一机制存在许多兼容性问题。安全人员可以收集终端加载的驱动程序,并利用此数据来发现正在加载的异常驱动程序,或易受攻击的驱动程序。最后,还可以借助工具,搜索并检测已经存在于网络之中的内核模式恶意软件。

要防御内核模式威胁,需要我们付出巨大的努力,希望我们的这两部分文章和两个开源工具能有助于提高大家对内核模式威胁的认识,并在这些威胁发生时采取及时的防护措施。

(完)