孔維亮,滕俊章,薛 猛
1(32753部隊(duì),武漢 430000) 2(78123部隊(duì),成都 610000) E-mail:qrhappy@163.com
Linux操作系統(tǒng)以頁為基本單位對(duì)用戶的內(nèi)存訪問操作進(jìn)行控制,但這種內(nèi)存訪問控制機(jī)制只能限制普通用戶,對(duì)超級(jí)用戶缺乏嚴(yán)格的約束.在Linux操作系統(tǒng)中,超級(jí)用戶擁有最高權(quán)限,能夠?qū)ο到y(tǒng)中的所有資源進(jìn)行管理,因此,當(dāng)惡意進(jìn)程獲取了系統(tǒng)最高權(quán)限,就可以控制系統(tǒng)資源并進(jìn)行惡意操作.同時(shí),可加載內(nèi)核模塊(Loadable Kernel Module,LKM)機(jī)制的存在使Linux系統(tǒng)具有良好的擴(kuò)展性,但其作為內(nèi)核的一部分,擁有最高權(quán)限,可以通過對(duì)內(nèi)存地址中的代碼和數(shù)據(jù)進(jìn)行修改實(shí)現(xiàn)惡意功能.
針對(duì)上述兩種Linux系統(tǒng)的不安全因素,目前已經(jīng)提出多種針對(duì)Linux內(nèi)存的保護(hù)機(jī)制和方法.文獻(xiàn)[1]提出3種內(nèi)存保護(hù)模型:客戶/服務(wù)器模型、進(jìn)程/線程模型和服務(wù)體/執(zhí)行流模型,這3種模型通過修改內(nèi)存保護(hù)機(jī)制實(shí)現(xiàn)內(nèi)存空間隔離,從而保護(hù)內(nèi)存數(shù)據(jù).文獻(xiàn)[2]針對(duì)保護(hù)內(nèi)存中的敏感數(shù)據(jù)問題,通過修改操作系統(tǒng)內(nèi)核,改變進(jìn)程虛擬地址和物理地址的映射關(guān)系,使包含敏感數(shù)據(jù)的頁面只在處理器訪問時(shí)才出現(xiàn)在進(jìn)程地址空間,減少敏感數(shù)據(jù)暴露時(shí)間,增加攻擊者窺視用戶敏感數(shù)據(jù)的困難.文獻(xiàn)[3]在解決利用動(dòng)態(tài)隨機(jī)存取內(nèi)存的Rowhammer攻擊方面,實(shí)現(xiàn)了一套在虛擬機(jī)監(jiān)視器層面的Rowhammer感知的內(nèi)存分配機(jī)制,能夠在虛擬機(jī)監(jiān)視器層面以虛擬機(jī)的粒度進(jìn)行Rowhammer攻擊的隔離防護(hù),但該方法針對(duì)從虛擬機(jī)內(nèi)部發(fā)出的攻擊,防御效果不是很好.文獻(xiàn)[4]利用硬件虛擬化技術(shù)保護(hù)應(yīng)用程序,但都需要通過修改操作系統(tǒng)內(nèi)核或應(yīng)用程序?qū)崿F(xiàn)保護(hù)功能,透明性不高.文獻(xiàn)[5]針對(duì)代碼復(fù)用攻擊,將目標(biāo)進(jìn)程的代碼頁設(shè)置可執(zhí)行不可讀,使代碼可以被處理器正常執(zhí)行,但在讀操作時(shí)根據(jù)被讀物理頁面的存儲(chǔ)內(nèi)容對(duì)讀操作進(jìn)行訪問控制,從而阻止攻擊者利用信息泄露漏洞惡意讀進(jìn)程代碼頁的方法搜索gadgets,但該方法需要逐條分析被讀物理頁面的內(nèi)容,效率較為低下.文獻(xiàn)[6]通過修改現(xiàn)有的CPU架構(gòu)實(shí)現(xiàn)保護(hù)應(yīng)用程序在物理內(nèi)存中的隱私數(shù)據(jù)和功能代碼,但該方法對(duì)特殊的硬件架構(gòu)依賴性高,通用性不高.文獻(xiàn)[7]依據(jù)協(xié)同認(rèn)證的思想,在內(nèi)存中加入一種具有計(jì)算功能的硬件部件,由處理器與該部件協(xié)同完成內(nèi)存數(shù)據(jù)完整性校驗(yàn),實(shí)現(xiàn)一種附加硬件的內(nèi)存完整性保護(hù)方法.文獻(xiàn)[8]針對(duì)內(nèi)存泄漏攻擊,通過修改應(yīng)用程序,將秘鑰等敏感數(shù)據(jù)從內(nèi)存轉(zhuǎn)移到CPU的寄存器中,寄存器的數(shù)量和容量導(dǎo)致該方法不能適用于敏感數(shù)據(jù)量比較大的場(chǎng)景.
在隔離物理內(nèi)存方面,文獻(xiàn)[9]提出內(nèi)存隔離方案,能夠提供通過編譯器自動(dòng)修改程序代碼,隔離敏感數(shù)據(jù)與普通數(shù)據(jù),能夠達(dá)到細(xì)粒度(以內(nèi)存區(qū)域?yàn)榱6?的保護(hù),該方法增加的了程序運(yùn)行前編譯器的負(fù)擔(dān),針對(duì)大型程序,運(yùn)行時(shí)間成本比較高.文獻(xiàn)[10]利用虛擬機(jī)監(jiān)控器的NPT地址轉(zhuǎn)換機(jī)制,為被保護(hù)應(yīng)用程序建立一個(gè)新的NPT頁表,并將新NPT頁表中的其他應(yīng)用程序和操作系統(tǒng)內(nèi)核頁表項(xiàng)設(shè)置為不存在,將原來NPT頁表中被保護(hù)應(yīng)用程序頁表項(xiàng)設(shè)置為不存在,從而實(shí)現(xiàn)對(duì)保護(hù)應(yīng)用程序的物理內(nèi)存進(jìn)行隔離的目的,但當(dāng)應(yīng)用程序占用的物理內(nèi)存空間過于龐大時(shí),遍歷被保護(hù)應(yīng)用程序的物理內(nèi)存會(huì)嚴(yán)重降低系統(tǒng)性能.
針對(duì)上述利用虛擬化技術(shù)實(shí)現(xiàn)內(nèi)存訪問控制方法和物理內(nèi)存隔離方法中存在的缺點(diǎn),本文提出一種利用Intel VT的EPT機(jī)制隱藏應(yīng)用程序進(jìn)程物理內(nèi)存的方法,實(shí)現(xiàn)對(duì)內(nèi)存數(shù)據(jù)和代碼的保護(hù).該方法分3個(gè)階段:1)實(shí)時(shí)監(jiān)控進(jìn)程切換,進(jìn)程級(jí)粒度跟蹤所有進(jìn)程對(duì)內(nèi)存的訪問操作;2)采用高效的Hash算法對(duì)被保護(hù)應(yīng)用程序的物理內(nèi)存實(shí)現(xiàn)動(dòng)態(tài)隔離和訪問驗(yàn)證;3)設(shè)置EPT頁表項(xiàng)訪問屬性實(shí)現(xiàn)物理內(nèi)存訪問控制.根據(jù)上述3個(gè)實(shí)現(xiàn)過程,本文設(shè)計(jì)了物理內(nèi)存隱藏原型PMM,并在Intel平臺(tái)上對(duì)原型系統(tǒng)進(jìn)行了測(cè)試驗(yàn)證,實(shí)驗(yàn)結(jié)果表明,該方法能夠隱藏被保護(hù)的應(yīng)用程序訪問的物理內(nèi)存,并且引入較少的系統(tǒng)性能開銷.
EPT(Extend Page Table,擴(kuò)展頁表)是Intel在VT-x技術(shù)基礎(chǔ)上增加的一種硬件輔助內(nèi)存虛擬化技術(shù)(1)https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html.在處理器端,VMX架構(gòu)通過引入EPT機(jī)制來實(shí)現(xiàn)VM物理地址空間的隔離.當(dāng)客戶機(jī)通過指令訪問內(nèi)存時(shí),首先,客戶機(jī)操作系統(tǒng)通過分頁機(jī)制將線性地址(linear address)轉(zhuǎn)換為客戶機(jī)物理地址GPA(Guest-Physical Address),然后,通過定義在VMM中EPT頁表將GPA轉(zhuǎn)換為主機(jī)物理地址HPA(Host-Physical Address),從而訪問真正的物理地址.
客戶機(jī)應(yīng)用程序通過線性地址訪問物理內(nèi)存,當(dāng)虛擬機(jī)監(jiān)控器開啟EPT機(jī)制并建立相應(yīng)的EPT頁表結(jié)構(gòu)后,線性地址到HPA的轉(zhuǎn)換如圖1所示,以Linux操作系統(tǒng)二級(jí)頁表結(jié)構(gòu)進(jìn)行地址轉(zhuǎn)換為例,其中CR3中保存的是客戶頁目錄表的物理內(nèi)存基地址,頁目錄中的頁目錄項(xiàng)保存的是客戶頁表的物理地址,頁表中的頁表項(xiàng)保存的是客戶物理地址GPA的高位部分.
圖1 線性地址到HPA的轉(zhuǎn)換Fig.1 Linear address translates to HPA
上述整個(gè)轉(zhuǎn)換過程需要進(jìn)行3次EPT地址轉(zhuǎn)換,而一次EPT地址轉(zhuǎn)換需要經(jīng)過4次頁表轉(zhuǎn)換.
系統(tǒng)進(jìn)程或內(nèi)核模塊實(shí)現(xiàn)惡意功能的關(guān)鍵在于修改內(nèi)存中的代碼或數(shù)據(jù),本文結(jié)合惡意代碼的該種攻擊特點(diǎn),并針對(duì)上述內(nèi)存保護(hù)方法中存在的缺點(diǎn),提出了一種利用EPT的動(dòng)態(tài)物理內(nèi)存隱藏方法.
如圖2所示,基于EPT機(jī)制實(shí)現(xiàn)的物理內(nèi)存隱藏原型系統(tǒng)框架涉及到計(jì)算機(jī)系統(tǒng)的應(yīng)用層、虛擬層和硬件層.應(yīng)用層的通信模塊負(fù)責(zé)與PMM進(jìn)行交互,包括啟動(dòng)PMM對(duì)被保護(hù)應(yīng)用程序的物理內(nèi)存進(jìn)行隱藏,以及顯示PMM的監(jiān)控信息和異常信息.本文通過執(zhí)行VMCALL指令傳遞相應(yīng)參數(shù)開啟PMM的物理內(nèi)存隱藏功能.當(dāng)執(zhí)行VMCALL指令時(shí),觸發(fā)VM exit,陷入PMM,在PMM中判斷VM exit事件類型,如果是VMCALL指令,當(dāng)傳遞的參數(shù)與預(yù)先設(shè)置的參數(shù)匹配時(shí),則啟動(dòng)PMM的物理內(nèi)存隱藏功能.PMM中的3個(gè)組件是該系統(tǒng)框架的核心,該部分在輕量級(jí)虛擬機(jī)監(jiān)控器BitVisor1.4框架上實(shí)現(xiàn),包括系統(tǒng)進(jìn)程監(jiān)控模塊,GPA地址隔離與訪問驗(yàn)證模塊和EPT物理頁屬性設(shè)置模塊,其中系統(tǒng)進(jìn)程監(jiān)控模塊實(shí)現(xiàn)對(duì)系統(tǒng)進(jìn)程切換的實(shí)時(shí)監(jiān)控,并獲取進(jìn)程信息.GPA地址隔離與訪問驗(yàn)證模塊利用Hash算法對(duì)被保護(hù)應(yīng)用程序的物理內(nèi)存進(jìn)行動(dòng)態(tài)隔離,并在訪問過程中進(jìn)行訪問驗(yàn)證,該模塊是實(shí)現(xiàn)物理內(nèi)存隱藏保護(hù)的關(guān)鍵.EPT物理頁屬性設(shè)置模塊通過對(duì)EPT頁表屬性的切換實(shí)現(xiàn)對(duì)物理頁的訪問控制.具體的設(shè)計(jì)及實(shí)現(xiàn)細(xì)節(jié)見下文.
圖2 物理內(nèi)存隱藏原型系統(tǒng)框架Fig.2 Physical memory hiding prototype system
進(jìn)程是應(yīng)用程序的執(zhí)行實(shí)體,實(shí)現(xiàn)對(duì)進(jìn)程切換的監(jiān)控是獲取應(yīng)用程序訪問的物理內(nèi)存的前提.文獻(xiàn)[11]將寄存器CR3的更新操作作為系統(tǒng)進(jìn)程切換的監(jiān)控點(diǎn),因?yàn)橄到y(tǒng)的每個(gè)進(jìn)程在發(fā)生切換時(shí)都會(huì)將CR3更新為自己頁目錄表的物理內(nèi)存基地址.但高版本的Linux為了提高進(jìn)程切換的效率,在切換進(jìn)程時(shí),如果即將轉(zhuǎn)入執(zhí)行狀態(tài)的進(jìn)程的頁目錄表的物理內(nèi)存基地址與上一個(gè)進(jìn)程的不同,才會(huì)更新CR3,當(dāng)兩個(gè)進(jìn)程共用同一塊物理內(nèi)存時(shí),基地址相同,不需要更新CR3,所以監(jiān)控CR3的更新操作不能獲取全部進(jìn)程信息.
本文通過分析與進(jìn)程上下文切換相關(guān)的內(nèi)核函數(shù)_switch_to發(fā)現(xiàn),當(dāng)該函數(shù)實(shí)現(xiàn)的上下文切換過程完成對(duì)thread_info的更新操作后,會(huì)執(zhí)行一個(gè)CLTS指令清除CR0進(jìn)程切換標(biāo)志位—TS,而此時(shí)獲得的進(jìn)程就是即將轉(zhuǎn)入執(zhí)行狀態(tài)的進(jìn)程,而且每個(gè)進(jìn)程切換都會(huì)執(zhí)行該操作,同時(shí)CLTS指令的執(zhí)行能夠被PMM監(jiān)控到,因此本文將CLTS指令的執(zhí)行作為進(jìn)程切換的監(jiān)控點(diǎn).而thread_info與內(nèi)核堆棧stack以及進(jìn)程描述符task_struct的結(jié)構(gòu)關(guān)系如圖3所示,thread_info與內(nèi)核堆棧stack共用一塊大小為THREAD_SIZE內(nèi)存,因此可以通過內(nèi)核堆棧棧頂指針esp的值和THREAD_SIZE的值確定thread_info的位置,由thread_info定義可知,thread_info的起始地址即為當(dāng)前執(zhí)行進(jìn)程的進(jìn)程描述符task_struct的首地址,然后根據(jù)task_struct變量的偏移值可以獲取當(dāng)前執(zhí)行進(jìn)程的詳細(xì)信息.
圖3 thread_info與task_struct關(guān)系Fig.3 Relation of thread_info and task_struct
通過上述對(duì)系統(tǒng)進(jìn)程監(jiān)控的實(shí)現(xiàn),能夠獲取被保護(hù)進(jìn)程的詳細(xì)信息,包括進(jìn)程名(comm),進(jìn)程號(hào)(pid)以及進(jìn)程描述符task_struct的物理地址(task_struct),由該信息可以唯一定位一個(gè)系統(tǒng)進(jìn)程,從而能夠準(zhǔn)確獲取該進(jìn)程物理內(nèi)存信息.
本文實(shí)現(xiàn)的方法基于Intel VT的EPT機(jī)制,沒有修改系統(tǒng)的內(nèi)存管理結(jié)構(gòu)以及增加新的頁表映射機(jī)制,而是在GPA轉(zhuǎn)換為HPA之前增加了對(duì)被保護(hù)應(yīng)用程序的GPA地址進(jìn)行隔離和訪問驗(yàn)證.通過動(dòng)態(tài)Hash映射機(jī)制,實(shí)現(xiàn)對(duì)被保護(hù)應(yīng)用程序物理內(nèi)存的動(dòng)態(tài)隔離,并通過檢測(cè)系統(tǒng)進(jìn)程訪問的GPA是否被Hash實(shí)現(xiàn)對(duì)物理內(nèi)存的訪問驗(yàn)證.
當(dāng)客戶機(jī)應(yīng)用程序首次訪問物理內(nèi)存空間時(shí),由于EPT對(duì)應(yīng)的頁表項(xiàng)不存在,會(huì)引起EPT violation,產(chǎn)生VM exit,陷入虛擬機(jī)監(jiān)控器,EPT機(jī)制會(huì)為GPA分配物理內(nèi)存HPA,并根據(jù)頁屬性建立相應(yīng)的EPT頁表項(xiàng).本文通過系統(tǒng)進(jìn)程監(jiān)控模塊獲取的進(jìn)程信息判斷GPA的所屬進(jìn)程,將被保護(hù)應(yīng)用程序的GPA與其他GPA進(jìn)行分離.在Linux系統(tǒng)中,一個(gè)應(yīng)用程序的正常執(zhí)行通常需要大量的物理內(nèi)存空間,因此采用一種可以動(dòng)態(tài)匹配、快速查找的方式對(duì)物理內(nèi)存地址進(jìn)行組織是降低系統(tǒng)負(fù)載的關(guān)鍵,這種要求正好符合Hash算法的特點(diǎn).而實(shí)現(xiàn)Hash算法的關(guān)鍵在于設(shè)計(jì)一個(gè)能夠避免沖突、均勻分配關(guān)鍵字、計(jì)算簡(jiǎn)單的散列函數(shù).本文設(shè)計(jì)了一種動(dòng)態(tài)擴(kuò)展Hash算法,能夠?qū)崿F(xiàn)動(dòng)態(tài)擴(kuò)展Hash表上限,為此,我們以ReHash()的方式對(duì)HashTableSize按素?cái)?shù)長(zhǎng)度進(jìn)行擴(kuò)展,然后,針對(duì)一個(gè)GPA采用3次Hash映射,降低Hash沖突.該算法包括初始化Hash表,動(dòng)態(tài)擴(kuò)展Hash表,Hash一個(gè)GPA,檢測(cè)一個(gè)GPA是否被Hash等功能函數(shù),算法如下.
算法1.將當(dāng)前進(jìn)程訪問的GPA映射到Hash表
輸入:Hash表HashTable[],當(dāng)前進(jìn)程訪問的GPA
輸出:當(dāng)前進(jìn)程訪問的GPA是否被Hash,被hash返回1,否則返回0;
1. InitHashTable();
2. if(GPA)
3. {
4. If(TableUsed >=HashTableSize)
5. Rehash();
6. If(Hashed(GPA)==0)
7. return Hash(GPA);
8. else
9. return 1;
10.}
由于該算法能夠?qū)崿F(xiàn)動(dòng)態(tài)擴(kuò)展Hash表,所以實(shí)驗(yàn)中被Hash的GPA個(gè)數(shù)小于或者等于Hash數(shù)組的上限.結(jié)合實(shí)際情況,我們證明通過3次Hash,產(chǎn)生Hash沖突的概率在可接受的范圍之內(nèi).可設(shè)應(yīng)用程序被Hash的GPA個(gè)數(shù)為n,GPA的集合為G,任何一個(gè)GPA為g,且滿足g∈G,Hash表的上限為m,Hash數(shù)組集合為M,M可對(duì)應(yīng)一個(gè)1行m列的矩陣A=[1,2,3,…,m],且總是滿足n≤m,Hash次數(shù)為q.我們證明當(dāng)q=3時(shí),通過該算法能夠?qū)ash沖突降到可接受的范圍內(nèi).
可得推導(dǎo)結(jié)果,由于m≤m2≤m3,因此,當(dāng)q=3,對(duì)每一個(gè)GPA執(zhí)行3次Hash,所有GPA產(chǎn)生沖突的概率最小,并且,在實(shí)際情況下當(dāng)q=3時(shí),沒有產(chǎn)生沖突的情況,能夠滿足實(shí)際需求.
當(dāng)應(yīng)用程序訪問主機(jī)物理內(nèi)存HPA時(shí),如果EPT頁表項(xiàng)的訪問屬性位bit2:0全為0、readable位為0、writeable位為0或executable位為0,能夠引起EPT violation,并產(chǎn)生VM exit.因此,可以通過設(shè)置對(duì)應(yīng)的EPT 頁表項(xiàng)的屬性位,實(shí)現(xiàn)對(duì)物理內(nèi)存的訪問控制.
實(shí)現(xiàn)流程如圖4所示,當(dāng)PMM監(jiān)控到被保護(hù)應(yīng)用程序的執(zhí)行進(jìn)程發(fā)生切換時(shí),當(dāng)應(yīng)用程序第一次訪問物理內(nèi)存時(shí),對(duì)應(yīng)的EPT頁表項(xiàng)不存在,會(huì)引起EPT violation,并且發(fā)生VM exit陷入PMM.此時(shí),首先由GPA地址隔離與訪問驗(yàn)證模塊對(duì)當(dāng)前的GPA進(jìn)行Hash,并建立對(duì)應(yīng)的EPT頁表項(xiàng),同時(shí)設(shè)置EPT頁表項(xiàng)屬性為readable,使任何進(jìn)程對(duì)被Hash過的GPA對(duì)應(yīng)的HPA進(jìn)行訪問都會(huì)產(chǎn)生一個(gè)EPT violation,并由PMM處理這次訪問事件.
圖4 物理內(nèi)存訪問控制實(shí)現(xiàn)流程Fig.4 Realization of physical memory access control
再次出現(xiàn)進(jìn)程訪問主機(jī)物理內(nèi)存時(shí),首先判斷該進(jìn)程是否為被保護(hù)應(yīng)用程序的執(zhí)行進(jìn)程,若是,則判斷當(dāng)前訪問的GPA是否被Hash,若沒有被Hash,則進(jìn)行Hash,并建立對(duì)應(yīng)的EPT頁表項(xiàng),同時(shí)設(shè)置EPT頁表項(xiàng)屬性為readable,若已經(jīng)被Hash映射,則修改當(dāng)前的對(duì)應(yīng)的EPT頁表屬性為可讀、可寫、可執(zhí)行,允許被保護(hù)應(yīng)用程序的執(zhí)行進(jìn)程訪問主機(jī)物理內(nèi)存.此時(shí),我們通過程序指令級(jí)監(jiān)控實(shí)現(xiàn)這個(gè)訪存過程.指令級(jí)監(jiān)控是利用EFLAGS寄存器的TF(Trap Flag)標(biāo)志位實(shí)現(xiàn),TF標(biāo)志位是進(jìn)程的跟蹤標(biāo)志位,用來控制CPU在單步調(diào)試模式下執(zhí)行一條指令,當(dāng)TF標(biāo)志位被設(shè)置為1時(shí),當(dāng)前指令執(zhí)行后會(huì)產(chǎn)生一個(gè)中斷,當(dāng)TF標(biāo)志位被設(shè)置為0時(shí),當(dāng)前指令執(zhí)行后不會(huì)產(chǎn)生中斷.因此當(dāng)被保護(hù)應(yīng)用程序的執(zhí)行進(jìn)程訪問已經(jīng)被Hash過的GPA時(shí),在PMM中將該進(jìn)程EFLAGS標(biāo)志寄存器的TF標(biāo)志位設(shè)置為1,然后執(zhí)行VMRESUME返回客戶機(jī)執(zhí)行內(nèi)存訪問操作,保證在客戶機(jī)應(yīng)用程序執(zhí)行完訪問物理內(nèi)存的指令后再次產(chǎn)生VM exit,陷入PMM,然后將剛被訪問過的物理內(nèi)存對(duì)應(yīng)的EPT頁表項(xiàng)屬性設(shè)置為readable,保證下次對(duì)該物理內(nèi)存進(jìn)行訪問時(shí)仍能夠產(chǎn)生EPT violation;若當(dāng)前的訪問進(jìn)程不是被保護(hù)應(yīng)用程序的執(zhí)行進(jìn)程,也要先判斷當(dāng)前被訪問的GPA是否被Hash,若是,則表示當(dāng)前進(jìn)程正在訪問被保護(hù)應(yīng)用程序的GPA,為了阻止該訪問,本文的解決方法是通過執(zhí)行add_ip()函數(shù)跳過該訪存指令;若不是,則允許訪問.
本文對(duì)原型系統(tǒng)PMM功能和性能兩個(gè)方面進(jìn)行了測(cè)試.功能測(cè)試主要根據(jù)物理內(nèi)存隱藏方法實(shí)現(xiàn)原理檢測(cè)該方法能否對(duì)被保護(hù)應(yīng)用程序的物理內(nèi)存實(shí)現(xiàn)隱藏功能,即利用本文方法實(shí)現(xiàn)對(duì)被保護(hù)應(yīng)用GPA的動(dòng)態(tài)隔離和訪問驗(yàn)證.性能測(cè)試用于測(cè)試在利用該方法隱藏被保護(hù)應(yīng)用程序的物理內(nèi)存時(shí),PMM引入的監(jiān)控開銷,實(shí)驗(yàn)環(huán)境如下:客戶機(jī)為Intel(R)Core(TM)i7-3770 @3.4GHz處理器,16GB內(nèi)存,Ubuntu-12.04LTS64位操作系統(tǒng),內(nèi)核版本號(hào)為L(zhǎng)inux 3.2.0-29-generic,虛擬機(jī)監(jiān)控器為BitVisor1.4.
功能測(cè)試主要包括3個(gè)功能模塊測(cè)試:1)監(jiān)控系統(tǒng)進(jìn)程切換,獲取被保護(hù)應(yīng)用程序的執(zhí)行進(jìn)程信息,在這里假設(shè)被保護(hù)的應(yīng)用程序是一個(gè)腳本程序start.sh,執(zhí)行進(jìn)程對(duì)應(yīng)一個(gè)守護(hù)進(jìn)程;2)利用本文設(shè)計(jì)的Hash算法動(dòng)態(tài)隔離被保護(hù)應(yīng)用程序的GPA,并進(jìn)行訪問驗(yàn)證;3)阻止非法進(jìn)程非法訪問被保護(hù)應(yīng)用程序的物理內(nèi)存地址.
4.1.1 監(jiān)控系統(tǒng)進(jìn)程
監(jiān)控系統(tǒng)進(jìn)程,主要用來獲取被保護(hù)應(yīng)用程序start.sh的執(zhí)行進(jìn)程信息,通過與在應(yīng)用層執(zhí)行“ps-e |grep start.sh”獲取到的進(jìn)程信息進(jìn)行對(duì)比,測(cè)試在PMM中監(jiān)控到的目標(biāo)進(jìn)程的準(zhǔn)確性,實(shí)驗(yàn)結(jié)果如圖5所示.
圖5 目標(biāo)進(jìn)程的關(guān)鍵信息Fig.5 Key information of target process
4.1.2 動(dòng)態(tài)隔離與訪問驗(yàn)證
應(yīng)用程序執(zhí)行后首次訪問物理內(nèi)存時(shí),由于EPT頁表中沒有對(duì)應(yīng)的EPT頁表項(xiàng),會(huì)引發(fā)EPT violation,同時(shí)產(chǎn)生VM exit陷入PMM.此時(shí),PMM中的GPA動(dòng)態(tài)隔離與訪問驗(yàn)證模塊對(duì)被保護(hù)應(yīng)用程序的GPA利用Hash算法進(jìn)行動(dòng)態(tài)隔離,并設(shè)置對(duì)應(yīng)的EPT頁表項(xiàng)屬性為readable,實(shí)驗(yàn)結(jié)果如圖6所示.
圖6 利用Hash算法對(duì)GPA進(jìn)行動(dòng)態(tài)隔離Fig.6 Hash algorithm dynamic isolate GPA
當(dāng)被保護(hù)應(yīng)用程序訪問已經(jīng)被Hash的物理內(nèi)存時(shí),由于被Hash的物理內(nèi)存對(duì)應(yīng)的EPT頁表項(xiàng)已經(jīng)被設(shè)置為readable,因此,同樣會(huì)引發(fā)EPT violation,陷入PMM.此時(shí),首先設(shè)置EFLAGS的TF位,并通過執(zhí)行VMRESUME命令實(shí)現(xiàn)單步訪存操作,訪存結(jié)束后再次陷入PMM,重新設(shè)置剛被訪問過的GPA對(duì)應(yīng)的EPT頁表項(xiàng)屬性為readable.而其他進(jìn)程能夠通過兩種方式對(duì)被保護(hù)應(yīng)用程序的物理內(nèi)存進(jìn)行非法訪問:第1種是獲取root權(quán)限,以特權(quán)進(jìn)程的方式直接訪問被保護(hù)應(yīng)用程序的物理內(nèi)存,第2種是通過操作系統(tǒng)漏洞,將被保護(hù)應(yīng)用程序的物理內(nèi)存映射到其他進(jìn)程的物理地址空間,從而以任意權(quán)限訪問被保護(hù)應(yīng)用程序的物理內(nèi)存,針對(duì)這兩種方式,本文提出的方法首先判斷當(dāng)前的訪問進(jìn)程,然后判斷當(dāng)前進(jìn)程訪問的GPA,如果該GPA已經(jīng)被Hash過,但是當(dāng)前進(jìn)程不是被保護(hù)應(yīng)用程序的執(zhí)行進(jìn)程,則跳過該訪存操作.因此,本文提出的方法能夠有效隱藏被保護(hù)應(yīng)用程序的物理內(nèi)存,防止其他應(yīng)用程序的非法訪問.
本文方法主要在兩個(gè)方面會(huì)產(chǎn)生額外的系統(tǒng)開銷:首先是利用該方法對(duì)每個(gè)系統(tǒng)進(jìn)程訪問的物理內(nèi)存地址都需要進(jìn)行Hash判斷.當(dāng)系統(tǒng)進(jìn)程是被保護(hù)應(yīng)用程序的執(zhí)行進(jìn)程時(shí),還需要對(duì)未被Hash的GPA進(jìn)行Hash,其次,如果當(dāng)前系統(tǒng)進(jìn)程是被保護(hù)應(yīng)用程序的執(zhí)行進(jìn)程或者是其他進(jìn)程時(shí),當(dāng)被訪問的物理內(nèi)存地址已經(jīng)被Hash,還需要對(duì)GPA對(duì)應(yīng)的EPT頁表項(xiàng)屬性進(jìn)行相應(yīng)設(shè)置,保證物理內(nèi)存被安全訪問,同時(shí)這兩個(gè)方面會(huì)引起VM exit和VM enrty的發(fā)生.測(cè)試中使用lmbench3.0分別測(cè)試了原操作系統(tǒng)(Phys)和加載PMM后的操作系統(tǒng)(PMM)的在系統(tǒng)調(diào)用(null call)、I/O操作(null I/O)、信號(hào)處理(sig inst和sig hndl)、進(jìn)程相關(guān)處理(fork、execve、ctxsw)、物理頁處理(Prot Fault和Page Fault)、物理內(nèi)存訪問(Mem read,Mem write和Rand mem)以及文件操作(File create和File delete)等方面的性能,測(cè)試結(jié)果如圖7所示,圖中所有測(cè)試結(jié)果單位均為us,柱狀條越高,說明帶來的性能開銷越大.
根據(jù)測(cè)試結(jié)果可知,由于PMM未對(duì)系統(tǒng)調(diào)用(NULL Call)、I/O操作(NULL I/O)及信號(hào)處理(Sig Inst和Sig Hndl)進(jìn)行陷入和監(jiān)控,均直接交由處理器執(zhí)行,因此開啟PMM后上述幾點(diǎn)均未引入額外開銷.由于PMM開啟了對(duì)系統(tǒng)進(jìn)程的實(shí)時(shí)監(jiān)控,因此與進(jìn)程切換相關(guān)的開銷,如fork進(jìn)程后再退出(Fork Porc)、執(zhí)行execve后再退出(Exec Proc)和進(jìn)程上下文切換過程(Ctxsw)等開銷有所增加.由于本文利用EPT機(jī)制實(shí)現(xiàn)對(duì)被保護(hù)應(yīng)用程序訪問的物理內(nèi)存進(jìn)行訪問控制,會(huì)涉及到頁表屬性設(shè)置以及缺頁情況的處理,因此在頁保護(hù)屬性設(shè)置(Prot Fault)和缺頁處理(Page Fault)等開銷會(huì)有所增加.
圖7性能測(cè)試結(jié)果Fig.7 Performance test result
除此之外,為了更加清楚的說明利用EPT機(jī)制實(shí)現(xiàn)對(duì)物理內(nèi)存的訪問控制所帶來的性能開銷,該實(shí)驗(yàn)增加了讀、寫1k物理內(nèi)存時(shí)的性能測(cè)試以及物理內(nèi)存隨機(jī)訪問性能測(cè)試,測(cè)試結(jié)果表明,開啟EPT機(jī)制后執(zhí)行以上3種操作會(huì)帶來額外的性能開銷.同時(shí),當(dāng)進(jìn)程創(chuàng)建和刪除大小為1k的文件時(shí),同樣會(huì)增加系統(tǒng)性能開銷.
綜上對(duì)性能測(cè)試結(jié)果的分析,與原物理機(jī)相比,利用EPT機(jī)制實(shí)現(xiàn)對(duì)被保護(hù)應(yīng)用程序訪問的物理內(nèi)存進(jìn)行訪問控制會(huì)增加系統(tǒng)性能開銷,但增加幅度均在10%以內(nèi).
根據(jù)功能測(cè)試和性能測(cè)試結(jié)果可知,本文提出的基于EPT的物理內(nèi)存隱藏方法能夠有效的保護(hù)應(yīng)用程序訪問的物理內(nèi)存空間,并且阻止其他應(yīng)用對(duì)被隱藏物理內(nèi)存空間的非法訪問,同時(shí)該方法不影響客戶機(jī)系統(tǒng)的正常運(yùn)行,引入的系統(tǒng)開銷在可接受的范圍內(nèi).
本文首先分析了EPT內(nèi)存虛擬化機(jī)制實(shí)現(xiàn)原理,應(yīng)用程序訪問的GPA需要經(jīng)過EPT轉(zhuǎn)換為HPA才能訪問真正的物理內(nèi)存,利用這種特點(diǎn),能夠在更底層實(shí)現(xiàn)對(duì)物理內(nèi)存的訪問控制.然后,利用本文設(shè)計(jì)的Hash算法實(shí)現(xiàn)了對(duì)被保護(hù)應(yīng)用程序物理內(nèi)存的動(dòng)態(tài)隔離,同時(shí)對(duì)訪問被保護(hù)應(yīng)用程序物理內(nèi)存的進(jìn)程實(shí)現(xiàn)了訪問驗(yàn)證.最后,通過設(shè)置EPT頁表的只讀屬性位,實(shí)現(xiàn)對(duì)物理內(nèi)存的訪問控制,保證了對(duì)被保護(hù)應(yīng)用程序物理內(nèi)存的訪問能夠被PMM捕獲和阻止.實(shí)驗(yàn)結(jié)果表明,該方法能夠?qū)崿F(xiàn)上述中的各項(xiàng)功能,并且引入較小的系統(tǒng)性能開銷.