軟件安全知識之漏洞類別
漏洞類別
如簡介中所述,我們使用術語實現漏洞(有時也稱為安全漏洞)來表示使攻擊者可能違反安全目標的錯誤,以及支持特定攻擊技術的bug類。
實施漏洞在網絡安全中發揮著重要作用,并且有多種形式。常見漏洞和披露(CVE)是一個公開的條目列表,采用標準化形式,描述廣泛使用的軟件組件中的漏洞,以及在撰寫本文時,它列出了近十萬個此類漏洞。實現漏洞通常是由不安全的編程實踐引起的,并受開發人員使用的編程語言或API的影響。第一個主題涵蓋了可歸因于此類不安全編程實踐的重要實現漏洞類別。
現有的脆弱性分類,如共同弱點枚舉(CWE),一個社區制定的脆弱性類別列表,可作為脆弱性識別、緩解和預防的基線,但沒有一個現有的分類已經成功地提出了一個完整的分類法。因此,第一個主題中討論的類別應被視為重要類別的脆弱性示例,而不是詳盡無遺的清單。選擇它們的目的是涵蓋最常見的實現漏洞,但這種選擇至少在某種程度上是主觀的。
特定類別的實現漏洞通常可以描述為違反軟件系統某些子組件的(正式或非正式)規范。這樣的規范采用合同的形式,明確子組件的期望,并提供給其客戶。在違反此類合同時,軟件系統進入錯誤狀態,軟件系統的進一步行為通常是系統開發人員未考慮的行為,并且依賴于系統實現詳細信息。系統的攻擊者可以研究實現細節并利用它們使系統以攻擊者所需的方式運行。
內存管理漏洞
命令式編程語言支持可變狀態,即這些語言具有用于分配存儲單元的構造,這些存儲單元隨后可以分配給程序或由程序讀取,然后再次釋放。編程語言定義指定如何正確使用這些構造:例如,分配n存儲單元將返回對單元數組的引用,然后可以使用索引0到訪問該數組n1直到再次釋放(釋放)引用。此規范可以看作是內存管理子組件的協定。某些編程語言實現此協定防守和將扔一例外如果a客戶程序訪問記憶錯誤。其他編程語言(最特別是C和C++)離開這責任為正確分配,訪問和解除分配記憶在這手之這程序員和說錯誤地訪問或管理內存的程序的行為是定義.這種語言有時被稱為內存不安全與內存管理相關的語言和錯誤(內存管理漏洞)是這些安全漏洞的臭名昭著的來源語言。
? 空間漏洞是指程序索引到有效的連續存儲單元范圍,但索引超出范圍的錯誤。典型的示例是緩沖區溢出漏洞,程序訪問具有越界索引的數組(緩沖區)。
? 臨時漏洞是程序訪問曾經分配給程序但后來已解除分配的內存的錯誤。一個典型的例子是取消引用懸空指針。
C和C++語言規范未定義具有內存管理漏洞的程序的行為。因此,觀察到的具有漏洞的程序的行為將取決于語言的實際實現。從安全的角度來看,內存管理漏洞尤其危險,因為在許多實現中,分配給程序的可變內存單元是存儲已編譯程序代碼和運行時元數據(如調用堆棧)的相同內存地址空間。在此類實現中,違反內存管理協定的程序訪問可能會導致對已編譯的程序代碼或運行時元數據的訪問,并且因此可能導致程序代碼、程序控制流和程序數據損壞。存在各種強大的攻擊技術來利用內存管理漏洞[3]。
攻擊包括向程序提供輸入以觸發漏洞,從而使程序違反內存管理協定。攻擊者選擇輸入,以便程序訪問攻擊者感興趣的存儲單元:
? 在代碼損壞攻擊中,無效的內存訪問將編譯的程序代碼修改為攻擊者指定的代碼。
? 在控制流劫持攻擊中,無效內存訪問修改代碼指針(例如,堆棧上的返回地址或函數指針),以使處理器執行攻擊者提供的代碼(直接代碼注入攻擊),或使處理器重用程序的現有代碼以意外的方式(代碼重用攻擊,也稱為間接代碼注入攻擊,例如返回libc攻擊或面向返回的編程攻擊)。
? 在僅數據攻擊中,無效的內存訪問會修改程序的其他數據變量,從而可能導致攻擊者的權限增加。
? 在信息泄漏攻擊中,無效內存訪問是讀取訪問,可能導致信息泄露,無論是應用程序機密(如加密密鑰)還是運行時元數據(如有助于預測的地址)的確切內存布局,因此可能會啟用其他攻擊。
由于這些類別的攻擊具有實際重要性,因此已經開發了應對特定攻擊技術的緩解技術,我們將在主題4中討論這些技術。