簡體   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