陳興蜀,陳蒙蒙,金 鑫
(四川大學(xué)計(jì)算機(jī)學(xué)院 成都 610065)
隨著云計(jì)算的發(fā)展,云平臺(tái)的安全問題成為業(yè)界關(guān)心的核心問題[1]。由于云平臺(tái)資源、信息高度集中,虛擬機(jī)的安全直接威脅著平臺(tái)的安全[2]。MITC攻擊[3]就是一種新型的云環(huán)境下利用虛擬機(jī)竊取云平臺(tái)數(shù)據(jù)的攻擊,此外還有各種勒索軟件、Cloud weaponization等均可通過虛擬機(jī)對云平臺(tái)造成攻擊,竊取租戶的數(shù)據(jù),甚至破壞整個(gè)平臺(tái)[4]。傳統(tǒng)主機(jī)面臨的安全威脅,在虛擬化環(huán)境下的虛擬機(jī)同樣存在[5]。目前針對操作系統(tǒng)的惡意軟件、病毒、rootkit層出不窮,嚴(yán)重威脅著操作系統(tǒng)的安全。進(jìn)程作為操作系統(tǒng)資源分配和代碼執(zhí)行的基本單位,一旦被攻擊,會(huì)直接威脅操作系統(tǒng)的安全[16]。因此,研究虛擬機(jī)中的進(jìn)程防護(hù)意義重大。
目前,針對虛擬機(jī)的進(jìn)程防護(hù)大部分是從全局的角度去檢測惡意進(jìn)程,缺乏針對特定進(jìn)程的防護(hù)方案。文獻(xiàn)[6]通過檢測CR3寄存器的變化攔截進(jìn)程切換動(dòng)作,在VMM中調(diào)用第三方的安全模塊對進(jìn)程進(jìn)行分析。這種方案一方面只能在惡意進(jìn)程運(yùn)行一段時(shí)間后分析出惡意進(jìn)程的存在,存在滯后性,不能針對特定進(jìn)程做防護(hù);另一方面,每次進(jìn)程切換都會(huì)發(fā)生陷入,然后傳遞信息到宿主機(jī)用戶空間進(jìn)行分析,性能損耗嚴(yán)重。文獻(xiàn)[7]通過虛擬機(jī)內(nèi)部代理驅(qū)動(dòng)設(shè)置KiFastCallEntry和KiSystemService函數(shù)中調(diào)用KiSystemServiceRepeat函數(shù)的點(diǎn)為0xFFFFFFFF,使該函數(shù)被調(diào)用的時(shí)候發(fā)生陷入,在VMM中做陷入處理分析。此方式雖然可以保護(hù)指定進(jìn)程,但是一方面存在虛擬機(jī)代理,代理本身安全無法保證;另一方面,陷入次數(shù)過于頻繁,同樣存在性能問題。文獻(xiàn)[8]通過設(shè)置SSDT(system service descriptor table)所在頁面為只讀頁面,在發(fā)生直接HOOK SSDT的時(shí)候會(huì)發(fā)生陷入,之后在VMM中做處理。文中針對的是對rootkit的檢測,且僅僅針對通過掛鉤SSDT隱藏自身這一個(gè)特征做處理,一方面關(guān)注點(diǎn)太小,另一方面也不適應(yīng)于特定進(jìn)程防護(hù)的場景。文獻(xiàn)[9-10]從全局的角度對虛擬機(jī)完整性做監(jiān)控,側(cè)重點(diǎn)不在于防護(hù)。文獻(xiàn)[11]通過攔截CR3切換動(dòng)作,在VMM中操作受保護(hù)進(jìn)程的頁表,對指定進(jìn)程內(nèi)存進(jìn)行防護(hù)。這種方式同樣存在文獻(xiàn)[6]提到的性能問題。文獻(xiàn)[12]通過構(gòu)建一個(gè)影子內(nèi)核,對所有系統(tǒng)服務(wù)重定向,可以較好對特定進(jìn)程進(jìn)行防護(hù),但是其依賴于虛擬機(jī)內(nèi)部的代理驅(qū)動(dòng),代理驅(qū)動(dòng)自身安全存在威脅。
針對以上存在的問題,本文提出一種基于影子內(nèi)存的無代理[13]虛擬機(jī)進(jìn)程防護(hù)系統(tǒng)AVMPPS(agentless process protection system based on shadow memory),并針對windows虛擬機(jī)進(jìn)行了實(shí)現(xiàn)。該系統(tǒng)通過影子內(nèi)存保證SSDT和系統(tǒng)調(diào)用執(zhí)行流的完整性,在虛擬機(jī)外部分析處理虛擬機(jī)內(nèi)部進(jìn)程敏感行為,保護(hù)虛擬機(jī)中特定進(jìn)程不被非法操作。基于本文方案無代理特性,規(guī)避了代理自身帶來的安全威脅和資源消耗。并且該方案僅對特定系統(tǒng)調(diào)用做陷入設(shè)置,減少了模式切換次數(shù),大幅減少了性能的損耗。
AVMPPS系統(tǒng)總體架構(gòu)如圖1所示。
圖1 AVMPPS系統(tǒng)結(jié)構(gòu)
AVMPPS系統(tǒng)分為4個(gè)模塊:受保護(hù)進(jìn)程管理模塊、影子內(nèi)存分配模塊、信息注入模塊和進(jìn)程行為分析處理模塊。在AVMPPS系統(tǒng)初始化階段,首先在VMM中由影子內(nèi)存分配模塊在虛擬機(jī)非換頁內(nèi)存區(qū)構(gòu)建一份純凈的影子內(nèi)存作為后續(xù)信息注入的頁面,該影子內(nèi)存位于虛擬機(jī)的非換頁內(nèi)存區(qū),頁表在虛擬機(jī)初始化內(nèi)存時(shí)已經(jīng)建立,且在虛擬機(jī)運(yùn)行期間不會(huì)被換出,可以被虛擬機(jī)直接訪問;接著由信息注入模塊向影子內(nèi)存注入信息構(gòu)建全新的SSDT和系統(tǒng)調(diào)用執(zhí)行流,其中進(jìn)程敏感行為的相關(guān)系統(tǒng)調(diào)用地址被設(shè)置成非法地址,這樣在用戶請求該系統(tǒng)調(diào)用的時(shí)候會(huì)發(fā)生取指令類型的pagefault。注入完成后在VMM中設(shè)置系統(tǒng)調(diào)用入口為新構(gòu)建的KiFastCallEntry,實(shí)現(xiàn)系統(tǒng)調(diào)用執(zhí)行流的重定向;在VM-entry之前根據(jù)VMCS結(jié)構(gòu)設(shè)置取指令類型的pagefault發(fā)生陷入,從而對進(jìn)程敏感行為做攔截處理,最后設(shè)置IA32_SYSENTER_EIP寄存器的讀寫陷入,屏蔽虛擬機(jī)中對該寄存器的讀寫行為,隱藏實(shí)際的系統(tǒng)調(diào)用入口。在AVMPPS系統(tǒng)運(yùn)行階段,當(dāng)虛擬機(jī)內(nèi)部進(jìn)程執(zhí)行敏感行為,觸發(fā)SSDT中的鉤子繼而陷入到VMM中,進(jìn)程行為分析處理模塊處理該陷入,根據(jù)受保護(hù)進(jìn)程鏈表對進(jìn)程敏感行為過濾,禁止受保護(hù)進(jìn)程被第三方進(jìn)程操作,保障受保護(hù)進(jìn)程的安全。受保護(hù)進(jìn)程鏈表的維護(hù)則由受保護(hù)進(jìn)程管理模塊實(shí)現(xiàn),該模塊通過超級系統(tǒng)調(diào)用機(jī)制增加、刪除、查詢當(dāng)前虛擬機(jī)的受保護(hù)進(jìn)程。
支持硬件虛擬化的CPU會(huì)提供一種特殊的操作模式即VMX操作模式,具體分為root模式和non-root模式。虛擬機(jī)運(yùn)行在non-root模式,而VMM則運(yùn)行在root模式。通過VMX快速系統(tǒng)調(diào)用指令VMCALL,CPU可以無條件的從non-root模式退出到root模式,將控制權(quán)交還給VMM[14]。
利用這一特性,在虛擬機(jī)內(nèi)部構(gòu)建用戶層工具,直接和用戶交互,完成受保護(hù)進(jìn)程信息的構(gòu)建。由于虛擬機(jī)和主機(jī)是兩個(gè)獨(dú)立的操作系統(tǒng),不能通過普通堆棧進(jìn)行參數(shù)傳遞,在用戶層工具構(gòu)建好受保護(hù)進(jìn)程結(jié)構(gòu)后,借助寄存器向VMM傳遞進(jìn)程結(jié)構(gòu)的地址,然后執(zhí)行VMCALL。VMM獲得控制權(quán)后,根據(jù)相應(yīng)寄存器中的地址,透明讀取虛擬機(jī)內(nèi)存中的進(jìn)程名稱,并構(gòu)建進(jìn)程保護(hù)結(jié)構(gòu)體,作為一個(gè)節(jié)點(diǎn)插入到受保護(hù)進(jìn)程鏈表中,鏈表頭保存在VMM中對應(yīng)虛擬機(jī)的KVM結(jié)構(gòu)體中(刪除和查詢操作類似)。整個(gè)結(jié)構(gòu)如圖2所示。
圖2 受保護(hù)進(jìn)程管理模塊架構(gòu)
構(gòu)建影子內(nèi)存需要通過分析虛擬機(jī)內(nèi)存管理架構(gòu),在VMM中按照虛擬機(jī)正常內(nèi)存分配流程,獲取一塊可用的內(nèi)存。這塊內(nèi)存需要保證3點(diǎn):
1)這塊內(nèi)存虛擬機(jī)不能已經(jīng)使用;
2)這塊內(nèi)存虛擬機(jī)以后不能被再次分配出去;
3)這塊內(nèi)存的頁表必須已經(jīng)建立,且不會(huì)被換出到外存。基于以上要求,所構(gòu)建的內(nèi)存必須位于虛擬機(jī)的非換頁內(nèi)存區(qū)。
Windows 7及其以后的系統(tǒng)采用非一致性內(nèi)存架構(gòu)NUMA(non-uniform memory access)來管理內(nèi)存。這種架構(gòu)下,每個(gè)CPU被分配屬于自己的一塊內(nèi)存稱之為local memory,處理器訪問屬于自己的local memory的速度是最快的,只有當(dāng)local memory不足的時(shí)候才會(huì)訪問其他CPU的memory。CPU通過node和內(nèi)存相關(guān)聯(lián),每個(gè)node負(fù)責(zé)管理一定的內(nèi)存區(qū),Windows對node實(shí)現(xiàn)為KNODE結(jié)構(gòu),每個(gè)KNODE管理一組內(nèi)存區(qū),包括換頁和非換頁內(nèi)存。對于非換頁內(nèi)存的管理,Windows利用空閑頁面自身,構(gòu)建了3條鏈表,根據(jù)連續(xù)頁面的數(shù)量,分為單頁面鏈表、雙頁面鏈表和多頁面鏈表。KNODE結(jié)構(gòu)中的NonPagedPoolSListHead字段保存這些鏈表頭[15-18]。
X86架構(gòu)下,IA32_SYSENTER_EIP寄存器保存系統(tǒng)調(diào)用入口函數(shù)的地址,當(dāng)該寄存器被填充時(shí)意味著系統(tǒng)調(diào)用機(jī)制開始啟用。同時(shí),這也是構(gòu)建影子內(nèi)存的時(shí)間點(diǎn),此時(shí)系統(tǒng)核心部分初始化剛剛完畢,驅(qū)動(dòng)和應(yīng)用程序尚未加載,可以保證在系統(tǒng)調(diào)用機(jī)制啟用之前完成系統(tǒng)調(diào)用流的重定向。在Windows虛擬機(jī)中,當(dāng)CPU運(yùn)行在內(nèi)核模式時(shí),F(xiàn)S寄存器指向處理器全局結(jié)構(gòu)KPCR,在KPCR結(jié)構(gòu)的0x5ec偏移處,保存當(dāng)前處理器的KNODE結(jié)構(gòu)。KNODE結(jié)構(gòu)中保存有節(jié)點(diǎn)關(guān)聯(lián)的非換頁內(nèi)存頁鏈表表頭NonPagedPoolSListHead數(shù)組。鏈表通過MMFREE_POOL_ENTRY結(jié)構(gòu)連接各個(gè)非換頁內(nèi)存頁面,該結(jié)構(gòu)位于頁面的頭部,結(jié)構(gòu)的地址就是非換頁內(nèi)存頁的地址。需要注意的是獲取操作對于虛擬機(jī)要保持透明,因此要使表頭指針_SLIST_HEADER指向鏈表第二個(gè)頁面,以保證本次獲取的頁面之后不會(huì)被系統(tǒng)再次分配。鏈表操作結(jié)構(gòu)如圖3所示。
圖3 非換頁內(nèi)存頁鏈表結(jié)構(gòu)
該模塊存位于VMM中,在影子內(nèi)存中構(gòu)建全新的SSDT和系統(tǒng)調(diào)用執(zhí)行流。注入信息在影子內(nèi)存中的結(jié)構(gòu)安排如圖4所示。
圖4 影子內(nèi)存組織結(jié)構(gòu)
虛擬機(jī)通過一個(gè)全局的SSDT控制結(jié)構(gòu)KeServiceDescriptorTable操作SSDT,為了保障新的SSDT的隱蔽性,KeServiceDescriptorTable結(jié)構(gòu)需要重新構(gòu)造。且為了對虛擬機(jī)產(chǎn)生盡可能小的影響,這里僅僅設(shè)置結(jié)構(gòu)中的ssdt指針,其他的不做修改。
在線程結(jié)構(gòu)Kthread中有個(gè)ServiceTable字段,記錄其適用的SSDT。若當(dāng)前線程是GUI線程,則ServiceTable指向KeServiceDescriptorTableShadow,否則指向KeServiceDescriptorTable。在AVMPPS系統(tǒng)部署時(shí),還是內(nèi)核初始化階段,當(dāng)前線程必定指向KeServiceDescriptorTable。根據(jù)此結(jié)構(gòu),讀取虛擬機(jī)內(nèi)部實(shí)際的SSDT內(nèi)容,按照順序?qū)懭氲接白觾?nèi)存中。為了區(qū)分,在KeServiceDescriptorTable結(jié)構(gòu)和具體SSDT之間放置4個(gè)字節(jié)做隔離。
1)系統(tǒng)調(diào)用分發(fā)函數(shù)構(gòu)建
如圖1所示,IA32_SYSENTER_EIP寄存器保存有系統(tǒng)調(diào)用入口函數(shù)的地址,在VMM中通過該寄存器即可獲取系統(tǒng)調(diào)用入口函數(shù)的地址。這里不需要構(gòu)建完整的函數(shù),只需要保證具體系統(tǒng)調(diào)用被執(zhí)行之前的代碼的完整性即可。在Windows下從函數(shù)開始到具體call指令執(zhí)行,包含159個(gè)字節(jié),寫入影子內(nèi)存的正是這159個(gè)字節(jié),在call指令執(zhí)行后,要使執(zhí)行流轉(zhuǎn)回到原始的分發(fā)函數(shù)中。
2)SSDT重定向
原始的系統(tǒng)調(diào)用入口函數(shù)引用的是指向原始SSDT的控制結(jié)構(gòu)KeServiceDescriptorTable,要讓影子內(nèi)存中的調(diào)用函數(shù)使用新的SSDT,需要對函數(shù)調(diào)用SSDT的時(shí)候進(jìn)行重定向。
由于AVMPPS系統(tǒng)未在虛擬機(jī)內(nèi)部安裝任何代理軟件,只能在VMM層根據(jù)函數(shù)結(jié)構(gòu),在適當(dāng)?shù)奈恢米⑷胩D(zhuǎn)代碼。由于GUI線程和普通線程使用同一套系統(tǒng)調(diào)用機(jī)制,而GUI線程使用的是KeServiceDescriptorTableShadow,故需要添加驗(yàn)證邏輯。礙于字節(jié)數(shù)的限制,本方案借助二級跳轉(zhuǎn)機(jī)制,構(gòu)建兩塊內(nèi)存分別用于邏輯驗(yàn)證與SSDT地址設(shè)置。這里所有的代碼均位于影子內(nèi)存中,未對原始函數(shù)做任何修改,有效避免了惡意程序?qū)瘮?shù)進(jìn)行溯源。具體的執(zhí)行流如圖5所示。
內(nèi)核空間對系統(tǒng)調(diào)用的使用是通過ZW*函數(shù)實(shí)現(xiàn)的。最終會(huì)調(diào)用KiSystemService函數(shù),該函數(shù)并不直接使用KeServiceDescriptorTable,而是在中途跳轉(zhuǎn)到了KiFastCallentry函數(shù)的指定位置,故這里要對KiSysemService函數(shù)進(jìn)行深度內(nèi)聯(lián),讓其跳轉(zhuǎn)到前面構(gòu)造的新KiFastCallentry函數(shù)。為了增強(qiáng)跳轉(zhuǎn)模塊的隱蔽性,AVMPPS系統(tǒng)在原始函數(shù)JMP指令的前面4個(gè)字節(jié)執(zhí)行掛鉤,整個(gè)跳轉(zhuǎn)邏輯如圖6所示。
圖5 KiFastCallEntry跳轉(zhuǎn)邏輯
圖6 KiSystemService 跳轉(zhuǎn)邏輯
目前虛擬機(jī)雖然不能直接HOOK實(shí)際的SSDT和系統(tǒng)調(diào)用入口函數(shù),但惡意rootkit還可能對系統(tǒng)調(diào)用函數(shù)執(zhí)行inline HOOK。虛擬機(jī)中的rootkit獲取系統(tǒng)調(diào)用函數(shù)地址大致有兩種方式:通過SSDT或者通過內(nèi)核映像文件。為了阻斷rootkit獲取系統(tǒng)調(diào)用函數(shù)地址,防止其被inline HOOK;AVMPPS系統(tǒng)對原始的SSDT進(jìn)行抹除。另外,把打開文件的系統(tǒng)調(diào)用NTCreateFile加入敏感行為列表,由VMM過濾打開的文件。具體處理在進(jìn)程行為分析處理模塊。這樣就阻斷了絕大部分rootkit獲取原始調(diào)用地址的途徑,對系統(tǒng)調(diào)用執(zhí)行流進(jìn)行有效防護(hù)。
如圖1所示,系統(tǒng)調(diào)用入口保存在IA32_SYSENTER_EIP寄存器中,該寄存器屬于MSR寄存器,Intel為MSR寄存器的讀寫陷入設(shè)置了開關(guān)[14]。Intel規(guī)定,在對MSR寄存器進(jìn)行讀寫時(shí),如果滿足以下條件,可以發(fā)生陷入:1)寄存器地址范圍在00000000~00001FFFFH;2)Bit n(MSR寄存器的地址)在Read bitmap/Write bitmap中為1;3)VM-execution中Use MSR bitmap控制位為1。
基于以上條件,在VM-entry前,設(shè)置相應(yīng)的位,讓虛擬機(jī)在對IA32_SYSENTER_EIP寄存器讀寫的時(shí)候陷入到VMM中,由VMM做出處理。具體的處理方案為:
RDMSR(讀取):給虛擬機(jī)返回原始入口函數(shù)地址,隱藏實(shí)際的函數(shù)地址。
WRMSR(寫入):VMM不寫入,但是正常返回虛擬機(jī),對虛擬機(jī)進(jìn)行欺騙。
該模塊位于VMM中。通過設(shè)置影子內(nèi)存中新的SSDT中的敏感系統(tǒng)調(diào)用地址為非法地址,在VMM中設(shè)置取指令類型的pagefault發(fā)生陷入,在VMM的異常處理函數(shù)handle_exception中處理陷入,對目標(biāo)進(jìn)程和源頭進(jìn)程作出分析,屏蔽針對受保護(hù)進(jìn)程的敏感操作。
根據(jù)Intel手冊[14],pagefault異常的陷入是可選陷入,默認(rèn)pagefault由虛擬機(jī)自己處理,通過設(shè)置VMCS結(jié)構(gòu)中的相應(yīng)字段,可以令某種類型的pagefault透明陷入,由VMM處理該異常。是否陷入取決于以下兩個(gè)公式:
式中,PFEC是發(fā)生異常的錯(cuò)誤碼;PFEC_MASK和PFEC_MATCH是VMCS結(jié)構(gòu)中的兩個(gè)字段,用來控制具體pagefault異常的陷入;式(2)中的ExceptionBitmap是VMCS結(jié)構(gòu)中的一個(gè)32位的字段,每位控制一種異常,位14控制pagefault異常。
當(dāng)虛擬機(jī)發(fā)生pagefault異常時(shí),處理器根據(jù)式(1)判斷是否成立,如果不成立,由虛擬機(jī)內(nèi)部的異常處理機(jī)制處理該異常;否則檢查式(2)是否成立,如果式(2)成立,則發(fā)生VM-exit;否則,虛擬機(jī)自己處理。
Intel官方定義的pagefault異常有5種:存在位異常、read/write異常、模式異常、保留位異常和取指令異常,由PFEC的最低5位標(biāo)識(shí),取指令異常對應(yīng)于第5位。根據(jù)式(1)對PFEC_MASK和PFEC_MATCH進(jìn)行設(shè)置,只讓虛擬機(jī)在發(fā)生取指令異常的時(shí)候陷入到VMM中,其他無關(guān)異常則在虛擬機(jī)內(nèi)部處理,減少虛擬機(jī)陷入次數(shù),從而降低性能損耗。
基于上述設(shè)置,在進(jìn)程發(fā)起敏感行為時(shí)會(huì)陷入到VMM中,由于本系統(tǒng)采用無代理方式,底層只能獲取原始二進(jìn)制代碼,要準(zhǔn)確識(shí)別出具體的進(jìn)程,需要根據(jù)特定的參數(shù)傳遞規(guī)范,在VMM中透明讀取虛擬機(jī)內(nèi)核調(diào)用棧,解析出具體的調(diào)用句柄參數(shù),根據(jù)進(jìn)程句柄解析當(dāng)前進(jìn)程句柄表,獲取進(jìn)程對象。
1)調(diào)用參數(shù)解析
操作系統(tǒng)禁止內(nèi)核空間和用戶空間共享堆棧,在具體的系統(tǒng)調(diào)用函數(shù)被執(zhí)行之前,位于用戶空間堆棧中的參數(shù)會(huì)被復(fù)制到內(nèi)核空間堆棧,ESP寄存器指向內(nèi)核棧頂。Windows針對進(jìn)程的操作有兩個(gè)步驟:打開進(jìn)程、操作進(jìn)程。首先要通過類似OpenProcess函數(shù)打開指定進(jìn)程獲取一個(gè)句柄,然后根據(jù)此句柄對進(jìn)程進(jìn)行特定的操作,進(jìn)程句柄會(huì)作為進(jìn)程相關(guān)系統(tǒng)調(diào)用的首個(gè)參數(shù)被傳遞。Windows中的參數(shù)傳遞根據(jù)stdcall參數(shù)傳遞規(guī)范[19],遵循從右至左壓棧的順序。基于此,在進(jìn)入VMM的陷入處理流程后,可以通過ESP寄存器定位虛擬機(jī)內(nèi)核棧頂,進(jìn)而獲取相關(guān)參數(shù)。
2)進(jìn)程句柄解析
Windows中進(jìn)程通過句柄表管理自己打開的所有對象,句柄值便是對應(yīng)對象在句柄表中的索引。在VMM中通過FS寄存器可以獲取當(dāng)前處理器結(jié)構(gòu)KPCR,進(jìn)而獲取當(dāng)前線程Kthread,Kthread中保存有所屬進(jìn)程對象Eprocess的指針。Eprocess中保存有當(dāng)前進(jìn)程句柄表的指針ObjectTable是一個(gè)指向HADLE_TABLE結(jié)構(gòu)的指針,HADLE_TABLE確定句柄表的級數(shù)和基地址,具體的句柄表表項(xiàng)是HADLE_TABLE_ENTRY結(jié)構(gòu),其中保存有對應(yīng)的對象頭OBJECT_HEAD的地址。根據(jù)句柄表結(jié)構(gòu),利用句柄值索引句柄表得到具體的對象頭(OBJECT_HEAD),對象體位于對象頭的0x18偏移處。2層句柄表解析架構(gòu)如圖7所示(1層和3層類似)。
圖7 句柄表解析架構(gòu)
3)進(jìn)程處理
根據(jù)最新一期的微軟安全報(bào)告[4],一個(gè)進(jìn)程可以通過以下行為攻擊進(jìn)程或者系統(tǒng)。主要有惡意終止、代碼注入、內(nèi)存讀取、調(diào)試攻擊等。同時(shí),為了阻斷虛擬機(jī)內(nèi)部獲取系統(tǒng)調(diào)用函數(shù)的路徑,打開文件操作被加入敏感行為列表?;诖?,AVMPPS系統(tǒng)掛鉤了以上行為對應(yīng)的核心系統(tǒng)調(diào)用,分別是NTTerminateProcess、NTReadVirtualMemory、NTWriteVirtualMemory、NTCreateProcess、NTDebugActiveProcess和NTCreateFile函數(shù)。這樣在上述行為發(fā)生時(shí),會(huì)觸發(fā)SSDT中的鉤子進(jìn)而陷入到VMM中。
在VMM中維護(hù)一條受保護(hù)進(jìn)程鏈表,在虛擬機(jī)中進(jìn)程敏感行為被捕獲而陷入到VMM后,若是針對進(jìn)程的調(diào)用,則根據(jù)此鏈表對當(dāng)前進(jìn)程進(jìn)行分析,若操作對象是受保護(hù)進(jìn)程,且源頭進(jìn)程是第三方進(jìn)程,則禁止本次調(diào)用,否則就允許調(diào)用。對于通過打開程序可執(zhí)行文件進(jìn)行調(diào)試的陷入,需要分析文件名和源頭進(jìn)程。對于打開系統(tǒng)鏡像文件的調(diào)用陷入,直接拒絕。針對非法操作,AVMPPS系統(tǒng)通過VMCS結(jié)構(gòu)獲取當(dāng)前指令的長度intr_length,令當(dāng)前虛擬機(jī)指令寄存器(EIP)后移intr_length個(gè)字節(jié),從而跳過當(dāng)前的call指令,并向EAX注入錯(cuò)誤碼,通知客戶機(jī)系統(tǒng)調(diào)用執(zhí)行失敗。而對于普通操作,則根據(jù)VMM中保存的完整SSDT,向EIP注入正確的系統(tǒng)調(diào)用地址,表示允許當(dāng)前調(diào)用。
為了驗(yàn)證AVMPPS系統(tǒng)的防護(hù)效果并且了解AVMPPS系統(tǒng)對虛擬機(jī)性能的影響,針對AVMPPS系統(tǒng)的功能和性能分別作了測試。Windows 7系統(tǒng)自發(fā)布以來穩(wěn)定性和用戶量均位于Windows各個(gè)版本前列,因此選取Windows 7系統(tǒng)進(jìn)行測試。
實(shí)驗(yàn)環(huán)境:宿主機(jī):Intel Core i5四核處理器、64位CentOS 7操作系統(tǒng)3.10.1版本內(nèi)核;虛擬機(jī):雙核2 G內(nèi)存、32位windows 7操作系統(tǒng);VMM:KVM 3.10.1;Qemu:1.7.1;Libvirt:1.2.17。
為了驗(yàn)證AVMPPS系統(tǒng)的防護(hù)效果,采取多個(gè)樣本分別針對進(jìn)程運(yùn)行防護(hù)、系統(tǒng)調(diào)用執(zhí)行流防護(hù)、SSDT防護(hù)做測試,樣本原理介紹如表1所示。同時(shí)為了凸顯本系統(tǒng)的優(yōu)勢,和已有的優(yōu)秀方案做對比,測試結(jié)果表明,AVMPPS可以有效地對指定進(jìn)程進(jìn)行保護(hù),同時(shí)保護(hù)SSDT自身和系統(tǒng)調(diào)用執(zhí)行流的完整性。如表2所示。
表1 AVMPPS防護(hù)功能測試
表2 AVMPPS防護(hù)功能測試
作為安全防護(hù)系統(tǒng),自身安全尤為重要,如果系統(tǒng)運(yùn)行期間代理驅(qū)動(dòng)被卸載,防護(hù)功能就蕩然無存。因此借助于PCHunter和Kmdmanager工具針對已有的基于代理驅(qū)動(dòng)的方案和本方案進(jìn)行安全性對比試驗(yàn),測試結(jié)果如表3所示。
表3 AVMPPS安全性測試
通過表3可以發(fā)現(xiàn),文獻(xiàn)[7-8]的方法未對代理驅(qū)動(dòng)作任何保護(hù),隨時(shí)可以被檢測和卸載。文獻(xiàn)[12]對驅(qū)動(dòng)作了隱藏設(shè)置,可以躲避檢測,但是如果事先知道驅(qū)動(dòng)名稱,還是可以強(qiáng)制卸載;AVMPPS未使用任何代理驅(qū)動(dòng),因此不可能被檢測到,且AVMPPS基于影子內(nèi)存,類似于系統(tǒng)預(yù)留的內(nèi)存,任何驅(qū)動(dòng)和檢測軟件都無法獲取其有效地址,因此AVMPPS的安全性可以得到保證。
AVMPPS系統(tǒng)在虛擬機(jī)系統(tǒng)調(diào)用機(jī)制啟用時(shí)部署,一旦部署成功,之后的性能損耗基本在于進(jìn)程特定敏感行為調(diào)用的陷入,由于AVMPPS系統(tǒng)對無關(guān)調(diào)用不作陷入設(shè)置,最大程度上減少了模式切換的次數(shù),所以對虛擬機(jī)性能的影響極其微小,基本可以忽略。以下利用魯大師從CPU、內(nèi)存、I/O三方面分別測試10次取平均值來測試AVMPPS系統(tǒng)對虛擬機(jī)的影響,并和其他無代理方案進(jìn)行對比。測試結(jié)果表明,AVMPPS系統(tǒng)部署成功后對CPU的影響在2%左右,而對內(nèi)存和I/O的影響都低于0.5%,性能損耗方面遠(yuǎn)遠(yuǎn)低于其他的無代理方案,如表4所示。
表4 AVMPPS性能測試展示
綜上所述,為了解決當(dāng)前虛擬機(jī)進(jìn)程防護(hù)方案有代理、高能耗的問題,本文提出基于影子內(nèi)存的無代理虛擬機(jī)進(jìn)程防護(hù)方案。通過透明構(gòu)建的影子內(nèi)存保證SSDT、系統(tǒng)調(diào)用執(zhí)行流和核心代碼的完整性。利用硬件虛擬化的陷入機(jī)制過濾進(jìn)程敏感行為,為受保護(hù)進(jìn)程提供運(yùn)行時(shí)防護(hù)。由于本文系統(tǒng)不對無關(guān)行為作陷入設(shè)置,保證進(jìn)程運(yùn)行安全的同時(shí),大幅減少了虛擬機(jī)陷入次數(shù),降低了虛擬機(jī)性能損耗。目前AVMPPS系統(tǒng)在分配虛擬機(jī)內(nèi)存時(shí),對具體系統(tǒng)版本有一定的依賴,后續(xù)要研究一種較為普適的方法獲取虛擬機(jī)內(nèi)存,這樣就在較大程度上減少了對虛擬機(jī)系統(tǒng)版本的依賴。
[1]林闖, 蘇文博, 孟坤, 等. 云計(jì)算安全: 架構(gòu)、機(jī)制與模型評價(jià)[J]. 計(jì)算機(jī)學(xué)報(bào), 2013, 36(9): 1765-1784.LIN Chuang, SU Wen-bo, MENG Kun, et al. Cloud computing security: Architecture, mechanism and medeling[J]. Chinese Journal Of Computers, 2013, 36(9): 1765-1784.
[2]SCHWARZKOPF R, SCHMIDT M, STRACK C, et al.Increasing virtual machine security in cloud environments[J].Journal of Cloud Computing, 2012, 1(1): 1-12.
[3]Imperva. Man in the cloud (MITC)attacks[EB/OL].[2015-09-06]. https://www.imperva.com/docs/HII_Man_In_The_Cloud_Attacks.pdf.
[4]ERIC A, VOLV G, CARMEN L, et al. Microsoft security intelligence report[EB/OL]. [2017-03-17]. https://www.microsoft.com/en-us/security/intelligence-report.
[5]王惠蒞, 楊晨, 楊建軍. 美國NIST云計(jì)算安全標(biāo)準(zhǔn)跟蹤及研究[J]. 信息技術(shù)與標(biāo)準(zhǔn)化, 2012(6): DOI: 10.3969/j.issn.1671-539X.2012.06.013.WANG Hui-li, YANG Chen, YANG Jian-jun. Research on clouds computing security standards of NIST[J].Information Technology & Standardization, 2012(6):DOI:10.3969/j.issn.1671-539X.2012.06.013.
[6]崔競松, 向浩, 郭遲, 等. 基于KVM的windows客戶機(jī)進(jìn)程查殺技術(shù)[J]. 四川大學(xué)學(xué)報(bào): 工程科學(xué)版, 2014,46(6): 7-13.CUI Jing-song, XIANG Hao, GUO Chi, et al. Online anti-virus technology of process running on Windows VM based on KVM[J]. Journal of SiChuan University(Engineering Science Edition), 2014, 46(6): 7-13.
[7]彭春洪. 基于KVM虛擬機(jī)的惡意行為檢測系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D]. 成都: 電子科技大學(xué), 2015.PENG Chun-hong. The design and implementation of the malicious behavior detecting system based on KVM virtual machine[D]. Chengdu: University of Electronic Science and Technology of China, 2015.
[8]張文靜. 基于Xen的Rootkit檢測技術(shù)研究[D]. 西安: 西安電子科技大學(xué), 2014.ZHANG Wen-jing. Research on rootkit detection techonlogy based on Xen[D]. Xi’an: XiDian University, 2014.
[9]張貴民. 基于Intel VT的內(nèi)核完整性監(jiān)控技術(shù)研究[D].鄭州: 解放軍信息工程大學(xué), 2014.ZHANG Gui-min. Research on kernel intergrity monitoring technology based on Intel VT[D]. Zhengzhou:PLA Information Engineering University, 2014.
[10]黃嘯. 基于虛擬化的內(nèi)核監(jiān)控模型研究與實(shí)現(xiàn)[D]. 南京:南京大學(xué), 2015.HUANG Xiao. Research and implementation of kernel monitoring model based on virtualization[D]. Nanjing:Nanjing University, 2015.
[11]李佳瑤. 基于虛擬化的Wndows進(jìn)程內(nèi)存保護(hù)研究[D].南京: 南京大學(xué), 2014.LI Jia-yao. Research on memory protection of Windows process based on virtualization[D]. Nanjing: Nanjing University, 2014.
[12]陳興蜀, 趙成, 陶術(shù)松. 基于KVM的windows虛擬機(jī)用戶進(jìn)程防護(hù)[J]. 電子科技大學(xué)學(xué)報(bào), 2016, 46(6): 950-957.CHEN Xing-shu, ZHAO Cheng, TAO Shu-song.KVM-based Windows virtual machine user process protection[J]. Journal of University of Electronic Science and Technology of China, 2016, 46(6): 950-957.
[13]DUNLAP G W, KING S T, CINAR S, et al. ReVirt:Enabling intrusion analysis through virtual-machine logging and replay[J]. Acm Sigops Operating Systems Review, 2002, 36(SI): 211-224.
[14]Intel. 64-ia-32-architectures-software-developer-manual-325462[EB/OL]. [2015-03-20]. http://www.intel.com/content/www/us/en/processors/architectures-software-deve loper-manuals.html.
[15]MANDT T. Kernel pool exploitation on Windows 7[EB/OL]. [2017-03-17].https://media.blackhat.com/bh-dc-11/Mandt/BlackHat_DC_2011_Mandt_kernelpool-wp.pdf.
[16]潘愛民. Windows內(nèi)核原理與實(shí)現(xiàn)[M]. 北京: 電子工業(yè)出版社, 2013.PAN Ai-min. Understanding the Windows kernel[M].Beijing: Publishing House of Electronics Industry, 2013.
[17]JIA X, ZHU M. Research on significance of VCPU scheduling for SR-IOV on NUMA platform[C]//2014 International Conference on Cloud Computing and Internet of Things (CCIOT). [S.l.]: IEEE, 2015: 57-60.
[18]WANG R B, LU K, LU X C. Aware conflict detection of non-uniform memory access system and prevention for transactional memory[J]. Journal of Central South University, 2012, 19(8): 2266-2271.
[19]Microsoft. MSDN library for visual studio 2017[EB/OL].[2016-05-09]. https://msdn.microsoft.com/en-us/library/984x0h58.aspx.