簡體   English   中英

沒有強命名的代碼簽名是否會讓您的應用程序被濫用?

[英]Does code-signing without strong-naming leave your app open to abuse?

試圖了解authenticode代碼簽名和強命名。

我是否正確地認為,如果我對引用一些dll(不是強名稱)的exe進行代碼簽名,惡意用戶可以替換我的DLL並以一種看起來像是由我簽名但正在運行的方式分發應用程序他們的代碼?

假設這是真的,看起來你真的不想在沒有強烈命名整個事情的情況下簽署.NET應用程序,否則你會讓人們能夠在你編寫的應用程序的幌子下執行代碼?

我不確定的原因是,我在網上發現的文章(包括使用SN + Authenticode的MSDN文檔)似乎都沒有提到這一點,這似乎是一個相當重要的理解點(如果我理解正確) ?

我是否正確地認為,如果我對引用一些dll(不是強名稱)的exe進行代碼簽名,惡意用戶可以替換我的DLL並以一種看起來像是由我簽名但正在運行的方式分發應用程序他們的代碼?

是的,如果其余的DLL只是簽名而不是強名稱,則可以在不引發異常的情況下替換它們。 您可以在exe內部驗證DLL是否由與exe相同的密鑰簽名。 這些方法都不能阻止某人替換您的DLL或EXE。

假設這是真的,看起來你真的不想在沒有強烈命名整個事情的情況下簽署.NET應用程序,否則你會讓人們能夠在你編寫的應用程序的幌子下執行代碼?

一般來說,我認為這是“最佳實踐”,但你再次沒有阻止任何事情。 一旦用戶有權更改本地系統上的文件,您就無法阻止他們進行惡意活動。

有幾種混淆技術可以將完整的.NET項目構建到單個exe中,這可能會成為“最安全”的方法,但仍然可以被篡改。

真正的問題是你想阻止他們做什么? 我的意思是說,為什么有人會有興趣更換你的dll? 他們希望實現什么,他們的目標是什么? 如果你試圖阻止某人從你進入的過程中讀取敏感信息,那就是一段漫長的艱難道路。 假設惡意方可以完全訪問您的源代碼以及您的進程使用的每條信息,因為它們可以訪問。 假設他們可以隨意替換全部或部分代碼,因為他們可以。

更新

因此,綁定重定向僅適用於使用相同鍵進行強名稱的程序集,因此可以保護您免受更改的DLL的影響嗎?

正確,除了注意到的例外,代碼注入仍然可以通過多種方式完成。

...回到原來的問題,沒有強命名的代碼簽名有點破壞了代碼簽名的意義嗎?

並不是的。 代碼簽名(不強命名)有兩個不同的目的:

  1. 驗證。 驗證軟件作者是誰。
  2. 誠信。 驗證軟件自簽名后未被篡改。

通常,這僅在安裝期間進行身份驗證和驗證。 這就是我們簽署setup.exe的原因,以確保客戶已收到我們未經修改的安裝程序。 系統會提示“您信任XXXX公司”,從而授權經過身份驗證/簽名的安裝程序。 一旦安裝,操作系統幾乎沒有內置的代碼簽名使用(除了驅動程序和其他一些模糊的情況)。

另一方的強命名與它的存在有着完全不同的目的。 它完全專注於應用程序的“完整性”。 沒有證書,沒有簽名機構(CA)來驗證它,沒有用戶顯示的信息供他們確認,操作系統也無法驗證它將要運行的可執行文件。

.NET框架對很多東西使用強名稱,所有這些我都松散地歸類為應用程序完整性:

  1. dll / exe的內容具有簽名哈希,因此不會被篡改。
  2. 加載依賴項時,每個引用都必須強名稱和驗證。
  3. 可以在GAC中注冊程序集,也可以使用發布者策略。
  4. 可以生成本機圖像以生成程序集IL的編譯圖像。

我確信這里還有其他一些我不知道的東西,但這些是我所知道的主要用途。

簽名和強命名的最佳實踐

  • 使用已簽名的安裝程序
  • 使用代碼簽名的可執行文件
  • 使用強名稱的可執行文件
  • 強名稱所有依賴項和對它們的引用
  • 通常不需要代碼簽名依賴項*
  • 考慮GAC在安裝時注冊程序集

*注意:代碼簽名在某些情況下對於DLL很有用,例如標記為“安全”並嵌入瀏覽器的COM對象應該簽名並強名稱,就像它是可執行文件一樣。 代碼簽名在外部驗證依賴關系時也很有用,無需加載程序集或反映它的屬性。

一旦有人可以替換你的機器上的dll或運行代碼,就不會有很多安全措施留給你。 就我而言,所有Dll都是單獨簽名的代碼。 我的代碼拒絕下載未作為自我更新的一部分簽名的Dll。 但是,在我的系統上以我的完整性級別或更高級別運行的任何應用程序(在> = Vista Windows的情況下)仍然可以通過CreateRemoteThread等(http://www.codeguru.com/Cpp/WP)向我的exe中注入一個dll /dll/article.php/c105)但是再次假設某人可以將外國代碼輸入系統是困難的部分。 其余的很容易。

在尋找相同的東西並閱讀許多東西之后。 我終於可以對你的問題說,是的,如果要對app app進行數字簽名,那么依賴的強名是必須的。

如果您的依賴項沒有強名稱,請假設這一點。 他們被取代了。 您的應用程序將毫無問題地加載它們。 用戶將看到對話框“Verified Publisher:Your Name”。 雖然可執行文件未受影響,但依賴項已被更改。

問題不在於該用戶,而是分發了具有更改依賴關系的包,而每個人都會在其上看到您的名字。

您還必須記住,在不部署應用程序的其他部分的情況下升級dll時,代碼簽名通常會帶來很多痛苦。

這就是為什么許多流行的圖書館都沒有強烈命名dll的原因

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM