程微微 張琦 謝億鑫
無錫江南計算技術(shù)研究所 江蘇 214083
0 引言
對于惡意代碼進(jìn)行分析的研究人員來說,虛擬機(jī)是一個非常有用的工具。研究人員可以在虛擬機(jī)中執(zhí)行惡意代碼的樣本,然后對其行為進(jìn)行分析。一旦分析結(jié)束,可以迅速恢復(fù)系統(tǒng),而且對真實主機(jī)沒有絲毫危害。它提供了一種確認(rèn)程序是否是惡意代碼的安全手段。然而攻擊者為了提高惡意程序的隱蔽性以及破壞真實主機(jī)的成功率,他們都會在惡意程序中加入檢測虛擬機(jī)的代碼,以判斷程序所處的運行環(huán)境。當(dāng)發(fā)現(xiàn)程序處于虛擬機(jī)(特別是蜜罐系統(tǒng))中時,它就會改變操作行為或者中斷執(zhí)行,甚至進(jìn)行拒絕服務(wù)攻擊和滲透攻擊。本文主要對當(dāng)前的虛擬機(jī)檢測技術(shù)及其檢測的準(zhǔn)確率進(jìn)行研究,然后針對當(dāng)前一些惡意代碼使用的虛擬檢測技術(shù)進(jìn)行反檢測研究。
1 虛擬機(jī)技術(shù)
本文所指的虛擬機(jī)(Virtual Machine)是指通過軟件模擬的具有完整硬件系統(tǒng)功能的、運行在一個完全隔離環(huán)境中的完整計算機(jī)系統(tǒng)。通過虛擬機(jī)環(huán)境(Virtual Machine Environment),比如VMware、Virtual PC、Xen、BOCHS以及用戶模式下的Linux,你可以在一臺宿主計算機(jī)上模擬出一臺或多臺虛擬的寄宿計算機(jī),這些虛擬機(jī)完全就像真正的計算機(jī)那樣進(jìn)行工作,例如你可以安裝操作系統(tǒng)、安裝應(yīng)用程序、訪問真實或虛擬設(shè)備以及訪問網(wǎng)絡(luò)資源等等,虛擬機(jī)在宿主主機(jī)中的位置如圖1所示。

圖1 虛擬機(jī)架構(gòu)圖
2 虛擬機(jī)檢測常用技術(shù)
通過虛擬機(jī)架構(gòu)圖可知,在惡意軟件分析中,虛擬機(jī)技術(shù)提高了木馬、病毒等惡意樣本分析過程的安全性以及硬件資源的節(jié)約性,因此虛擬機(jī)技術(shù)在惡意軟件領(lǐng)域中是應(yīng)用越來越廣泛。因此,攻擊者為了讓自己的代碼運行在真實的系統(tǒng)中而不是虛擬機(jī)中,其就必須有檢測虛擬機(jī)的機(jī)制。另外,當(dāng)前,許多蜜罐系統(tǒng)也利用虛擬機(jī)進(jìn)行部署,攻擊者為了避免樣本程序被蜜罐系統(tǒng)捕獲,于是產(chǎn)生遠(yuǎn)程虛擬機(jī)檢測技術(shù)。
2.1 本地虛擬機(jī)檢測技術(shù)
在本地,檢測虛擬機(jī),攻擊者有不少選擇。當(dāng)前,檢測本地虛擬機(jī)有以下四種策略。
(1)在進(jìn)程、文件系統(tǒng)或注冊表中搜索VME特征;
(2)在內(nèi)存中搜索VME特征;
(3)在VME中搜索特定的虛擬硬件;
(4)在VME的處理器中搜索特殊的指令和攻能。
仔細(xì)考慮一下,現(xiàn)代的計算機(jī)都是由文件系統(tǒng)、內(nèi)存、各種硬件部件以及處理器,檢測的方法主要包括以下幾種方式。本地的虛擬機(jī)檢測機(jī)制包括了計算機(jī)系統(tǒng)的各個方面。
2.1.1 在進(jìn)程、服務(wù)、文件系統(tǒng)或注冊表中搜索VME特征
虛擬環(huán)境(VME)軟件為了便于識別,往往都會向寄宿系統(tǒng)中添加一些明顯的特征。添加的范圍包括正在運行的進(jìn)程和服務(wù)、文件與目錄系統(tǒng)以及注冊表項。許多惡意代碼就是通過這種到上述項目中找VMware相關(guān)特征來檢測的。
在一個VMware虛擬環(huán)境下的Win Xp寄宿系統(tǒng)中,有開啟的 VMtools服務(wù),在文件系統(tǒng)中有超過 50多個與“VMware”和“vmx”等字符串有關(guān)的特征項,而且在注冊表中也有超過500項與“VMware”這樣字符串相關(guān)的特征。在這些項目中,有足夠多的特征被攻擊者用來檢測VMware。
雖然這種方法利用的范圍很大,但是該方法利用性有限,容易被欺騙。惡意代碼分析人員可以通過一些 Rootkit技術(shù)掛鉤系統(tǒng)服務(wù)函數(shù),欺騙惡意代碼,從而使其虛擬機(jī)檢測模塊失效。
2.1.2 在內(nèi)存中搜索VME特征
寄宿系統(tǒng)中的內(nèi)存映射與宿主系統(tǒng)中的內(nèi)存映射之間有許多的不同,因而,攻擊者可以到內(nèi)存中去尋找虛擬機(jī)的痕跡。實驗證明,在VMware虛擬環(huán)境下的win xp寄宿系統(tǒng)中,用dd命令查看RAM寄存器,在內(nèi)存中可以找到1500多項與“VMware”有關(guān)的內(nèi)容。當(dāng)然,在整個內(nèi)存中去搜索這些類似的特征并不是明智之舉,將搜索范圍縮小到特定的內(nèi)存區(qū)域則是一個可行的方法,這樣,不但容易實現(xiàn)檢測算法,而且效率也較高。虛擬環(huán)境中的安裝的操作系統(tǒng),一些關(guān)鍵的操作系統(tǒng)表指針都是重定位的,從而內(nèi)存位置不同,因此對這些關(guān)鍵部件的內(nèi)存位置進(jìn)行檢測顯然事半功倍。例如,中斷描述表(Interrupt Descriptor Table),其用于管理系統(tǒng)的各式各樣的中斷操作,他在宿主系統(tǒng)(真實主機(jī))中的內(nèi)存位置要比在寄宿系統(tǒng)(虛擬機(jī))中的內(nèi)存位置低。通過利用檢測IDT所處的內(nèi)存位置等相關(guān)技術(shù),程序可以很快檢測出是否運行在虛擬系統(tǒng)中,再者,由于IDT這些系統(tǒng)核心部件是系統(tǒng)構(gòu)架的一部分,不容易改變,因此該種檢測技術(shù)比較不容易被欺騙。除此之外,它是一種通用方式,對VMware和Virtual PC等虛擬環(huán)境均適用,且適用Linux和Windows操作系統(tǒng)。
“紅色藥丸”是Joanna Rutkowska于在2004年11月實現(xiàn)的一種 IDT-檢測虛擬機(jī)的技術(shù)。它通過 SIDT指令查看IDTR,Rutkowska發(fā)現(xiàn)在VMware虛擬環(huán)境下的寄宿系統(tǒng)中,IDT基本位于在0xffXXXXXX附近,然而在VisualPC虛擬環(huán)境下的寄宿系統(tǒng)下,IDT位于0xe8XXXXXX附近,在宿主操作系統(tǒng)中,IDT則處于很低位置的內(nèi)存里。根據(jù)這個特征,“紅色藥丸”檢測IDTR的指針地址是否大于0xd0000000,如果大于則說明該代碼運行在寄宿主機(jī)上,如果小于則聲稱“紅色藥丸”在宿主主機(jī)上運行。紅色藥丸可以檢測各樣的虛擬環(huán)境,包括VisualPC和VMware,而且可以在各式的操作系統(tǒng)下運行,包括winxp、win2000、linux。不過在一些linux操作系統(tǒng)中,由于一些安全機(jī)制阻止從ring3到ring0層的調(diào)用,這樣就會導(dǎo)致紅色藥丸產(chǎn)生段錯誤,無法正常進(jìn)行檢測。
“紅色藥丸”的算法如下所示:

當(dāng)然,操作系統(tǒng)中像IDT這種關(guān)鍵系統(tǒng)結(jié)構(gòu)有許多,可以通過檢查其它的一些類似結(jié)構(gòu)來檢測程序運行環(huán)境是否是虛擬環(huán)境,如檢測全局描述符表(GDT)和本地描述符表(LDT)這樣的結(jié)構(gòu)。Tobias Klein實現(xiàn)的Scoopy就是分別用SIDT、SGDT、SLDT這些命令去查看IDT、GDT和LDT的內(nèi)存位置。Klein發(fā)現(xiàn)在宿主系統(tǒng)中,IDT位于在0xc0XXXXXX附近(“紅色藥丸”用于檢測的閥值是0xd0XXXXXX),Scoopy運行檢查,如果發(fā)現(xiàn)IDT地址以0xc0開頭,則說明是運行環(huán)境是在宿主系統(tǒng)下,否則表示是在寄宿系統(tǒng)下。同樣,經(jīng)過實驗分析,可發(fā)現(xiàn)在真實系統(tǒng)中GDT位于0xc0XXXXXX附近,而LDT位于0x0000附近,通過檢測這三個系統(tǒng)結(jié)構(gòu)的內(nèi)存位置,不但可以很容易檢測出程序是否運行在虛擬環(huán)境中,而且檢測結(jié)果更加準(zhǔn)確。
2.1.3 搜索VME特殊的虛擬硬件
第三種檢測策略是搜索虛擬環(huán)境下特殊的虛擬硬件,例如NIC卡(通過VMware的MAC地址,它經(jīng)常以00-05-69,00-0C-29或00-50-56開頭)、USB控制器和聲音設(shè)備等,還有,一些虛擬環(huán)境下引入的 SCSI設(shè)備也可以用于檢測。一些虛擬環(huán)境還會引起系統(tǒng)時鐘的異常,在虛擬環(huán)境中運行程序的效率沒有在真實硬件上高,執(zhí)行速度要比在真實環(huán)境中慢。因為虛擬機(jī)模擬硬件,中間有翻譯或攔截,增加了流程,也增加了執(zhí)行的時間。因此也可以通過基于執(zhí)行時間差異來檢測虛擬環(huán)境。
Scoopy的作者Tobias Klein實現(xiàn)的DOO工具就是利用搜索VME特殊的虛擬硬件的技術(shù)檢測虛擬機(jī)。在Linux版本的DOO中,其在IO、port以及SCSI等相關(guān)的目錄下尋找“VMware”字符串,或者通過使用dmesg命令在內(nèi)核中查找是否有有關(guān)VMware硬件的信息。
在 Windows下的 DOO,其主要是在注冊表中搜索VMware SCSI適配器和VMware硬件類號的鍵值。這些特殊的鍵值如下:
HKEY_LOCAL_MACHINEHARDWAREDEVICEMAP ScsiScsi Port0Scsi Bus 0Target Id 0Logical Unit Id 0Identifier
HKEY_LOCAL_MACHINEHARDWAREDEVICEMAP ScsiScsi Port1Scsi Bus 0Target Id 0Logical Unit Id 0Identifier
HKEY_LOCAL_MACHINESYSTEMControlSet001Co ntrolClass{4D36E968-E325-11CE-BFC1-08002BE10318}