Internet Explorer 10 在内存保护方面引入了显著改进,可防止漏洞被轻易攻破,帮助确保用户在危机四伏的 Web 环境中安然无恙。这些改进将增加漏洞攻击的难度和开发成本,让黑客的伎俩难以得逞。
社交工程类恶意软件已经成为黑客们将恶意代码植入受害者计算机的主要方式,这在很大程度上是由于过去几年中大量浏览器漏洞陆续得到修复,大大提高了发动漏洞攻击的难度。但是,随着越来越多的用户升级到 IE9 并受益于 SmartScreen 筛选器提供的保护,黑客们对直接攻击浏览器及其插件再次萌生了兴趣。
在今天的博文中,我将介绍当下的威胁环境,回顾 IE9 中现有的保护技术,并解释为何 IE10 中新的内存保护技术将提供更强的安全性。
攻击 Web 浏览器
黑客之所以攻击内存相关的漏洞,其目的在于将浏览器的代码执行路径偏转到黑客选择的代码。为了实现这个目的,攻击者需要满足以下两个条件。条件之一是他们必须在受害者的计算机上植入自己希望运行的代码。用于获取此类代码的技术可以分为两类。攻击者可以借助堆喷射等技术将自己的恶意代码植入内存。攻击者也可以选择借助名为返回导向编程的技术,执行已经在内存中呈现的代码。
攻击者还需要攻破一个可更改原始代码执行流的漏洞,例如,缓存区溢出漏洞。然后,他们可以将代码路径更改为“跳到”其希望执行的代码地址。
在典型的缓存区溢出攻击中,攻击者会将一个精心设计的数据集植入线程的堆栈中,造成为其分配的缓存区溢出,并覆盖其他数据结构。攻击者尝试覆盖的结构包括异常处理程序记录或函数的返回地址,以便将代码流更改为他们在内存中选择的位置。
其他攻击类型包括释放后使用漏洞,在这种攻击类型中,攻击者会诱导应用程序访问一个内存已释放并用于其他用途的对象。
保护浏览器
内存保护技术为阻止攻击者实现其目标提供了第一道防线。这些技术旨在提高漏洞攻击的难度,降低其成功率,并在某些情况下完全禁绝其可能性。内存保护技术的目标是在攻击者成功攻破漏洞并运行其代码前,安全地终止遭到攻击的浏览器进程。在许多情况下,保护技术可以为供应商争取一定的时间,帮助他们在黑客攻破漏洞并造成损害前,成功开发并散布相应的修复程序。
Internet Explorer 采用的内存缓解技术已经历过多次改进,以便对抗日新月异的攻击技术。许多防护技术(例如,/GS 编译器标记)已经在之前的多个 Internet Explorer 版本中采用,同时也历经了多个版本的更新和增强。另外一些防护技术(例如,稍后将介绍的 ForceASLR)是 IE10 的新增功能,需要依靠新的操作系统功能。
编译时间缓解
软件开发人员可以使用编译器缓解技术,并且这也应作为最佳开发实践的一部分采用。在 Internet Explorer 的开发过程中,Internet Explorer 团队将这些缓解技术包含进了我们的安全开发生命周期要求。我们建议软件开发人员采用包含这些编译时间缓解技术实现的自定义 SDL 流程。
/GS 标记最初在 Visual Studio .NET 2002 中引入,并已在所有受支持的 IE 版本中采用。这是一种可以在应用程序的堆栈中添加缓存区溢出检测功能的编译器技术。这种技术会在运行时向应用程序的堆栈边界添加称为“金丝雀”的安全密钥。举例来说,对于针对返回地址的缓存区溢出攻击,其覆盖对象将变为堆栈缓存区和返回地址间植入的金丝雀。这也为进程提供了一种检测溢出的手段。在发生溢出时,系统将抛出异常,以便系统可以在攻击者的代码运行前安全地终止进程。
这一基本的保护概念在每个新的 Visual Studio 版本中都获得了增强。Internet Explorer 9 及后续版本中采用了最新的增强 /GS,其中包含经过大幅改进的启发式方法,以保护包括非指针数组和纯数据结构在内的更多函数。此外,增强的优化杜绝了不必要的检查,降低了防护的性能开销。
/SAFESEH 标记是一种链接器选项,该标记可通过某种机制将应用程序的注册异常处理程序存储到可靠内存位置的查找表中。在发生异常时,应用程序堆栈中的异常处理程序地址将通过查找表进行验证。如果二者不匹配,系统将终止该进程。
/SAFESEH 标记存在一个问题,即该标记需要所有 DLL 模块全部选择加入,才能可靠地保护进程。如果存在未选择加入的模块,保护效果将会大打折扣。虽然 SDL 要求全部 Microsoft 代码在编译时使用 SAFESEH 标记,但第三方的插件可能并未使用该标记进行编译。
/DYNAMICBASE 标记是一种链接器选项,该标记可让应用程序选择加入一种名为地址空间布局随机化 (ASLR) 的操作系统缓解技术,我们稍后将在本文中对该技术进行更加详细的介绍。
/DYNAMICBASE 的问题与 /SAFESEH 的局限类似,如果存在未选择加入此保护的 DLL 模块,ASLR 作为漏洞缓解技术的价值将大打折扣。攻击者可以定位到处于可预测位置的任何模块,而只要存在一个这样的可预测目标就会让攻击者有机可乘。最经成为漏洞攻击目标的许多浏览器插件都没有选择加入 ASLR 保护。例如,去年发现的一种 Adobe Reader 和 Acrobat 0 日漏洞攻击就是利用了一个未选择加入 ASLR 的模块(名为 icucnv36.dll)中的可预测函数位置。
运行时缓解
运行时缓解结束允许操作系统参与到确保进程安全的工作中。
DEP/NX 是一种依赖现代 CPU 密钥安全功能(数据执行防护或称 No eXecute)的操作系统缓解技术。这种缓解技术允许将内存页标记为不可执行(数据);处理器将拒绝运行如此标记的内存页中的代码。
在内存漏洞攻击的第二阶段,攻击者可能会尝试执行已添加到内存数据页中的自定义代码。在数据页已标记为不可执行的情况下,攻击者的代码将无法运行,并且系统会安全地终止该进程。
IE8 中首次默认启用了 DEP/NX 支持,并且该功能在 IE10 中将继续启用。
SEHOP 是一种运行时缓解技术,该技术可提供与 /SAFESEH 编译器标记非常类似的异常处理程序篡改保护机制。这种保护技术的工作原理是将符号化的异常记录作为线程异常处理程序列表的尾记录插入。在发生异常的情况下,异常处理函数列表将前进,以确保到达该符号化记录。如果未到达该记录,表示异常处理程序链已损坏,系统将安全地终止该进程。与 SafeSEH 不同,SEHOP 不需要每个模块都选择加入,因此即便插件未使用最安全的标记进行编译,该技术也可以提供相应的保护。
SEHOP 在 IE9 中首次启用并将在 IE10 中继续启用。
地址空间布局随机化技术在 Windows Vista 中初次引入,并在 Windows 8 中得到了显著增强。ASLR 将在应用程序最初载入内存时为其分配随机的内存基地址。此外,进程环境块 (PEB)、线程环境块 (TEB)、堆栈和堆等其他内存结构也将分配到内存中的随机位置。
将对象和函数在内存中的位置随机化,有助于防止攻击者找到它们的位置,进而阻止名为返回导向编程的技术。您可以将这种随机化想象为通过密码锁阻止攻击者的负载。如果不知道正确的密码组合,攻击者将只能获得一次胡乱猜测的机会。一旦猜测错误就将导致攻击失败,系统将安全地终止该进程。
以下图片描述了核心系统组件如何在系统启动时载入随机的内存地址。
Windows 8 中的 ASLR 在诸多方面都获得了改进,这些改进都将在 Internet Explorer 10 中获得充分利用。
所有自下而上和自上而下的分配,现在都将通过 8 位的熵进行随机化处理。这一改进将显著减少 VirtualAlloc 和 MapViewOfFile 中包含的可预测内存区域。
高熵地址空间布局随机化 (HEASLR) 可以充分利用 64 位地址空间增加的位数,并将更多位数分配给熵。这将大幅增加可分配给 64 位进程的潜在地址数量。所有 64 位进程都可以选择加入通过 HEASLR 实现的扩展熵。进程可以通过一个新的映像文件执行选项在链接时 (/HIGHENTROPYVA) 或加载时选择加入这些熵。
默认情况下,64 位计算机上的 Metro 风格浏览器将在 64 位模式下运行,以便提供更大的地址空间和随机性更强的布局。
ForceASLR 是 Windows 8 中公认为最重要的 ASLR 更改。ForceASLR 是 Internet Explorer 10 采用的一个新加载器选项,可指示操作系统随机化通过浏览器加载的所有模块的位置,即使给定模块未使用 /DYNAMICBASE 标记进行编译也是如此。ForceASLR 保护已添加到 Windows 8 的内核之中,并将作为 Windows 7 的更新随 Internet Explorer 10 一起安装到该平台中。
为了帮助确保与此功能的兼容性,并为不支持 ForceASLR 的较老 Internet Explorer 版本提供内存随机化保护,我们继续推荐插件开发人员使用 /DYNAMICBASE 标记。
总结
我希望对 Windows 8 和 Internet Explorer 10 中内存保护功能的这些简短概述能够对您有所帮助。我们在幕后还对增强安全性进行了许多改进,但其中很多都因为过于玄妙而无法命名。我们还有一些安全性相关的公告即将发布,因此请继续关注我们的动态,我们也将在提供安全的 Web 浏览平台这一征途上继续前行。
—Internet Explorer 安全性项目经理 Forbes Higman