周洪偉,原錦輝,肖 銳,杜遵良,馮 賢
1(信息工程大學(xué),鄭州 450001)2(中原工學(xué)院,鄭州 450007)
由于計(jì)算機(jī)體系結(jié)構(gòu)的限制,現(xiàn)有主流處理器都只能處理明文形式的指令和數(shù)據(jù),數(shù)據(jù)只能以明文形式存在于內(nèi)存.此外,由于金字塔似的存儲(chǔ)體系以及操作系統(tǒng)的影響,使得一些敏感的用戶隱私數(shù)據(jù)在用戶未知的情況下,在內(nèi)存中反復(fù)拷貝并長(zhǎng)時(shí)間存留[1,2].文獻(xiàn)[3]提出對(duì)內(nèi)存數(shù)據(jù)的攻擊方法,并以APACHE和OPENSSL為攻擊對(duì)象,實(shí)驗(yàn)結(jié)果表明可以在1-5分鐘內(nèi)從內(nèi)存中竊取目標(biāo)進(jìn)程的密鑰.
如何保護(hù)在內(nèi)存中的數(shù)據(jù)?有的學(xué)者提出構(gòu)建安全處理器這樣的特殊硬件來保護(hù)用戶敏感數(shù)據(jù)[4,5].但是這種方法對(duì)硬件要求過高,一旦對(duì)硬件有特殊要求就很難被市場(chǎng)接受.有的學(xué)者提出利用虛擬機(jī)監(jiān)控器的支持,對(duì)內(nèi)存數(shù)據(jù)實(shí)施保護(hù)[6].然而,虛擬機(jī)監(jiān)控器自身的性能開銷過大,會(huì)影響用戶的可接受性.有的學(xué)者通過改造應(yīng)用軟件,將安全敏感數(shù)據(jù)從內(nèi)存轉(zhuǎn)移到處理器寄存器中.但是處理器寄存器容量有限,無法支持大數(shù)據(jù)量的保護(hù)需求.有的學(xué)者則對(duì)操作系統(tǒng)進(jìn)行改造,使活動(dòng)在內(nèi)存中的數(shù)據(jù),只有在被處理器訪問前后的一段時(shí)間內(nèi),才以明文形式存在于內(nèi)存[8,9].然而,頁面加解密操作的引入使得系統(tǒng)性能開銷增加.
本文基于操作系統(tǒng)改造,提出通過隱藏頁面的方法,來保護(hù)內(nèi)存數(shù)據(jù).與現(xiàn)有方法不同的是,我們不采用加解密算法實(shí)施保護(hù),而是通過修改頁表,影響虛擬地址尋地過程,使得包含安全敏感數(shù)據(jù)的頁面只有在處理器訪問時(shí)才出現(xiàn)在進(jìn)程地址空間,而其它時(shí)間由內(nèi)核單獨(dú)持有,從而減少安全敏感數(shù)據(jù)的暴露時(shí)間.我們?cè)贔edora 21(內(nèi)核版本號(hào):3.17.6)上構(gòu)建了原型系統(tǒng),并對(duì)其進(jìn)行功能測(cè)試和性能測(cè)試.測(cè)試結(jié)果表明:我們的原型系統(tǒng)能夠在不影響處理器訪問的前提下,隱藏用戶隱私數(shù)據(jù);雖然對(duì)數(shù)據(jù)讀寫的操作性能影響明顯,但是對(duì)系統(tǒng)整體性能影響不大.
我們從硬件、虛擬機(jī)、操作系統(tǒng)和應(yīng)用軟件四個(gè)角度說明本文的相關(guān)工作.首先是基于硬件的相關(guān)工作.保護(hù)內(nèi)存數(shù)據(jù)的直接方法就是改變處理器不能處理密文數(shù)據(jù)的狀態(tài),典型的范例如AEGIS[4].AEGIS安全處理器是在傳統(tǒng)處理器的基礎(chǔ)上,增加了加密單元、完整性驗(yàn)證單元、安全上下文管理器以及私鑰.進(jìn)程數(shù)據(jù)在進(jìn)入安全處理器時(shí),會(huì)經(jīng)過加解密單元進(jìn)行解密,解密后的結(jié)果會(huì)再經(jīng)過完整性驗(yàn)證單元檢查其完整性,而后進(jìn)入cache和寄存器,最后提交給運(yùn)算單元完成計(jì)算.當(dāng)進(jìn)程數(shù)據(jù)處理完畢后,會(huì)再次經(jīng)過完整性驗(yàn)證單元和加解密單元,最終形成加密保護(hù)和完整性保護(hù)的數(shù)據(jù),存儲(chǔ)于不可信的內(nèi)存.這樣,攻擊者就無法直接從內(nèi)存中竊取信息.類似的工作還有:XOM[5]、Cerium[10]和RIFLE[11]等.這類工作面臨的最大問題是:它們所依賴的硬件并不一定會(huì)被商用和推廣.這就導(dǎo)致這些解決方案的用戶可接受程度不高.
虛擬化技術(shù)的發(fā)展為內(nèi)存數(shù)據(jù)保護(hù)提供新的途徑.Overshadow[12]就是一個(gè)典型案例,其原理是利用虛擬機(jī)監(jiān)控器對(duì)訪問物理內(nèi)存的控制,將內(nèi)存的內(nèi)容以不同形式展現(xiàn)給安全應(yīng)用和操作系統(tǒng).當(dāng)安全應(yīng)用訪問其內(nèi)存時(shí),內(nèi)存內(nèi)容是明文.當(dāng)操作系統(tǒng)或其它應(yīng)用程序訪問這塊內(nèi)存時(shí),內(nèi)存內(nèi)容則是密文.Storage Capsules[6]依賴虛擬化技術(shù)的支持,將數(shù)據(jù)處理的操作系統(tǒng)置于私有的虛擬機(jī)客戶機(jī)中,并在虛擬機(jī)監(jiān)控器控制私有客戶機(jī)對(duì)硬件的訪問.在用戶數(shù)據(jù)編輯前,虛擬機(jī)監(jiān)控器記錄客戶機(jī)狀態(tài),并在用戶數(shù)據(jù)編輯過程中,禁止客戶機(jī)外泄用戶數(shù)據(jù),用戶數(shù)據(jù)被編輯完畢后,虛擬機(jī)監(jiān)控器還原私有客戶機(jī),僅保留數(shù)據(jù)處理結(jié)果.類似的工作還有Lacuna[13]、SeCage[14]等.基于虛擬機(jī)監(jiān)控器的解決方案面臨的主要問題是虛擬機(jī)監(jiān)控器自身的性能開銷過大,將虛擬機(jī)監(jiān)控器引入計(jì)算機(jī)系統(tǒng)會(huì)導(dǎo)致整體性能下降,影響用戶可接受性.
改造操作系統(tǒng),提升其安全性是保護(hù)內(nèi)存數(shù)據(jù)的一種途徑.RamCrypt[8]修改內(nèi)核,在內(nèi)存頁面訪問增加新的異常,使得處理器訪問密文頁面時(shí),首先由操作系統(tǒng)內(nèi)核對(duì)其進(jìn)行脫密,再轉(zhuǎn)交處理器訪問.按照RamCrypt的設(shè)計(jì),大多數(shù)內(nèi)存頁面在大多數(shù)時(shí)候都是呈密文狀態(tài).Cryptkeeper[9]和LeMe[15]是與RamCrypt類似的工作.Cryptkeeper將內(nèi)存頁面分為一個(gè)小的明文狀態(tài)的頁面集和大的密文狀態(tài)的頁面集.在初始情況下,所有頁面是公開的;在頁面置換過程中,公開頁面逐漸轉(zhuǎn)換為秘密頁面;當(dāng)秘密頁面過多,再轉(zhuǎn)換成公開頁面.LeMe則是一種輕量級(jí)內(nèi)存加解密方案,它僅對(duì)用戶所標(biāo)識(shí)的數(shù)據(jù)實(shí)施內(nèi)存加密保護(hù).Shreds[16]是對(duì)進(jìn)程結(jié)構(gòu)的改造,實(shí)現(xiàn)進(jìn)程內(nèi)部更細(xì)粒度的隔離,達(dá)到只有特定指令才能訪問特定數(shù)據(jù)的目的.Nizza[17]依托L4微內(nèi)核,為上層應(yīng)用構(gòu)建可信的運(yùn)行環(huán)境.類似的還有Virtual Ghost[18],它是在不可信操作系統(tǒng)基礎(chǔ)上保護(hù)進(jìn)程,其核心思想是:依賴編譯優(yōu)化和運(yùn)行時(shí)檢查,構(gòu)造一個(gè)內(nèi)核不能訪問的存儲(chǔ)空間,使得進(jìn)程數(shù)據(jù)與不可信內(nèi)核相互隔離.
還有一些工作是通過改變應(yīng)用軟件,將用戶隱私數(shù)據(jù)隱藏在非內(nèi)存的存儲(chǔ)區(qū)域.就目前的相關(guān)工作來看,處理器寄存器是存儲(chǔ)內(nèi)存秘密數(shù)據(jù)的后備存儲(chǔ)地.AESSE[19]為了不使AES密鑰出現(xiàn)在內(nèi)存,AESSE占用SSE相關(guān)的寄存器xmm0-xmm7,在處理器內(nèi)部完成AES加解密運(yùn)算.TRESOR[20]使用調(diào)試寄存器來保存AES密鑰,Amnesia[21]是與TRESOR類似的工作,它也將密鑰存儲(chǔ)于處理器寄存器中,并重新設(shè)計(jì)加密算法,保證加密算法正常運(yùn)算.處理器寄存器容量有限,無法直接存儲(chǔ)RSA這樣較長(zhǎng)的非對(duì)稱密鑰.Copker就是應(yīng)對(duì)這一問題的一種解決方案[22].在初始情況下,Copker借助TRESOR的方法保護(hù)主密鑰.主密鑰是AES對(duì)稱密鑰,用于加密保護(hù)私鑰,私鑰的密文存在于內(nèi)存.工作時(shí),Copker基于主密鑰解密獲得私鑰的明文,然后再基于私鑰完成相應(yīng)的密碼運(yùn)算.PRIME[23]也實(shí)現(xiàn)類似的工作.Mimosa[24]在TSX特性的支持,將RSA私鑰的密文以及保護(hù)密鑰讀入cache,在保護(hù)環(huán)境下完成RSA私鑰的解密以及RSA運(yùn)算.PixelVault[7]將密鑰存儲(chǔ)于GPU寄存器中,并且敏感代碼也存在于GPU的cache.依賴GPU設(shè)置不可搶斷執(zhí)行模式的特點(diǎn),保證加解密過程中密鑰不泄露到內(nèi)存.
頁面隱藏就是指在內(nèi)存秘密數(shù)據(jù)不被進(jìn)程訪問時(shí),將其從進(jìn)程地址空間移走,從而使攻擊者無法從進(jìn)程地址空間中獲取秘密數(shù)據(jù).為此,在保證處理器訪問內(nèi)存數(shù)據(jù)不受影響的前提下,通過及時(shí)的頁面轉(zhuǎn)置,使待訪問數(shù)據(jù)在敏感頁面和影子頁面之間切換,使秘密數(shù)據(jù)長(zhǎng)時(shí)間不存在于進(jìn)程地址空間,從而實(shí)現(xiàn)對(duì)秘密數(shù)據(jù)的保護(hù).
結(jié)合圖1說明本方法的工作原理.我們通過改造Linux操作系統(tǒng)的內(nèi)存管理子系統(tǒng),為進(jìn)程地址空間構(gòu)造兩個(gè)視圖,使得攻擊者和進(jìn)程本身所看到的地址空間視圖不一樣.在攻擊者視圖內(nèi),不包括需要保護(hù)數(shù)據(jù)的內(nèi)存頁面.需要保護(hù)數(shù)據(jù)所在內(nèi)存頁面只出現(xiàn)在進(jìn)程視圖內(nèi).
圖1 工作原理Fig.1 Working principle of our solution
為了便于說明,我們給出以下定義:
定義1.敏感頁面:敏感頁面是指包括需要保護(hù)數(shù)據(jù)的頁面.
定義2.影子頁面:影子頁面是指與敏感頁面對(duì)應(yīng)的頁面,它將用于替代敏感頁面,構(gòu)建攻擊者視圖.
為了欺騙攻擊者,在攻擊者視圖中,我們用影子頁面替代敏感頁面.影子頁面與敏感頁面基本一致,只是對(duì)需要保護(hù)的數(shù)據(jù)進(jìn)行偽造.例如:敏感頁面記錄用戶口令是pwd,影子頁面則記錄用戶口令是usr.通過欺騙攻擊者,使其難以查覺敏感頁面的存在.
為了保證處理器正常訪問進(jìn)程的指令和數(shù)據(jù),我們通過頁面轉(zhuǎn)置操作,及時(shí)完成兩種視圖的切換.當(dāng)進(jìn)程申明需要保護(hù)的內(nèi)存數(shù)據(jù)后,在系統(tǒng)為這些內(nèi)存數(shù)據(jù)分配內(nèi)存頁面的同時(shí),也會(huì)構(gòu)造影子頁面與敏感頁面一一對(duì)應(yīng).在攻擊者視圖中,敏感頁面將由內(nèi)核持有,其頁表項(xiàng)信息并不會(huì)出現(xiàn)在進(jìn)程頁表中,這樣攻擊者就無法從進(jìn)程頁表中查詢到敏感頁面.當(dāng)進(jìn)程需要訪問被保護(hù)的內(nèi)存數(shù)據(jù)時(shí),內(nèi)核將敏感頁面的頁表項(xiàng)覆蓋影子頁面的頁表項(xiàng),實(shí)現(xiàn)攻擊者視圖到進(jìn)程視圖的切換.反之,當(dāng)內(nèi)核將影子頁面的頁表項(xiàng)覆蓋敏感頁面的頁表項(xiàng)時(shí),則實(shí)現(xiàn)進(jìn)程視圖到攻擊者視圖的切換.這種切換我們稱之為頁面轉(zhuǎn)置.由于頁面轉(zhuǎn)置只涉及到頁表項(xiàng)的修改,而x86系列處理器所對(duì)應(yīng)的頁表項(xiàng)的大小只有32字節(jié),對(duì)其操作較加解密運(yùn)算要節(jié)省性能開銷.這樣,我們就可以在不過多影響系統(tǒng)性能的前提下達(dá)到保護(hù)內(nèi)存數(shù)據(jù)的目的.
本方法的系統(tǒng)架構(gòu)如圖2所示.主要的功能單元均在內(nèi)核空間,只有用戶接口在用戶空間,且只對(duì)用戶開放.內(nèi)核空間有頁面轉(zhuǎn)置、頁面分配與頁面回收功能單元.用戶接口以動(dòng)態(tài)鏈接庫的形式提供給用戶.用戶接口與內(nèi)核中的功能單元,通過系統(tǒng)調(diào)用的方式完成交互.
圖2 系統(tǒng)架構(gòu)圖Fig.2 Architecture of our solution
分別簡(jiǎn)要說明各功能單元.用戶接口是用戶使用本系統(tǒng)的接口,用戶可以通過用戶接口訪問本系統(tǒng)所提供的服務(wù),如向頁面轉(zhuǎn)置功能單元提出頁面轉(zhuǎn)置請(qǐng)求,由其完成敏感頁面的重現(xiàn)和隱藏.頁面轉(zhuǎn)置功能單元是指實(shí)現(xiàn)敏感頁面和影子頁面之間的相互替代,包括頁面正轉(zhuǎn)和頁面逆轉(zhuǎn)兩種情況.頁面分配與回收并非完全獨(dú)立功能單元,而是對(duì)現(xiàn)有Linux操作系統(tǒng)內(nèi)核的改造,從而滿足頁面分配和回收的特殊要求.頁面分配是指為待保護(hù)內(nèi)存數(shù)據(jù)的頁面分配操作,當(dāng)分配一個(gè)敏感頁面存儲(chǔ)待保護(hù)數(shù)據(jù)時(shí),系統(tǒng)同時(shí)分配一個(gè)與之同樣大小空間的影子頁面用來存儲(chǔ)虛假數(shù)據(jù).頁面回收功能單元采用雙頁面回收算法,同時(shí)回收敏感頁面及與之對(duì)偶的影子頁面.
本文所討論頁面分配是指為待保護(hù)內(nèi)存數(shù)據(jù)的頁面分配操作.如果用戶提出對(duì)某項(xiàng)數(shù)據(jù)的保護(hù)需求,我們將對(duì)其作特殊處理,以支持后繼的頁面隱藏相關(guān)操作.頁面分配將分為以下幾個(gè)步驟.
第1步.申請(qǐng)頁面.內(nèi)存數(shù)據(jù)需要申請(qǐng)新的存儲(chǔ)空間時(shí),系統(tǒng)按照傳統(tǒng)的方式申請(qǐng)相應(yīng)的存儲(chǔ)空間,將其視為敏感頁面;同時(shí)為影子頁面分配相應(yīng)的存儲(chǔ)空間;標(biāo)記影子頁面和敏感頁面的對(duì)偶關(guān)系.
第2步.數(shù)據(jù)虛假化.當(dāng)內(nèi)存數(shù)據(jù)被拷貝到敏感頁面后,本系統(tǒng)要求將類似的內(nèi)容拷貝至影子頁面,以欺騙攻擊者.用D表示待保護(hù)的內(nèi)存數(shù)據(jù),用S表示敏感頁面的其它數(shù)據(jù),那么影子頁面所包含的數(shù)據(jù)為D′∪S,其中D′是故意偽造的虛假信息.
第3步.頁面隱藏.為了隱藏敏感頁面,我們將敏感頁面的信息從頁表中移除,將其轉(zhuǎn)移至影子頁表.影子頁表的定義如定義3所示.
定義3.影子頁表:影子頁表是保存敏感頁面和影子頁面頁表項(xiàng)及對(duì)偶關(guān)系的數(shù)據(jù)結(jié)構(gòu).
與本文所使用的影子頁表容易混淆的是虛擬機(jī)監(jiān)控器所使用的影子頁表.雖然兩個(gè)頁表都保存了頁表項(xiàng)信息,但是本文所使用的影子頁表只是單純保存敏感頁面和影子頁面的頁表項(xiàng)信息,并記錄敏感頁面和影子頁面的對(duì)偶關(guān)系,這些信息是實(shí)現(xiàn)頁面轉(zhuǎn)置時(shí),供本系統(tǒng)查詢使用,影子頁表本身并不參與尋址.
如圖3所示,頁表既含有普通頁面(非敏感頁面和影子頁面的其它頁面)的頁表項(xiàng)信息,也可能含有敏感頁面和影子頁面的信息.在絕大部分情況下,敏感頁面的頁表項(xiàng)并不出現(xiàn)在頁表中,都以影子頁面的形式出現(xiàn).影子頁表記錄了影子頁面和敏感頁面對(duì)換所需要的信息.
圖3 頁面隱藏示意Fig.3 Method to hide page
存在一些特殊情況需要進(jìn)一步說明.第一種情況是:新的待保護(hù)數(shù)據(jù)將寫入敏感頁面.在這種情況下,后繼數(shù)據(jù)將不需要再申請(qǐng)頁面,但應(yīng)該再次申明待保護(hù)數(shù)據(jù),以便系統(tǒng)明確該頁面含有超過1個(gè)受保護(hù)數(shù)據(jù).第二種情況是:待保護(hù)數(shù)據(jù)占據(jù)多個(gè)頁面.這種情況需要 將多個(gè)敏感頁面的信息從頁表中移除,將其轉(zhuǎn)移至影子頁表.以上兩種情況都不會(huì)影響頁面隱藏.
首先給出頁面轉(zhuǎn)置的定義.
定義4.頁面轉(zhuǎn)置:頁面轉(zhuǎn)置是指敏感頁面和影子頁面之間的相互替代.
當(dāng)處理器對(duì)待保護(hù)數(shù)據(jù)需要進(jìn)行正常訪問時(shí),系統(tǒng)會(huì)使用敏感頁面替代影子頁面.當(dāng)處理器結(jié)束訪問后,系統(tǒng)會(huì)將影子頁面替代敏感頁面,從而避免敏感頁面長(zhǎng)時(shí)間暴露.頁面轉(zhuǎn)置并不是真的將頁面實(shí)現(xiàn)替代,而是將影子頁面和敏感頁面所對(duì)應(yīng)的頁表項(xiàng)實(shí)施替代,從而改變處理器尋址的目的頁面.由于頁表項(xiàng)長(zhǎng)度較頁面要小得多,從而可以避免在內(nèi)核空間大規(guī)模轉(zhuǎn)移數(shù)據(jù),進(jìn)而提高系統(tǒng)效率.頁面轉(zhuǎn)置分為頁面正轉(zhuǎn)和頁面逆轉(zhuǎn)兩類,其定義如下:
定義5.頁面正轉(zhuǎn):頁面正轉(zhuǎn)是指敏感頁面替代影子頁面,以隱藏敏感頁面內(nèi)的待保護(hù)數(shù)據(jù).
定義6.頁面逆轉(zhuǎn):頁面逆轉(zhuǎn)是指影子頁面替代敏感頁面,以滿足處理器訪問敏感頁面內(nèi)待保護(hù)數(shù)據(jù)的合法請(qǐng)求.
頁面正轉(zhuǎn)和頁面逆轉(zhuǎn)相互配合,共同完成敏感頁面內(nèi)待保護(hù)數(shù)據(jù)的隱藏和正常訪問.頁面正轉(zhuǎn)在合法訪問待保護(hù)數(shù)據(jù)前發(fā)生,頁面逆轉(zhuǎn)是在合法訪問待保護(hù)數(shù)據(jù)后發(fā)生.當(dāng)回收頁面時(shí),我們通過頁面正轉(zhuǎn)恢復(fù)頁表以完成后繼內(nèi)存釋放操作.
頁面轉(zhuǎn)置請(qǐng)求由用戶顯式提出.頁面轉(zhuǎn)置也可以由頁面異常引起,但是我們認(rèn)為這可能導(dǎo)致風(fēng)險(xiǎn).操作系統(tǒng)內(nèi)核無從得知當(dāng)前處理器訪問是否合法.如果只要處理器訪問(這就可能引起頁面異常),系統(tǒng)內(nèi)核就實(shí)施頁面轉(zhuǎn)置,那隱藏頁面就沒有意義可言,因?yàn)楣粽呖梢砸龑?dǎo)觸發(fā)處理器訪問該頁面,從而獲知敏感頁面的內(nèi)容.為此,我們強(qiáng)調(diào)頁面轉(zhuǎn)置請(qǐng)求應(yīng)該由用戶顯式提出.用戶在訪問待保護(hù)數(shù)據(jù)時(shí),首先提出頁面轉(zhuǎn)置請(qǐng)求,待系統(tǒng)內(nèi)核完成轉(zhuǎn)置后,再實(shí)施訪問,待訪問結(jié)束后再次提交頁面轉(zhuǎn)置請(qǐng)求,恢復(fù)影子頁面.
頁面轉(zhuǎn)置請(qǐng)求由用戶顯式提出也存在弊端.頁面正轉(zhuǎn)操作和頁面逆轉(zhuǎn)操作應(yīng)該對(duì)偶,且頁面逆轉(zhuǎn)操作應(yīng)該在完成數(shù)據(jù)訪問后立即執(zhí)行.不過,用戶可能會(huì)遺忘頁面逆轉(zhuǎn)操作,或者沒有及時(shí)執(zhí)行頁面逆轉(zhuǎn)操作,從而導(dǎo)致敏感頁面長(zhǎng)期處于暴露狀態(tài).為此,我們?cè)鲈O(shè)頁面定時(shí)自動(dòng)逆轉(zhuǎn)功能.當(dāng)用戶執(zhí)行頁面正轉(zhuǎn)操作后,超過一定時(shí)間仍然沒有執(zhí)行頁面逆轉(zhuǎn)操作,系統(tǒng)就自動(dòng)執(zhí)行頁面逆轉(zhuǎn)操作,從而減少敏感頁面暴露風(fēng)險(xiǎn).
頁面回收的目的是回收影子頁面和敏感頁面從而釋放內(nèi)存空間.頁面分配時(shí),我們根據(jù)敏感頁面的情況,額外多分配相應(yīng)頁面以建立影子頁面.如果仍然按照傳統(tǒng)的頁面回收方法,是無法完全回收額外分配的頁面,只能回收出現(xiàn)在頁表中的頁面.一種解決方案是待進(jìn)程死亡時(shí),根據(jù)影子頁表回收頁面.但是如果進(jìn)程長(zhǎng)久存活,且反復(fù)申請(qǐng)和回收頁面,就會(huì)造成大量的內(nèi)存頁面無法使用的情況.因此需要對(duì)傳統(tǒng)的頁面回收功能進(jìn)行升級(jí)和改造.
首先說明雙頁面回收算法.該算法需要同時(shí)回收敏感頁面以及與之對(duì)偶的影子頁面,故而稱之為雙頁面回收算法.雙頁面回收算法不僅需要回收敏感頁面,還需要回收影子頁面以及影子頁表對(duì)應(yīng)結(jié)點(diǎn).其工作流程如下:在回收具體頁面前,首先應(yīng)查詢影子頁表,遍歷影子頁表獲知目標(biāo)頁面信息(包括敏感頁面和影子頁面);執(zhí)行頁面正轉(zhuǎn),恢復(fù)進(jìn)程頁表,以便后繼內(nèi)存釋放操作;然后利用傳統(tǒng)內(nèi)存釋放方法釋放敏感頁面和影子頁面;最后釋放影子頁表中對(duì)應(yīng)的結(jié)點(diǎn).
還存在影子頁面回收算法.影子頁面回收算法是針對(duì)這樣的一種回收?qǐng)鼍埃河脩粼趧h除受保護(hù)數(shù)據(jù)前,將敏感頁面恢復(fù)成普通頁面.我們稱這種情況下的頁面回收算法為影子頁面回收算法.簡(jiǎn)而言之,影子頁面回收算法只回收影子頁面,保留敏感頁面.當(dāng)敏感頁面不再包含任何受保護(hù)數(shù)據(jù)時(shí),系統(tǒng)應(yīng)該將影子頁面提前刪除.其工作流程如下:系統(tǒng)檢查當(dāng)前頁表中相應(yīng)頁面是否為影子頁面,如果是則執(zhí)行頁面正轉(zhuǎn);系統(tǒng)釋放影子頁面,并修改影子頁表,釋放相應(yīng)節(jié)點(diǎn);此時(shí)意味著原敏感頁面轉(zhuǎn)變?yōu)槠胀撁?如果用戶需要繼續(xù)回收頁面,則按照傳統(tǒng)頁面回收算法回收頁面即可.
我們?cè)贔edora 21(Linux內(nèi)核版本號(hào):3.17.6)構(gòu)建原型系統(tǒng).為了實(shí)現(xiàn)頁面分配、回收和轉(zhuǎn)置的操作,我們修改了內(nèi)核,添加了5個(gè)內(nèi)核函數(shù),封裝了4個(gè)系統(tǒng)調(diào)用,以動(dòng)態(tài)鏈接庫的形式向用戶提供7個(gè)接口函數(shù),以便用戶在編程時(shí)標(biāo)注需要保護(hù)的數(shù)據(jù),并完成正轉(zhuǎn)和逆轉(zhuǎn)等操作.
由于我們?yōu)槊總€(gè)敏感頁面附加一個(gè)影子頁面,從而使得我們必須改變傳統(tǒng)的內(nèi)存分配方法以及回收方法.內(nèi)存分配有多種形式,出于典型示范的考慮,我們選擇對(duì)malloc和free這種堆分配和回收操作進(jìn)行升級(jí),來適應(yīng)本系統(tǒng).為此,我們新增ppmalloc、ppfree和ppclear實(shí)現(xiàn)頁面分配和回收.為了支持上述用戶接口,我們?cè)O(shè)計(jì)和實(shí)現(xiàn)了ppinit和ppfree兩個(gè)系統(tǒng)調(diào)用和ptp_addnode、ptp_delnode和get_pte三個(gè)內(nèi)核函數(shù).
ppmalloc工作流程如圖4(a)所示:
①首先利用傳統(tǒng)的malloc申請(qǐng)敏感頁面存儲(chǔ)空間;
②利用傳統(tǒng)的malloc申請(qǐng)影子頁面存儲(chǔ)空間;
③調(diào)用ppinit系統(tǒng)調(diào)用,ppinit進(jìn)一步調(diào)用內(nèi)核函數(shù)ptp_addnode,在影子頁表中添加一個(gè)新的空白節(jié)點(diǎn);
④調(diào)用內(nèi)核函數(shù)get_pte,收集敏感頁面和影子頁面的頁表項(xiàng),填寫新分配節(jié)點(diǎn)的內(nèi)容.與傳統(tǒng)的malloc相比,ppmalloc所分配的存儲(chǔ)空間增加,同時(shí)也增加了維護(hù)影子頁表的操作.
圖4 ppmalloc和get_pte流程Fig.4 Workflow of ppmalloc and get_pte
為了讓內(nèi)核感知影子頁表,我們?cè)谶M(jìn)程描述符數(shù)據(jù)結(jié)構(gòu)task_struct中增加一項(xiàng)屬性(用*Phead表示),指向影子頁表.影子頁表以單鏈表的形式組織,每個(gè)節(jié)點(diǎn)的定義如下所示:
strcut ptp_node{
unsigned char* addr_t;
unsigned char* addr_f;
PTE pte_t;
PTE pte_f; ptp_node * next;
}
每個(gè)節(jié)點(diǎn)內(nèi)部?jī)蓚€(gè)頁表項(xiàng)pte_f和pte_t分別對(duì)應(yīng)影子頁面和敏感頁面,兩者一一對(duì)應(yīng),呈對(duì)偶關(guān)系.addr_t是敏感數(shù)據(jù)地址,其位于敏感頁面內(nèi),addr_f是虛假數(shù)據(jù)地址,其位于影子頁面內(nèi).頁面轉(zhuǎn)置時(shí),需要查詢影子頁表,其性能開銷與影子頁表長(zhǎng)度相關(guān).由于影子頁表所含節(jié)點(diǎn)數(shù)量一般不多,我們認(rèn)為查詢操作不會(huì)影響到系統(tǒng)整體性能.
內(nèi)核函數(shù)ptp_addnode的功能是在影子頁表中添加一個(gè)新的節(jié)點(diǎn),其函數(shù)原型為:int ptp_addnode(char* t_addr,char* f_addr).與之相對(duì)應(yīng)的是內(nèi)核函數(shù)ptp_delnode,該函數(shù)用于在影子頁表中刪除指定節(jié)點(diǎn),其函數(shù)原型為:int ptp_delnode(char* t_addr).由于影子頁表采用單鏈表的形式組織,所以從本質(zhì)上講,上述兩個(gè)函數(shù)就是在單鏈表中添加或刪除節(jié)點(diǎn),其實(shí)現(xiàn)過程較為簡(jiǎn)單,本文不再贅述.
內(nèi)核函數(shù)get_pte是支持ppmalloc的另一個(gè)內(nèi)核函數(shù),其函數(shù)原型是pte_t* get_pte(unsigned long addr),其功能是獲取指定地址所在頁面的頁表項(xiàng).該內(nèi)核函數(shù)的工作流程如圖4(b)所示:
①以輸入地址addr為參數(shù),利用內(nèi)核函數(shù)pgd_offset,獲取頁全局目錄描述符;
②利用內(nèi)核函數(shù)pud_offset,進(jìn)一步獲取頁上級(jí)目錄描述符;
③利用內(nèi)核函數(shù)pmd_offset,進(jìn)一步獲取頁中間目錄描述符;
④利用內(nèi)核函數(shù)pte_offset_map,最終獲取頁表項(xiàng).內(nèi)核函數(shù)ptp_addnode利用該函數(shù)獲取敏感頁面和影子頁面的頁表項(xiàng)信息,并填入影子頁表中新添加的空白節(jié)點(diǎn).
當(dāng)敏感的內(nèi)存數(shù)據(jù)寫入敏感頁面后,類似的內(nèi)容也應(yīng)該寫入影子頁面,以欺騙攻擊者.構(gòu)造虛假信息的一種直接而簡(jiǎn)單的方法是采用隨機(jī)數(shù)對(duì)其進(jìn)行覆蓋.不過,這種方法容易被攻擊者識(shí)破,進(jìn)而促使攻擊者實(shí)施進(jìn)一步攻擊.我們?cè)O(shè)計(jì)和實(shí)現(xiàn)了一個(gè)新的用戶接口pptrap,由用戶指定寫入影子頁面的虛假數(shù)據(jù).虛假數(shù)據(jù)的大小和所在頁內(nèi)的偏移應(yīng)該與敏感數(shù)據(jù)相同,從而使數(shù)據(jù)以一種接近真實(shí)的狀態(tài)呈現(xiàn)給攻擊者.例如敏感頁面記錄用戶口令是pwd,影子頁面則記錄用戶口令是usr,攻擊者竊取到usr口令時(shí)認(rèn)為攻擊已經(jīng)成功,進(jìn)而停止攻擊,從而使頁面達(dá)到較好的隱藏效果.
圖5 ppfree和ppclear流程Fig.5 Workflow of ppfree and ppclear
為了支持真實(shí)頁面和虛假頁面的回收,我們?cè)O(shè)計(jì)和實(shí)現(xiàn)了用戶接口ppfree和ppclear.ppfree對(duì)應(yīng)雙頁面回收算法,其工作流程如圖5(a)所示:
①執(zhí)行敏感頁面轉(zhuǎn)置操作(詳見4.2節(jié)),確保敏感頁面處于正轉(zhuǎn)狀態(tài),還原頁表項(xiàng);
②調(diào)用ppfree系統(tǒng)調(diào)用,觸發(fā)內(nèi)核函數(shù)ptp_delnode,刪除影子頁表所保存的對(duì)應(yīng)節(jié)點(diǎn);
③利用傳統(tǒng)的free釋放對(duì)應(yīng)的影子頁面;
④利用傳統(tǒng)的free釋放對(duì)應(yīng)的敏感頁面.
與傳統(tǒng)的free相比,ppfree刪除的存儲(chǔ)空間增加,并且增加刪除影子頁表節(jié)點(diǎn)的操作.ppclear對(duì)應(yīng)影子頁面回收算法,其工作流程如圖5(b)所示,與ppfree主要的區(qū)別在于不再釋放敏感頁面.完成ppclear操作后,敏感頁面所對(duì)應(yīng)的影子頁面將不存在,而敏感頁面本身則改變?yōu)槠胀撁?
頁面轉(zhuǎn)置操作分為頁面正轉(zhuǎn)操作和頁面逆轉(zhuǎn)操作.雖然目的是實(shí)現(xiàn)影子頁面和敏感頁面的相互替代,但是在本質(zhì)上是通過修改頁表項(xiàng)內(nèi)容,影響虛擬地址尋址過程,使同樣的虛擬地址在頁面轉(zhuǎn)置前后,會(huì)出現(xiàn)不同的尋址結(jié)果,定位于不同的物理頁面.由于頁表項(xiàng)長(zhǎng)度較頁面要小得多(頁面大小一般為4K字節(jié),而頁表項(xiàng)的大小為32字節(jié)),從而可以避免在內(nèi)核空間大規(guī)模轉(zhuǎn)移數(shù)據(jù),進(jìn)而提高系統(tǒng)效率.
為了便于用戶控制頁面轉(zhuǎn)置操作,我們?cè)O(shè)計(jì)和實(shí)現(xiàn)了ppturnoff和ppturnon接口函數(shù).上述支持上述應(yīng)用接口,我們?cè)谙到y(tǒng)調(diào)用層面增加了ppturnoff和ppturnon兩個(gè)系統(tǒng)調(diào)用,在內(nèi)核函數(shù)層面增加了put_pte和ptp_findnode兩個(gè)內(nèi)核函數(shù).put_pte的函數(shù)原型:int put_pte(unsigned long addr,pte_t *pte_n),其功能是用pte_n替換頁表中addr所在頁面的頁表項(xiàng),其實(shí)現(xiàn)類似內(nèi)核函數(shù)get_pte,本文不再贅述.ptp_findnode的函數(shù)原型:struct ptp_node* ptp_findnode(char* addr),其功能是查找影子頁表指定節(jié)點(diǎn),用于獲取該節(jié)點(diǎn)所存儲(chǔ)的敏感頁面和影子頁面的頁表項(xiàng)信息,其實(shí)現(xiàn)是遍歷影子頁表,并按條件返回指定節(jié)點(diǎn).
頁面正轉(zhuǎn)操作是使用敏感頁面的頁表項(xiàng)替代影子頁面的頁表項(xiàng),從而實(shí)現(xiàn)還原數(shù)據(jù)的目的.其實(shí)現(xiàn)的細(xì)節(jié)如下:
①用戶通過接口函數(shù)ppturnoff發(fā)出頁面正轉(zhuǎn)請(qǐng)求;
②該請(qǐng)求觸發(fā)系統(tǒng)調(diào)用ptp_turn_off;
③系統(tǒng)調(diào)用ptp_turn_off調(diào)用內(nèi)核函數(shù)ptp_findnode,該函數(shù)利用Current宏,獲取當(dāng)前進(jìn)程任務(wù)描述符,從而獲得影子頁表頭指針,進(jìn)而遍歷影子頁表,獲得對(duì)應(yīng)地址所在敏感頁面的頁表項(xiàng)pte;
④系統(tǒng)調(diào)用ptp_turn_off調(diào)用新增加的內(nèi)核函數(shù)put_pte,獲得對(duì)應(yīng)地址所在頁面的頁表項(xiàng)pte',并利用內(nèi)核函數(shù)set_pte,使用pte替代pte',改變進(jìn)程頁表內(nèi)容;
⑤刷新cache,確保當(dāng)前頁表項(xiàng)更新生效.如果不刷新cache,會(huì)使處理器仍然使用pte'進(jìn)行尋址,使得頁面正轉(zhuǎn)無法生效.
頁面逆轉(zhuǎn)操作與頁面正轉(zhuǎn)操作正好互逆,是用影子頁面的頁表項(xiàng)替換敏感頁面,從而實(shí)現(xiàn)隱藏?cái)?shù)據(jù)的目的,其實(shí)現(xiàn)的細(xì)節(jié)類似于頁面正轉(zhuǎn),如下所述:
①用戶通過接口函數(shù)ppturnon發(fā)出頁面逆轉(zhuǎn)請(qǐng)求;
②用戶請(qǐng)求觸發(fā)系統(tǒng)調(diào)用ptp_turn_on;
③ptp_turn_on調(diào)用內(nèi)核函數(shù)ptp_findnode,獲得對(duì)應(yīng)地址所在影子頁面的頁表項(xiàng)pte';
④ptp_turn_on調(diào)用內(nèi)核函數(shù)put_pte,該函數(shù)查詢頁表,獲得對(duì)應(yīng)地址所在頁面的頁表項(xiàng)pte,并利用內(nèi)核函數(shù)set_pte,使用pte'替代pte;
⑤刷新cache,確保當(dāng)前頁表項(xiàng)更新生效.
為了避免由于用戶的遺漏,沒有及時(shí)執(zhí)行頁面逆轉(zhuǎn)操作,從而使數(shù)據(jù)長(zhǎng)時(shí)間暴露,我們?cè)黾佑脩艚涌趐ptime.用戶接口pptime用于實(shí)現(xiàn)延時(shí)自動(dòng)逆轉(zhuǎn)的功能,允許在頁面正轉(zhuǎn)后若干時(shí)間后,自動(dòng)執(zhí)行頁面逆轉(zhuǎn)操作.當(dāng)然,用戶再次執(zhí)行頁面逆轉(zhuǎn)操作,也不會(huì)引起系統(tǒng)異常,所有的操作結(jié)果均以最后一次執(zhí)行為準(zhǔn).
表1總結(jié)了本系統(tǒng)為用戶所封裝7個(gè)接口函數(shù).其中,ppmalloc和、ppfree和ppclear是用戶分配和回收存儲(chǔ)空間時(shí)使用;ppturnon和ppturnoff是用戶實(shí)現(xiàn)頁面轉(zhuǎn)置的接口;pptime是用戶設(shè)置延時(shí)自動(dòng)轉(zhuǎn)置的接口;pptrap用于用戶設(shè)置為影子頁面設(shè)置虛假內(nèi)容.pptime和pptrap是在用戶空間完成,不與新增系統(tǒng)調(diào)用交互.
我們整理了系統(tǒng)實(shí)現(xiàn)過程中,所增設(shè)的內(nèi)核函數(shù)、系統(tǒng)調(diào)用和用戶接口,圖6描述了它們之間的調(diào)用關(guān)系.在內(nèi)核函數(shù)層面,我們添加了get_pte和put_get兩個(gè)內(nèi)核函數(shù)用于操作傳統(tǒng)頁表中的頁表項(xiàng)(即:PTE),為了操作影子頁表,我們?cè)黾恿藀tp_addnode等3個(gè)內(nèi)核函數(shù).在系統(tǒng)調(diào)用層面,我們?cè)黾恿?個(gè)系統(tǒng)調(diào)用,分別對(duì)應(yīng)頁面初始化、頁面正轉(zhuǎn)、頁面逆轉(zhuǎn)和頁面釋放4種操作.依托4個(gè)新增加的系統(tǒng)調(diào)用,我們?cè)O(shè)計(jì)和實(shí)現(xiàn)了5個(gè)用戶接口函數(shù),同時(shí)從提高安全性角度,我們另外增加延時(shí)反轉(zhuǎn)和設(shè)置虛假數(shù)據(jù)等2個(gè)用戶接口.
表1 用戶接口Table 1 User interfaces
我們從功能和性能兩個(gè)方面對(duì)原型系統(tǒng)進(jìn)行測(cè)試.在功能上,我們通過在內(nèi)存中對(duì)敏感頁面以及對(duì)影子頁面的訪問結(jié)果進(jìn)行對(duì)比,進(jìn)而表明在內(nèi)存中只有對(duì)敏感頁面的訪問才是有效的.在性能上,我們利用測(cè)試軟件UnixBench對(duì)引入原型系統(tǒng)后的操作系統(tǒng)進(jìn)行整體測(cè)試,并通過測(cè)試頁面轉(zhuǎn)置函數(shù)執(zhí)行時(shí)間來進(jìn)一步分析頁面轉(zhuǎn)置性能開銷,從而全面反映原型系統(tǒng)的性能開銷情況.
表2 軟硬件情況Table 2 Used hardware and software
我們測(cè)試所使用的軟硬件信息如表2所示.硬件平臺(tái)可以在市面上購(gòu)買,軟件均為開源軟件,可以在相應(yīng)的網(wǎng)站下載安裝.在后繼的時(shí)間,我們擬在其它的硬件平臺(tái)以及其它內(nèi)核版本的操作系統(tǒng)上完成測(cè)試,以進(jìn)一步驗(yàn)證本系統(tǒng)的兼容性.
為驗(yàn)證本系統(tǒng)的有效性,我們編寫一段簡(jiǎn)單應(yīng)用程序,其內(nèi)容為打印某個(gè)字符串變量.我們將該變量設(shè)置為需要保護(hù)的數(shù)據(jù),并在頁面正轉(zhuǎn)、逆轉(zhuǎn)后分別打印該字符串.具體測(cè)試流程如下描述.
我們首先利用ppmalloc()申請(qǐng)12字節(jié)的存儲(chǔ)空間,并對(duì)其賦初始值“Hello world”,然后調(diào)用pptrap()將類似的虛假數(shù)據(jù)“I am a liar”寫入影子頁面.現(xiàn)在打印該存儲(chǔ)空間的內(nèi)容,由于初時(shí)狀態(tài)下存儲(chǔ)空間為敏感頁面狀態(tài),該打印結(jié)果應(yīng)該為“Hello world”.我們調(diào)用ppturnoff()將敏感頁面逆轉(zhuǎn)為影子頁面,再次打印該存儲(chǔ)空間的內(nèi)容,此時(shí)存儲(chǔ)空間為影子頁面狀態(tài),該打印結(jié)果應(yīng)該為“I am a liar”.再次調(diào)用ppturnon()將影子頁面正轉(zhuǎn)為敏感頁面,并利用pptime()設(shè)置頁面定時(shí)自動(dòng)逆轉(zhuǎn),在規(guī)定時(shí)間后,再次打印該存儲(chǔ)空間內(nèi)容,打印結(jié)果應(yīng)該為“I am a liar”.
圖7 功能測(cè)試Fig.7 Functional test
實(shí)驗(yàn)結(jié)果如圖7所示,與預(yù)期效果一致.當(dāng)頁面處于敏感頁面時(shí),處理器可以直接訪問頁面內(nèi)的敏感數(shù)據(jù),打印出我們預(yù)先寫入的字符串?dāng)?shù)據(jù).當(dāng)敏感頁面被逆轉(zhuǎn)為影子頁面時(shí),處理器所訪問的是虛假數(shù)據(jù).這反映了我們的系統(tǒng)成功改變了地址映射關(guān)系,使同一個(gè)地址在頁面正轉(zhuǎn)和頁面逆轉(zhuǎn)操作后,指向不同的存儲(chǔ)空間,使攻擊者無法在進(jìn)程地址空間看到敏感數(shù)據(jù).
為了測(cè)試本系統(tǒng)的性能開銷情況,我們利用測(cè)試軟件UnixBench對(duì)引入本系統(tǒng)后的系統(tǒng)進(jìn)行測(cè)試,從而全面反映本系統(tǒng)對(duì)計(jì)算機(jī)整體性能開銷的影響.使用UnixBench實(shí)施測(cè)試的方案如下:首先采用默認(rèn)設(shè)置,在未安裝本系統(tǒng)的操作系統(tǒng)上運(yùn)行UnixBench,記錄得分情況(稱基準(zhǔn)得分);然后安裝本系統(tǒng),再次運(yùn)行UnixBench,記錄得分情況(稱系統(tǒng)得分);對(duì)比分析兩種情況下的UnixBench得分情況.我們以處理器每核同時(shí)運(yùn)行測(cè)試程序的結(jié)果作為最終結(jié)果.為了提高準(zhǔn)確率,我們重復(fù)實(shí)驗(yàn)5次,以平均值作為最后結(jié)果.本部分實(shí)驗(yàn)結(jié)果如表3所示.從結(jié)果來看,系統(tǒng)整體性能下降幅度為0.9%左右.考慮到UnixBench自身的誤差,可以認(rèn)為原型系統(tǒng)對(duì)系統(tǒng)總體性能開銷基本可以忽略.
為了進(jìn)一步明確性能開銷,我們先后測(cè)試存儲(chǔ)空間分配操作和存儲(chǔ)空間寫操作的時(shí)間開銷.對(duì)于存儲(chǔ)空間分配操作,我們采用本系統(tǒng)所提供函數(shù)接口ppmalloc與傳統(tǒng)malloc函數(shù)接口分配同樣大小存儲(chǔ)空間的時(shí)間開銷.為了提高測(cè)量精度,我們使用rdtsc指令讀取處理器時(shí)鐘周期計(jì)數(shù)值,以處理器時(shí)鐘周期為計(jì)數(shù)量單位.我們分別使用上述兩個(gè)函數(shù)申請(qǐng)16字節(jié)、64字節(jié)、256字節(jié)等多種大小的存儲(chǔ)空間,并記錄其所消耗的處理器時(shí)鐘周期數(shù)量.重復(fù)實(shí)驗(yàn)10次,以最后平均值為最后結(jié)果.實(shí)驗(yàn)結(jié)果如表4所示.從表中的數(shù)據(jù)可以發(fā)現(xiàn),當(dāng)分配不大于1024字節(jié)存儲(chǔ)空間時(shí),ppmalloc的性能開銷約為malloc的75倍.當(dāng)分配的存儲(chǔ)空間較大時(shí),性能開銷的差距會(huì)有明顯縮小.
表3 UnixBench測(cè)試結(jié)果Table 3 UnixBench test results
表4 存儲(chǔ)空間分配操作性能測(cè)試Table 4 Performance tests for allocating space
我們還對(duì)敏感頁面寫操作進(jìn)行了性能測(cè)試.我們分別使用memset函數(shù)將不同大小的存儲(chǔ)空間初始化.相對(duì)于傳統(tǒng)寫操作,本方法需要首先對(duì)頁面進(jìn)行轉(zhuǎn)置,再進(jìn)行寫操作.同樣,為了保證測(cè)試結(jié)果的準(zhǔn)確性,我們重復(fù)實(shí)驗(yàn)10次,并以平均值作為最后結(jié)果.實(shí)驗(yàn)結(jié)果如表5所示.從表中的數(shù)據(jù)可以發(fā)現(xiàn),性能開銷增加數(shù)十倍.
表5 寫操作性能測(cè)試Table 5 Performance tests for writing
雖然整體性能測(cè)試和單項(xiàng)操作性能測(cè)試的結(jié)果都表明原型系統(tǒng)導(dǎo)致操作性能存在明顯的下降,但是這種下降幅度對(duì)于進(jìn)程運(yùn)行的影響基本可以忽略.我們采用處理器時(shí)鐘周期作為計(jì)量單位,雖然增加的幅度很明顯,但是增加的實(shí)際值其實(shí)是很有限的.就寫操作而言,雖然需要20000左右的時(shí)鐘周期,但是也僅僅只有10微秒左右.考慮到軟件需要保護(hù)數(shù)據(jù)的數(shù)量以及讀寫操作的頻繁程度,原型系統(tǒng)對(duì)軟件整體運(yùn)行的性能基本可以忽略.
分析性能增加的原因.首先是由于頁面轉(zhuǎn)置操作.雖然頁面轉(zhuǎn)置本身只是對(duì)頁表項(xiàng)的替換,但是為了在應(yīng)用空間和內(nèi)核空間之間的切換,成為性能增加的主要開銷.其次是影子頁表維護(hù).在頁面分配時(shí),由于需要額外分配影子頁面和影子頁表,這導(dǎo)致分配存儲(chǔ)空間的性能開銷增加.此外,當(dāng)被操作存儲(chǔ)空間比較大時(shí),性能開銷的增加幅度變小,這主要是因?yàn)閭鹘y(tǒng)方法需要的性能開銷增加,而這種增加對(duì)于本方法而言并不明顯.
對(duì)于寫操作而言,存在一種性能優(yōu)化的途徑.考慮到頁面轉(zhuǎn)置是主要性能開銷操作,可以考慮在指定時(shí)間內(nèi),保持敏感頁面在進(jìn)程地址空間,待多次寫操作完畢后再實(shí)施頁面轉(zhuǎn)置.針對(duì)這一問題,我們完成如下實(shí)驗(yàn):在頁面轉(zhuǎn)置后,完成1000次寫操作,而不必每次寫操作前均進(jìn)行一次頁面轉(zhuǎn)置.實(shí)驗(yàn)結(jié)果表明:在上述大小的存儲(chǔ)空間寫操作中,性能開銷的增加幅度均可以降低至2倍至10倍.
本文提出一種新的內(nèi)存數(shù)據(jù)保護(hù)方案.該方案能夠使處理器在訪問敏感數(shù)據(jù)前后,敏感數(shù)據(jù)頁面才出現(xiàn)在進(jìn)程地址空間,而其它時(shí)間則從進(jìn)程地址空間移出,由操作系統(tǒng)內(nèi)核單獨(dú)持有.這樣,敏感數(shù)據(jù)以明文形式暴露在攻擊者面前的時(shí)間大幅減少.為了達(dá)到上述設(shè)計(jì)目的,我們通過修改進(jìn)程頁表,影響虛擬地址尋址過程,使得敏感頁面和影子頁面能夠及時(shí)轉(zhuǎn)置.我們?cè)贔edora 21(內(nèi)核版本號(hào):3.17.6)構(gòu)建了原型系統(tǒng),并以動(dòng)態(tài)鏈接庫的形式向用戶提供7個(gè)接口函數(shù),方便用戶使用內(nèi)核新特性.實(shí)驗(yàn)驗(yàn)證表明原型系統(tǒng)能夠通過頁面轉(zhuǎn)置,在不影響處理器訪問的前提下,實(shí)現(xiàn)敏感數(shù)據(jù)的隱藏.系統(tǒng)整體性能測(cè)試表明原型系統(tǒng)對(duì)系統(tǒng)整體性能影響約在1%以下.單項(xiàng)測(cè)試表明原型系統(tǒng)存在明顯的性能下降.但是這種下降幅度,對(duì)于進(jìn)程整體運(yùn)行而言,仍然是可以忽略的.