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