Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows WinVerifyTrust的安全性,或验证锁定文件的信任_Windows_Authenticode - Fatal编程技术网

Windows WinVerifyTrust的安全性,或验证锁定文件的信任

Windows WinVerifyTrust的安全性,或验证锁定文件的信任,windows,authenticode,Windows,Authenticode,我有一个加载外部DLL类插件系统的进程,我想在其中验证加载的DLL是否使用Authenticode正确签名。在阅读了and和friends的文档之后,有一件事让我印象深刻,那就是这两个操作都是从文件路径到DLL的 在我看来,利用此漏洞使我的程序加载一个无符号DLL是完全可行的,方法是向程序提供一个有符号的DLL,使WinVerifyTrust成功,并在LoadLibrary调用执行之前立即用无符号代码替换DLL。这是一种硬竞争条件,但是,如果攻击者对文件系统有一定的控制权,例如在使用网络文件系统

我有一个加载外部DLL类插件系统的进程,我想在其中验证加载的DLL是否使用Authenticode正确签名。在阅读了and和friends的文档之后,有一件事让我印象深刻,那就是这两个操作都是从文件路径到DLL的

在我看来,利用此漏洞使我的程序加载一个无符号DLL是完全可行的,方法是向程序提供一个有符号的DLL,使WinVerifyTrust成功,并在LoadLibrary调用执行之前立即用无符号代码替换DLL。这是一种硬竞争条件,但是,如果攻击者对文件系统有一定的控制权,例如在使用网络文件系统时,它可以得到更好的控制

WinVerifyTrust的API似乎建议我可以在打开文件的句柄上运行验证过程。如果我可以打开文件,验证打开的文件句柄,然后从相同的文件句柄加载库,那么我就安全了。不幸的是,LoadLibraryEx——这可能是我实现此功能的主要嫌疑犯——将其hFile参数记录为保留供将来使用

我的下一个想法是将文件内容加载到内存中,然后从内存中加载DLL,我找到了执行此操作的库。我想知道是否有一些现有的实现已经开始并结合了所有这些,允许开发人员安全地验证和加载DLL,这意味着我不必自己编写和维护它


有什么建议吗?

只是一个我没有尝试过的随机想法:你能用FILE_SHARE_READ&~FILE_SHARE_WRITE | FILE_SHARE_DELETE打开DLL的句柄吗?在调用CloseHandle之前执行WinVerifyTrust和LoadLibrary?这将防止在这两次调用之间替换模块。为什么需要~FILE_SHARE_WRITE | FILE_SHARE_READ,因为默认共享权限为0,即不授予其他共享权限?具体地说,~运算符将启用我可能希望或不希望启用的其他位。无论如何,我试过CreateFilepath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL;它似乎做了我想要的。如果你想提交你的评论作为答复,我会接受的。