汪自旺,莊 毅,晏祖佳
(南京航空航天大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,南京 211106)
目前,ARM處理器芯片占據(jù)了移動(dòng)與嵌入式設(shè)備領(lǐng)域的主導(dǎo)地位,為超過(guò)60%的嵌入式設(shè)備以及超過(guò)45億部智能電話提供芯片支持.其中ARM處理器芯片在智能移動(dòng)電話的處理器芯片中占比超過(guò)95%,到2035年,集成ARM芯片的移動(dòng)設(shè)備估計(jì)將達(dá)到1萬(wàn)億部[1].然而,ARM終端的安全風(fēng)險(xiǎn)已成為限制其發(fā)展的關(guān)鍵問(wèn)題,尤其是智能手機(jī)和車聯(lián)網(wǎng)的應(yīng)用與普及,不可信終端可能會(huì)給企業(yè)和個(gè)人帶來(lái)嚴(yán)重的安全與隱私泄露風(fēng)險(xiǎn).在這種情況下,系統(tǒng)與用戶程序的完整性保證是實(shí)現(xiàn)移動(dòng)終端可信與安全計(jì)算的基本要求與必要條件.
遠(yuǎn)程證明是驗(yàn)證遠(yuǎn)程計(jì)算設(shè)備完整性狀態(tài)與可信性的過(guò)程,表現(xiàn)為被多個(gè)實(shí)體所接受并共同使用的通用協(xié)議[2].標(biāo)準(zhǔn)的TCG(Trusted Computing Group)遠(yuǎn)程證明[3]過(guò)程通過(guò)向質(zhì)詢方報(bào)告設(shè)備的環(huán)境指紋,以驗(yàn)證證明方的完整性狀態(tài).因此,完整性度量是遠(yuǎn)程證明的基礎(chǔ),其實(shí)現(xiàn)通常分為靜態(tài)證明與動(dòng)態(tài)證明兩種.大多數(shù)現(xiàn)有的完整性證明方案都是基于設(shè)備內(nèi)存指紋來(lái)實(shí)現(xiàn)的靜態(tài)證明,稱為基于二進(jìn)制的證明方案[4].
現(xiàn)階段移動(dòng)平臺(tái)遠(yuǎn)程證明相關(guān)研究的核心問(wèn)題仍是如何為嵌入式平臺(tái)設(shè)計(jì)輕量級(jí)的完整性度量與證明機(jī)制.靜態(tài)證明方案通過(guò)在程序加載期間獲取實(shí)體的測(cè)量值,反應(yīng)了測(cè)量發(fā)生時(shí)代碼與數(shù)據(jù)的狀態(tài),卻無(wú)法為平臺(tái)提供運(yùn)行時(shí)狀態(tài)證明.如果存在漏洞,攻擊者能夠利用TOC-TOU(Time of Check Versus Time of Use)[5]的競(jìng)爭(zhēng)條件缺陷來(lái)實(shí)施攻擊,即攻擊者能夠根據(jù)度量粒度在相鄰的兩個(gè)度量時(shí)刻之間動(dòng)態(tài)的插入攻擊行為與恢復(fù)行為,從而操縱證明方度量模塊在攻擊行為發(fā)生時(shí)仍會(huì)收集到正確的結(jié)果.而基于控制流[6]、程序執(zhí)行邏輯分析[7]的動(dòng)態(tài)完整性度量機(jī)制無(wú)法適用于性能與功耗嚴(yán)格受限的移動(dòng)設(shè)備.因此,研究ARM平臺(tái)可抵御TOC-TOU攻擊的二進(jìn)制可信度量與更新機(jī)制是當(dāng)前研究的重點(diǎn).
ARM TrustZone是ARM對(duì)可信計(jì)算的硬件實(shí)現(xiàn)解決方案,能夠?qū)崿F(xiàn)一個(gè)高度安全的隔離環(huán)境[8],為用戶提供數(shù)據(jù)、固件和外設(shè)的安全保護(hù),稱為安全域.最近,越來(lái)越多的研究人員利用TrustZone提供的可信執(zhí)行環(huán)境(Trusted Execution Environment,TEE)來(lái)托管內(nèi)核完整性監(jiān)視器,給出了不同類型使用ARM TrustZone安全域中的安全監(jiān)視器來(lái)保護(hù)操作系統(tǒng)內(nèi)核的安全架構(gòu).三星Knox是移動(dòng)端首個(gè)實(shí)現(xiàn)了基于TrustZone完整性度量框架的商業(yè)解決方案[9],通過(guò)運(yùn)行在TEE中的可信組件來(lái)檢測(cè)內(nèi)核的完整性.Ali等人[10]提出一種基于TrustZone與區(qū)塊鏈[11]的物聯(lián)網(wǎng)終端度量架構(gòu),利用TrustZone的安全機(jī)制提高了對(duì)度量程序與度量結(jié)果的保護(hù).Morbitzer[12]指出位于TEE中的度量組件與其他可信應(yīng)用程序(Trusted Application,TA)共享可信OS的上下文,任何TA被攻擊都可能影響度量組件的安全性,因此提出將度量程序遷移到一種類似于Intel Software Guard eXtensions(SGX)的飛地環(huán)境中執(zhí)行,稱為Scanclave.然而,Scanclave的實(shí)現(xiàn)成本遠(yuǎn)遠(yuǎn)超過(guò)了任何一種相關(guān)的研究成果,無(wú)法部署到移動(dòng)設(shè)備中.
上述研究工作僅對(duì)完整性度量程序的安全性進(jìn)行了優(yōu)化,缺乏對(duì)動(dòng)態(tài)度量策略實(shí)現(xiàn)方法的討論,無(wú)法應(yīng)對(duì)TOC-TOU攻擊.ABERA等人[13]與Heejin等人[14]通過(guò)在安全域構(gòu)建流驗(yàn)證服務(wù)以實(shí)時(shí)檢測(cè)威脅普通世界完整性的行為.類似的,KIMS[15]在安全世界中實(shí)現(xiàn)對(duì)Rootkit等攻擊行為的建模,可以動(dòng)態(tài)監(jiān)視操作系統(tǒng)內(nèi)核的變更行為并檢測(cè)其是否被破壞.TZ-RKP[16]通過(guò)剝奪內(nèi)核控制某些關(guān)鍵功能的能力,例如系統(tǒng)控制指令、存儲(chǔ)器轉(zhuǎn)換表的更新指令等,并將這些功能路由到安全世界中執(zhí)行,從而可以有效地阻止未經(jīng)許可的修改或注入二進(jìn)制文件的攻擊,以實(shí)現(xiàn)內(nèi)核的動(dòng)態(tài)完整性保護(hù)機(jī)制.然而,安全世界與普通世界的語(yǔ)義鴻溝[17]是制約此類方案應(yīng)用的主要挑戰(zhàn).
與本文工作最為接近的是Sprobes[18,19],通過(guò)對(duì)篩選的操作系統(tǒng)指令放置探針,再利用安全世界能夠動(dòng)態(tài)地中斷、恢復(fù)普通世界的事務(wù)的特性,實(shí)現(xiàn)在安全世界中動(dòng)態(tài)執(zhí)行完整性檢查組件,保證內(nèi)核代碼的完整性.Sprobes與本文方法存在兩個(gè)主要不同:1)Sprobes通過(guò)利用探針的觸發(fā)將執(zhí)行環(huán)境切換到安全域以實(shí)現(xiàn)對(duì)篩選的目標(biāo)指令進(jìn)行分析,從而保證只有經(jīng)過(guò)分析和認(rèn)可的敏感指令才能夠被執(zhí)行;2)Sprobes仍是屬于操作系統(tǒng)的一種自省機(jī)制,其有效性受限于安全世界內(nèi)運(yùn)行的指令分析模塊的能力瓶頸.相比之下,本文的方法旨在通過(guò)探針的放置來(lái)監(jiān)視內(nèi)存寫入與寄存器變更等敏感指令行為,以動(dòng)態(tài)檢測(cè)可能的完整性變更結(jié)果,不需要在安全世界獲取目標(biāo)指令的上下文信息,并且不用考慮安全世界與普通世界不同執(zhí)行環(huán)境之間存在語(yǔ)義鴻溝所帶來(lái)的挑戰(zhàn),具備更小的性能損失.
本文提出了一種基于探針的移動(dòng)安全域動(dòng)態(tài)完整性度量方案,該技術(shù)能夠動(dòng)態(tài)實(shí)現(xiàn)完整性度量數(shù)據(jù)的運(yùn)行時(shí)更新.針對(duì)所有靜態(tài)證明機(jī)制面臨的TOC-TOU競(jìng)爭(zhēng)條件缺陷問(wèn)題,與普遍采用的實(shí)現(xiàn)復(fù)雜的一致性檢查機(jī)制不同,構(gòu)建了基于探針機(jī)制的系統(tǒng)內(nèi)核與用戶程序完整性動(dòng)態(tài)監(jiān)測(cè)模型ProbeIMA(Probe-based dynamic Integrity Measurement Architecture),任何影響程序和內(nèi)核完整性的內(nèi)存片段的寫入與更新操作以及重要寄存器的變更行為都會(huì)產(chǎn)生新的完整性度量記錄.
在現(xiàn)有完整性證明方案的設(shè)計(jì)中,不乏利用TEE的最高安全權(quán)限提供可信的完整性保護(hù)服務(wù)的研究.當(dāng)運(yùn)行于安全域的處理程序收到請(qǐng)求時(shí)即跳轉(zhuǎn)到安全世界的可信執(zhí)行環(huán)境,普通世界被暫停.TEE中的度量組件測(cè)量當(dāng)前存儲(chǔ)單元中用戶程序指紋的完整性,最后將度量結(jié)果發(fā)送給質(zhì)詢方.目前,此類方案只能實(shí)現(xiàn)靜態(tài)證明服務(wù),因此無(wú)法應(yīng)對(duì)TOC-TOU攻擊.
本文所提的基于探針的安全域度量框架如圖1中所示,抽象了如何利用ARM TrustZone安全拓展實(shí)現(xiàn)可應(yīng)對(duì)TOC-TOU攻擊的完整性動(dòng)態(tài)更新機(jī)制.具體的,運(yùn)行于可信執(zhí)行環(huán)境中度量根的有效性與健壯性是整個(gè)度量框架正常工作的基礎(chǔ),TrustZone的硬件安全機(jī)制保證了可信應(yīng)用TA實(shí)現(xiàn)的度量與報(bào)告根的可信性,使得安全域的完整性度量過(guò)程有效且可信.在此基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了ProbeIMA,使得度量根能夠在系統(tǒng)運(yùn)行的完整生命周期中動(dòng)態(tài)檢測(cè)系統(tǒng)與用戶程序的完整性變更,以應(yīng)對(duì)TOC-TOU攻擊.

圖1 基于探針的安全域度量框架
首先,使用在TEE中運(yùn)行的可信應(yīng)用程序來(lái)模擬與普通執(zhí)行環(huán)境相隔離的可信度量模塊和報(bào)告模塊,如圖1中左側(cè)所示.由于安全世界能夠直接從其硬件寄存器和存儲(chǔ)單元中提取普通世界的不可偽造狀態(tài),因而,度量模塊可以準(zhǔn)確的度量?jī)?nèi)核和程序的完整性信息,并將度量結(jié)果直接保存到安全存儲(chǔ)中的SML(Stored-Measurement Log).報(bào)告模塊維護(hù)設(shè)備內(nèi)所有實(shí)體的當(dāng)前和歷史指紋,并在認(rèn)證進(jìn)行時(shí)將其發(fā)送給質(zhì)詢方.其次,提出了一種基于探針的完整性更新機(jī)制ProbeIMA,該機(jī)制通過(guò)放置探針來(lái)動(dòng)態(tài)監(jiān)視測(cè)量對(duì)象的完整性變化.
在基于二進(jìn)制的完整性證明過(guò)程中,挑戰(zhàn)者通過(guò)完整性質(zhì)詢協(xié)議獲得平臺(tái)的完整性度量記錄,并通過(guò)在返回的度量列表中發(fā)現(xiàn)未知指紋來(lái)驗(yàn)證平臺(tái)是否可信.通常,靜態(tài)證明只能獲取當(dāng)前時(shí)刻程序運(yùn)行列表中未知指紋的信息,也就是說(shuō),度量模塊僅驗(yàn)證了度量請(qǐng)求發(fā)生時(shí)刻的狀態(tài)信息是否完整.然而,任何獲得root訪問(wèn)權(quán)限的攻擊者都能夠根據(jù)度量粒度來(lái)動(dòng)態(tài)篡改數(shù)據(jù),并操縱由可信度量根獲取的二進(jìn)制指紋,即存在TOC-TOU的競(jìng)爭(zhēng)條件缺陷.
針對(duì)這一問(wèn)題,本文設(shè)計(jì)了一種基于探針的完整性動(dòng)態(tài)更新機(jī)制ProbeIMA,通過(guò)靜態(tài)二進(jìn)制插樁技術(shù)編輯內(nèi)核與程序代碼的binary文件,在任意變更關(guān)鍵寄存器以及內(nèi)存存儲(chǔ)信息的指令處添加探針代碼.因此,ProbeIMA可以在系統(tǒng)運(yùn)行期間動(dòng)態(tài)檢測(cè)未知指紋的生成,從而將測(cè)量模塊的范圍擴(kuò)展到系統(tǒng)運(yùn)行的整個(gè)生命周期.
由于ARM具有固定長(zhǎng)度指令,因此在二進(jìn)制文件中找到目標(biāo)指令非常容易.圖2中顯示了ProbeIMA的探針觸發(fā)時(shí)的算法流程圖.當(dāng)放置在內(nèi)核或程序二進(jìn)制文件中的探測(cè)指令被觸發(fā)時(shí),安全世界直接從其硬件寄存器中提取普通世界的不可偽造狀態(tài),運(yùn)行度量程序?qū)χ噶畈僮鬟M(jìn)行分析,包括確定指令所影響的程序主體ID,以更新對(duì)應(yīng)程序ID實(shí)體的完整性度量記錄.本文統(tǒng)計(jì)了所有影響內(nèi)核和用戶程序完整性的頁(yè)表集,并將它們寫入指定的安全內(nèi)存地址,該地址稱為完整性相關(guān)內(nèi)存地址集(Integrity related Memory Address Set,IMASet).

圖2 ProbeIMA算法流程圖
此外,在整個(gè)內(nèi)核及所有用戶程序中的目標(biāo)指令處添加探針會(huì)導(dǎo)致安全世界被頻繁喚醒,為了避免在啟動(dòng)過(guò)程中引起用戶可感知的延遲,重寫了監(jiān)視器模式中的代碼以實(shí)現(xiàn)兩個(gè)處理邏輯:首先,對(duì)于在內(nèi)核或用戶程序啟動(dòng)完成之前任何由探針觸發(fā)的切換操作,將直接返回普通世界并執(zhí)行下一條指令.這是因?yàn)樵趦?nèi)核或用戶程序啟動(dòng)過(guò)程中對(duì)關(guān)鍵寄存器進(jìn)行初始化會(huì)產(chǎn)生大量的誤觸發(fā).
其次,對(duì)于所有內(nèi)存寫入的觸發(fā)指令,獲取觸發(fā)指令寫入的物理地址,判斷物理地址是否包含于IMASet中,如果包含,通過(guò)IMASet獲取對(duì)應(yīng)的程序ID,并更新對(duì)應(yīng)實(shí)體的完整性記錄.IMASet能夠顯著減少真正與完整性相關(guān)的有效觸發(fā)的數(shù)量,進(jìn)而降低性能消耗.如圖2中的實(shí)線所示,將ProbeIMA中的世界跳轉(zhuǎn)指令SMC(Secure Monitor Call)稱為安全觸發(fā)器,通過(guò)安全觸發(fā)器切換到安全環(huán)境以執(zhí)行完整性更新.并且,將從“安全監(jiān)視器模式”直接返回普通世界的觸發(fā)指令稱為“無(wú)效觸發(fā)”,與之相對(duì)的,則稱為“有效觸發(fā)”.
ProbeIMA是一種運(yùn)行時(shí)完整性度量機(jī)制,通過(guò)放置在二進(jìn)制執(zhí)行程序中的探針觸發(fā)器來(lái)更新系統(tǒng)環(huán)境指紋,能夠?qū)⑽粗讣y的檢測(cè)擴(kuò)展到系統(tǒng)運(yùn)行的整個(gè)生命周期.安全監(jiān)視器調(diào)用SMC指令作為動(dòng)態(tài)測(cè)量組件的入口,并且SMC可以通過(guò)常規(guī)寄存器中設(shè)置的命令I(lǐng)D來(lái)區(qū)分不同類型的調(diào)用.另一方面,作為探針插入的SMC指令是固定的,不會(huì)造成程序完整性信息的隨機(jī)變化,這一點(diǎn)對(duì)于完整性參考值的管理非常重要.
總的來(lái)說(shuō),ProbeIMA通過(guò)探針的放置,能夠?yàn)槠胀ㄊ澜邕\(yùn)行的內(nèi)核與用戶程序維護(hù)一個(gè)運(yùn)行時(shí)監(jiān)控機(jī)制,主要對(duì)以下兩個(gè)方面的操作進(jìn)行監(jiān)控:1)檢測(cè)新程序的執(zhí)行;2)已運(yùn)行程序和內(nèi)核完整性的變更.首先,檢測(cè)影響內(nèi)核完整性的關(guān)鍵CPU寄存器(如SCTLR,TTBR和TTBCR)中發(fā)生的修改操作,其次,監(jiān)視保存在存儲(chǔ)器中的二進(jìn)制文件的修改,即在可能影響進(jìn)程二進(jìn)制文件完整性的所有指令處插入SMC跳轉(zhuǎn)指令,如內(nèi)存寫入指令STR、STM、SWP等.當(dāng)放置的指令被觸發(fā)時(shí),運(yùn)行于安全世界的處理程序?qū)υ撐锢韮?nèi)存地址的所屬程序?qū)嶓w執(zhí)行一次完整性度量.這意味著,所有影響內(nèi)存頁(yè)表的操作指令都將路由至安全世界進(jìn)行處理,并根據(jù)觸發(fā)指令的執(zhí)行結(jié)果對(duì)內(nèi)核或程序的完整性進(jìn)行更新.
在廣泛使用的ARMv7 32位架構(gòu)中,控制指令是通過(guò)寫入某些協(xié)處理器寄存器來(lái)實(shí)現(xiàn)的.由于ARM強(qiáng)制執(zhí)行指令對(duì)齊和固定指令的大小[16].因此很容易為所有寫入?yún)f(xié)處理器寄存器的MCR和LDC指令生成模板.如圖3所示,在對(duì)寫入CP15協(xié)處理器寄存器的MCR指令后放置探針,使普通世界跳轉(zhuǎn)到安全世界執(zhí)行完整性度量程序.首先查詢目標(biāo)寄存器是否影響用戶內(nèi)核的完整性,同樣將經(jīng)過(guò)篩選的寄存器位存放于IMASet集合中,對(duì)于影響完整性的操作指令重新計(jì)算系統(tǒng)內(nèi)核的完整性指紋,并生成一條新的完整性記錄.需要指出的是,某些寄存器的寫入可能會(huì)影響IMASet的內(nèi)容.也就是說(shuō),IMASet的內(nèi)容不是固定的.

圖3 ProbeIMA的放置與觸發(fā)機(jī)制
一個(gè)程序本質(zhì)上是由.bss段、.data段、.text段3部分組成的.如圖4中所示,.text和.data段一般是固化在可執(zhí)行文件中的,由內(nèi)核從可執(zhí)行文件中加載,.bss段不在二進(jìn)制文件中,由系統(tǒng)初始化生成,而.text,.data和.bss的完整性等同于程序本身的完整性.在Linux中,內(nèi)核會(huì)為每個(gè)進(jìn)程創(chuàng)建單獨(dú)的地址空間,即創(chuàng)建一組新的轉(zhuǎn)換表.轉(zhuǎn)換表存儲(chǔ)在內(nèi)核的內(nèi)存片段中,轉(zhuǎn)換表的更新也是正常的內(nèi)存寫入.這意味著安全世界可以獲取普通世界進(jìn)程轉(zhuǎn)換表的全部視圖,因此,動(dòng)態(tài)維護(hù)不同進(jìn)程完整性相關(guān)頁(yè)表地址集合組成的IMASet是可行的.另一方面,由于ARM處理器可以支持兩個(gè)頁(yè)表同時(shí)活動(dòng),一個(gè)由TTBR0確定,而另一個(gè)由TTBR1確定,即,相同的虛擬地址位可能被映射為不同的物理地址,因此本文使用物理地址來(lái)維護(hù)IMASet.

圖4 IMASet的設(shè)計(jì)
為了捕獲運(yùn)行于普通世界應(yīng)用程序的完整性狀態(tài)變更,ProbeIMA在所有程序二進(jìn)制文件內(nèi)存寫入指令處插入安全世界跳轉(zhuǎn)指令,當(dāng)檢測(cè)到包含于IMASet中的內(nèi)存頁(yè)表的寫入操作,安全世界的度量模塊能夠確定目標(biāo)物理內(nèi)存地址對(duì)應(yīng)的程序ID,動(dòng)態(tài)更新該程序的完整性記錄.一方面,由于ARM具有固定指令長(zhǎng)度的特性,因此在內(nèi)核二進(jìn)制文件中找到這樣的指令很簡(jiǎn)單.另一方面,由于普通世界對(duì)于安全世界是透明的,頁(yè)表基址等關(guān)鍵信息能直接被安全世界讀取和保存,安全世界中的組件能夠很簡(jiǎn)單的維護(hù)普通世界頁(yè)表與程序的關(guān)聯(lián)信息,獲取該頁(yè)表對(duì)應(yīng)的進(jìn)程的進(jìn)程號(hào),識(shí)別對(duì)應(yīng)頁(yè)表的編輯是否能夠造成完整性的變更.
本節(jié)中的探針?lè)胖貌僮髦饕峭ㄟ^(guò)指令級(jí)插樁技術(shù)[20]來(lái)實(shí)現(xiàn)的.在實(shí)際的靜態(tài)二進(jìn)制插樁的實(shí)踐中通常包含兩種實(shí)現(xiàn)策略,一種是直接對(duì)ELF可執(zhí)行文件進(jìn)行編輯,如PEBIL[21],PEBIL能夠在原ELF文件增加一個(gè)插樁代碼段與數(shù)據(jù)段.這種實(shí)現(xiàn)思路在定長(zhǎng)指令架構(gòu)下通常只需要簡(jiǎn)單的將插樁點(diǎn)原指令替換成一個(gè)無(wú)條件跳轉(zhuǎn)指令;另一種實(shí)現(xiàn)策略則是在編譯階段對(duì)中間代碼進(jìn)行插樁.本節(jié)中通過(guò)第一種實(shí)現(xiàn)策略來(lái)進(jìn)行演示模型的構(gòu)建.
圖5中演示了如何在STR內(nèi)存寫入指令處添加探針操作的實(shí)現(xiàn)過(guò)程,左上部分是ARM架構(gòu)匯編程序的一個(gè)原始示例片段.由于固定指令長(zhǎng)度的限制,理論上能夠?qū)?15CD8處的32位STR存儲(chǔ)指令替換成任意指令而不會(huì)導(dǎo)致ELF文件結(jié)構(gòu)的損壞.具體的,首先將STR指令的進(jìn)行保存和替換,利用B跳轉(zhuǎn)指令將執(zhí)行過(guò)程跳轉(zhuǎn)到探針指令處.在本文的實(shí)現(xiàn)中,首先執(zhí)行完成原始的內(nèi)存寫入指令,然后通過(guò)SMC跳轉(zhuǎn)指令將CPU的運(yùn)行狀態(tài)切換到安全世界,如圖5(a)所示,安全世界中通過(guò)查詢目標(biāo)內(nèi)存地址對(duì)應(yīng)的物理地址PA,如果此PA包含在IMAset的集合當(dāng)中,通過(guò)IMAset查詢對(duì)應(yīng)實(shí)體的標(biāo)簽與度量區(qū)間完成一次實(shí)體的完整性更新.

圖5 ARMv7-A架構(gòu)下ProbeIMA的放置與觸發(fā)演示
盡管探針的插入操作在ARM架構(gòu)的定長(zhǎng)指令環(huán)境下更加簡(jiǎn)易,但是在實(shí)際的實(shí)現(xiàn)過(guò)程中仍然會(huì)存在問(wèn)題,例如,本文在具體的硬件平臺(tái)上進(jìn)行實(shí)現(xiàn)時(shí),無(wú)法在任何EL0(Exception Level/Privilege Level)層的實(shí)體上部署SMC跳轉(zhuǎn)指令.這是因?yàn)椋捎贏RM的硬件安全機(jī)制,任何用戶層的程序或者組件無(wú)法通過(guò)直接執(zhí)行SMC指令來(lái)實(shí)現(xiàn)安全環(huán)境與普通環(huán)境之間的切換.因此,作為原型驗(yàn)證,本文在用戶程序的實(shí)現(xiàn)中將SMC指令替換成安全世界入口API函數(shù)的跳轉(zhuǎn)指令.簡(jiǎn)單來(lái)說(shuō),通過(guò)在源文件中引入一個(gè)自定義的安全世界入口函數(shù),并在后續(xù)探針插入的實(shí)現(xiàn)過(guò)程中通過(guò)利用BL指令跳轉(zhuǎn)到PLT表(Procedure Linkage Table)的指定位置,并通過(guò)PLT表跳轉(zhuǎn)到外部全局函數(shù)的入口以執(zhí)行安全世界的切換以及后續(xù)的完整性度量階段.圖5(b)處給出了簡(jiǎn)單的入口函數(shù)的使用示例,需要指出的是,這種方式盡管能夠通過(guò)GDT(Global Descriptor Table)進(jìn)入內(nèi)核態(tài)執(zhí)行安全世界切換,但是在入口函數(shù)被劫持時(shí)將無(wú)法完成用戶程序的探針觸發(fā).
由于完整性度量所需要的量對(duì)象并不是連續(xù)分布和存儲(chǔ)在內(nèi)存中,傳統(tǒng)基于硬件的內(nèi)存提取方法和基于軟件的內(nèi)存提取方法都是將整塊內(nèi)存提取出來(lái),再?gòu)闹刑崛≠Y源,一方面對(duì)系統(tǒng)的影響較大,另一方面也帶來(lái)了較大的時(shí)間開銷.本文通過(guò)維護(hù)影響所有程序與操作系統(tǒng)內(nèi)核完整性的內(nèi)存信息,只需要根據(jù)被度量對(duì)象在內(nèi)存中的位置提取資源,符合度量對(duì)象離散分布的規(guī)律,能夠極大地加快度量對(duì)象的提取效率.由于靜態(tài)測(cè)量對(duì)象(如代碼,數(shù)據(jù),中斷向量表和系統(tǒng)調(diào)用表)的完整性測(cè)量過(guò)程相對(duì)簡(jiǎn)單,因此在此不再贅述.
總的來(lái)說(shuō),本文直接修改內(nèi)核及用戶程序的二進(jìn)制文件,以便在寫入關(guān)鍵協(xié)處理器寄存器和內(nèi)存頁(yè)指令處放置探針,當(dāng)探針被觸發(fā)時(shí),執(zhí)行SMC指令以跳轉(zhuǎn)到安全世界.進(jìn)一步,安全世界對(duì)目標(biāo)內(nèi)存頁(yè)進(jìn)行判斷,對(duì)于那些能夠影響代碼、數(shù)據(jù)、中斷向量表以及系統(tǒng)調(diào)用表完整性的指令執(zhí)行結(jié)果進(jìn)行完整性檢查.因此,維護(hù)離散內(nèi)存頁(yè)數(shù)據(jù)與程序ID的從屬關(guān)系信息表也是ProbeIMA機(jī)制的核心問(wèn)題.
本節(jié)將從功能與性能兩個(gè)方面來(lái)對(duì)所提方案進(jìn)行分析,功能測(cè)試用于驗(yàn)證ProbeIMA動(dòng)態(tài)完整性度量的有效性,即,能否度量并發(fā)現(xiàn)系統(tǒng)的異常和攻擊行為,性能測(cè)試用于驗(yàn)證ProbeIMA的效率和開銷.
具體的實(shí)驗(yàn)環(huán)境如下:
在Ubuntu 16.04中交叉編譯了一個(gè)開源OP-TEE[22]運(yùn)行環(huán)境,并將其部署到樹莓派3 Model B Rev1.2開發(fā)板上.OP-TEE是一個(gè)流行的開源可信執(zhí)行環(huán)境解決方案,能夠?qū)崿F(xiàn)一個(gè)完整的可信OS應(yīng)用場(chǎng)景.安全域運(yùn)行一個(gè)定制的微型操作系統(tǒng)optee_os,普通世界運(yùn)行的是64位的Linux系統(tǒng).硬件參數(shù)分別為1.2GHz處理器與1G內(nèi)存.度量核心通過(guò)運(yùn)行于optee_os中的可信應(yīng)用TA模擬,實(shí)現(xiàn)初始化簽名密鑰對(duì)、哈希以及PCR(Platform Configuration Register)等操作,包括計(jì)算和擴(kuò)展用于模擬TPM_quote操作的PCR值.所有安全上下文都存儲(chǔ)在TrustZone安全RAM存儲(chǔ)區(qū)域中.
如章節(jié)3所述,如果待驗(yàn)證系統(tǒng)的內(nèi)核是可信的且未被更改的,并且其后運(yùn)行的所有程序?qū)嶓w都是可信的且未被更改的,則認(rèn)為系統(tǒng)當(dāng)前狀態(tài)是可信的.例如,Arun等人[23]使用動(dòng)態(tài)哈希完整性檢查器在運(yùn)行時(shí)對(duì)所有歷史指令記錄執(zhí)行完整性檢查,以應(yīng)對(duì)TOC-TOU威脅.也就是說(shuō),未曾運(yùn)行過(guò)危險(xiǎn)程序或內(nèi)核異常狀態(tài)的系統(tǒng)當(dāng)前時(shí)刻的完整性狀態(tài)是可被信任的.
事實(shí)上,攻擊者可能實(shí)現(xiàn)的攻擊行為中,包括打開設(shè)備直接對(duì)硬件單元進(jìn)行更改,必定是以修改系統(tǒng)參數(shù)或越權(quán)運(yùn)行非法進(jìn)程作為最重要的一個(gè)標(biāo)志性成就.這意味著在可信計(jì)算領(lǐng)域,所有越權(quán)攻擊行為都將導(dǎo)致系統(tǒng)完整性的變化.因此,本文將諸如惡意軟件激活和配置參數(shù)修改之類的行為作為安全檢查觸發(fā)器是合理且可靠的.
下面通過(guò)具體的攻擊示例,分析本文提出的方法的動(dòng)態(tài)完整性檢測(cè)能力.具體的,創(chuàng)建了一個(gè)簡(jiǎn)單的Rootkit以實(shí)現(xiàn)系統(tǒng)調(diào)用表內(nèi)核函數(shù)的劫持.首先,通過(guò)kallsyms_lookup_name確定目標(biāo)函數(shù)的地址;其次,Rootkit程序利用系統(tǒng)提供的內(nèi)核熱補(bǔ)丁函數(shù)(aarch64_insn_patch_text)動(dòng)態(tài)創(chuàng)建內(nèi)核Hook、插入Payload以及隱藏Module;最后,基于此Rootkit的加載與移除操作模擬了典型TOC-TOU攻擊中在兩次完整性檢查之間攻擊與恢復(fù)行為.
完整的TOC-TOU攻擊過(guò)程模擬如圖6所示,在Rootkit程序的執(zhí)行與移除操作之前分別驗(yàn)證了內(nèi)核符號(hào)表/proc/kallsyms的完整性,均能夠正確輸出其散列值,而在Rootkit運(yùn)行時(shí),由于在kallsyms_op符號(hào)內(nèi)存地址處添加了hook代碼,無(wú)法正確輸出內(nèi)核符號(hào)的信息.

圖6 TOC-TOU攻擊模擬示例
最后,通過(guò)查詢存儲(chǔ)度量列表中的完整性記錄驗(yàn)證攻擊過(guò)程是否造成了根節(jié)點(diǎn)的哈希值改變.本文在安全世界實(shí)現(xiàn)了一個(gè)完整性度量值的查詢組件,并向普通世界提供查詢接口.在攻擊的執(zhí)行與移除操作前后各執(zhí)行了一次度量值查詢操作,查詢結(jié)果顯示兩次查詢執(zhí)行時(shí)刻獲取到的相關(guān)內(nèi)核函數(shù)的散列值并未發(fā)生變更,然而發(fā)現(xiàn)在此過(guò)程中,查詢到的散列值記錄條數(shù)卻增加了.如圖7所示,在將Rootkit移除后,安全世界的度量更新組件記錄了符號(hào)kallsyms_op的一個(gè)歷史值.因此,保存在PCR中的根節(jié)點(diǎn)散列值會(huì)相應(yīng)地發(fā)生變更,最終影響完整性證明的結(jié)果.因此,ProbeIMA能夠有效的實(shí)現(xiàn)運(yùn)行時(shí)內(nèi)核完整性更新.
本節(jié)將對(duì)所提框架的系統(tǒng)原型的性能損失進(jìn)行評(píng)估.本文將對(duì)ProbeIMA在運(yùn)行過(guò)程中產(chǎn)生的世界切換進(jìn)行測(cè)量,重點(diǎn)評(píng)估使用探針機(jī)制帶來(lái)的開銷.
首先,將評(píng)估ProbeIMA對(duì)普通世界程序的運(yùn)行所造成的性能影響.在實(shí)驗(yàn)環(huán)境中實(shí)施了性能評(píng)估的有限模型,主要的作在于對(duì)安全監(jiān)視器模式中的觸發(fā)代理及安全世界中處理程序TA的程序開發(fā).由于OP-TEE項(xiàng)目中安全監(jiān)視器的執(zhí)行文件與安全操作系統(tǒng)的執(zhí)行文件是打包在一起的,即OP-TEE中安全監(jiān)視器無(wú)法脫離可信OS單獨(dú)加載,無(wú)法計(jì)算無(wú)效觸發(fā)時(shí)的時(shí)間消耗.因此,在實(shí)際的設(shè)計(jì)實(shí)驗(yàn)中,通過(guò)統(tǒng)計(jì)探針的放置數(shù)量,再根據(jù)不同階段執(zhí)行指令的比重來(lái)估算出不同觸發(fā)方式造成的時(shí)間開銷.
CostProbeIMA=TimesPT*CostPT+TimesNT*CostNT
(1)
ProbeIMA的總體時(shí)間成本計(jì)算方法如式(1)所示,TimesPT、TimesNT分別表示在系統(tǒng)運(yùn)行過(guò)程中累計(jì)發(fā)生的有效觸發(fā)和無(wú)效觸發(fā)的次數(shù),CostPT、CostNT則表示各自產(chǎn)生的時(shí)間延時(shí).
表1中顯示了原型系統(tǒng)的統(tǒng)計(jì)數(shù)據(jù).本文在普通世界的不可信操作系統(tǒng)中構(gòu)建了兩個(gè)用戶程序RA_Router和Test_App_CA,其中RA_Router用于轉(zhuǎn)發(fā)安全世界中的報(bào)告以及MTR與遠(yuǎn)程質(zhì)詢者之間的交互數(shù)據(jù),包括接收和轉(zhuǎn)發(fā)完整性質(zhì)詢和度量數(shù)據(jù).Test_App_CA是示例測(cè)試程序在普通世界運(yùn)行的部分.

表1 ProbeIMA數(shù)據(jù)統(tǒng)計(jì)結(jié)果
本文的實(shí)驗(yàn)?zāi)P筒⑽磳?duì)精確的循環(huán)計(jì)數(shù)建模,而是跟蹤指令計(jì)數(shù).為了量化所提方案造成的效能開銷,真實(shí)測(cè)量了實(shí)驗(yàn)環(huán)境中普通世界系統(tǒng)內(nèi)核與程序運(yùn)行產(chǎn)生的時(shí)間延遲.進(jìn)一步,為實(shí)驗(yàn)環(huán)境設(shè)立了一組對(duì)照環(huán)境Baseline,在基準(zhǔn)測(cè)試中沒有放置探針指令,而是僅在安全環(huán)境中安裝了IMA組件.
記錄了在兩組環(huán)境中運(yùn)行的系統(tǒng)內(nèi)核、用戶程序RA_Router及用戶程序Test_App_CA的時(shí)間消耗數(shù)據(jù),如表2所示,系統(tǒng)內(nèi)核啟動(dòng)階段造成的時(shí)間消耗約為0.35s,且用戶程序的啟動(dòng)與運(yùn)行造成時(shí)間消耗非常小,滿足移動(dòng)系統(tǒng)平臺(tái)的實(shí)際需要.最后,根據(jù)統(tǒng)計(jì)結(jié)果估算出的單次無(wú)效觸發(fā)的平均時(shí)延約為47μs,而單次有效觸發(fā)產(chǎn)生的平均時(shí)延為3.2ms.

表2 時(shí)間消耗測(cè)試結(jié)果(in seconds)
大量的移動(dòng)設(shè)備使用基于ARM的專用集成電路,因此研究ARM體系結(jié)構(gòu)下的完整性認(rèn)證方案是必要的.為了構(gòu)建一個(gè)高效且經(jīng)濟(jì)的完整性度量框架,保證移動(dòng)平臺(tái)的安全性,本文利用TrustZone的最高權(quán)限來(lái)實(shí)現(xiàn)可信的完整性度量與更新組件,所有安全性關(guān)鍵操作都在TEE中執(zhí)行,以使其具備出色的安全屬性.其次,提出了一種基于探針的動(dòng)態(tài)測(cè)量機(jī)制ProbeIMA,能夠動(dòng)態(tài)檢測(cè)內(nèi)核和進(jìn)程在運(yùn)行過(guò)程中出現(xiàn)的未知指紋,有效防御TOC-TOU攻擊并滿足預(yù)期的安全需求.與現(xiàn)有解決方案相比,所提出的解決方案具有更好的通用性,更適合于資源匱乏的低成本ARM移動(dòng)終端.