深入解析MS12-001:SafeSEH绕过漏洞及其影响

本文详细解析了MS12-001安全更新,该更新修复了SafeSEH防御机制被绕过的漏洞。文章探讨了漏洞成因、影响范围及缓解措施,并提供了检测受影响二进制文件的方法。

更多关于MS12-001影响的信息

今天我们发布了MS12-001,该更新解决了一个可能使攻击者绕过深度防御功能SafeSEH的问题。此绕过仅限于使用Microsoft Visual C++ .NET 2003 RTM构建的二进制文件。使用Microsoft Visual C++ .NET 2003 Service Pack 1及更高版本构建的二进制文件不受影响。在本博客文章中,我们将提供更多关于已解决问题的详细信息及其影响。此外,我们还将澄清分配给此公告的“安全功能绕过”漏洞类别的参数。

什么是SafeSEH?

SafeSEH是一种深度防御安全功能,旨在使攻击者更难以利用某些类型的漏洞。特别是,SafeSEH旨在防止攻击者使用称为“SEH覆盖”的攻击技术。关于如何实现这一点的更多细节可以在我们去年7月发布的报告中找到:http://go.microsoft.com/?linkid=9776900。

Microsoft在Visual Studio 2003 RTM中发布了SafeSEH支持。Windows XP Service Pack 2和Windows Server 2003 Service Pack 1是首批启用SafeSEH构建的Windows版本。

正在解决的问题是什么?

此问题可能导致为已构建支持SafeSEH的二进制文件未强制执行SafeSEH。当使用Microsoft Visual C++ .NET 2003 RTM构建的二进制文件被运行在受MS12-001影响的Windows版本上的应用程序加载时,会发生这种情况。

在此场景中未强制执行SafeSEH的原因是Microsoft Visual C++ .NET 2003 RTM生成的二进制文件元数据大小与Windows加载程序期望的大小不同。因此,加载程序保守地退回到假设二进制文件不支持SafeSEH。MS12-001通过允许二进制文件具有Microsoft Visual C++ .NET 2003 RTM生成的大小的元数据来解决此问题。

此问题有什么影响?

未能对二进制文件强制执行SafeSEH可能使攻击者更容易开发漏洞利用。攻击者必须找到能够实现代码执行的漏洞才能实现这一点;MS12-001解决的问题本身并不启用代码执行。此外,它不启用权限提升、信息泄露等。因此,我们将MS12-001分配给非常小的“安全功能绕过”漏洞类别。尽管未能强制执行SafeSEH绝不是可取的,但问题本身并不构成利用向量。

尽管受此问题影响的二进制文件集有限,但一些受影响的二进制文件被应用程序广泛使用。例如,Visual Studio 2003的可再发行C运行时DLL(如msvcrt.dll)受此问题影响。这些DLL也不启用ASLR支持,因此是开发漏洞利用的有吸引力的目标。EMET可用于通过为使用此类DLL的应用程序启用强制ASLR和SEHOP来更好地缓解这些担忧。

如果我的二进制文件是用Visual C++ 2003构建的,是否需要重新构建?

安装MS12-001的更新将完全解决此问题,无需重新构建任何二进制文件。或者,也可以通过使用Microsoft Visual C++ .NET 2003 Service Pack 1或更高版本重新构建受影响的二进制文件来解决此问题。您可以使用Microsoft Visual C++链接器命令“link.exe /dump /headers binary.dll”确定您的二进制文件是否受此问题影响。具有0x48加载配置目录大小的二进制文件受影响,如下所示。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
File Type: DLL
            7.10 linker version

          100000 size of heap reserve
            1000 size of heap commit
               0 loader flags
              10 number of directories
           3AC74 [    43E0] RVA [size] of Export Directory
           49298 [      28] RVA [size] of Import Directory
           52000 [     3B8] RVA [size] of Resource Directory
               0 [       0] RVA [size] of Exception Directory
               0 [       0] RVA [size] of Certificates Directory
           53000 [    2B64] RVA [size] of Base Relocation Directory
           39B48 [      38] RVA [size] of Debug Directory
               0 [       0] RVA [size] of Architecture Directory
               0 [       0] RVA [size] of Global Pointer Directory
               0 [       0] RVA [size] of Thread Storage Directory
           49078 [      48] RVA [size] of Load Configuration Directory

感谢Gerardo Di Giacomo和Windows持续工程部门的同事在解决此问题方面的工作。

Matt Miller, MSEC Security Science

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