微软公司的安全研究中心的职责之一,就是研究深度防御技术以让攻击者很难发掘利用软件漏洞,这些技术通常被成为exploit mitigations,并且通过/GS、DEP(Data Execution Prevention,数据执行保护)以及ASLR(Address Space Layout Randomization,地址空间随机加载)等保护功能的形式交付给用户。在Windows Server 2008和Windows Vista SP1中,微软公司加入了新的解决漏洞发掘问题的平台,也就是SEHOP(Structured Exception Handler Overwrite Protection,结构化异常处理覆盖保护)。本文将探讨这个新功能将如何解决SHE问题以提高系统安全性。
漏洞发掘技术:SEH覆盖
SEHOP保护的目的在于阻止攻击者利用SEH(结构化异常处理)覆盖技术发动攻击,2003年9月NGS Software公司的David Litchfield 发表的研究论文中阐述了这种SEH覆盖技术,随后SEH覆盖技术成为攻击者使用的标准工具。最新版本的Metasploit框架中约有20%的漏洞发掘利用的是SEH覆盖技术,另外该技术同样经常被用于发掘浏览器漏洞。
从较高角度来看,SEH覆盖技术使用软件漏洞并通过滥用Windows提供的32位异常调度设备执行任意代码。从功能角度来看,SEH覆盖技术通常使用基于堆栈缓冲区溢出来覆盖存储在thread的栈上的异常注册记录的。另外,提供一点背景知识,异常注册记录通常由两部分组成:下一记录指针和异常处理器函数指针。下一记录指示器用于连接例外注册记录到单一链接列表的下一条注册记录,该列表列出的是注册的异常处理器。当异常发生时,windows异常调度器会呼叫异常处理器函数指针。异常注册记录的定义如下:
typedef struct _EXCEPTION_REGISTRATION_RECORD { struct _EXCEPTION_REGISTRATION_RECORD *Next; PEXCEPTION_ROUTINE Handler; } EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD; |
异常注册记录被覆盖后,必须提出一个异常,这样异常调度器才能够处理它。这可以通过几种方式来实现,例如通过用伪造地址来覆盖位于栈上的返回地址以造成访问异常。当出现异常时,异常调度器将为该thread例举出异常注册记录并呼叫与每条记录相关的异常处理器。通过破坏这些异常注册记录的下一记录指示器和异常处理器函数指针,异常调度器将执行受损的异常处理器函数指针规定的任意地址的代码。
在很多情况下,攻击者会选择覆盖异常处理器函数指针,并且使用包含类似pop reg, pop reg, ret指示的地址来覆盖。这使攻击者能够通过把控制权转移给EstablisherFrame(当呼叫异常处理器时异常调度器作为第二个参数通过),以有效执行任意代码。这样做能够成功是因为EstablisherFrame 参数持有攻击者控制的异常注册记录的地址。攻击者同时结合使用heap spray技术与SEH覆盖技术来有效执行任意代码。下图展示的是SEH覆盖技术的原理图:
缓解技术:SEHOP
通常有两种方法可以对付SEH覆盖技术,第一种方法是,对编译版本的代码作出更改使可执行文件包含元数据,而该平台则可以利用这些元数据适当地缓解覆盖技术造成的破坏。微软公司采取了这种方法,并且在Visual Studio 2003中加入了这种缓解技术,这种缓解技术采用了新的链接器形式,即/SAFESEH。但是,由于需要重建可执行程序,并且不能完全处理所有情况(特别是当异常处理器位于图像文件的外面时),这些使SafeSEH保护方法不是那么有吸引力。本文将不再讨论有关SafeSEH方法的具体问题,可以在MSDN(http://msdn.microsoft.com/en-us/library/9a89h429(VS.80).aspx)上找到更多详细内容。
第二种方法则涉及向异常调度器添加动态check,而该调度器并不依赖于源自二进制的元数据。这正是SEHOP采用的方法。从较高级别来看,SEHOP保护能够通过验证thread的异常处理器列表的完整性(在允许任何登记的异常处理器被呼叫前)来阻止攻击者使用SEH技术。SEH覆盖的含糊性使这种缓解技术得以实现。当大多数基于堆栈的缓冲区发生溢出时,攻击者将会在覆盖异常登记记录的异常处理器函数指针之前,将会含糊地覆盖异常登记记录的下一记录指针。由于下一记录指针被损坏,异常处理器链的完整性就被破坏了。这一观点,加上ASLR技术,使SEHOP得以有效减轻SEH覆盖技术带来的损坏。
从执行的角度来看,SEHOP通过两个不同的步骤来实现其功能。第一步是在thread的异常处理器列表中插入象征性的异常登记记录以作为尾记录,这一步骤发生在thread第一次开始在用户模式执行的时候。由于异常登记记录总是插在异常处理器列表的前面,象征记录总是最后的异常登记记录。
第二步则是:在异常情况正在被调度的时候清理常处理器列表以确保象征记录的有效性。这一步骤发生在,异常调度器发现在用户模式出现异常的时候。如果象征记录无效,异常调度器就会认为,异常处理器列表已经遭到破坏,已经发生了SHE覆盖技术攻击。随后,异常调度器就会安全结束进程。如果发现象征记录有效,异常调度器就会正常运作并呼叫每个登记异常处理器。下图就是相关的原理图。
可以如何使用SEHOP
SEHOP在Windows Server 2008中是默认启用的,而在Windows Vista SP1中默认是禁用的。在Windows Vista SP1中默认禁用的主要原因是因为缺乏足够的应用程序兼容性数据。KB article 956607则讲述了如何从系统的角度启用或者禁用SEHOP。
安全专家指出,会继续研究新的先进的缓解技术,目前而言,SEHOP是能够保护用户的有效工具,希望用户们启用此功能(如果默认为禁用的话)以更好地保护自己免收SEH覆盖技术的攻击。