郭芷含,羅森林,柯懂湘,秦梟喃
北京理工大學(xué) 信息與電子學(xué)院,北京100081
近年來(lái),互聯(lián)網(wǎng)、物聯(lián)網(wǎng)技術(shù)飛速發(fā)展,移動(dòng)終端、智能工業(yè)設(shè)備等被廣泛使用,萬(wàn)物互聯(lián)正在逐步實(shí)現(xiàn)[1]。隨之而來(lái)的問(wèn)題也十分嚴(yán)重,針對(duì)智能設(shè)備的網(wǎng)絡(luò)攻擊正在危及物理世界的安全[2]。在移動(dòng)終端設(shè)備中,用戶常常受到垃圾信息、詐騙信息的侵害,面對(duì)病毒、木馬導(dǎo)致的金錢損失[3]。在市場(chǎng)份額中,Android系統(tǒng)占據(jù)主要成分,目前已運(yùn)行在超過(guò)25億活躍移動(dòng)設(shè)備上[4]。因此,基于Android系統(tǒng)的安全性研究是當(dāng)前研究的熱點(diǎn)問(wèn)題,確保數(shù)據(jù)安全和私密性是Android系統(tǒng)的首要任務(wù)[5]。
系統(tǒng)服務(wù)(System Service)是Android系統(tǒng)的核心組成部分,指后臺(tái)運(yùn)行的應(yīng)用程序或系統(tǒng)級(jí)進(jìn)程,具有較高的運(yùn)行權(quán)限[6],也是惡意代碼攻擊的主要目標(biāo)。系統(tǒng)服務(wù)漏洞是Android漏洞的關(guān)鍵部分。利用系統(tǒng)服務(wù)漏洞,可對(duì)Android系統(tǒng)設(shè)備實(shí)現(xiàn)多種攻擊,其中包括利用PowerManager服務(wù)存在的越權(quán)訪問(wèn)漏洞實(shí)現(xiàn)關(guān)機(jī)竊聽(tīng)、利用鎖屏服務(wù)存在的管理漏洞繞過(guò)鎖屏密碼解鎖設(shè)備、利用媒體服務(wù)中的整數(shù)溢出漏洞實(shí)現(xiàn)選線提升攻擊來(lái)控制整個(gè)設(shè)備。
系統(tǒng)服務(wù)關(guān)鍵信息獲取是Android系統(tǒng)漏洞挖掘和安全評(píng)估的重要步驟。在系統(tǒng)服務(wù)漏洞挖掘過(guò)程中首先需要獲取關(guān)鍵信息,如統(tǒng)計(jì)接口數(shù)量、分析日志獲取服務(wù)名和函數(shù)接口名,以及測(cè)試的參數(shù)數(shù)值信息,進(jìn)而對(duì)漏洞挖掘的過(guò)程進(jìn)行跟蹤和分析。當(dāng)前系統(tǒng)服務(wù)關(guān)鍵信息獲取已廣泛應(yīng)用于漏洞挖掘。例如,Long等通過(guò)分析包括API和強(qiáng)制清單權(quán)限的Android框架,提出了一種基于機(jī)器學(xué)習(xí)的模型[7],檢測(cè)針對(duì)不同Android版本的隱形惡意軟件;Jung等通過(guò)提取許可請(qǐng)求、API調(diào)用和運(yùn)行時(shí)行為的信息,提出了一種Android惡意軟件檢測(cè)的新方法[8],防止Android惡意軟件的傳播并保護(hù)隱私信息免遭破壞。目前常用的系統(tǒng)服務(wù)關(guān)鍵信息獲取方法主要有人工信息獲取方法和自動(dòng)化信息獲取方法。人工信息獲取方法需要人工閱讀代碼,獲取信息量少。在自動(dòng)化信息獲取方法中,基于源碼解析的方法對(duì)系統(tǒng)源碼的依賴程度高,無(wú)法獲取閉源服務(wù)信息;基于Java反射的方法無(wú)法獲取Native層信息;基于Binder通信監(jiān)控的方法在系統(tǒng)兼容性上存在缺陷。因此,目前已有的Android系統(tǒng)服務(wù)關(guān)鍵信息獲取方法存在獲取信息不全面的缺點(diǎn)。
本文針對(duì)系統(tǒng)服務(wù)模糊測(cè)試過(guò)程中系統(tǒng)服務(wù)關(guān)鍵信息獲取不全面的問(wèn)題,提出了Android系統(tǒng)服務(wù)信息分層獲取方法(A Hierarchical Acquisition Method of Android System Service Information,HAA)。利用該方法對(duì)系統(tǒng)服務(wù)的跨進(jìn)程通信數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析,能夠有效防護(hù)Android系統(tǒng)、攔截惡意行為、識(shí)別惡意軟件和診斷系統(tǒng)服務(wù)異常等。實(shí)驗(yàn)結(jié)果表明,該方法可以全面獲取系統(tǒng)服務(wù)接口參數(shù)規(guī)范、系統(tǒng)服務(wù)依賴信息和系統(tǒng)服務(wù)進(jìn)程信息,在保障Android系統(tǒng)安全方面行之有效。
目前提出的Android系統(tǒng)服務(wù)關(guān)鍵信息獲取方法主要分為兩類:人工信息獲取方法和自動(dòng)化信息獲取方法。其中,根據(jù)實(shí)現(xiàn)原理差異,可將自動(dòng)化獲取方法分為基于源碼解析方法[9]、基于Java反射方法[10]和基于Binder通信監(jiān)控方法[11]。
基于人工分析的系統(tǒng)服務(wù)關(guān)鍵信息獲取方法是通過(guò)人工閱讀代碼、調(diào)試分析等方法獲取服務(wù)依賴關(guān)系、服務(wù)接口參數(shù)信息和服務(wù)進(jìn)程信息。該方法自動(dòng)化程度低,難以應(yīng)對(duì)大量系統(tǒng)服務(wù)信息的獲取。
基于源碼解析的信息獲取方法是通過(guò)自動(dòng)化解析服務(wù)源碼中的AIDL文件獲取服務(wù)接口參數(shù)規(guī)范。Gu等人提出的Android系統(tǒng)服務(wù)漏洞挖掘方法[12],通過(guò)解析AIDL文件獲取服務(wù)接口參數(shù)規(guī)范。上述方法對(duì)系統(tǒng)源碼依賴程度高,無(wú)法獲取閉源服務(wù)信息。并且靜態(tài)分析源碼的方法無(wú)法獲取服務(wù)進(jìn)程信息,也無(wú)法解析源碼獲取服務(wù)依賴信息,由于Native層沒(méi)有實(shí)現(xiàn)AIDL文件,所以無(wú)法獲取Native層服務(wù)接口參數(shù)規(guī)范。
基于Java反射的信息獲取方法主要用于系統(tǒng)服務(wù)接口參數(shù)規(guī)范的獲取。調(diào)用ServiceManager對(duì)象的getService方法獲取框架層的服務(wù),利用反射技術(shù)獲取服務(wù)接口的函數(shù)簽名,并解析簽名信息,以獲取服務(wù)接口參數(shù)信息。利用Java反射技術(shù)獲取接口參數(shù)規(guī)范,如Iannillo等提出的Chizpurfle[13]。該方法實(shí)現(xiàn)簡(jiǎn)單且不依賴源碼,可有效獲取Java層服務(wù)接口參數(shù)規(guī)范。但其獲取信息不全面:只能獲取Java層系統(tǒng)服務(wù)接口的參數(shù)規(guī)范,無(wú)法獲取Native層服務(wù)接口參數(shù)規(guī)范;也不能獲取服務(wù)進(jìn)程信息和服務(wù)依賴信息。
基于Binder通信監(jiān)控的系統(tǒng)服務(wù)關(guān)鍵信息獲取方法,主要用于系統(tǒng)服務(wù)動(dòng)態(tài)信息的獲取,監(jiān)控分析Binder通信數(shù)據(jù)獲取系統(tǒng)服務(wù)的關(guān)鍵信息。作為系統(tǒng)服務(wù)架構(gòu)實(shí)現(xiàn)的基礎(chǔ),系統(tǒng)服務(wù)與其他進(jìn)程的通信數(shù)據(jù)經(jīng)由Binder傳輸,完成系統(tǒng)服務(wù)關(guān)鍵信息的獲取。該方法在Android安全防護(hù)領(lǐng)域用途廣泛,例如惡意行為攔截和惡意軟件識(shí)別。根據(jù)Binder驅(qū)動(dòng)監(jiān)控的實(shí)現(xiàn)方式,可將其分為修改系統(tǒng)源碼方式和動(dòng)態(tài)插樁、函數(shù)Hook方式。系統(tǒng)源碼方式通過(guò)修改系統(tǒng)源碼,構(gòu)建包含Binder監(jiān)控模塊的Android虛擬環(huán)境,監(jiān)控分析Binder通信數(shù)據(jù),獲取系統(tǒng)服務(wù)動(dòng)態(tài)信息,如Tam等人提出的CopperDroid[14]。這一類方法的優(yōu)點(diǎn)是能夠有效獲取系統(tǒng)服務(wù)的動(dòng)態(tài)信息,但只能用于虛擬設(shè)備,在實(shí)際Android設(shè)備中無(wú)效。第二類方法通過(guò)構(gòu)建動(dòng)態(tài)插樁和Hook函數(shù)為核心的機(jī)制以監(jiān)控Binder驅(qū)動(dòng),監(jiān)控分析Binder通信數(shù)據(jù),獲取系統(tǒng)服務(wù)動(dòng)態(tài)信息,如Yoon等人提出的AppScope[15]。這類方法只關(guān)注部分系統(tǒng)服務(wù)動(dòng)態(tài)信息,并且只針對(duì)Java層的Binder通信進(jìn)行監(jiān)控,忽略了Native層的Binder通信過(guò)程,因此服務(wù)信息獲取不夠全面。
針對(duì)上述方法存在的自動(dòng)化程度低、獲取信息不全面和對(duì)實(shí)際Android設(shè)備無(wú)效的缺陷,本文提出一種Android系統(tǒng)服務(wù)信息分層獲取方法(HAA)。該方法通過(guò)Binder通信劫持技術(shù),在系統(tǒng)中構(gòu)建完整的Binder通信行為監(jiān)控視圖,并對(duì)不同層次Binder通信數(shù)據(jù)所獲取的系統(tǒng)服務(wù)關(guān)鍵信息進(jìn)行分析,實(shí)現(xiàn)自動(dòng)且高兼容性的獲取。
針對(duì)系統(tǒng)服務(wù)關(guān)鍵信息獲取不全面的問(wèn)題,本文提出了系統(tǒng)服務(wù)關(guān)鍵信息的分層獲取方法。該方法主要分為兩個(gè)核心模塊:多層次Binder監(jiān)控模塊和關(guān)鍵信息解析模塊。針對(duì)系統(tǒng)服務(wù)關(guān)鍵信息的自動(dòng)化獲取,構(gòu)建完整的三層Binder通信行為監(jiān)控模塊,攔截系統(tǒng)服務(wù)注冊(cè)過(guò)程獲取系統(tǒng)服務(wù)進(jìn)程信息,實(shí)現(xiàn)應(yīng)用層的序列化記錄、框架層的服務(wù)注冊(cè)記錄和內(nèi)核層的通信數(shù)據(jù)記錄。針對(duì)接口參數(shù)規(guī)范、服務(wù)依賴關(guān)系和服務(wù)進(jìn)程信息的信息獲取不全的問(wèn)題,構(gòu)建關(guān)鍵信息解析模塊,分析系統(tǒng)服務(wù)通信過(guò)程中獲取到的服務(wù)依賴關(guān)系和接口參數(shù)規(guī)范,如圖1所示。
圖1 HAA方法原理框圖
多層次Binder監(jiān)控模塊監(jiān)控發(fā)生在系統(tǒng)不同層次的Binder行為,分別在系統(tǒng)的應(yīng)用層、框架層和內(nèi)核層構(gòu)建序列化子模塊、服務(wù)注冊(cè)監(jiān)控子模塊和數(shù)據(jù)傳輸監(jiān)控子模塊。相對(duì)其他已有方法,HAA方法在不需要修改源碼的同時(shí),拓寬了監(jiān)控的范圍,獲取完整的Binder通信數(shù)據(jù)和通信行為記錄,并且有效克服其他方法僅能夠?qū)崿F(xiàn)單層動(dòng)態(tài)信息獲取和兼容性差的問(wèn)題。
多層次Binder監(jiān)控模塊以Android系統(tǒng)中的Binder通信機(jī)制為基礎(chǔ)實(shí)現(xiàn)對(duì)數(shù)據(jù)流的監(jiān)控。為將Java層和Native層的Binder建立通信,該監(jiān)控模塊依據(jù)Native層Binder是Java層Binder映像的特點(diǎn),在Java層的JavaBBinder和Native層的BBinder上建立Binder通信機(jī)制,構(gòu)建了Java層到Native層的通道。在Java層與Native層的通信時(shí),Java層通過(guò)JNI(Java Native Interface)實(shí)現(xiàn)對(duì)Native層的調(diào)用,分為注冊(cè)JNI、注冊(cè)服務(wù)和獲取服務(wù)三個(gè)階段。在Native層與Java層進(jìn)行Binder通信時(shí),Native層通過(guò)JNI實(shí)現(xiàn)對(duì)Java層的反調(diào)用,調(diào)用過(guò)程分為獲取對(duì)象、獲取屬性及方法、構(gòu)造對(duì)象。在系統(tǒng)中的應(yīng)用層、框架層和內(nèi)核層構(gòu)建序列化子模塊以獲取數(shù)據(jù)。
在應(yīng)用層,通過(guò)Hook libbinder.so動(dòng)態(tài)庫(kù)中的序列化方法監(jiān)控并記錄應(yīng)用的序列化操作。在框架層,通過(guò)Hook ServiceManager進(jìn)程的svc_can_register函數(shù),實(shí)現(xiàn)系統(tǒng)服務(wù)注冊(cè)過(guò)程監(jiān)控。在內(nèi)核層,通過(guò)Hook IPCThread類的transact方法,監(jiān)控并記錄應(yīng)用的Binder通信數(shù)據(jù)傳輸行為,如表1所示。
表1 日志條目說(shuō)明
關(guān)鍵信息解析模塊,是從多層次Binder監(jiān)控模塊獲取的復(fù)雜信息中,解析出規(guī)范化且可使用的信息。而多層次數(shù)據(jù)的數(shù)據(jù)類型不一致、不同服務(wù)間獲取方式不一致將導(dǎo)致關(guān)鍵信息解析困難。此模塊將構(gòu)建3個(gè)子模塊,分別用于解析接口參數(shù)規(guī)范、解析服務(wù)依賴關(guān)系和解析服務(wù)進(jìn)程信息。相較于其他方法僅能實(shí)現(xiàn)服務(wù)依賴解析,HAA方法極大擴(kuò)展了關(guān)鍵信息的解析范圍。
2.3.1 參數(shù)規(guī)范獲取
應(yīng)用程序跨進(jìn)程調(diào)用系統(tǒng)服務(wù)接口的參數(shù)需要先經(jīng)過(guò)序列化操作,再通過(guò)Binder傳輸。其中,序列化操作將數(shù)據(jù)變?yōu)榭纱鎯?chǔ)、可通過(guò)Binder傳輸?shù)臓顟B(tài)。在Android系統(tǒng)中,使用Parcel容器保存序列化的數(shù)據(jù)。通過(guò)監(jiān)控應(yīng)用程序調(diào)用系統(tǒng)服務(wù)接口時(shí)對(duì)參數(shù)進(jìn)行的序列化操作,可以獲得系統(tǒng)服務(wù)接口參數(shù)信息。根據(jù)序列化數(shù)據(jù)類型,可將序列化操作分為兩種,HAA方法針對(duì)下述兩類序列化操作進(jìn)行攔截。
對(duì)于基本類型、基本類型數(shù)組、泛型容器等類型數(shù)據(jù),Pracel對(duì)象提供和數(shù)據(jù)類型對(duì)應(yīng)的序列化操作接口實(shí)現(xiàn)對(duì)該類型的序列化?;绢愋腿鏘nteger型數(shù)據(jù)Parcel提供writeInt接口實(shí)現(xiàn)序列化操作;基本類型數(shù)組如int[]數(shù)組型數(shù)據(jù),Parcel提供writeInt接口實(shí)現(xiàn)序列化操作;泛型容器如List容器型數(shù)據(jù),Parcel提供writeIntArray接口實(shí)現(xiàn)序列化操作。本方法通過(guò)Hook Parcel對(duì)象提供的序列化接口監(jiān)控這類數(shù)據(jù)類型的序列化操作,如表2所示。
表2 Hook函數(shù)列表
對(duì)于實(shí)現(xiàn)了Parcelable接口的對(duì)象,系統(tǒng)通過(guò)調(diào)用對(duì)象自身的writeToParcel方法實(shí)現(xiàn)序列化操作,HAA方法對(duì)這一類對(duì)象序列化的攔截記錄,操作步驟如下:
(1)注入到待監(jiān)控的服務(wù)調(diào)用進(jìn)程。
(2)在進(jìn)程中遍歷每個(gè)被ClassLoader加載的類,查詢每個(gè)類是否含有writeToParcel方法,并檢查參數(shù)類型確定其是否繼承自Parcelable接口。
(3)對(duì)每個(gè)Hook函數(shù)找到的繼承自Parcelable接口的writeToParcel方法,在調(diào)用writeParcel方法時(shí)記錄寫入的Parcel對(duì)象和寫入的類型。
HAA方法監(jiān)控系統(tǒng)服務(wù)調(diào)用時(shí)每一次序列化操作與數(shù)據(jù)傳輸?shù)倪^(guò)程,通過(guò)查詢表1中Parcel字和Data字段匹配的記錄,可獲取對(duì)應(yīng)接口的參數(shù)規(guī)范。
2.3.2 服務(wù)依賴解析
根據(jù)獲取方式不同,可將Android系統(tǒng)服務(wù)分為實(shí)名服務(wù)和匿名服務(wù)。實(shí)名服務(wù)通過(guò)ServiceManager索引,依據(jù)服務(wù)名稱獲取。匿名服務(wù)只能調(diào)用其所依賴的實(shí)名服務(wù)的特定接口來(lái)創(chuàng)建。針對(duì)匿名服務(wù)的模糊測(cè)試要根據(jù)服務(wù)依賴關(guān)系獲取匿名服務(wù)。
以sip_session匿名服務(wù)為例介紹匿名服務(wù)的獲取方式,如圖2所示。
具體步驟如下:
(1)客戶端通過(guò)ServiceManager獲取SipManager服務(wù),然后通過(guò)調(diào)用SipManager服務(wù)的CreateSession接口創(chuàng)建SipSession服務(wù)。
(2)調(diào)用readStrongBinder函數(shù),從SipManager服務(wù)的返回?cái)?shù)據(jù)中解析出SipSession服務(wù)引用,再利用該引用調(diào)用SipSession服務(wù)的相關(guān)接口。
HAA方法獲取匿名服務(wù)依賴關(guān)系的具體步驟如下:
(1)監(jiān)控Binder驅(qū)動(dòng),獲取實(shí)名服務(wù)返回的Binder通信數(shù)據(jù)。
(2)通過(guò)Hook Pracel對(duì)象的readStrongBinder函數(shù),從通信數(shù)據(jù)中提取所有匿名Binder引用,并保存其來(lái)源,獲取匿名服務(wù)所依賴的系統(tǒng)服務(wù)。
(3)當(dāng)后續(xù)通過(guò)該匿名Binder與匿名服務(wù)通信時(shí),從通信數(shù)據(jù)中提取該匿名服務(wù)的名稱,并保存匿名服務(wù)名稱和該匿名服務(wù)所依賴的實(shí)名服務(wù)。
2.3.3 進(jìn)程信息獲取
Android系統(tǒng)服務(wù)量大,且運(yùn)行在系統(tǒng)的不同進(jìn)程中,為了監(jiān)控系統(tǒng)服務(wù)運(yùn)行狀態(tài),需要獲取服務(wù)進(jìn)程信息。當(dāng)啟動(dòng)實(shí)名服務(wù)時(shí),需要在ServiceManager服務(wù)處注冊(cè)才能提供服務(wù)。其中匿名服務(wù)和其所依賴的實(shí)名服務(wù)處于同一進(jìn)程。通過(guò)攔截實(shí)名服務(wù)的注冊(cè)過(guò)程,可以獲得系統(tǒng)服務(wù)進(jìn)程信息。HAA方法選取ServiceManager的svc_can_register函數(shù)監(jiān)控。svc_can_register函數(shù)原型為Int svc_can_register(ubsigneD uid,uint16_t*name)。
svc_can_register函數(shù)的參數(shù)uid表示服務(wù)所在進(jìn)程ID,參數(shù)name表示服務(wù)名稱,系統(tǒng)中的實(shí)名服務(wù)向ServiceManager注冊(cè)時(shí),ServiceManager會(huì)調(diào)用該函數(shù)來(lái)處理注冊(cè)信息。通過(guò)Hook函數(shù)記錄每次注冊(cè)的服務(wù)進(jìn)程ID與服務(wù)名稱。
HAA方法在開(kāi)始監(jiān)控實(shí)名服務(wù)注冊(cè)過(guò)程之前,存在部分實(shí)名服務(wù)已經(jīng)注冊(cè)完成的情況,無(wú)法獲取此類服務(wù)的進(jìn)程信息。為解決該問(wèn)題,HAA方法先終止Zygote進(jìn)程,再獲取服務(wù)進(jìn)程信息。HAA方法可獲得所有服務(wù)的進(jìn)程信息。
為驗(yàn)證HAA方法的有效性,本實(shí)驗(yàn)在多個(gè)Android系統(tǒng)設(shè)備中進(jìn)行系統(tǒng)服務(wù)關(guān)鍵信息獲取實(shí)驗(yàn)。測(cè)試設(shè)備包括實(shí)體機(jī)和模擬器2種類型,測(cè)試設(shè)備系統(tǒng)包括原生系統(tǒng)和設(shè)備制造商定制系統(tǒng)2種類型。從GooglePlay選取15種應(yīng)用作為測(cè)試樣本生成系統(tǒng)服務(wù)通信數(shù)據(jù),測(cè)試應(yīng)用覆蓋主要應(yīng)用類別,如表3所示。最后與Chizpurfle[13]所使用的基于Java反射的關(guān)鍵信息獲取方法、Gu[12]所使用的基于源碼解析的關(guān)鍵信息獲取方法、BadIntent[16]所使用的基于Binder監(jiān)控的關(guān)鍵信息獲取方法進(jìn)行對(duì)比分析實(shí)驗(yàn)。
表3 系統(tǒng)服務(wù)信息獲取全面性實(shí)驗(yàn)測(cè)試樣本列表
實(shí)驗(yàn)環(huán)境分為兩部分,如表4所示。
(1)多層次Binder通信監(jiān)控模塊部署環(huán)境
分別在Android模擬器、Nexus6P和SamsungS4這三臺(tái)測(cè)試設(shè)備中部署B(yǎng)inder通信監(jiān)控模塊獲取系統(tǒng)服務(wù)通信數(shù)據(jù)。
圖2 sip_session匿名服務(wù)獲取原理圖
表4 實(shí)驗(yàn)環(huán)境配置
(2)關(guān)鍵信息解析模塊部署環(huán)境
在Dell 390臺(tái)式機(jī)中做監(jiān)控?cái)?shù)據(jù)分析工作,用于運(yùn)行信息解析程序,分析歸納監(jiān)控?cái)?shù)據(jù)獲取系統(tǒng)服務(wù)關(guān)鍵信息。
評(píng)價(jià)指標(biāo)包括獲取的系統(tǒng)服務(wù)總數(shù)N、已正確解析函數(shù)規(guī)范的服務(wù)接口總數(shù)I、已正確獲取服務(wù)依賴關(guān)系的匿名服務(wù)總數(shù)Nc和已正確獲取進(jìn)程信息的服務(wù)總數(shù)N p率。其上述評(píng)價(jià)方法的計(jì)算公式如下:
其中,Ni、N n和N a分別為實(shí)驗(yàn)方法所獲取的Java層實(shí)名服務(wù)總數(shù)、Native層實(shí)名服務(wù)總數(shù)和Native層匿名服務(wù)總數(shù);I i、I n和I a分別為已正確解析參數(shù)規(guī)范的Java層實(shí)名服務(wù)接口總數(shù)、Native層實(shí)名服務(wù)接口總數(shù)和Native層匿名服務(wù)接口總數(shù)。
實(shí)驗(yàn)過(guò)程的步驟如下:(1)在測(cè)試機(jī)器中部署自動(dòng)化測(cè)試工具M(jìn)onkey;(2)在測(cè)試機(jī)器中安裝所有測(cè)試樣本及HAA方法系統(tǒng)服務(wù)關(guān)鍵信息獲取框架;(3)在測(cè)試機(jī)器中運(yùn)行HAA方法,使用Monkey依次啟動(dòng)每個(gè)測(cè)試樣本,每個(gè)測(cè)試樣本運(yùn)行時(shí)長(zhǎng)為5 min,導(dǎo)出監(jiān)控?cái)?shù)據(jù),并通過(guò)運(yùn)行關(guān)鍵信息解析程序,自動(dòng)化分析監(jiān)控?cái)?shù)據(jù);(4)統(tǒng)計(jì)分析系統(tǒng)服務(wù)關(guān)鍵信息的獲取結(jié)果,根據(jù)公式(1)、(2)計(jì)算N和I,并記錄HAA方法信息獲取實(shí)驗(yàn)結(jié)果;(5)使用Gu等人提出的Android系統(tǒng)服務(wù)漏洞挖掘方法[12]、Chizpurfle[13]和Badlntent[16]的關(guān)鍵信息獲取方法替換步驟(2)中的HAA方法,重新安排所有測(cè)試樣本,消除之前執(zhí)行樣本帶來(lái)的干擾,重復(fù)步驟(3)和(4)。
表5分別為Android模擬器(系統(tǒng)版本8.0)、Nexus6P(系統(tǒng)版本7.1.2)設(shè)備和GalaxyS4(系統(tǒng)版本5.0.1)設(shè)備中所獲取信息的實(shí)驗(yàn)結(jié)果。
由表5的實(shí)驗(yàn)結(jié)果可知:
(1)在系統(tǒng)服務(wù)數(shù)量上,HAA方法在Android模擬器、Nexus6p和GalaxyS4三個(gè)測(cè)試環(huán)境上的N值分別為114、159和168,高于其他三類方法,這是由于該方法在Native層實(shí)名服務(wù)總數(shù)N n和匿名服務(wù)總數(shù)Na上獲取的更多的信息。由于Gu無(wú)法實(shí)現(xiàn)AIDL文件、Chizpurfle依賴Java層的反射特性和BadIntent僅監(jiān)控單一層次Binder導(dǎo)致這三類方法的N n值為0,都無(wú)法獲取到實(shí)名服務(wù)信息,而HAA在三個(gè)測(cè)試環(huán)境下的N n值分別為13、33和39,且與對(duì)比方法相比在Android模擬器和Nexus6P測(cè)試環(huán)境中具有更高的Na值,分別為19和31,表明該方法能有效提高系統(tǒng)服務(wù)信息的獲取數(shù)量。這是由于HAA在Native層的BpBinder與BBinder上建立通信機(jī)制,構(gòu)建了Java層到Native層通道,從而實(shí)現(xiàn)全面有效地獲取服務(wù)關(guān)鍵信息。
(2)在系統(tǒng)接口數(shù)量上,依據(jù)Native層的Binder是Java層Binder的映像的特點(diǎn),HAA方法利用Java映射,有效聯(lián)合Java層和Native層以提取關(guān)鍵信息,有效提高了I n值。在三個(gè)測(cè)試平臺(tái)上,I n值分別為101、158和195,解決了其他三類方法無(wú)法獲取Native層實(shí)名服務(wù)接口總數(shù)的問(wèn)題。HAA在三個(gè)平臺(tái)的I a值分別為185、412和342,均高于Chizpurfle和BadIntent方法,且在Nexus6P和GalaxyS4兩個(gè)測(cè)試平臺(tái)上高于Gu方法的I a值338和92,因此HAA方法能全面有效地獲取服務(wù)接口信息。
(3)HAA正確獲取服務(wù)依賴關(guān)系的匿名服務(wù)總數(shù)Nc分別為19、31和17,大于對(duì)比方法的Nc值,表明該方法能夠?qū)崿F(xiàn)匿名服務(wù)依賴解析,獲取正確的匿名服務(wù)接口總數(shù)。在正確獲取進(jìn)程信息的服務(wù)總數(shù)N p上,HAA分別為114、159和168,大于其他對(duì)比方法的N p值,這是由于HAA將Native層的BBinder對(duì)象和Java層的JavaBBinder對(duì)象關(guān)聯(lián)起來(lái),通過(guò)監(jiān)控服務(wù)注冊(cè)過(guò)程,準(zhǔn)確無(wú)誤獲取服務(wù)進(jìn)程信息。
表5 多環(huán)境配置下系統(tǒng)服務(wù)信息獲取全面性結(jié)果
綜上,HAA方法在Android模擬器(系統(tǒng)版本8.0)、Nexus6P(系統(tǒng)版本7.1.2)和GalaxyS4(系統(tǒng)版本5.0.1)三個(gè)測(cè)試平臺(tái)的N值、I值、N c值和N p值都高于其他三類方法,表明該方法能全面地獲取Java層的系統(tǒng)服務(wù)接口參數(shù)規(guī)范、Native層的接口參數(shù)規(guī)范、系統(tǒng)匿名服務(wù)依賴信息和系統(tǒng)服務(wù)進(jìn)程信息,能夠在多個(gè)不同Android平臺(tái)上全面有效地獲取系統(tǒng)服務(wù)信息,具有高兼容性。
本文分析了現(xiàn)有的Android系統(tǒng)服務(wù)關(guān)鍵信息獲取方法的原理和優(yōu)缺點(diǎn),發(fā)現(xiàn)現(xiàn)有方法的兼容性、信息獲取全面性和自動(dòng)化獲取能力方面存在不足,同時(shí)提出一種Android系統(tǒng)服務(wù)信息分層獲取方法。通過(guò)在Android系統(tǒng)的應(yīng)用層、框架層和內(nèi)核層分別構(gòu)建完整的Binder通信行為監(jiān)控模塊,攔截系統(tǒng)服務(wù)注冊(cè)過(guò)程獲取系統(tǒng)服務(wù)進(jìn)程信息,分析系統(tǒng)服務(wù)業(yè)務(wù)通信過(guò)程獲取服務(wù)依賴信息與接口參數(shù)規(guī)范,實(shí)現(xiàn)系統(tǒng)服務(wù)關(guān)鍵信息的自動(dòng)化獲取。最后在覆蓋實(shí)體和虛擬、定制系統(tǒng)和原生系統(tǒng)的3個(gè)Android設(shè)備中進(jìn)行了系統(tǒng)服務(wù)關(guān)鍵信息獲取實(shí)驗(yàn),并與其他方法進(jìn)行對(duì)比分析。結(jié)果表明,Android系統(tǒng)服務(wù)信息分層獲取方法能有效地獲取系統(tǒng)服務(wù)接口參數(shù)規(guī)范、系統(tǒng)服務(wù)依賴信息和系統(tǒng)服務(wù)進(jìn)程信息,信息獲取全面,實(shí)現(xiàn)了系統(tǒng)服務(wù)關(guān)鍵信息獲取過(guò)程的自動(dòng)化和高兼容性。