深入解析DLL预加载远程攻击向量及防护策略

本文详细介绍了DLL预加载远程攻击向量的工作原理、风险评估方法、系统防护工具使用指南以及开发者安全编码建议,帮助用户全面了解并防御此类安全威胁。

关于DLL预加载远程攻击向量的更多信息

今天,我们发布了安全公告2269637,通知客户存在一类影响以不安全方式加载DLL的应用程序的远程攻击向量。开发人员早已了解此问题的根本原因。然而,上周研究人员发布了这些问题的远程攻击向量,而过去这些问题通常被认为是本地的且影响相对较低。在本博客文章中,我们希望分享:

  • 漏洞背景
  • 帮助您进行环境风险评估的信息
  • 可安装以保护系统的可选二进制更新
  • 开发者指南
  • Microsoft正在采取的措施

漏洞

当应用程序加载DLL而未指定完全限定路径名时,Windows将尝试通过搜索一组定义的目录来定位DLL。我们在此博客上讨论过DLL搜索路径,David LeBlanc的博客也对此进行了很好的解释。就这个问题而言,足以说明如果攻击者能够使应用程序在应用程序的当前目录设置为攻击者控制的目录时调用LoadLibrary(),应用程序将运行攻击者的代码。开发最佳实践指出,应用程序应在调用LoadLibrary(“foo.dll”)之前调用带有空白路径的SetDllDirectory,以确保foo.dll不会从当前目录加载。我们正在调查我们自己的任何应用程序是否受此类漏洞影响,以便采取适当措施保护客户。

为您的环境进行风险评估

最可能的利用场景涉及攻击者说服受害者打开托管在攻击者控制的SMB或WebDAV共享上的文件。文件本身不一定恶意或格式错误。关键在于文件是从攻击者还可以放置与易受攻击应用程序加载的DLL同名的恶意DLL的位置加载的。

如果外围防火墙阻止系统向攻击者控制的位置发出出站SMB或WebDAV连接,则此问题风险很小。攻击无法通过电子邮件或网页浏览攻击向量自动启动;用户必须选择打开文件。然而,我们认识到用户通常会打开受信任的文件类型。我们继续建议所有出站SMB在外围防火墙处进行过滤。此外,安全公告建议在工作站上禁用WebDAV客户端服务以防止出站WebDAV连接。

可用于保护系统的工具

保护系统的另一个选项是部署一个可以帮助防止此问题被利用的工具。知识库文章2264107提供了一个可供下载的工具,允许客户选择性地更改库加载行为,无论是系统范围还是特定应用程序。

客户可以设置以下两个注册表键:

1
2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CWDIllegalInDllSearch
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\binaryname.exe\CWDIllegalInDllSearch

设置第一个键将定义系统范围的行为,而第二个键将为特定应用程序设置行为。请注意,这是一个映像文件执行选项(IFEO),因此对系统上具有相同名称的所有二进制文件有效。

这些键的值根据应用程序启动的位置略有不同的效果。

场景1:应用程序从本地文件夹启动,例如C:\Program Files

效果
0xffffffff 从默认DLL搜索顺序中移除当前工作目录。
0 使用默认DLL搜索路径。这是Windows默认设置,也是最不安全的设置。
1 如果当前工作目录设置为WebDAV文件夹,则阻止从当前工作目录加载DLL。
2 如果当前工作目录设置为远程文件夹,则阻止从当前工作目录加载DLL。

场景2:应用程序从远程文件夹启动,例如\remote\share

效果
0xffffffff 从默认DLL搜索顺序中移除当前工作目录。
0 使用默认DLL搜索路径。这是Windows默认设置,也是最不安全的设置。
1 如果当前工作目录设置为WebDAV文件夹,则阻止从当前工作目录加载DLL。
2 如果当前工作目录设置为远程文件夹,则允许从当前工作目录加载DLL。如果当前工作目录设置为WebDAV共享,则阻止从WebDAV共享加载的DLL。

场景3:应用程序从WebDAV文件夹启动,例如http://remote/share

效果
0xffffffff 从默认DLL搜索顺序中移除当前工作目录。
0 使用默认DLL搜索路径。这是Windows默认设置,也是最不安全的设置。

开发者如何解决这些问题?

Microsoft建议开发者明确定义他们打算从何处加载特定库。这在MSDN上的特定LoadLibrary应用程序编程接口文档中已有记录。然而,我们认识到这一指南可能并不总是非常清晰。我们最近发布了一篇MSDN文章“动态链接库安全”,为开发者提供了如何安全加载这些库的具体指南。

虽然存在几种受影响的情况,在上述MSDN文章中有详细描述,但我们的总体建议是:

  • 尽可能在加载库时使用完全限定路径名;
  • 通过使用SetDLLDirectory从搜索路径中移除当前目录;
  • 不要使用SearchPath来定位库。SearchPath并非用于查找要加载到应用程序进程空间中的库,并且使用不安全的搜索顺序;
  • 不要尝试仅为了识别Windows版本而加载库。相反,使用GetVersionEx或Windows API提供的类似函数。

我们还最近起草了额外的指南,以帮助开发者理解此问题。您可以在博客文章附件中找到该开发者指南。

Microsoft正在采取的措施

加载动态库是Windows和其他操作系统的基本行为,某些应用程序的设计要求能够从当前工作目录加载库。因此,如果不破坏预期功能,此问题无法直接在Windows中解决。相反,它要求开发者确保他们编码安全的库加载。然而,我们正在研究如何使开发者将来更容易不犯此错误。

Microsoft还在进行彻底调查,以了解这一新向量可能如何影响Microsoft产品。一如既往,如果我们发现此问题影响我们的任何产品,我们将适当解决它们。

我们希望这篇博客有助于解决您可能有的任何问题。感谢Mark Debenham、Anoop KV、Hari Pulapaka、Dou Kaya、Gov Maharaj、David LeBlanc和Michael Howard在此问题上的工作。

干杯, Jonathan Ness,MSRC工程 Maarten Van Horenbeeck,MSRC项目经理

[安全加载库以防止DLL预加载.docx](Secure loading of libraries to prevent DLL Preloading.docx)

缓解措施

风险评估

变通方案

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