安全地管理內(nèi)存及高速緩存
如果一個(gè)程序能夠長時(shí)間地充分地利用某些高速緩存或內(nèi)存,我們就稱這部分內(nèi)存空間為持久內(nèi)存。
內(nèi)存和高速緩存一直是黑客攻擊的重點(diǎn)領(lǐng)域之一,程序開發(fā)人員必須重視安全管理內(nèi)存和高速緩存的策略問題。
限制持久利用高速緩存
當(dāng)今程序員編制的許多軟件都能持久而充分地利用高速緩存,從而實(shí)現(xiàn)軟件性能的最大化。持久利用高速緩存的問題在于,數(shù)據(jù)在內(nèi)存中的保留時(shí)間越長,如果故障導(dǎo)致存儲(chǔ)器的信息轉(zhuǎn)儲(chǔ),或者造成內(nèi)存的內(nèi)容可被直接訪問,那么,數(shù)據(jù)被有意或無意泄露的可能性就越大。產(chǎn)生這個(gè)問題在原因在于,內(nèi)存并不受操作系統(tǒng)級(jí)文件系統(tǒng)的訪問控制的保護(hù)。
例如,當(dāng)在Java企業(yè)版平臺(tái)上使用Entity Bean時(shí),數(shù)據(jù)可被存儲(chǔ)到服務(wù)器上,并擁有容器級(jí)的持久性或bean級(jí)的持久性。無論是哪種情況,處理數(shù)據(jù)并將數(shù)據(jù)放到高速緩存的程序都需要提供安全的高速緩存管理功能,能夠適應(yīng)程序必須同時(shí)處理的所有進(jìn)程(即接收并處理請(qǐng)求、會(huì)話管理、從數(shù)據(jù)庫或文件系統(tǒng)讀取數(shù)據(jù))。開發(fā)人員可以在每次完成業(yè)務(wù)后,強(qiáng)制要求一個(gè)程序使用EJB來將數(shù)據(jù)寫到持久的非易失存儲(chǔ)器上,而不是將數(shù)據(jù)長久地放在內(nèi)存中;此問題的平衡點(diǎn)在于性能(很少的數(shù)據(jù)庫訪問意味著更好的性能)與安全(很小的內(nèi)存持久性意味著攻擊者幾乎沒有機(jī)會(huì)訪問沒有被文件系統(tǒng)或數(shù)據(jù)庫訪問控制所保護(hù)的敏感數(shù)據(jù))。在一個(gè)多用戶的程序中,如果要求安全地管理持久使用的高速緩存,其成本和代價(jià)也會(huì)受到同時(shí)訪問程序的用戶數(shù)量的影響;被放到高速緩存的數(shù)據(jù)量越大,其它進(jìn)程可用的內(nèi)存量就越低。
在編制一個(gè)持久使用內(nèi)存的程序時(shí),程序員應(yīng)當(dāng)確保其持久度是可配置的,以便于管理員或用戶可以根據(jù)需要而經(jīng)常進(jìn)行清除。理想情況下,程序還可以提供一個(gè)命令,允許管理員或用戶隨意清除內(nèi)存。不管程序運(yùn)行時(shí)的內(nèi)存持久度如何,在程序關(guān)閉時(shí)都應(yīng)當(dāng)從內(nèi)存中清除數(shù)據(jù)。對(duì)于極重要的可信任程序,程序不應(yīng)當(dāng)保留進(jìn)程完成之后的內(nèi)存空間,在進(jìn)程完成時(shí),程序應(yīng)當(dāng)清除內(nèi)存。
理想情況下,極端敏感的數(shù)據(jù),如認(rèn)證令牌和加密令牌絕對(duì)不能放在持久內(nèi)存中。但是,持久內(nèi)存不可避免存在于商業(yè)化成品軟件(包括開源軟件)組件中。在這些情況下,如果組件有可能將敏感數(shù)據(jù)存放到持久內(nèi)存中,開發(fā)者應(yīng)當(dāng)利用操作系統(tǒng)的高速緩存管理和對(duì)象重用功能。而且如果有的話,開發(fā)人員還應(yīng)當(dāng)利用數(shù)據(jù)庫管理系統(tǒng)來覆蓋每一個(gè)持久的內(nèi)存位置。在利用商業(yè)化成品軟件組件時(shí),如果它使用持久內(nèi)存,且它放到內(nèi)存中的數(shù)據(jù)有可能是敏感數(shù)據(jù),就應(yīng)當(dāng)把這個(gè)組件放到一個(gè)可信的處理器模塊上,從而將其持久內(nèi)存與系統(tǒng)的其它部分分離開來。
謹(jǐn)慎分配內(nèi)存和其它資源
程序員應(yīng)當(dāng)使每個(gè)進(jìn)程占用的計(jì)算機(jī)資源最小化。例如,對(duì)于運(yùn)行在Unix上的軟件而言,應(yīng)使用ulimit()、getrlimit()、 getrusage()、sysconf()、 quota()、 quotactl()、quotaon()等,用以限制在特定進(jìn)程發(fā)生故障或遭到破壞后導(dǎo)致的潛在損失,并防止對(duì)軟件的拒絕服務(wù)攻擊。
如果軟件是一個(gè)Web服務(wù)、應(yīng)用程序或Web服務(wù),開發(fā)人員應(yīng)當(dāng)建立一個(gè)獨(dú)立的過程,用以處理每次會(huì)話,并限制每個(gè)過程中每次會(huì)話被允許的CPU時(shí)間量。這樣做可以防止任何攻擊者過度使用內(nèi)存或CPU周期的請(qǐng)求,防止他干擾其它任務(wù)。這樣做可以使攻擊者難以通過產(chǎn)生多個(gè)會(huì)話而制造拒絕服務(wù)攻擊。
高速緩存緩沖區(qū)的內(nèi)存位置不應(yīng)當(dāng)與可執(zhí)行的堆棧部分相連。只要有可能,堆棧就應(yīng)當(dāng)是不可執(zhí)行的。數(shù)據(jù)執(zhí)行保護(hù)(DEP)是Windows操作系統(tǒng)的一個(gè)安全特性,這是可以確保可寫內(nèi)存無法被執(zhí)行的一個(gè)簡單方法。數(shù)據(jù)執(zhí)行保護(hù)可以阻止被病毒或其它惡意代碼感染的惡意程序,防止其運(yùn)行被注入的代碼。在一個(gè)支持DEP的系統(tǒng)上,執(zhí)行被注入的代碼會(huì)導(dǎo)致例外。強(qiáng)化DEP有助于阻止利用Windows的例外處理機(jī)制的惡意程序。
在返回庫函數(shù)(return-to-libc)攻擊中,程序的返回地址會(huì)被覆蓋,用以執(zhí)行攻擊者想運(yùn)行的代碼,因而應(yīng)當(dāng)將系統(tǒng)代碼移動(dòng)到內(nèi)存中的不同點(diǎn)上。地址空間的布局隨機(jī)化(ASLR)是Windows操作系統(tǒng)的另一個(gè)安全特性,它可以在系統(tǒng)每次啟動(dòng)時(shí)將可執(zhí)行的代碼、庫和代碼的其它重要部分遷移到內(nèi)存中的隨機(jī)點(diǎn)上。這種特性可以使攻擊者在利用代碼時(shí)更難以提前做出預(yù)測。