要解決該問題,可以限制調用方(例如,要求它具有某個權限)或對執行委托的權限加以限制(例如,通過使用 Deny 或 PermitOnly 堆棧重寫)。
LinkDemands 和包裝程序在安全基礎結構中,已經加強了對鏈接請求的特殊保護措施,但它仍然是代碼中可能的漏洞來源。
如果完全受信任的代碼調用某個由 LinkDemand 保護的屬性、事件或方法,那么,如果對調用方的 LinkDemand 權限檢查獲得通過,則調用將成功。此外,如果完全受信任的代碼所公開的類使用了某個屬性的名稱,并使用反射來調用該屬性的 get 訪問器,那么,即使用戶代碼無權訪問該屬性,對 get 訪問器的調用也會成功。這是因為 LinkDemand 將只檢查直接調用方,而直接調用方是完全受信任的代碼。其實,完全受信任的代碼在代表用戶代碼執行經授權的調用時,不需要確保用戶代碼有權進行該調用。如果您要包裝反射功能,請參閱 Microsoft .NET 框架的第 1 版安全更改一文,以獲得詳細信息。
為了防止因疏忽造成的安全漏洞(例如,上面描述的情況),運行時將對任何使用調用的操作(實例創建、方法調用、屬性設置或獲得)所進行的完整堆棧審核請求檢查擴展到由鏈接請求保護的方法、構造函數、屬性或事件。該保護會導致一些性能成本(單級 LinkDemand 速度更快),并且會更改安全檢查的語義 — 即使單級檢查已通過,完整堆棧審核請求也可能會失敗。
程序集加載包裝程序用來加載托管代碼的幾個方法(包括 Assembly.Load(byte[])),可使用調用方的證據加載程序集。具體來說,如果要包裝這些方法中的任意一個,安全系統可以使用您代碼被授予的權限(而不是調用方對包裝程序的權限)來加載程序集。顯然,您并不想允許信任度較低的代碼指使您代表它加載其所獲權限比調用方對包裝程序的權限更高的代碼。
擁有完全信任或信任度比潛在調用方(包括 Internet 權限級調用方)高得多的任何代碼很容易通過這種方式降低安全性。如果您代碼包含的公共方法可以取得字節數組并將其傳遞給 Assembly.Load(byte[]),從而代表調用方創建程序集,則可能會破壞安全性。
該問題會發生在以下 API 元素上:
•System.AppDomain.DefineDynamicAssembly
•System.Reflection.Assembly.LoadFrom
•System.Reflection.Assembly.Load
異常處理在運行任何 finally 語句之前,將運行堆棧上面的一個篩選表達式。在運行 finally 語句之后,將運行與該篩選器關聯的 catch 代碼塊。請考慮以下偽代碼:
void Main() { try { Sub(); } except (Filter()) { Console.WriteLine("catch"); } } bool Filter () { Console.WriteLine("filter"); return true; } void Sub() { try { Console.WriteLine("throw"); throw new Exception(); } finally { Console.WriteLine("finally"); } }該代碼將打印以下內容:
Throw Filter Finally Catch
文章來源于領測軟件測試網 http://www.kjueaiud.com/