◆李 賀 張 超 楊 鑫 朱俊虎
基于虛擬機(jī)內(nèi)省的Intel PT多進(jìn)程監(jiān)控技術(shù)研究
◆李 賀1,2張 超2楊 鑫1,2朱俊虎1
(1.戰(zhàn)略支援部隊(duì)信息工程大學(xué) 河南 450002;2.清華大學(xué)網(wǎng)絡(luò)科學(xué)與網(wǎng)絡(luò)空間研究院 北京 100083)
以Intel Processor Trace(PT)為代表的片上動(dòng)態(tài)跟蹤技術(shù)有著低開(kāi)銷、低感知的優(yōu)良特性,在程序行為記錄和監(jiān)控領(lǐng)域得到了越來(lái)越廣泛的應(yīng)用。然而,由于片上動(dòng)態(tài)跟蹤技術(shù)依賴CPU特性實(shí)現(xiàn),對(duì)于操作系統(tǒng)內(nèi)核監(jiān)控、惡意代碼分析等需要在虛擬化平臺(tái)上運(yùn)行程序的場(chǎng)景支持還存在一些困難。本文通過(guò)對(duì)Intel PT片上動(dòng)態(tài)跟蹤技術(shù)的研究,提出了一套基于虛擬機(jī)內(nèi)省的Intel-PT多進(jìn)程監(jiān)控技術(shù),通過(guò)將Intel-PT嵌入到硬件虛擬化平臺(tái)上,實(shí)現(xiàn)了對(duì)硬件輔助虛擬化客戶機(jī)中的多個(gè)進(jìn)程并行進(jìn)行監(jiān)控。實(shí)驗(yàn)結(jié)果表明,該技術(shù)可以有效監(jiān)控硬件虛擬機(jī)中并行多個(gè)進(jìn)程。
虛擬化;多進(jìn)程監(jiān)控;非侵入調(diào)試
片上動(dòng)態(tài)跟蹤技術(shù)因其低開(kāi)銷、被監(jiān)控程序無(wú)感的優(yōu)良特性,在控制流完整性保護(hù)、惡意代碼分析檢測(cè)、執(zhí)行路徑記錄等領(lǐng)域得到了越來(lái)越廣泛的應(yīng)用。片上動(dòng)態(tài)跟蹤技術(shù)主要原理是使用CPU內(nèi)部專用的硬件非侵入式地實(shí)時(shí)記錄程序執(zhí)行的信息[1]。片上動(dòng)態(tài)跟蹤技術(shù)早期是為了解決嵌入式設(shè)備調(diào)試?yán)щy問(wèn)題而發(fā)明的,隨著Intel在其第五代CPU上添加了Intel Processor Trace (Intel PT)特性,使得在X86平臺(tái)下也可以使用在Intel CPU中內(nèi)嵌的片上動(dòng)態(tài)跟蹤技術(shù)對(duì)程序進(jìn)行非侵入調(diào)試。目前,Intel PT已經(jīng)被應(yīng)用于程序行為記錄[2][3]、模糊測(cè)試代碼覆蓋率生成[4][5]、軟件安全防護(hù)[6]、控制流圖完整性保護(hù)[7]等領(lǐng)域。
然而,由于Intel PT技術(shù)主要依賴CPU硬件才能發(fā)揮作用,對(duì)于虛擬化平臺(tái)支持的存在一定的困難。對(duì)于需要運(yùn)行在虛擬化平臺(tái)上的操作系統(tǒng)內(nèi)核執(zhí)行路徑記錄、惡意代碼分析等場(chǎng)景不能提供較好支持。
本文通過(guò)對(duì)Intel Virtualization Technology(VT)硬件輔助虛擬化技術(shù)以及操作系統(tǒng)實(shí)現(xiàn)原理的分析,在Linux 4.19.34 KVM模塊上實(shí)現(xiàn)了一套針對(duì)硬件輔助虛擬機(jī)中運(yùn)行的多個(gè)目標(biāo)進(jìn)程使用Intel PT進(jìn)行監(jiān)控的方法。
在Intel處理器手冊(cè)[8]第三卷36章5節(jié)對(duì)Intel PT監(jiān)控硬件虛擬機(jī)進(jìn)行了說(shuō)明。Intel PT技術(shù)可以和Intel VT硬件虛擬化技術(shù)相結(jié)合,對(duì)運(yùn)行在虛擬機(jī)中的程序進(jìn)行記錄。在進(jìn)入VMX硬件虛擬化模式時(shí),虛擬機(jī)是運(yùn)行在真實(shí)的物理CPU上,所以可以直接根據(jù)用于配置Intel PT的MSR(Model Specific Registers)寄存器的相應(yīng)字段監(jiān)控虛擬機(jī)中目標(biāo)進(jìn)程活動(dòng)。
通過(guò)配置MSR寄存器Intel PT使能位(TraceEn位),在虛擬機(jī)執(zhí)行非特權(quán)指令陷入時(shí),啟動(dòng)Intel PT監(jiān)控。當(dāng)虛擬機(jī)中執(zhí)行到特權(quán)指令,導(dǎo)致虛擬機(jī)陷出行時(shí)關(guān)閉Intel PT監(jiān)控。在Intel PT監(jiān)控硬件虛擬化狀態(tài)轉(zhuǎn)換時(shí),還可以生成VMCS包來(lái)標(biāo)識(shí)虛擬機(jī)動(dòng)作,同時(shí)可以通過(guò)MSR對(duì)虛擬機(jī)陷入和虛擬機(jī)陷出動(dòng)作是否產(chǎn)生對(duì)應(yīng)PT數(shù)據(jù)包進(jìn)行配置。
需要說(shuō)明的是,虛擬機(jī)陷出后的處理程序確實(shí)會(huì)對(duì)于PT控制流記錄產(chǎn)生一定影響,本文在不對(duì)這些影響進(jìn)行特殊處理,解碼器會(huì)在解碼時(shí)不對(duì)由于內(nèi)存空間轉(zhuǎn)換產(chǎn)生的數(shù)據(jù)包進(jìn)行處理,故而忽略虛擬機(jī)陷出帶來(lái)的大部分影響。
在X86平臺(tái)上,操作系統(tǒng)切換進(jìn)程上下文的過(guò)程中,需要對(duì)虛擬內(nèi)存空間進(jìn)行切換。以Linux為例,在用戶進(jìn)程發(fā)生切換時(shí),需要切換CPU運(yùn)行的地址空間,作為保存全局頁(yè)表目錄(Page Global Directory,PGD)的頁(yè)表基地址寄存器(CR3寄存器)內(nèi)容也需要切換。另外,為了實(shí)現(xiàn)進(jìn)程空間的隔離,每個(gè)進(jìn)程的全局頁(yè)表目錄內(nèi)容都是不同的,這樣就可以通過(guò)全局頁(yè)表目錄來(lái)區(qū)分進(jìn)程。
虛擬機(jī)內(nèi)省(virtual machine introspection,VMI)指的是在虛擬機(jī)運(yùn)行過(guò)程中獲取其內(nèi)部運(yùn)行程序的狀態(tài)。在Intel VT硬件虛擬化中,可以將設(shè)置為在寫頁(yè)表基址寄存器時(shí)執(zhí)行虛擬機(jī)陷出動(dòng)作,退出虛擬化狀態(tài)(VMX Non-root模式)。在虛擬機(jī)啟動(dòng)時(shí)將虛擬機(jī)行為控制域中對(duì)應(yīng)寫頁(yè)表基址寄存器的位設(shè)置為監(jiān)控模式,就可以對(duì)虛擬機(jī)切換進(jìn)程動(dòng)作進(jìn)行監(jiān)控。這樣就具備了使用虛擬機(jī)內(nèi)省技術(shù)監(jiān)控虛擬機(jī)進(jìn)程切換狀態(tài)的能力。
圖1 多進(jìn)程監(jiān)控示意圖
通過(guò)監(jiān)控頁(yè)表基址寄存器的切換,內(nèi)核虛擬化模塊就具備了在虛擬機(jī)外部監(jiān)控特定進(jìn)程運(yùn)行狀態(tài)的能力。如圖1所示,首先需要將目標(biāo)進(jìn)程頁(yè)表基址寄存器的值告知外部監(jiān)控程序。而后任何虛擬機(jī)陷出行為都會(huì)讓PT監(jiān)控停止,這時(shí)就可以修改PT監(jiān)控的各項(xiàng)配置。在目標(biāo)進(jìn)程通過(guò)上下文切換從就緒狀態(tài)進(jìn)入執(zhí)行狀態(tài)時(shí),可以通過(guò)硬件虛擬化捕獲CR3寄存器的值,通過(guò)比較,如果是目標(biāo)進(jìn)程就可以啟動(dòng)PT對(duì)該進(jìn)程進(jìn)行監(jiān)控,如不是就將虛擬機(jī)的頁(yè)表目錄寄存器改為指令要修改目標(biāo)值,而后跳過(guò)這一條指令返回虛擬化模式繼續(xù)執(zhí)行。對(duì)于多個(gè)目標(biāo)進(jìn)程,可以在內(nèi)核中構(gòu)造一個(gè)表來(lái)記錄這寫進(jìn)程的頁(yè)表目錄寄存器值,在進(jìn)程進(jìn)入執(zhí)行狀態(tài)前查詢是否在這個(gè)表中。為了提高查詢效率,可以利用內(nèi)核中比較常見(jiàn)的哈希鏈表來(lái)存放全局頁(yè)表目錄。
由于使用Intel PT需要對(duì)MSR寄存器進(jìn)行直接操作,所以在內(nèi)核模塊中實(shí)現(xiàn)Intel PT的配置管理模塊。在文獻(xiàn)[4]實(shí)現(xiàn)的基礎(chǔ)上,本文利用Linux 4.19.34 KVM硬件虛擬化內(nèi)核模塊進(jìn)行修改,配合QEMU 2.9.0用戶態(tài)虛擬機(jī)管理器以及在QEMU附加定制的PT解碼器模塊,實(shí)現(xiàn)了上述多進(jìn)程監(jiān)控方案。在KVM虛擬機(jī)初始化過(guò)程中,用setup_vmcs_config函數(shù)對(duì)虛擬機(jī)行為控制數(shù)據(jù)結(jié)構(gòu)部分內(nèi)容進(jìn)行初始化。在擴(kuò)展頁(yè)表功能開(kāi)啟的情況下,負(fù)責(zé)標(biāo)識(shí)監(jiān)控頁(yè)表基址寄存器寫操作的CPU_BASED_CR3 _LOAD_EXITING位會(huì)被置為關(guān)閉。因此通過(guò)簡(jiǎn)單地將代碼中置位的操作去掉,就可以在擴(kuò)展頁(yè)表功能開(kāi)啟的情況下啟用CR3寄存器寫操作監(jiān)控,所有寫入CR3寄存器的指令都會(huì)引發(fā)虛擬機(jī)陷出動(dòng)作,提高被測(cè)程序執(zhí)行效率。
為了能夠有效驗(yàn)證多進(jìn)程監(jiān)控技術(shù),本文選擇Windows系統(tǒng)中VirtualAlloc函數(shù)對(duì)應(yīng)內(nèi)核函數(shù)作為測(cè)試目標(biāo)。本文基于文獻(xiàn)[4]專門在Linux 4.19.34上實(shí)現(xiàn)了一個(gè)單進(jìn)程監(jiān)控的Intel PT動(dòng)態(tài)監(jiān)控平臺(tái)進(jìn)行工作對(duì)比,并實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的測(cè)試程序。測(cè)試程序的主要作用是,開(kāi)啟PT監(jiān)控,并將最后生成的覆蓋率數(shù)據(jù)保存下來(lái)。通過(guò)比較程序并發(fā)時(shí)生成的控制流數(shù)據(jù),查看有無(wú)多進(jìn)程PT監(jiān)控能否在并發(fā)的情況下記錄內(nèi)核活動(dòng)。在虛擬機(jī)中通過(guò)腳本并發(fā)執(zhí)行10個(gè)測(cè)試程序,記錄其對(duì)應(yīng)的內(nèi)核代碼執(zhí)行路徑。生成的跟蹤記錄數(shù)據(jù)主要是跳轉(zhuǎn)指令地址(基本塊尾部,省略前32位地址),采用IDA生成控制流圖,并將PT記錄的地址標(biāo)為黃色,為了方便理解,本文將路徑中經(jīng)過(guò)但沒(méi)有記錄基本塊也進(jìn)行染色。便于比較兩者之間的區(qū)別。首先針對(duì)本文實(shí)現(xiàn)的多進(jìn)程監(jiān)控進(jìn)行測(cè)試,其次針對(duì)專門實(shí)現(xiàn)的單進(jìn)程PT監(jiān)控平臺(tái)進(jìn)行對(duì)比。
圖2 PT多進(jìn)程監(jiān)控記錄并發(fā)進(jìn)程的結(jié)果
本次測(cè)試選取Windows 10(1809英文版)ntoskrnl.exe中sub_FFFFF80469EED480函數(shù)做展示,ntoskrnl.exe內(nèi)存地址為0xfffff80469e97000到0xfffff8046a888000。如圖2所示,可以看出圖2(b)所示的控制流圖完整地記錄了內(nèi)核代碼正確的執(zhí)行路徑,將sub_FFFFF80469EED480函數(shù)中內(nèi)核執(zhí)行路徑上的所有條件跳轉(zhuǎn)都進(jìn)行了正確的記錄。
如圖3所示,單進(jìn)程PT監(jiān)控測(cè)試結(jié)果記錄的前幾個(gè)地址都在sub_FFFFF800596EECF0函數(shù)中,此時(shí)ntoskrnl.exe映射在從0xfffff800596a5000到0xfffff8005a096000的內(nèi)存,從圖3(b)可以看出,紅框中記錄的地址不僅前兩個(gè)是無(wú)效的零地址,第三個(gè)地址0x596ef183到第四個(gè)地址0x596ef1aa中間路徑上存在基本塊缺失,如圖3(a)圖所示,最短路徑上缺少兩個(gè)條件跳轉(zhuǎn)分支的記錄(紫色基本塊)。另外,如圖4所示在第五個(gè)地址0x596ef1d3出現(xiàn)了偏移錯(cuò)誤,地址指向了指令的內(nèi)部字節(jié)。
圖3 PT單進(jìn)程監(jiān)控記錄并發(fā)進(jìn)程的結(jié)果
圖4 錯(cuò)誤的跳轉(zhuǎn)指令地址
為了進(jìn)一步證明多進(jìn)程記錄有效性,分別對(duì)12個(gè)進(jìn)程進(jìn)行監(jiān)控,通過(guò)10組的實(shí)驗(yàn)進(jìn)行對(duì)比,出現(xiàn)沒(méi)有任何PT基本塊地址記錄的次數(shù)如表1所示:
表1 記錄地址數(shù)量為零的PT記錄
從表1中可以看出,PT多進(jìn)程監(jiān)控雖然也存在獲取地址不穩(wěn)定的問(wèn)題,但相對(duì)于單進(jìn)程監(jiān)控而言,已經(jīng)又了質(zhì)的提升,具備實(shí)用價(jià)值。PT多進(jìn)程監(jiān)控針對(duì)Linux內(nèi)核也可以獲得比較好的效果。
本文研究了Intel PT在監(jiān)控虛擬化平臺(tái)程序中存在的不足,設(shè)計(jì)和實(shí)現(xiàn)了基于虛擬機(jī)內(nèi)省的Intel PT多進(jìn)程監(jiān)控技術(shù),通過(guò)捕獲虛擬機(jī)進(jìn)程切換過(guò)程,并利用Intel PT監(jiān)控硬件虛擬機(jī)的特性,有效實(shí)現(xiàn)了對(duì)于虛擬機(jī)中多個(gè)進(jìn)程進(jìn)行并行監(jiān)控。
[1]扈嘯,陳書明,李杰,等.片上 trace:嵌入式處理器的有效調(diào)試和優(yōu)化技術(shù)[J].國(guó)防科技大學(xué)學(xué)報(bào),2008(2):46-50.
[2]Linux. Perf [EB/OL]. https://perf.wiki.kernel.org/index.php/Main_Page.
[3]Cui W,Ge X, Kasikci B,et al. {REPT}:ReverseDebugging of Failures in Deployed Software[C]//13th {USENIX} Symposium on Operating Systems Design and Implementation({OSDI} 18).2018:17-32.
[4]Schumilo S,Aschermann C,Gawlik R,et al. kAFL: Hardware-Assisted Feedback Fuzzing for {OS} Kernels[C]//26th {USENIX} Security Symposium ({USENIX} Security 17).2017:167-182.
[5]Zhang G,Zhou X,Luo Y,et al. Ptfuzz:Guided fuzzing with processor trace feedback[J].IEEE Access,2018(6):37302-37313.
[6]王心然,劉宇濤,陳海波.基于 IPT 硬件的內(nèi)核模塊 ROP 透明保護(hù)機(jī)制[J].軟件學(xué)報(bào),2018,29(5):1333-1347.
[7]Ge X,Cui W,Jaeger T. GRIFFIN: Guarding Control Flows Using Intel Processor Trace[J]. Acm Sigarch Computer Architecture News,2017,45(4):585-598.
[8]Intel. Developer Manuals [EB/OL]. https://software.intel.com/en-us/articles/intel-sdm.
國(guó)家自然科學(xué)基金聯(lián)合基金項(xiàng)目(U1736209)資助。