SerializationFormatter。使用序列化可以規避可訪問性(前面已討論)。
•ControlPrincipal。設置當前用戶的能力可以欺騙基于角色的安全性。
•ControlThread。由于安全狀態與線程相關聯,因此操縱線程是危險的。
•ReflectionPermission
•MemberAccess。挫敗可訪問性機制(可以使用私有成員)。
安全性和爭用條件另一個關注區域涉及由爭用條件利用安全漏洞的可能性。這在幾種方式下很明顯。下面的子節概括了開發人員必須避免的某些主要缺陷。
dispose 方法中的爭用條件
如果某個類的 Dispose 方法未同步化,則 Dispose 內部的清除代碼可能會運行多次。請考慮使用以下代碼:
void Dispose() { if( _myObj != null ) { Cleanup(_myObj); _myObj = null; } }因為該 Dispose 實現未同步化,所以Cleanup 可能在被第一個線程調用之后又被第二個線程調用,之后才將_myObj 設置為null。這是否是需要關注的安全問題取決于在 Cleanup 代碼運行時所發生的事情。未同步化的 Dispose 實現的主要問題涉及對資源句柄(文件等)的使用。不正確的處理可能會導致使用錯誤的句柄,而這通常會導致安全漏洞。
構造函數中的爭用條件
在某些應用程序中,其他線程有可能在類成員的類構造函數完全運行之前訪問這些類成員。您應當檢查所有類構造函數,以確保在發生這種情況時不會出現安全問題,或者在需要時同步化線程。
緩存對象的爭用條件
如果類的其他部分未適當地進行同步化,則緩存安全信息或 Asserts 的代碼也可能很容易受到爭用條件的侵害。請考慮使用以下代碼:
void SomeSecureFunction() { if(SomeDemandPasses()) { _fCallersOk = true; DoOtherWork(); _fCallersOk = false(); } } void DoOtherWork() { if( _fCallersOK ) { DoSomethingTrusted(); } else { DemandSomething(); DoSomethingTrusted(); } }如果可以使用同一對象從另一個線程調用的 DoOtherWork 有其他路徑,則不受信任的調用方可以略過某個請求。
如果您的代碼緩存了安全信息,請確保檢查它是否有該漏洞。
完成器中的爭用條件
爭用條件的另一個來源是那些引用了它們在完成器中釋放的靜態或非托管資源的對象。如果多個對象共享在類的完成器中操作的資源,則這些對象必須同步化對該資源的所有訪問。
其他安全技術本部分列出了其他一些可能適用于您代碼的安全技術,但這里無法充分討論它們。
On-the-Fly 代碼生成某些庫的操作方式是,生成代碼并運行它以執行調用方的某些操作;締栴}是,代表信任度較低的代碼生成代碼,并以較高的信任度運行它。如果調用方可以影響代碼生成,那么問題將惡化,因此您必須確保只生成安全代碼。
您始終需要確切了解要生成什么代碼。這意味著,您必須嚴格控制從用戶那里得到的任何值,注意他們括起來的字符串(它們應當被轉義,這樣就無法包含意外的代碼元素)、標識符(應當檢查這些標識符,以驗證它們的有效性)或其他任何內容。標識符可能是危險的,因為您可以修改經過編譯的程序集,使它的標識符中包含陌生字符,而這些字符將有可能破壞程序集(盡管這通常不是安全漏洞)。
建議您使用 Reflection.Emit 生成代碼,這樣做通?梢詭椭苊夂芏噙@類問題。
編譯代碼時,請考慮惡意程序是否可以用某種方式修改它。在編譯器讀取磁盤上的源代碼之前或在您的代碼加載 DLL 之前,惡意代碼是否有機會更改源代碼?如果有,則必須根據情況使用代碼訪問安全性或文件系統中的訪問控制列表來保護包含這些文件的目錄。
如果調用方可以用使編譯器出錯的方式影響被生成的代碼,則這里也可能存在安全漏洞。
以最低的可能權限設置運行生成的代碼(使用 PermitOnly 或 Deny)。
基于角色的安全性:身份驗證和授權除了確保代碼的安全以外,某些應用程序還需要實現將使用者范圍限制在某些用戶或用戶組的安全保護;诮巧陌踩裕ú辉诒疚牡挠懻摲秶鷥龋┲荚谔幚磉@些需要。
處理機密數據在內存中時可以相當有效地保密,但持久地保存它并保密則很難做到。第一版的 .NET 框架沒有為保密處理提供托管代碼支持。如果您有專門技術,則加密庫可提供許多基本的必需功能。
加密和簽名System.Security.Cryptography 命名空間包含一組豐富的加密算法。安全地實施加密需要某些專門技術,并且不應當以特殊方式嘗試。處理所涉及的數據和密鑰的每個方面都必須經過仔細設計和檢查。加密的細節不在本文的討論范圍內。有關詳細信息,請參閱標準的參考資料。
隨機數應當使用 System.Security.Cryptography.RandomNumberGenerator 來生成可能在需要真實隨機性的安全操作中使用的任意隨機數。使用虛擬隨機數生成器會產生能夠被利用的可預知性。
安裝問題本部分描述了測試應用程序或組件的安裝以確保最佳安全做法并保護已安裝代碼的注意事項。建議在安裝托管代碼或非托管代碼時采用以下步驟,以確保安裝本身的安全。應對所有支持 NTFS 的平臺執行這些步驟:
•將系統設置為兩個分區。
•重新格式化第二個分區;不要更改根驅動器上的默認 ACL。
•安裝產品,將安裝目錄更改為第二個分區上的新目錄。
驗證以下各項:
•是否有任何代碼作為服務執行,或者通常由具有全局可寫權的管理員級別的用戶運行?
•代碼是否安裝在處于應用程序服務器模式下的終端服務器系統上?您的用戶現在是否可以寫入其他用戶可能運行的二進制代碼?
•在非管理員可能寫入的系統區域或系統區域的子目錄中,是否有任何內容最終出現在這里?
此外,如果產品需要與 Web 進行交互,則應當知道偶爾使用 Web 服務器將允許用戶運行通常在 IUSR_MACHINE 帳戶的上下文中執行的命令。某些全局可寫的文件或配置項可以在這些條件下被來訪者帳戶利用,請驗證不存在這樣的文件或配置項。
文章來源于領測軟件測試網 http://www.kjueaiud.com/