(1.國防科學技術大學 計算機學院, 長沙410073;2.北京系統工程研究所, 北京 100101)
摘要:隨著越來越多的PC用戶習慣于從互聯網上下載和執行各類軟件,潛在的自隱藏惡意代碼已成為亟待解決的安全問題,而進程隱藏是這類惡意代碼最常用也是最基本的規避檢測的自隱藏技術。針對這個問題,提出了一種新的基于硬件虛擬化技術的隱藏進程檢測技術——Libra。Libra通過構造一個輕量級的虛擬機監視器(libra virtual machine monitor,LibraVMM)實現了從虛擬層隱式獲取真實進程列表(true process list, TPL)的新技術。與已有的基于虛擬機技術的解決方案相比,Libra具有兩個特色,即動態的操作系統遷移技術和不依賴于操作系統的隱式進程自省技術。測試結果證明了Libra檢測隱藏進程的完整性,具有很好的實用性。
關鍵詞:虛擬機監視器;自隱藏惡意代碼;硬件虛擬化技術;進程隱藏
中圖分類號:TP3095文獻標志碼:A
文章編號:1001-3695(2008)11-3460-03
Detecting hidden process with hardware-assisted virtual machine monitor
WEN Yan1,ZHAO Jin-jing2,WANG Huai-min1 (1.School of Computer, National University of Defense Technology, Changsha 410073, China;2.Beijing Institute of System Engineering, Beijing 100101, China)Abstract:With more and more PC users were accustomed to download and execute programs from Internet, stealth malware had become a major threat to the PC computers. Process hiding was a powerful stealth technique commonly used by stealth malware to evade detection by computer users and anti-malware scanners. This paper proposed a new approach called Libra for detect hidden processes implicitly. Libra implemented a novel lightweight hardware-assisted VMM to obtain the true process list (TPL) from deep within the system. Compared to existing VMM-based approaches, Libra provides two unique advantages: dynamic OS migration and implicit introspection of TPL. The functionality evaluation shows the completeness and effectiveness of Libra.
Key words:virtual machine monitor(VMM); stealth malware; hardware-assisted virtualization; process hiding
自隱藏惡意代碼利用各種技術使系統工具無法檢測到其存在,進程隱藏則是這類惡意代碼最常用也是最基本的規避檢測的自隱藏技術,此類惡意代碼已對計算機系統的安全構成了很大威脅。
多視圖驗證技術(cross-view validation)[1]是一種檢測進程隱藏的有效機制,它分別從可信視圖和非可信視圖獲取進程列表,兩個列表集合的差集即為被隱藏進程。實現這種機制的關鍵就是如何獲取真實準確的可信進程視圖。已有的可信視圖獲取技術主要分為基于操作系統內核和基于虛擬機監視器(virtual machine monitor,VMM)兩類。但是前者無法抵御內核態惡意代碼的攻擊。而現有的基于虛擬機監視器的檢測技術則依賴于可被內核態惡意代碼竄改的客戶操作系統的內核數據結構,而且它們都是針對在虛擬機中重新安裝部署的操作系統,不能檢測實際需要保護的宿主計算機系統中的自隱藏惡意代碼。針對這些問題,本文提出了一種新的基于輕量級虛擬化技術的隱藏進程檢測技術——Libra。除了能夠有效抵御內核態惡意代碼的攻擊外,與已有的基于虛擬機技術的解決方案相比,Libra具有兩大優勢:a)動態的操作系統遷移技術,準備檢查隱藏進程時,Libra可以動態創建LibraVMM并將運行中的操作系統遷移到LibraVMM之上,檢測完畢后,可以動態退出LibraVMM從而將操作系統恢復到原有的本地運行方式,這種動態的遷移方式明顯減少了對操作系統運行性能的影響;b)Libra不依賴于操作系統的隱式進程自省技術,利用處理器管理進程地址空間的特征構造了不依賴于操作系統的進程枚舉技術,使得所有的檢測操作均在虛擬機監視器(LibraVMM)的層次完成,有效保護檢測機制的安全性。
1Libra體系結構
如前所述,現有基于虛擬機監視器的檢測技術實際檢測是在虛擬中安裝運行的操作系統中潛在的自隱藏代碼,而不是PC用戶真正關心的宿主操作系統。Libra與這些基于虛擬機監視器的檢測技術也有所不同,它無須先啟動虛擬機監視器再啟動虛擬機中安裝的操作系統,而是通過動態地將運行中的宿主操作系統遷移到LibraVMM之上,真實再現了操作系統的動態信息,保證其真實性。
如圖1所示。Libra的核心組件為LibraVMM,進程檢測組件則在LibraVMM內實現。在Libra檢測模型中,宿主操作系統運行于兩種狀態,即準備檢測前的本地運行狀態和遷移到LibraVMM之上后虛擬化運行狀態(virtualized mode)。在本地運行狀態下,操作系統直接運行在硬件系統之上,所以沒有任何性能損失。
若準備進行隱藏進程檢測,Libra將動態創建LibraVMM,并將運行中的操作系統遷移到LibraVMM之上,進程檢測組件負責提取真實的進程創建與退出信息。
進程檢測組件的核心功能為獲取TPL,進程檢測組件利用了Intel x86處理器管理進程地址空間(process address space)的通用機制實現了TPL的獲取。
對于所有Intel x86體系結構的處理器(包括AMD的x86處理器),每個進程均有一個獨立的進程地址空間(32 bit的處理器為4 GB)。進程基于邏輯地址訪問內存,啟動了段式內存管理的x86處理器首先將此邏輯地址轉換為線性地址,接著處理器通過頁式內存管理機制將由段式管理形成的線性地址映射為物理地址。x86處理器的頁式內存管理將進程地址空間分為固定大小(一般為4 KB)的頁面,每一個頁面被映射到物理內存中的一頁。進行線性地址到物理地址的轉換時,x86處理器的頁式內存管理器利用頁目錄表—頁表—頁描述項這三層結構維護地址空間中從線性地址到物理內存頁的映射, 32 bit的線性地址被劃分為三個部分,即10 bit的頁目錄表下標、10 bit的頁面表下標、12 bit的頁內地址偏移。x86處理器中負責存放指向當前頁目錄表指針的是控制寄存器CR3。尋址方式過程為從CR3取得頁目錄表的基地址,然后根據10 bit頁目錄表下標和12 bit的頁內地址偏移得到的基地址,取得相應頁面表的基地址,接著根據10 bit頁表下標和之前得到的基地址,從頁表中取出相應的頁描述項,最后將頁描述項中的頁面基地址和線性地址中的12 bit頁內地址偏移相加,得到物理頁地址。
如前所述, CR3寄存器的值指向了一個進程的地址空間的頁目錄表,因此,實際上CR3寄存器與進程形成了一一映射關系。Libra基于Intel的硬件虛擬化技術(virtualization technology,VT)[2]實現了LibraVMM,而在創建了LibraVMM后,所有修改CR3寄存器的操作都將被LibraVMM捕獲。在LibraVMM中實現的進程檢測組件正是利用這一特性通過監視CR3寄存器的變化來獲取TPL。
2Libra實現
上一章描述的Libra的體系結構顯然是與操作系統無關的,但考慮到目前PC平臺最常見的配置是Windows操作系統與Intel x86處理器,所以Libra的原型系統首先在配置了支持Intel VT技術的處理器且在安裝Windows計算機系統上實現。Libra的隱式進程自省技術的詳細描述參見文獻[3]。
Intel VT技術于2006年推出,目前包括面向x86處理器的VT-x技術與面向安騰處理器的VT-i技術,Libra針對普遍使用x86體系結構的處理器,因此Libra的原型系統基于VT-x技術實現,而本文后面提及的VT特指VT-x技術。Intel VT技術的核心是給x86 CPU中各種特權指令的執行都增加可以進行自陷(trap)的功能。VT技術使得CPU運行在兩種不同的模式下,即VMX root和VMX non-root模式。這兩種模式都支持0~3的四個特權級??蛻籼摂M系統及其應用程序運行在VMX non-root模式下,虛擬機監視器運行在VMX root模式下。 VT引入了兩種狀態轉換,從root模式轉換到non-root模式稱之為VM entry;反之則稱之為VM exit。VM entry和VM exit都會重新加載Intel的控制寄存器CR3,以便VMM和Guest OS有不同的地址空間。與傳統x86處理器相比,VT處理器最大的不同就是當處理器在non-root模式下運行時,一些特權指令的執行將會導致VM exit,執行CPUID、mov CR3、RDMSR、WDMSR等指令會無條件地觸發VM exit;而其他的指令、中斷和異常是否觸發VM Exit則由新引入的虛擬機控制結構(virtual machine control structure ,VMCS)管理。這種機制為VMM解釋執行這些指令和異常提供了有效支持。
VM entry會先加載客戶系統狀態區域的VMCS,然后進入VMX non-root,并且立即引發中斷。這樣,VMM就可以通過對IDT的修改,在系統進入VMX non-root的第一時間觸發事件,以便模擬事件的傳遞。
VM exit則會保存CPU狀態到客戶系統狀態區域,并且加載host狀態區域的信息后返回VMM。所有的VM exit使用公共的進入VMM的入口點(entry point),并且每次VM exit都會提供引發VM exit的詳細原因,以便VMM進行相應的處理。
通過VMCS的設置,LibraVMM可以配置處理器,使得每次CR3被修改均產生VM exit事件,從而使得進程檢測組件捕獲到此事件,并獲取新的CR3寄存器的值以提取TPL。通過動態加載LibraVMM及其進程檢測組件來獲取TPL的具體運行流程主要包括以下幾個步驟:
a)加載LibraVMM驅動。只有在內核態(ring 0)才能執行Intel VT技術引入的新指令和處理各類VM exit事件(包括修改CR3導致的VM exit事件),因此必須以Windows內核驅動的形式實現LibraVMM以使其能夠進入操作系統內核執行特權指令。動態加載LibraVMM即利用Windows提供的標準接口加載Libra驅動程序并利用I/O控制指令通知其開始執行創建LibraVMM的操作。
b)在所有邏輯處理器上啟用VMX模式。Libra通過設置CR4控制寄存器中為VT新增的相應控制位來啟動VMX模式。接著,Libra在以4 Byte為邊界對齊的非分頁內存上創建VMXON區段,最后通過傳遞VMXON區段的物理地址執行VMXON,此操作必須在所有的邏輯處理器上均執行一遍。所謂邏輯處理器,就是從操作系統的角度,能夠提供完整處理器計算功能的處理器單元。例如,對于多核處理器,每個核即為一個邏輯處理器;而對于超線程(hyperthread)處理器,每個超線程就是一個邏輯處理器。
c)設置VMCS。通過執行VMXON啟用VMX后,處理器將處于VM root模式。此時,Libra將在非分頁內存上創建VMCS并設置相應的版本標志符以便使得相應特權操作激發VM exit事件。進程檢測組件需要監視CR3寄存器的變化,所以Libra設置VMCS是為了使CR3的修改產生VM exit事件。為此,Libra需要將VMCS中的CR3-target count比特位設為零。之后,Libra通過調用 VMWRITE來初始化VMCS的客戶虛擬系統狀態(guest-state), 主要包括當從VMX root模式切換到VMX non-root模式(VM entry)時需要的處理器執行上下文等。最后,Libra將設置棧指針寄存器(ESP)與指令寄存器(EIP)以控制客戶虛擬系統將要執行的指令。
d)從VMX root模式切換到VMX non-root模式(VM entry)。通過以上復雜的準備工作,Libra已經完成了LibraVMM的創建;接著通過調用VMLUNCH將處于在本地運行狀態宿主操作系統動態遷移到LibraVMM之上;最后被遷移的操作系統將在虛擬化狀態下繼續運行。
e)VM exit事件處理。通過在c)中對VMCS作了相應配置,所有在VMX non-root模式下對CR3的修改操作將會觸發VM exit事件,而 LibraVMM的進程檢測組件將會捕獲該事件,并提取進出系統中相應的進程信息,利用CR3寄存器的變化偵測進程信息的算法將在第3章中詳細描述。
f)在所有邏輯處理器上禁用VMX模式。在結束隱藏進程的檢測后,Libra將結束LibraVMM。LibraVMM 首先釋放占用的所有內存資源,接著在所有處理器調用VMMOFF以禁用VMX模式。至此,Libra完成了將操作系統從虛擬化狀態切換回本地化運行狀態的狀態轉換。
3實驗
測試Libra的計算機系統是配置了支持Intel VT技術的處理器的Thinkpad T61筆記本電腦,處理器為Intel Core2 Duo 7300 2.00 GHz,內存為2 GB,硬盤為120 GB。
為了驗證Libra檢測隱藏進程的有效性,測試使用了五種基于不同進程隱藏技術的常用惡意代碼,包括Aphex、Hacker Defender、FU、FUTo和phide_ex。Aphex[4]通過修改每個進程的導入函數地址表(import address table)來鉤掛函數ZwQuerySystemInformation,從而將欲隱藏的進程從ZwQuerySystemInformation返回的進程列表中刪除。Hacker Defender[5]則是將函數NtQuerySystemInformation開始幾個字節的代碼修改成跳轉到自己代碼的“jmp”指令。FU[6]則是采用了所謂直接內核對象操作技術(direct kernel object manipulation,DKOM)將欲隱藏的進程從Windows內核的活動進程列表(active process list)中刪除。FUTo[7]是FU的增強版本,除了修改活動進程列表外,它還將欲隱藏的進程從內核結構PspCidTable中刪除, 而PspCidTable正是保存進程和線程標志符的列表。黑客PE386則提出了一種新的基于KDOM的進程隱藏技術,phide_ex[8]則是其提供的實現范例。
測試同時比較了已有Anti Rootkit Group[9]推薦的檢測工具,包括F-Secure BlackLight 2.2、DarkSpy 1.0.5、 IceSword 120、RkUnhooker 3.0、UnHackMe 2.5.5、GMER 1.0、KProcCheck 0.2、bitdefender_antirootkit-BETA1、Process Hunter 1.1和TaskInfo 6.2。
測試結果顯示所有被測試的惡意代碼檢測工具均可檢測到Aphex,Hacker Defender和FU,BlackLight、Icesword、UnHackMe和TaskInfo不能檢測到FUTo,而所有的這些檢測工具均不能檢測到phide_ex,只有Libra能檢測到所有這五種方式隱藏的進程。
對于Libra而言,為了獲取TPL而需要監視CR3寄存器的修改,每次進程切換均會導致CR3寄存器值的改變,進而引發VM exit事件。為了測試由此導致性能下降,本文在Windows平臺下實現了著名的UNIX的內核測試工具forkwait,forwait通過重復創建大量進程來測試進程創建/退出/切換對系統性能的影響。下面的代碼清晰地說明了forwait的工作原理:
if (argc > 1) return 0;
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo;
memset (StartupInfo, 0, sizeof (StartupInfo));
for (int i=0;i<10000; i++){
CreateProcess (NULL, \"ForkWait.exe child\", NULL,NULL,FALSE,0,NULL,NULL,StartupInfo, ProcessInfo);
WaitForSingleObject (ProcessInfo.hProcess, INFINITE);
CloseHandle (ProcessInfo.hProcess);
CloseHandle (ProcessInfo.hThread);
}
如上述代碼所示,本文的測試用例中進程創建數為10 000,在本地運行模式下forwait耗時35.926 s測試同時比較了forwait在VMware Workstation 6.0、VirtualPC 2007和Parallels Workstation 2.2中的運行結果,如表1所示。作為輕量級的虛擬機監視器,LibraVMM對系統性能的影響遠遠小于系統級虛擬機。
表1Forwait性能測試比較
模式運行時間/s性能下降比例/%
VMware Workstation46.86930.46
VirtualPC51.15442.39
Parallels Workstation48.62035.33
LibraVMM41.32415.03
4結束語
針對PC平臺,為了在已有的宿主操作系統下有效檢測進程隱藏惡意代碼,本文基于硬件虛擬化技術構造了支持操作系統動態遷移的輕量級虛擬機監視器LibraVMM,并在LibraVMM中實現了不依賴于操作系統的隱式的隱藏進程檢測技術,為自隱藏惡意代碼的檢測技術提供了有效支持。本文的測試結果證明了Libra能夠準確獲取真實的進程列表(TPL)并能檢測目前所有流行的進程隱藏惡意代碼,充分說明了本文提出的解決方案的有效性。
參考文獻:
[1]WANG Y M,BECK D,VO B,et al.Detecting stealth software with strider ghost buster[C]//Proc of International Conference on Dependable Systems and Networks (DSN’05).2005:368-377.
[2]UHLIG R,NEIGER G,RODGERS D,et al.Intel virtualization technology[J].IEEE Computer,2005,38(5): 48-56.
[3]WEN Yan,ZHAO Jin-jing,WANG Huai-min.Implicit detection of hidden processes with a local-booted virtual machine[C]//Proc of the 2nd International Conference on Information Security and Assurance (ISA’08).2008.
[4]Aphex:AFX Windows rootkit[EB/OL].[2007-11-21].http://www.iamaphex.cjb.net.
[5]Hacker defender[EB/OL].[2007-11-25].http://hxdef.org/.
[6]Fuzen_op,FU rootkit[EB/OL].[2007-11-23].http://www.rootkit.com/project.php?id=12.
[7]SILBERMAN P,C H A O S.FUTo:bypassing blacklight and icesword[EB/OL].[2007-11-26].https://www.rootkit.com/newsread.php?newsid=433.
[8]PE386.phide_ex-untimate process hiding example[EB/OL].[2007-11-24].http://forum.sysinternals.com/printer_friendly_posts.asp?TID=8527.
[9]Anti Rootkit Group[EB/OL].[2007-11-28].http://www.antirootkit.com/blog/.