【问题标题】:Avoid dll pre-loading vulnerability by reloading dll, any better way?通过重新加载dll来避免dll预加载漏洞,有更好的方法吗?
【发布时间】:2017-06-02 03:47:34
【问题描述】:

为了避免 dll 预加载,我尝试使用 SetDllDirectory(""),正如 MSDN 中提到的那样从搜索路径中删除当前目录。

要添加到搜索路径的目录。如果这个参数是 空字符串 (""),调用从 默认 DLL 搜索顺序。如果此参数为 NULL,则函数 恢复默认搜索顺序。

令人惊讶的是它没有工作。如果 dll 存在,我可以看到 dll 仍然从​​当前目录加载。我也厌倦了将 dll 目录路径设置为系统 32 路径,但它仍然从当前目录中选择 dll。最后,我决定将所有模块加载到我的应用程序中并再次重新加载它们。我的代码是这样的,

if(wcsstr(szModName,L"TestLibrary.dll"))
{
   FreeLibrary(hMods[i]);
   LoadLibrary("SomeRelavantPath\TestLibrary.dll");
}

您发现我的代码有什么问题吗?

@编辑: 我的完整 POC 代码,

int main( void )
{
    SetDllDirectory(L"");
    LPWSTR s = new WCHAR[100];
    GetDllDirectory(100,s);
    HINSTANCE myDLL = LoadLibrary(L"TestLibrary.dll");
    //myDLL returns non-null, there is file in current dir and not at any other location, it should have return null.
    return 0;
}

【问题讨论】:

  • SetDllDirectory("") 之后和LoadLibrary 之前尝试GetDllDirectory
  • @iehrlich 没用。有什么理由打电话给GetDllDirectory 应该有效吗?
  • @PranitKothari,我怀疑@iehrlich 的意思是使用GetDllDirectory 确保搜索路径确实已更改为您想要的。变了吗?
  • 您是否链接了导致 TestLibrary.dll 被显式导入的 .lib 文件?
  • 等等等等。比如,“C:\Work\MyApp\MyDll.dll”显式?

标签: c++ winapi dll


【解决方案1】:

从安全角度来看,使用新路径卸载并再次加载是没有意义的,已经为时已晚,因为邪恶的 .dll 可以在其 DllMain 中执行代码!

best solution 是直接链接到尽可能少的 DLL 并在 WinMain 函数中调用SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32)

【讨论】:

  • @Andres 感谢您的快速回复。我也尝试使用SetDefaultDllDirectories。遇到同样的问题。另外,我想支持Windows 7。最低要求是Win 8。
  • 它在 Vista 和 7 上可用,如果它们在 2011 年之后的某个时间打开了 Windows 更新。只需 GetProcAddress 即可,如果它不存在,您只需手动加载具有完整路径的内容。
  • @Andres 我厌倦了 Wndows 10 上的 SetDefaultDllDirectoriesLoadLibraryEx 组合。API 在那里工作,问题仍然存在。
  • @PranitKothari:事实并非如此。它不能证明您的观察,因为没有人被告知,您的 POC 使用了完全限定的路径名​​
  • @PranitKotharI: Here,但不在您的 problem statement 中。因此,它是没有用的。您已经展示了代码来重现您的代码无法重现的东西。不过,我要在这里停下来。您似乎没有遵循简单的概念。
【解决方案2】:

如果字符串指定了完整路径,则函数仅在该路径中搜索模块。

如果字符串指定了相对路径或不带路径的模块名,该函数使用标准搜索策略来查找模块;有关详细信息,请参阅备注。

来自LoadLibrary function @ MSDN

SetDllDirectory 的调用不会对完整路径产生任何影响。

【讨论】:

  • 好的,所以对于我的 POC 代码,我只使用了LoadLibrary("TestLibrary.dll");,它会从当前目录加载 dll。现在不确定它是否是相对路径?
  • 请在问题中发布您的完整 POC 代码作为更新。
  • 更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 2020-07-30
  • 2013-03-13
  • 2018-01-06
  • 1970-01-01
  • 2017-06-26
相关资源
最近更新 更多