防止DLL劫持漏洞在C#中不起作用

时间:2017-07-24 03:59:42

标签: c# .net dll dllimport

因为我想创建一个自解压格式文件(* .exe), 所以我按照以下网址的说明进行操作:

Secure loading of libraries to prevent DLL preloading attacks

为了防止DLL劫持漏洞,我尝试使用SetDllDirectory()使当前工作目录(CWD)无效,如下所示:

namespace DllPreload
{
  static class Program
  {
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetDllDirectory(string lpPathName);

    /// <summary>
    /// Here is the main entry point of the application.
    /// </summary>
    [STAThread]
    static void Main()
    {

      SetDllDirectory("");

      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
  }
}

但是,在CWD中放置易受攻击的DLL(例如DWMAPI.DLLDWrite.dll等),DLL会在入口点Main()可以调用SetDllDirectory()之前无意中加载

Windows 10(64位)中再现的其他文件名如下。

  • WTSAPI32.DLL
  • PROPSYS.DLL
  • MSIMG32.DLL
  • INDOWSCODECS.DLL
  • WINSTA.dll

我将验证码放在GitHub中:

https://github.com/hibara/DllPreload

演示代码中DWMAPI.DLLDWrite.dll目录中的

DebugRelease是已配置DLL预加载的DLL。验证DLL的源代码如下:

#include <windows.h>

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
{
  MessageBox(NULL,
      "This program is vulnerable to DLL Hijacking.",
      "DLL Hijacked",
       MB_OK);
   return TRUE;
}

所以我的问题是:在这种情况下可以做些什么?

1 个答案:

答案 0 :(得分:0)

防止不安全加载仅适用于使用LoadLibrary/Ex() 动态加载的DLL,因此您可以控制加载它们的 DllImport加载DLL 静态,这就是为什么它们会在main()运行之前加载,而您无法控制它们。

有关如何在C#中使用LoadLibrary/Ex()的信息,请参阅Dynamically calling an unmanaged dll from .NET (C#)