可以將 LinkDemands 放在接口上,以有選擇地挑出某些接口,使其不能由部分信任的代碼使用(例如,在使用 AllowPartiallyTrustedCallers 屬性時)。
•如果在不包含 AllowPartiallyTrustedCallers 屬性的程序集中定義接口,則可以在部分信任的類上實現該接口。
•如果將 LinkDemand 放在一個實現接口方法的類的公共方法上,在隨后強制轉換到該接口并調用該方法時,將不會執行 LinkDemand。在這種情況下,因為是對接口進行鏈接,所以只考慮接口上的 LinkDemand。
應當審閱以下各項是否有安全問題:
•接口方法上的顯式鏈接請求。確保這些鏈接請求提供了預期的保護。確定惡意代碼是否可以使用強制轉換來避開前面描述的鏈接請求。
•具有鏈接請求的虛擬方法。
•它們實現的類型和接口應當一致地使用 LinkDemands。
虛擬內部重寫在確認代碼對其他程序集不可用時,需要了解類型系統可訪問性的細微差別。聲明 virtual 和 internal 的方法可以重寫超類的 vtable 條目,并且只能在同一個程序集的內部使用,因為它是內部的。但是,重寫的可訪問性是由 virtual 關鍵字決定的,并且只要代碼能夠訪問類本身,就可以從另一個程序集對該可訪問性進行重寫。如果重寫的可能性比較小,請使用聲明性安全解決它,或者刪除 virtual 關鍵字(如果它不是必需的)。
包裝程序代碼包裝程序代碼(特別是在包裝程序比使用它的代碼具有更高可信度時)可以顯露一組獨特的安全漏洞。如果沒有將調用方的受限制權限包括在適當的安全檢查中,則代表調用方所執行的任何操作都是可能被利用的潛在漏洞。
不要通過包裝程序來啟用調用方本身無法執行的某些操作。在執行某些涉及受限制安全檢查的操作時(與完整的堆棧審核請求相反),會有特殊的危險性。涉及到單一級別的檢查時,在實際調用方與可疑 API 元素之間插入包裝程序代碼,可以很容易地使安全檢查在不應當成功時成功通過,從而降低了安全性。
委托無論何時,如果您的代碼從可能調用它、但信任度較低的代碼那里取得委托權,請確保您不會讓信任度較低的代碼提升它的權限。如果您取得委托權并隨后使用它,那么,如果委托中或委托下面的代碼試圖執行受保護的操作,則創建委托的代碼將不會在調用堆棧中,并且不會測試它的權限。如果您的代碼和委托代碼具有比調用方更高的特權,這將使調用方能夠在不成為調用堆棧一部分的情況下改變調用路徑。
文章來源于領測軟件測試網 http://www.kjueaiud.com/