繁体   English   中英

如何在.NET中验证DLL的数字签名

[英]How to Verify a Digital Signature of a DLL in .NET

我编写了一个C#.NET应用程序,它使用流行的非托管DLL文件来实现其部分功能。 使用System.Runtime.InteropServices中的标准DllImport导入DLL。

但是,遗憾的是,我的应用程序(以及大多数使用DllImport的.NET应用程序)容易受到DLL劫持攻击。 即攻击者可以将导入的DLL的恶意副本放在与我的应用程序打开的任何文件相同的目录中。 这可以使攻击者完全控制用户的计算机。

为了缓解此漏洞,我想在导入之前验证DLL文件是否已正确签名(使用默认的Authenticode)。 我知道可以使用像sigcheck.exe这样的工具验证签名,但这对我来说不是一个可行的解决方案,因为我需要在我的C#代码中进行。

所以我的问题很简单: 在加载DLL之前,如何从我的托管C#代码中验证DLL是否具有有效的Authenticode签名?

限制:

  • 导入的DLL不是由我开发的,而是来自外部公司。
  • DLL不随我的应用程序一起分发,预计在运行我的应用程序之前已经安装了。
  • 导入的DLL存在于许多不同的版本中(甚至会有更多版本),因此我无法在导入之前简单地验证DLL的MD5校验和

失败的方法:

  • 微软有一个关于防止“DLL预加载攻击”的好文章 ,但是,这个信息不适用于.NET的DllImport。
  • 我见过一些人建议使用Wintrust.dll中的非托管函数WinVerifyTrust。 这当然是一个愚蠢的解决方案,因为这会使我的应用程序容易受到Wintrust.dll的DLL注入。

您需要使用Authenticode验证程序。 这个问题的答案提供使用P / Invoke,如果您需要托管解决方案,您可能会对我们的SecureBlackbox库感兴趣,其中包括其他功能提供Authenticode签名和签名验证。

但是,虽然您可以保护自己免于加载假DLL,但您无法防止应用程序本身被破解。 因此,签名验证当然只能保护您免受一个攻击媒介。

让我指出,替换WinTrust.dll取决于需要访问计算机的不同攻击向量。 在这种情况下,攻击者可以完全修补您的应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM