Windows用户模式堆损坏漏洞利用防护技术解析

本文详细分析了Windows堆管理器从XP到Windows 7的安全加固技术,包括元数据保护、随机化机制和堆损坏终止等防护措施,并评估了现有堆利用技术在最新系统上的可行性。

防止用户模式堆损坏漏洞的利用 | MSRC博客

Microsoft安全响应中心

在过去几个月中,我们讨论了几种深度防御缓解措施(如GS[第一部分,第二部分]、SEHOP和DEP[第一部分,第二部分]),这些措施旨在使攻击者更难成功利用软件中的内存安全漏洞。除了我们已经讨论过的缓解措施之外,我们还投入了大量精力来加固Windows堆管理器,以增加基于堆的内存损坏漏洞利用的复杂性。这项加固工作始于Windows XP SP2中的更改,并一直持续到Windows 7。在本博客文章中,我们将简要回顾Windows堆管理器所做的相关更改。我们还将帮助阐明堆基内存损坏漏洞利用技术的最新状态,以及这些技术与Windows Vista、Windows Server 2008和Windows 7的相关性。

堆缓解技术

对Windows堆管理器所做的加固更改通常分为两类:元数据保护和不确定性。元数据保护更改侧重于保护堆管理器内部使用的各种数据结构的完整性。这些更改很有用,因为大多数公共利用技术传统上依赖于一个或多个堆数据结构的损坏。另一方面,不确定性更改侧重于使堆的状态不可预测,这直接影响利用成功的概率。

Windows XP和Windows Server 2003

第一组堆加固更改随Windows XP SP2和Windows Server 2003 SP1发布。这些更改包括:

  • 安全解除链接:在空闲块解除链接期间进行的验证检查,确保存储在空闲块中的列表条目是有效的双向链表条目(通过检查E->F->B == E->B->F == E,其中E是空闲块列表条目)。这防止了依赖于在空闲块合并期间执行的解除链接操作将任意值写入内存中任意地址的利用技术[2]。安全解除链接检查也添加到了Windows 7的内核池中。
  • 堆条目头Cookie:每个堆条目的头部添加了一个8位随机值,在堆条目释放时进行验证。这使得在块释放时可以检测到损坏。

Windows Vista、Windows Server 2008和Windows 7

Windows Vista、Windows Server 2008和Windows 7中的堆管理器通过纳入许多额外的安全改进,扩展了Windows XP SP2和Windows Server 2003 SP1的加固工作。这些改进默认启用(除了堆损坏终止),包括:

  • 移除常用目标数据结构:已被多种利用技术针对的堆数据结构,如后备列表和数组列表,已被移除。后备列表已被低碎片堆(LFH)取代。
  • 堆条目元数据随机化:与每个堆条目关联的头部与随机值进行XOR操作,以保护元数据的完整性。堆管理器在操作每个堆条目之前解包并验证其完整性。
  • 扩展堆头Cookie的作用:与每个堆条目头部关联的8位随机值的作用范围已扩展,以启用更多字段的完整性检查。Cookie的值也在更多地方进行验证(而不仅仅在堆条目释放时检查)。
  • 随机化堆基地址:堆区域的基地址作为整体地址空间布局随机化(ASLR)实现的一部分进行随机化,并具有5位熵。这旨在使堆数据结构和堆分配的位置对攻击者不可预测。
  • 函数指针编码:堆数据结构中的函数指针(例如CommitRoutine)用随机值编码,以防止它们被替换为不受信任的值。
  • 堆损坏终止:如果启用,任何检测到的堆数据结构损坏将导致立即进程终止[1]。这是大多数内置Windows应用程序的默认设置,第三方可以动态启用。如果禁用,损坏错误将被忽略,应用程序允许继续执行。
  • 算法变化:堆管理器使用的分配算法可能会根据分配模式和政策而变化。这可以使攻击发生时确定性地预测堆的状态更加困难。这也可能导致运行时切换到迄今为止被证明对暴力攻击更具弹性的代码路径。

这些更改的一个副作用是它们显著改变了堆的结构和行为。这意味着希望在Windows XP和Windows Vista上利用基于堆的漏洞的攻击者将需要为每个平台开发单独的利用,或者找到攻击这两个平台的通用方法。这些复杂性增加了开发健壮利用所需的努力和复杂性。除了为加固堆管理器本身而采取的措施之外,Windows Vista、Windows Server 2008和Windows 7还支持DEP和ASLR。这些缓解措施通过使攻击者更难执行任意代码,进一步复杂化了任何与堆相关的内存损坏漏洞的利用。

堆利用技术

可用于利用基于堆的内存损坏漏洞的技术近年来一直是研究的热门话题(见参考文献)。最近,IBM ISS X-Force研究团队的John McDonald和Christopher Valasek在Black Hat USA 2009上发表了一篇关于适用于Windows XP和Windows Server 2003的基于堆的利用技术的全面论文[13]。在此之前,Ben Hawkes介绍了他关于可用于攻击Windows Vista堆管理器的利用技术的工作[11,12]。鉴于在这一领域进行了大量研究,我们认为提供一些关于已知基于堆的利用技术的影响和相关性的见解会有所帮助。为简洁起见,我们将不深入讨论这些技术的工作原理。

下表提供了基于堆的利用技术的一般分类,并描述了它们与Windows Vista、Windows Server 2008和Windows 7的相关性,包括文献中目前所述的可行性、感知难度(基于先决条件)以及适用的特定利用缓解措施。

利用技术 针对Windows Vista、Windows Server 2008或Windows 7 可行性 难度 适用的利用缓解措施
合并解除链接覆盖[2,3] N/A N/A - 安全解除链接
关键部分解除链接覆盖[8] N/A N/A - 安全解除链接
后备列表覆盖[4,5,6,14] N/A N/A - 后备列表被移除,由LFH取代
FreeLists[]攻击[5,6,9,10,11,14] 堆缓存攻击[14] N/A N/A - 基于数组的FreeLists被移除 - 使大多数技术无效 - 安全解除链接 - 堆条目元数据随机化 - 堆条目Cookie检查* - DEP & ASLR
LFH桶覆盖[13] - DEP & ASLR
HEAP数据结构覆盖[13] - DEP & ASLR
应用特定数据损坏[10,13] 可变 可变 - 如果需要堆条目头损坏 - 堆条目元数据随机化 - 堆条目Cookie检查* - DEP & ASLR

如何阅读此表(以HEAP数据结构覆盖技术为例):HEAP数据结构覆盖技术在Windows Vista、Windows Server 2008和Windows 7上是可行的,但感知难度高(由于使用它所需的先决条件)。即使这种技术可能可行,DEP和ASLR也有可能进一步复杂化利用。 *如果堆元数据随机化材料和Cookie是秘密的,并且启用了堆损坏终止(这是内置Windows应用程序和Internet Explorer 7/8的默认设置)。

结论

大多数现有的基于堆的利用技术依赖于堆元数据的损坏,无法以其当前形式用于利用Windows Vista及更高版本上的堆内存损坏漏洞。这是由于对堆管理器进行的加固更改,例如移除常用目标数据结构、保护堆元数据的完整性以及使堆的状态非确定性。虽然已经提出了新的攻击[13],但我们目前不知道任何公共利用针对Windows Vista及更高版本,这些利用依赖于堆元数据损坏来利用现实世界中的堆内存损坏漏洞。尽管如此,我们预计基于堆的利用技术将继续是一个活跃的研究主题。因此,我们将继续研究堆增强功能(例如RobustHeap中包含的功能),这些功能将使攻击者更难可靠地利用基于堆的内存损坏漏洞。

  • Matt Miller, MSEC安全科学 帖子按“原样”提供,不提供任何保证,也不授予任何权利。

参考文献

[1] Michael Howard. Corrupted Heap Termination Redux. 2008年6月。 [2] Solar Designer. JPEG COM Marker Processing Vulnerability in Netscape Browsers. Bugtraq. 2000年7月。 [3] Halvar Flake. Third Generation Exploitation. Black Hat Windows Briefings 2002. 2002年2月。 [4] Alexander Anisimov. Defeating Microsoft Windows XP SP2 Heap protection. 2004年。 [5] Matt Conover, Oded Horovitz. Reliable Windows Heap Exploits. CanSecWest. 2004年。 [6] Matt Conover. Windows Heap Exploitation (Win2KSP0 through WinXPSP2). SyScan. 2004年。 [7] David Litchfield. Windows Heap Overflows. Black Hat USA. 2004年。 [8] Nicolas Falliere. A new way to bypass Windows heap protections. 2005年9月。 [9] Brett Moore. Exploiting FreeList[0] on Windows XP Service Pack 2. 2005年12月。 [10] Nicolas Waisman. Understanding and Bypassing Windows Heap Protection. 2007年7月。 [11] Brett Moore. Heaps About Heaps. SyScan 2008. 2008年7月。 [12] Ben Hawkes. Attacking the Vista Heap. Black Hat USA. 2008年8月。 [13] Ben Hawkes. Attacking the Vista Heap. Ruxcon. 2008年11月。 [14] John McDonald and Christopher Valasek. Practical Windows XPSP3/2003 Heap Exploitation. Black Hat USA. 2009年7月。 更新:对利用技术表进行了轻微澄清。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计