減少漏洞利用
即使有很好的技術(shù)來防止在新代碼中引入漏洞,或者檢測現(xiàn)有代碼中的漏洞,也必然會有大量的遺留代碼。在可預(yù)見的未來,漏洞正在積極使用。因此,漏洞預(yù)防和檢測技術(shù)可以輔之以減輕對剩余漏洞的利用的技術(shù)。這種緩解技術(shù)通常在執(zhí)行基礎(chǔ)結(jié)構(gòu)中實現(xiàn),即硬件、操作系統(tǒng)、加載程序或虛擬機,或者由編譯器(所謂的“內(nèi)聯(lián)引用監(jiān)視器”)。這些技術(shù)的一個重要目標(biāo)是限制對性能的影響,并最大限度地提高與舊程序的兼容性。
攻擊的運行時檢測
(相關(guān)資料圖)
程序執(zhí)行的運行時監(jiān)視是檢測攻擊的強大技術(shù)。原則上,在測試期間檢測漏洞的程序監(jiān)視器(在3.2動態(tài)檢測中討論)也可以在運行時用于檢測攻擊。例如,動態(tài)污點分析與動態(tài)檢查受污染的數(shù)據(jù)是否影響生成的輸出的解析樹相結(jié)合,也被提議作為SQL注入攻擊的運行時緩解技術(shù)。
但是,測試期間使用的監(jiān)視器(在主題3中討論)和運行時用于緩解攻擊的監(jiān)視器的性能要求存在重要差異。對于攻擊的運行時檢測,挑戰(zhàn)在于識別可有效檢測的屬性沖突,這些沖突預(yù)期在程序的執(zhí)行跟蹤中保持不變。使用了多種技術(shù):
?堆棧Canary檢測調(diào)用堆棧上激活記錄完整性的違規(guī)行為,從而檢測一些利用內(nèi)存管理漏洞修改返回地址的攻擊。
?無執(zhí)行(NX)數(shù)據(jù)存儲器檢測到將程序計數(shù)器定向到數(shù)據(jù)存儲器而不是代碼存儲器的嘗試,因此可檢測許多直接代碼注入攻擊。
?控制流完整性(CFI)是一類技術(shù),用于監(jiān)視程序的運行時控制流是否符合預(yù)期控制流的某些規(guī)范,并且因此可以檢測到許多代碼重用攻擊。
檢測到攻擊時,運行時監(jiān)視器必須做出適當(dāng)?shù)姆磻?yīng),通常是終止受到攻擊的程序。終止是確保攻擊不會造成進(jìn)一步損害的良好反應(yīng),但它當(dāng)然會對可用性屬性產(chǎn)生負(fù)面影響。
自動化軟件多樣性
漏洞的利用通常依賴于受攻擊軟件的實現(xiàn)細(xì)節(jié)。例如,利用內(nèi)存管理漏洞通常依賴于運行時程序內(nèi)存布局的詳細(xì)信息。SQL注入攻擊可能依賴于SQL查詢發(fā)送到的數(shù)據(jù)庫的詳細(xì)信息。
因此,使漏洞更難利用的通用對策是使這些實現(xiàn)細(xì)節(jié)多樣化。這以兩種方式提高了攻擊的標(biāo)準(zhǔn)。首先,攻擊者更難在相同的系統(tǒng)上準(zhǔn)備和測試他/她的攻擊。由于多樣化,針對攻擊者計算機上安裝的Web服務(wù)器的攻擊可能會對受害計算機上的同一Web服務(wù)器失敗。其次,構(gòu)建同時針對多個系統(tǒng)的攻擊更難。攻擊者現(xiàn)在必須為他們想要攻擊的每個系統(tǒng)構(gòu)建定制的漏洞,而不是構(gòu)建一次漏洞,然后對許多系統(tǒng)使用它。
這個想法最重要的實現(xiàn)是地址空間布局隨機化(ASLR),其中代碼,堆棧和/或堆內(nèi)存的布局在加載或加載時隨機化。運行。這種隨機化可以是粗粒度的,例如,通過隨機重新定位代碼、堆棧和堆段的基址,或者細(xì)粒度地將代碼存儲器中各個函數(shù)的地址、激活記錄在堆棧,或堆中的對象是隨機選擇的。
研究界已經(jīng)研究了許多其他在編譯時或安裝時自動創(chuàng)建多樣性的方法[28],但這種自動多樣化也會給軟件維護(hù)帶來重要的挑戰(zhàn),如錯誤報告。可能更難解釋,軟件更新可能也必須多樣化。
限制權(quán)限
利用軟件漏洞會影響受攻擊軟件的行為,從而違反某些安全目標(biāo)。通過對軟件可以做什么施加一般限制,可以大大降低攻擊的潛在損害。
沙盒是一種安全機制,其中軟件在受控環(huán)境(“沙盒”)中執(zhí)行,并且可以對沙盒中的軟件可以訪問的資源強制執(zhí)行策略。沙盒可用于限制不受信任的軟件,但也可用于減輕利用對易受攻擊軟件的影響:在成功利用軟件后,攻擊者仍受到沙盒。
沙盒的通用概念可以使用現(xiàn)代計算機系統(tǒng)提供的任何隔離機制進(jìn)行實例化:沙盒可以是在虛擬機監(jiān)視器的監(jiān)督下運行的虛擬機,也可以是操作系統(tǒng)施加訪問控制策略的進(jìn)程。此外,已經(jīng)為特定類別的軟件開發(fā)了幾種特定于目的的沙盒機制,例如,可以在虛擬主機環(huán)境中對網(wǎng)絡(luò)和文件系統(tǒng)訪問進(jìn)行沙盒處理的監(jiān)獄。Java運行時環(huán)境實現(xiàn)了一種沙盒機制,旨在包含不受信任的Java代碼,或?qū)⒋a與同一Java虛擬機中的不同利益相關(guān)者隔離開來,但多年來在該沙盒機制中發(fā)現(xiàn)了幾個重大漏洞[29]。
分化是一種相關(guān)但更細(xì)粒度的安全機制,其中軟件本身被劃分為多個隔間,并且對每個隔間的特權(quán)強制執(zhí)行一些界限。這再次需要一些底層機制來強制執(zhí)行這些邊界。例如,一個部分化的瀏覽器可以依靠操作系統(tǒng)進(jìn)程訪問控制,通過拒絕其文件系統(tǒng)訪問來綁定其渲染引擎的權(quán)限?,F(xiàn)在,渲染引擎中的軟件漏洞利用已得到緩解,即使成功利用此漏洞,攻擊者仍被阻止訪問文件系統(tǒng)。非常細(xì)粒度的分化形式可以通過對象能力系統(tǒng)[22]實現(xiàn),其中每個應(yīng)用程序級對象都可以是一個單獨的保護(hù)域。
為了緩解側(cè)信道漏洞,可以將易受攻擊的代碼隔離在單獨的內(nèi)核或單獨的硬件上,這樣通過側(cè)信道泄漏的信息就不再存在。攻擊者可觀察到。
軟件完整性檢查
在“可信計算”這一總稱下,已經(jīng)開發(fā)了廣泛的技術(shù)來測量計算機系統(tǒng)的狀態(tài),并在該狀態(tài)被認(rèn)為不安全時采取適當(dāng)?shù)拇胧?。一種代表性的技術(shù)是可信引導(dǎo),其中為每個執(zhí)行的程序累積測量值。對程序的任何修改(例如,由于成功的攻擊)都將導(dǎo)致不同的測量。然后,可以強制規(guī)定,例如,只能從具有指定測量值的狀態(tài)訪問密鑰。
Parnoetal.[30]對這類技術(shù)進(jìn)行了很好的概述。
結(jié)論
軟件實現(xiàn)漏洞有多種形式,可以通過各種對策來緩解。表1總結(jié)了本章中討論的漏洞類別之間的關(guān)系,以及通常用于應(yīng)對這些漏洞的相關(guān)預(yù)防、檢測和緩解技術(shù)。
標(biāo)簽: