路子聰,徐開勇,郭 松,肖警續(xù)
(信息工程大學(xué),鄭州 450000)
Android是基于Linux內(nèi)核的開源操作系統(tǒng),操作系統(tǒng)的安全性是Android安全體系中非常重要的一部分。內(nèi)核是操作系統(tǒng)中最重要的組成部分,目前,針對(duì)Android系統(tǒng)內(nèi)核的攻擊日益增多。對(duì)于Android系統(tǒng)內(nèi)核而言,它的安全威脅一方面是繼承Linux 系統(tǒng)本身的漏洞,另一方面是由于Android系統(tǒng)本身不夠完善[1]。有些學(xué)者對(duì)Android內(nèi)核漏洞進(jìn)行挖掘[2],但由于Android生態(tài)系統(tǒng)的復(fù)雜性,內(nèi)核漏洞的修補(bǔ)通常需要很長(zhǎng)的周期,這意味著內(nèi)核防御技術(shù)對(duì)于Android來(lái)說(shuō)至關(guān)重要。Android4.3版本之前,安全模型部分是基于應(yīng)用沙盒的概念,系統(tǒng)可以為每個(gè)應(yīng)用程序提供一個(gè)自己的沙盒并分配一個(gè)獨(dú)有的UID(User IDentification),使每個(gè)應(yīng)用在自己的沙盒中運(yùn)行來(lái)保證應(yīng)用的資源獨(dú)立存儲(chǔ)。Shabtai 等[3]提出將安全增強(qiáng)型 Linux(Security-Enhanced Linux, SELinux) 植入到Android 平臺(tái)中,限制應(yīng)用對(duì)系統(tǒng)資源的訪問,增強(qiáng)Android 系統(tǒng)安全。從Android 4.3 版起,SELinux開始用于進(jìn)一步定義 Android 應(yīng)用沙盒的邊界。雖然SEAndroid(Security-Enhanced Android)對(duì)基于應(yīng)用程序的攻擊有很好的防御效果,然而SEAndroid卻依賴于操作系統(tǒng)內(nèi)核完整性的假設(shè)。如果Linux內(nèi)核受到威脅(或許還有未知的漏洞),則Android安全機(jī)制的SE (Security-Enhanced)可能被禁用并且效果不佳[4]。
有學(xué)者對(duì)在移動(dòng)平臺(tái)上增強(qiáng)Android系統(tǒng)內(nèi)核的安全性進(jìn)行了研究。針對(duì)Android設(shè)備大部分使用ARM處理器,利用ARM的安全擴(kuò)展TrustZone[5]可以用來(lái)保護(hù)系統(tǒng)[4,6-10],盡管TrustZone是基于硬件進(jìn)行數(shù)據(jù)保護(hù),但其攔截能力的局限性使得它不適合作域內(nèi)反思和域內(nèi)保護(hù)。這就是Hypervision[4]在操作系統(tǒng)上作出顯著改變的原因,但其在模式切換的消耗大,導(dǎo)致有一定局限性。
利用硬件輔助虛擬化技術(shù)可以用來(lái)保護(hù)系統(tǒng)安全[11],許多研究人員利用虛擬化技術(shù)來(lái)保護(hù)ARM平臺(tái)上的系統(tǒng)安全。使用ARM上的虛擬化擴(kuò)展,提出了Xen on ARM[12]、KVM(Kernel-based Virtual Machine) for ARM[13]等hypervisor;但是, Xen和KVM需要一個(gè)主機(jī)系統(tǒng)來(lái)處理一些重要的中斷,這導(dǎo)致可信計(jì)算基 (Trusted Computing Base,TCB)包含主機(jī)系統(tǒng)的代碼庫(kù),而系統(tǒng)的TCB越大就越脆弱,并且由于它們對(duì)性能影響較大不滿足移動(dòng)設(shè)備低功耗便捷的要求。L4Android[14]對(duì)每個(gè)場(chǎng)合的Android系統(tǒng)進(jìn)行隔離,但對(duì)系統(tǒng)的攻擊仍無(wú)法阻止。DroidVisor[15]對(duì)內(nèi)核的靜態(tài)關(guān)鍵對(duì)象進(jìn)行完整性保護(hù),并對(duì)進(jìn)程和模塊進(jìn)行rootkit檢測(cè),但它無(wú)法檢測(cè)對(duì)動(dòng)態(tài)的熵池資源進(jìn)行修改的rootkit。
針對(duì)以上問題,本文提出了一種利用ARM硬件輔助虛擬化的Android內(nèi)核動(dòng)態(tài)完整性度量 (Dynamic Integrity Measurement of Android,DIMDroid)方案。通過(guò)在任意時(shí)刻對(duì)Android內(nèi)核的各種重要資源的值和數(shù)據(jù)結(jié)構(gòu)進(jìn)行動(dòng)態(tài)完整性度量來(lái)保證Android內(nèi)核的安全性。
要完成對(duì)Android內(nèi)核進(jìn)行完整性度量的目標(biāo),結(jié)合相關(guān)因素和面臨的問題要考慮到以下幾個(gè)方面的挑戰(zhàn):
1)度量模塊的位置。如果度量模塊與Android內(nèi)核位于同一特權(quán)層,則進(jìn)入Android內(nèi)核的攻擊可能會(huì)對(duì)度量模塊造成一定威脅,所以要設(shè)置好度量模塊的位置以解決度量模塊與被度量Android內(nèi)核的隔離問題。
2)度量對(duì)象的選取與重構(gòu)。度量對(duì)象必須能表達(dá)當(dāng)前Android內(nèi)核的完整性信息,同時(shí)在Android內(nèi)核外部對(duì)其實(shí)施動(dòng)態(tài)度量,所以存在度量層與被度量?jī)?nèi)核之間的語(yǔ)義鴻溝問題。通過(guò)在度量層對(duì)選取的Android內(nèi)核度量對(duì)象進(jìn)行重構(gòu)來(lái)解決該問題。
3)度量模塊自身的安全性。對(duì)Android內(nèi)核進(jìn)行動(dòng)態(tài)度量,首先要保證度量功能模塊自身的安全啟動(dòng)并保證在運(yùn)行時(shí)不受到在Android中獲得root權(quán)限的惡意代碼的攻擊。
DIMDroid設(shè)計(jì)利用了ARM平臺(tái)的虛擬化技術(shù),為了便于理解,將簡(jiǎn)單介紹ARM平臺(tái)上的虛擬化技術(shù)的相關(guān)背景。
最近的ARMv7-A架構(gòu)在ARM處理器上引入了虛擬化擴(kuò)展。具體來(lái)說(shuō),引入了一種稱為hyp模式的新處理器模式,它比現(xiàn)有的非安全狀態(tài)中的svc模式擁有更高的特權(quán)級(jí)別。Android操作系統(tǒng)和應(yīng)用程序可以不經(jīng)過(guò)任何修改就能分別運(yùn)行在現(xiàn)有的svc模式和usr模式下。具有虛擬化擴(kuò)展和安全擴(kuò)展的ARM處理器的架構(gòu)如圖1所示。

圖1 ARM處理器的架構(gòu)
ARM虛擬化擴(kuò)展使用兩階段頁(yè)表轉(zhuǎn)換來(lái)更好地控制客戶的虛擬內(nèi)存。Stage-1頁(yè)表由客戶操作系統(tǒng)維護(hù),客戶操作系統(tǒng)可利用Stage-1頁(yè)表將客戶虛擬地址(Virtual Address,VA)轉(zhuǎn)換為中間物理地址(Intermediate Physical Address,IPA)。將IPA轉(zhuǎn)換為物理地址(Physical Address,PA)的Stage-2頁(yè)表由虛擬機(jī)管理程序維護(hù),并且對(duì)客戶操作系統(tǒng)保持透明。ARM 虛擬化擴(kuò)展必須與大物理地址擴(kuò)展和安全擴(kuò)展同時(shí)使用。如表1所示大物理地址擴(kuò)展的bit[7:6]為Stage-2的訪問權(quán)限位HAP[2:1],通過(guò)對(duì)Stage-2頁(yè)表項(xiàng)(Page Table Entry,PTE)中屬性位的適當(dāng)配置,客戶操作系統(tǒng)的內(nèi)存訪問將處于管理程序的控制之下。

表1 Stage-2訪問權(quán)限控制
為了實(shí)現(xiàn)對(duì)Android內(nèi)核的動(dòng)態(tài)度量,利用ARM平臺(tái)下的硬件輔助虛擬化技術(shù),設(shè)計(jì)了如圖2所示的DIMDroid體系架構(gòu)。DIMDroid主要實(shí)現(xiàn)了度量模塊與Android內(nèi)核的隔離,利用度量代理對(duì)Android內(nèi)核中的度量對(duì)象進(jìn)行重構(gòu)和動(dòng)態(tài)度量。此外,還通過(guò)基于硬件的信任鏈啟動(dòng)保護(hù)和基于內(nèi)存隔離的運(yùn)行時(shí)保護(hù)來(lái)對(duì)DIMDroid自身安全進(jìn)行保證。

圖2 DIMDroid體系架構(gòu)
其中,DIMDroid的度量模塊置于hyp模式下(以下簡(jiǎn)稱度量層)。Android操作系統(tǒng)控制第一階段頁(yè)表,DIMDroid控制第二階段頁(yè)表,進(jìn)行第二階段地址轉(zhuǎn)換的頁(yè)表對(duì)Android 操作系統(tǒng)是透明的。DIMDroid通過(guò)Stage-2頁(yè)表將其和度量代理模塊設(shè)置為內(nèi)核不可訪問并將其聲明為直接內(nèi)存訪問 (Direct Memory Access,DMA)緩沖區(qū),保證DIMDroid能夠從Android內(nèi)核外部進(jìn)行系統(tǒng)運(yùn)行時(shí)的完整性度量,解決了度量模塊與被度量系統(tǒng)的隔離問題,降低了度量軟件模塊遭受攻擊的可能性。
基準(zhǔn)庫(kù)提供度量的基準(zhǔn)值,其中的主要內(nèi)容為靜態(tài)度量對(duì)象的Hash值與除子集約束對(duì)象外的動(dòng)態(tài)度量的約束值,同時(shí)采用對(duì)基準(zhǔn)值進(jìn)行AES(Advanced Encryption Standard)加密保證基準(zhǔn)值的安全性,為了防止AES密鑰的泄露,將其存儲(chǔ)在Trustzone中。基準(zhǔn)庫(kù)是在系統(tǒng)啟動(dòng)時(shí)構(gòu)建的,此時(shí)的系統(tǒng)由Trustzone保證了基于硬件的可信鏈且不聯(lián)網(wǎng),即基準(zhǔn)庫(kù)的構(gòu)建是在系統(tǒng)可信條件下進(jìn)行的,同時(shí)避免其受到網(wǎng)絡(luò)攻擊。
DIMDroid的度量代理模塊位于svc模式下,通過(guò)System.map文件獲取度量對(duì)象的虛擬地址并將其傳給度量模塊,并在度量層下進(jìn)行度量對(duì)象的語(yǔ)義重構(gòu)并進(jìn)行完整性分析。
為了使度量對(duì)象全面描述Android內(nèi)核運(yùn)行時(shí)的完整性,本文從Android內(nèi)核的組成運(yùn)行原理和內(nèi)核惡意軟件的攻擊面等方面確定系統(tǒng)運(yùn)行中度量對(duì)象的選取。
在分析加載Android操作系統(tǒng)內(nèi)核的各種關(guān)鍵組成元素后,發(fā)現(xiàn)例如基本只讀數(shù)據(jù)段、內(nèi)核代碼段、系統(tǒng)調(diào)用表、中斷描述符表、異常向量表、內(nèi)核模塊代碼等數(shù)據(jù)結(jié)構(gòu)在Android系統(tǒng)運(yùn)行中是靜態(tài)不變的,一旦發(fā)現(xiàn)這些數(shù)據(jù)結(jié)構(gòu)被篡改、發(fā)生變化,系統(tǒng)就不會(huì)以預(yù)期的方式運(yùn)行。例如kbeast、enyelkm等rootkit可以篡改中斷處理函數(shù)和系統(tǒng)調(diào)用表中的表項(xiàng)來(lái)執(zhí)行惡意代碼,因此這些靜態(tài)數(shù)據(jù)結(jié)構(gòu)的完整性在Android系統(tǒng)運(yùn)行過(guò)程中至關(guān)重要。
與此同時(shí),例如Android內(nèi)核中進(jìn)程鏈表、模塊鏈表、初始化數(shù)據(jù)段、熵池資源等數(shù)據(jù)結(jié)構(gòu)在Android系統(tǒng)運(yùn)行過(guò)程中是動(dòng)態(tài)變化的。考慮到某些直接對(duì)象操作(Direct Kernel Object Manipulation,DKOM)的rootkit,它們可以對(duì)某個(gè)模塊從模塊鏈表隱藏或者對(duì)某個(gè)進(jìn)程從進(jìn)程鏈表中隱藏,例如對(duì)ps、top等系統(tǒng)服務(wù)程序篡改或者進(jìn)行文件替換,當(dāng)監(jiān)控軟件或程序調(diào)用這些服務(wù)程序查看進(jìn)程信息時(shí)過(guò)濾掉了惡意軟件想要隱藏的進(jìn)程,從而實(shí)現(xiàn)惡意軟件對(duì)內(nèi)核的攻擊,但在這些內(nèi)核數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)變化中它們滿足一定的特征約束。例如,Android內(nèi)核中的進(jìn)程滿足running_list?all-tasks,即在運(yùn)行鏈表running_list中的元素全都包含在進(jìn)程鏈表all-tasks中,或者all-tasks==ps-tasks,即所有的進(jìn)程都應(yīng)該可以用ps系統(tǒng)服務(wù)程序觀測(cè)到;adore-ng和wipemod等rootkit可以實(shí)現(xiàn)惡意模塊隱藏和惡意進(jìn)程隱藏,即不滿足進(jìn)程鏈表或模塊鏈表的子集特征約束; Android內(nèi)核使用偽隨機(jī)數(shù)生成器(Pseudo Random Number Generator,PRNG)生成其他安全關(guān)鍵應(yīng)用程序所需隨機(jī)數(shù),為了確保PRNG生成的數(shù)字是偽隨機(jī)的,每次使用攪拌函數(shù)更新熵池的內(nèi)容字節(jié)從熵池中提取,攪拌函數(shù)使用的多項(xiàng)式系數(shù)為在struct poolinfo數(shù)據(jù)結(jié)構(gòu)的整數(shù)字段,這些整數(shù)字段的取值滿足一定的邊界約束,具體來(lái)說(shuō)poolinfo.tap1∈{26, 103}, poolinfo.tap2∈{20, 76},poolinfo.tap3∈{14, 51},poolinfo.tap4∈{7, 25},poolinfo.tap5==1 等。
根據(jù)這些數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)變化的特征,本文可將它們分為四種約束:固定長(zhǎng)度約束、固定取值約束、子集約束和邊界約束,如系統(tǒng)的最大線程數(shù)max_threads屬于固定取值約束,進(jìn)程、模塊等屬于子集約束,熵池結(jié)構(gòu)屬于邊界約束等。
通過(guò)以上分析在Android系統(tǒng)運(yùn)行過(guò)程中,內(nèi)核度量對(duì)象包括靜態(tài)度量對(duì)象和動(dòng)態(tài)度量對(duì)象兩大類。
如果將度量軟件直接置于Android內(nèi)核中,則與Android內(nèi)核運(yùn)行在同一個(gè)特權(quán)級(jí),易受到惡意軟件的攻擊。而將度量軟件置于hyp模式下,實(shí)現(xiàn)了度量軟件與被度量的Android內(nèi)核的分離,但hyp模式下的度量模塊獲取到的信息為底層的二進(jìn)制信息,無(wú)法獲取內(nèi)核級(jí)的語(yǔ)義信息。因此,分析之前需要根據(jù)內(nèi)核結(jié)構(gòu)知識(shí)和底層的二進(jìn)制信息在度量層進(jìn)行度量對(duì)象的重構(gòu)。
首先,由于Android內(nèi)核是基于Linux內(nèi)核的,可以通過(guò)內(nèi)核提供的system.map 文件獲取度量對(duì)象的虛擬地址,system.map 文件保存了成千上萬(wàn)個(gè)內(nèi)核導(dǎo)出符號(hào)和其對(duì)應(yīng)的虛擬地址。其中也包括本文在上一節(jié)分析得到的度量對(duì)象及其虛擬地址,例如內(nèi)核代碼段地址、初始化數(shù)據(jù)段地址、異常向量表虛擬地址、系統(tǒng)調(diào)用表虛擬地址、init進(jìn)程地址等。由這些虛擬地址經(jīng)過(guò)兩階段地址轉(zhuǎn)換過(guò)程可以得到度量對(duì)象的物理地址,根據(jù)Android內(nèi)核存儲(chǔ)這些度量對(duì)象的方式(如鏈表、數(shù)組、樹等),度量對(duì)象的類型和各個(gè)字段的偏移可以在度量層重構(gòu)這些度量對(duì)象,方便對(duì)其進(jìn)行分析。
其中經(jīng)過(guò)兩階段地址轉(zhuǎn)換得到的物理地址為該度量對(duì)象在物理設(shè)備中的起始地址,度量對(duì)象的類型為系統(tǒng)定義的鏈表、整型、長(zhǎng)整型或者結(jié)構(gòu)體等,度量對(duì)象中字段的偏移為該字段相對(duì)于結(jié)構(gòu)體起始地址的偏移量。具體分析過(guò)程如下:
輸入 度量對(duì)象的虛擬地址Va、中間地址Ipa、起始物理地址Pa、度量對(duì)象的類型定義SC[]、字段偏移量FS[]、內(nèi)核符號(hào)表文件System.map;
輸出 靜態(tài)對(duì)象列表SML[]或動(dòng)態(tài)對(duì)象列表DML []。
Va[]=Request_Proxy (System.map);
while (Va[i]!=0)
Ttbr=Read_Guest_TTBR();
Ipa=Translate_Stage1_Guest(Ttbr, Va);
Pa=Translate_Stage2(Ipa);
if (Va[i]∈codesection|datasection|IDT
|System_call|others)
//靜態(tài)度量對(duì)象重構(gòu)
ML[]=getcode(Pa,SC[i]);
//內(nèi)核代碼段
ML[]=getdata(Pa,SC[i]);
//只讀數(shù)據(jù)段
ML[]=getSys_call(Pa,SC[i]);
//系統(tǒng)調(diào)用表
ML[]=getIDT(Pa,SC[i]);
//中斷向量表
ML[]=getOthers (Pa,SC[i]);
//異常向量表、全局描述符表等其他靜態(tài)對(duì)象
return SML[i];
else if (Va[i]∈init_task|module_set|others)
//動(dòng)態(tài)度量對(duì)象重構(gòu)
ML[]=getTask(Pa,SC[i],FS[i]);
//進(jìn)程
ML[]=getMoudle(Pa,SC[i],FS[i]);
//模塊
ML[]=getOthers(Pa,SC[i],FS[i]);
//文件、線程數(shù)等其他動(dòng)態(tài)對(duì)象
return DML[i];
end if
end while
由于內(nèi)核代碼、內(nèi)核初始化數(shù)據(jù)、系統(tǒng)調(diào)用表和中斷向量表等靜態(tài)度量對(duì)象的內(nèi)容是連續(xù)分布的,根據(jù)虛擬地址很容易得到,故重構(gòu)分析過(guò)程相對(duì)單一,本文不再詳細(xì)介紹,重點(diǎn)討論動(dòng)態(tài)度量對(duì)象的重構(gòu)分析方法。下面以分析Android系統(tǒng)的進(jìn)程為例說(shuō)明度量對(duì)象的重構(gòu)分析的基本思想。
如圖3所示,單個(gè)進(jìn)程的信息存儲(chǔ)在該進(jìn)程的任務(wù)結(jié)構(gòu)task_struct中,Android內(nèi)核中的所有進(jìn)程通過(guò)一個(gè)雙向循環(huán)鏈表all-tasks來(lái)前后鏈接,單個(gè)進(jìn)程的信息存儲(chǔ)在進(jìn)程結(jié)構(gòu)體task_struct中。為了獲取全部進(jìn)程信息,需要某個(gè)進(jìn)程的信息,0號(hào)進(jìn)程init_task是系統(tǒng)所有進(jìn)程的父進(jìn)程,即進(jìn)程鏈表的鏈表頭。通過(guò)在 system.map 文件查詢標(biāo)識(shí)為init_task的符號(hào),找到數(shù)據(jù)結(jié)構(gòu) init_task 的虛擬地址Va,經(jīng)過(guò)兩階段地址轉(zhuǎn)換獲取的物理地址Pa即為init_task對(duì)應(yīng)task_struct結(jié)構(gòu)的首地址,根據(jù)字段類型定義與地址偏移量就可獲得例如pid、comm和tasks等對(duì)應(yīng)的語(yǔ)義內(nèi)容,存入pi[],pi[]即為在度量層重構(gòu)的該進(jìn)程信息,再以該tasks字段的值為下一個(gè) task_struct 的虛擬地址繼續(xù)循環(huán)該過(guò)程,直到發(fā)現(xiàn)某個(gè)進(jìn)程 tasks 的值和init_task 的虛擬地址值相同時(shí)停止該過(guò)程,由于系統(tǒng)的進(jìn)程鏈表是一個(gè)循環(huán)鏈表,可知當(dāng)循環(huán)結(jié)束時(shí)已經(jīng)遍歷到了其余所有進(jìn)程。

圖3 在度量層對(duì)內(nèi)核進(jìn)程視圖重構(gòu)
與此同時(shí),調(diào)度程序使用一個(gè)名為run-list的鏈表來(lái)調(diào)度進(jìn)程以執(zhí)行,采用與分析進(jìn)程鏈表一樣的方法分析runqueues結(jié)構(gòu)體,將此時(shí)在CPU上運(yùn)行隊(duì)列上所有就緒進(jìn)程信息存入pr[],將得到的pi[]與pr[]存入DML[]。
因?yàn)樵谙到y(tǒng)中的進(jìn)程需要滿足running_list?all-tasks的約束關(guān)系,分析過(guò)程中則重點(diǎn)分析pr[]中的進(jìn)程及其字段的元素是否全部包含在pi[]中。若滿足該約束,即進(jìn)程滿足子集約束,此時(shí)進(jìn)程無(wú)篡改。反之,系統(tǒng)進(jìn)程被篡改,記錄篡改日志并報(bào)告系統(tǒng)隱藏的進(jìn)程。
DIMDroid的度量步驟如下:
1)DIMDroid在度量時(shí)間點(diǎn)時(shí)刻進(jìn)行一次完整性度量。度量點(diǎn)的選取采用隨機(jī)化時(shí)間算法得到,保證系統(tǒng)度量的隨機(jī)性。完整性度量首先在度量層進(jìn)行度量對(duì)象的重構(gòu)。具體來(lái)說(shuō),DIMDroid通過(guò)度量代理模塊獲取度量對(duì)象的虛擬地址,度量代理模塊訪問Linux內(nèi)核提供的System.map文件獲取度量對(duì)象的虛擬地址VA。然后,將該虛擬地址傳遞給度量模塊后,由度量模塊使用被度量系統(tǒng)的第一階段頁(yè)表結(jié)構(gòu)獲取VA對(duì)應(yīng)的中間物理地址IPA;接著度量模塊利用DIMDroid控制的第二階段頁(yè)表結(jié)構(gòu)獲取IPA對(duì)應(yīng)的物理地址PA;最后,根據(jù)度量對(duì)象的物理地址、類型定義與各個(gè)字段的偏移重構(gòu)該度量對(duì)象。
2)判斷度量對(duì)象為靜態(tài)對(duì)象或者動(dòng)態(tài)對(duì)象并對(duì)其進(jìn)行完整性度量分析。若為靜態(tài)對(duì)象的度量需要進(jìn)行Hash后進(jìn)行AES加密與基準(zhǔn)庫(kù)的基準(zhǔn)值進(jìn)行一致性比對(duì),本文采用安全哈希算法 (Secure Hash Algorithm,SHA1)來(lái)計(jì)算對(duì)象的Hash值。動(dòng)態(tài)對(duì)象的度量根據(jù)其相應(yīng)的約束進(jìn)行區(qū)分驗(yàn)證。若動(dòng)態(tài)對(duì)象需要滿足例如進(jìn)程、模塊等的子集約束,則需要同時(shí)構(gòu)建兩個(gè)集合列表,例如驗(yàn)證進(jìn)程的完整性時(shí)構(gòu)建pi[]與pr[]集合列表,通過(guò)這兩個(gè)列表是否滿足子集約束判斷該動(dòng)態(tài)對(duì)象的完整性;如果動(dòng)態(tài)對(duì)象滿足的約束為其他約束,則需將該度量動(dòng)態(tài)對(duì)象鏈表長(zhǎng)度或者相關(guān)內(nèi)容與基準(zhǔn)庫(kù)中存儲(chǔ)的固定長(zhǎng)度約束值、固定取值約束值或者取值邊界范圍進(jìn)行對(duì)比判斷該動(dòng)態(tài)對(duì)象的完整性。若度量對(duì)象滿足對(duì)應(yīng)的約束,報(bào)告系統(tǒng)的完整性;若不滿足則及時(shí)報(bào)告系統(tǒng)對(duì)應(yīng)關(guān)鍵內(nèi)核對(duì)象的篡改情況并記錄日志中。
DIMDroid的完整性度量的基本過(guò)程如圖4所示。
DIMDroid處于hyp模式中,在普通區(qū)域?qū)Y源擁有最高的訪問權(quán)限,對(duì)處于svc模式中的Android內(nèi)核進(jìn)行動(dòng)態(tài)度量,因此,DIMDroid自身的安全至關(guān)重要。DIMDroid建立基于硬件的信任鏈啟動(dòng)保護(hù)和基于內(nèi)存隔離的運(yùn)行時(shí)保護(hù),同時(shí),DIMDroid使用簡(jiǎn)單易懂的度量策略,方便進(jìn)行形式化驗(yàn)證。

圖4 DIMDroid的完整性度量過(guò)程
在實(shí)現(xiàn)中,本文使用加載時(shí)完整性檢測(cè)來(lái)建立基于硬件的信任鏈。也就是說(shuō),TrustZone首先驗(yàn)證bootloader的完整性,然后由bootloader驗(yàn)證內(nèi)核映像的完整性。DIMDroid所需的數(shù)據(jù)對(duì)象和資源為內(nèi)核初始化的一部分,且在內(nèi)核啟動(dòng)任何進(jìn)程之前完成其初始化。在DIMDroid初始化結(jié)束時(shí),通過(guò)配置Stage-2頁(yè)面表,使其自身與內(nèi)核隔離,以便內(nèi)核在此之后不再擁有對(duì)DIMDroid的訪問控制權(quán)限。該過(guò)程實(shí)現(xiàn)的細(xì)節(jié)如圖5所示,灰色部分為系統(tǒng)的TCB。
步驟1 DIMDroid被組裝到內(nèi)核映象中并由bootloader加載。在TrustZone驗(yàn)證bootloader的完整性后,bootloader進(jìn)入非安全狀態(tài)中的hyp模式,將壓縮的映象加載到內(nèi)存中。
步驟2 設(shè)置hyp向量基址寄存器(HYP Vector Based Address Register, HVBAR)為異常向量。切換到svc模式中,解壓內(nèi)核映象并啟動(dòng)內(nèi)核初始化。內(nèi)核完成自己的地址空間設(shè)置后,準(zhǔn)備好分離DIMDroid所需的所有資源。
步驟3 通過(guò)Trustzone安全保護(hù)技術(shù)驗(yàn)證DIMDroid在內(nèi)核中的度量代理模塊后加載該模塊。具體來(lái)說(shuō),內(nèi)核分配一個(gè)連續(xù)的物理內(nèi)存區(qū)域作為DIMDroid的內(nèi)存空間,例如存儲(chǔ)Stage-2頁(yè)表、DIMDroid的代碼和數(shù)據(jù)部分。內(nèi)核將未壓縮的DIMDroid復(fù)制到分配的區(qū)域中,并使用具有三級(jí)翻譯的長(zhǎng)描述符轉(zhuǎn)換表格式來(lái)配置定義從IPA到PA的標(biāo)識(shí)映射的Stage-2頁(yè)表。 Stage-2頁(yè)面表不映射由內(nèi)核為DIMDroid及其度量代理模塊事先分配的內(nèi)存區(qū)域。盡管如此,由于當(dāng)前的ARM虛擬化擴(kuò)展不支持I/O虛擬化,惡意內(nèi)核可能會(huì)發(fā)起DMA攻擊來(lái)侵入虛擬機(jī)管理程序空間。為了避免由于內(nèi)核對(duì)該區(qū)域的良性訪問(例如由于內(nèi)存管理)而導(dǎo)致的異常,該區(qū)域被聲明為DMA緩沖區(qū),以致未損壞的內(nèi)核不會(huì)試圖釋放或訪問它。
步驟4 發(fā)出一個(gè)hypervisor調(diào)用進(jìn)入hyp模式。DIMDroid通過(guò)將HCR.VM設(shè)置為0x1來(lái)啟用Stage-2轉(zhuǎn)換,并將虛擬化轉(zhuǎn)換表基址寄存器(Virtualization Translation Table Base Register, VTTBR)設(shè)置為物理地址步驟3中由內(nèi)核事先設(shè)置的Stage-2頁(yè)表的根。
步驟5 設(shè)置HVBAR為異常向量返回到svc模式,恢復(fù)內(nèi)核初始化。從此時(shí)起,所有的內(nèi)核和用戶空間代碼執(zhí)行都使用兩級(jí)地址轉(zhuǎn)換,因此,內(nèi)核被排除在運(yùn)行時(shí)TCB之外,大大降低了TCB的大小。DIMDroid能夠通過(guò)Stage-2頁(yè)面表在運(yùn)行時(shí)從內(nèi)核中保護(hù)自己。

圖5 加載DIMDroid過(guò)程
本文實(shí)現(xiàn)了DIMDroid原型,實(shí)驗(yàn)環(huán)境是使用Intel Core i5- 3210M CPU @ 2.50 GHz處理器和8 GB主內(nèi)存的PC上的Linux Ubuntu。在這個(gè)平臺(tái)上,本文搭載了ARM FastModels(ARM,2011),F(xiàn)astModels是精確、靈活的ARM IP的程序員視圖模型,允許芯片可用之前開發(fā)諸如驅(qū)動(dòng)程序、固件、操作系統(tǒng)和應(yīng)用程序等軟件,它可以全控制模擬,包括分析、調(diào)試和跟蹤ARM IP。本文使用FastModels搭載支持ARM虛擬化擴(kuò)展的Cortex-A15x1處理器模擬平板電腦,在平板電腦中運(yùn)行植入DIMDroid的Android5.0進(jìn)行功能測(cè)試和性能測(cè)試,功能測(cè)試的目的在于檢測(cè)強(qiáng)制訪問控制機(jī)制能否有效執(zhí)行,性能測(cè)試的目的在于測(cè)試系統(tǒng)的性能損耗。
本實(shí)驗(yàn)針對(duì)現(xiàn)有Android系統(tǒng)的rootkit進(jìn)行測(cè)試,在5個(gè)rootkit中:前兩個(gè)修改了syscall_table子程序的若干字節(jié)來(lái)實(shí)現(xiàn)攻擊;第三個(gè)修改了系統(tǒng)的異常向量表;第四個(gè)使用了inline hook技術(shù)攔截了proc_lookup 函數(shù),執(zhí)行惡意代碼實(shí)現(xiàn)模塊和進(jìn)程隱藏;第五個(gè)對(duì)Android系統(tǒng)的熵池資源進(jìn)行攻擊,使得用于從池中提取字節(jié)的算法部分無(wú)效。
DroidVisor[15]也是利用硬件虛擬化對(duì)Android內(nèi)核進(jìn)行監(jiān)控,使用DIMDroid與DroidVisor來(lái)對(duì)運(yùn)行中的Android內(nèi)核進(jìn)行動(dòng)態(tài)度量,結(jié)果如表2所示。
由度量結(jié)果可以看出,無(wú)論是針對(duì)系統(tǒng)調(diào)用表、中斷調(diào)用表一類的內(nèi)核靜態(tài)度量對(duì)象篡改還是對(duì)進(jìn)程鏈表、熵池資源等動(dòng)態(tài)度量對(duì)象修改的rootkit都可以被檢測(cè)出來(lái),DIMDroid度量方法能夠有效執(zhí)行。DroidVisor不能夠檢測(cè)到rootkit 5是因?yàn)闆]有對(duì)Android內(nèi)核的動(dòng)態(tài)的熵池資源作完整性保護(hù),DIMDroid可以利用熵池資源須滿足的邊界約束對(duì)rootkit 5進(jìn)行檢測(cè)。

表2 Android系統(tǒng)內(nèi)核遭受rootkit攻擊后的度量
為了判斷DIMDroid方法對(duì)Android系統(tǒng)的性能影響,本文采用了安兔兔測(cè)評(píng)(AnTuTu Benchmark)軟件,它是專門給Android設(shè)備手機(jī)、平板電腦評(píng)分的專業(yè)軟件。比較使用與未使用DIMDroid度量的性能指標(biāo)來(lái)進(jìn)行測(cè)試,性能指標(biāo)主要選取幾個(gè)現(xiàn)階段主流的選項(xiàng):RAM速度、CPU浮點(diǎn)計(jì)算性能和CPU整型計(jì)算性能。使用安兔兔軟件測(cè)試DIMDroid度量?jī)?nèi)核100次,并取平均值。性能損耗比率為采用DIMDroid度量的性能指標(biāo)項(xiàng)分值與未采用DIMDroid度量該指標(biāo)項(xiàng)分值之差占未采用該指標(biāo)項(xiàng)的百分比,結(jié)果如表3所示。

表3 使用安兔兔測(cè)試DIMDroid結(jié)果
由于本文實(shí)驗(yàn)在FastModels上進(jìn)行測(cè)試,不能精確地模擬ARM處理器,但可以得到性能損耗比率。由表3可知,使用DIMDroid與未使用DIMDroid相比有一定性能損耗,但在可接受范圍內(nèi),說(shuō)明此方法對(duì)保證Android內(nèi)核動(dòng)態(tài)完整性有一定借鑒意義。
本文介紹了一種在ARM硬件虛擬化上利用動(dòng)態(tài)度量來(lái)保護(hù)Android內(nèi)核實(shí)時(shí)完整性的方法DIMDroid。該方法通過(guò)分析Android內(nèi)核的運(yùn)行機(jī)制和被攻擊對(duì)象得出了內(nèi)核中哪些元素影響了Android內(nèi)核的完整性,并在hyp層對(duì)內(nèi)核中的度量對(duì)象進(jìn)行重構(gòu)后分析內(nèi)核的完整性;與傳統(tǒng)方法不同,本文的方法是可信的,因?yàn)樗c度量的Android內(nèi)核進(jìn)行了隔離,并通過(guò)基于硬件的信任鏈啟動(dòng)保護(hù)和基于內(nèi)存隔離的運(yùn)行時(shí)防護(hù)來(lái)保證DIMDroid自身的安全。本文的實(shí)驗(yàn)表明,通過(guò)與其他保護(hù)方法結(jié)果的比較表明,DIMDroid在Android完整性驗(yàn)證上的綜合性能更好,但DIMDroid沒有突破一些攻擊,例如有些攻擊不對(duì)內(nèi)核關(guān)鍵數(shù)據(jù)結(jié)構(gòu)進(jìn)行篡改實(shí)現(xiàn)權(quán)限提升、修改控制流等。接下來(lái)將通過(guò)對(duì)內(nèi)核級(jí)的rootkit進(jìn)行數(shù)據(jù)特征分析,進(jìn)而完善DIMDroid度量?jī)?nèi)核完整性的準(zhǔn)確性。