田東海 ,陳君華,賈曉啟,胡昌振
(1. 北京理工大學(xué) 北京市軟件安全工程技術(shù)重點(diǎn)實(shí)驗(yàn)室,北京 100081;2. 云南民族大學(xué) 云南省高校物聯(lián)網(wǎng)應(yīng)用技術(shù)重點(diǎn)實(shí)驗(yàn)室,云南 昆明 650500;3. 中國科學(xué)院 信息工程研究所 信息安全國家重點(diǎn)實(shí)驗(yàn)室,北京 100093)
操作系統(tǒng)內(nèi)核是操作系統(tǒng)最核心的部分,負(fù)責(zé)管理和維護(hù)系統(tǒng)的整體運(yùn)行。操作系統(tǒng)內(nèi)核的任何部分受到損害都有可能影響上層應(yīng)用程序的安全。當(dāng)前主流操作系統(tǒng)如Windows和Linux均采用宏內(nèi)核(monolithic-kernel)架構(gòu),即操作系統(tǒng)內(nèi)核和內(nèi)核擴(kuò)展模塊都運(yùn)行在同一地址空間。這種架構(gòu)的優(yōu)點(diǎn)是操作系統(tǒng)內(nèi)核無需切換地址空間就可以直接調(diào)用內(nèi)核擴(kuò)展模塊,其性能明顯優(yōu)于微內(nèi)核(micro-kernel)架構(gòu)。然而宏內(nèi)核的缺點(diǎn)是外部非可信擴(kuò)展模塊一旦被加載到內(nèi)核,將可以不受限制地訪問操作系統(tǒng)內(nèi)核的任何資源,從而給操作系統(tǒng)帶來了極大的安全隱患。目前針對內(nèi)核的常見攻擊是將惡意擴(kuò)展模塊載入到內(nèi)核,使其直接破壞操作系統(tǒng)內(nèi)核的資源,比如通過替換系統(tǒng)調(diào)用表來劫持應(yīng)用程序與操作系統(tǒng)之間的交互。
為了保護(hù)操作系統(tǒng)內(nèi)核的安全,最有效地方法之一是對內(nèi)核擴(kuò)展模塊的行為進(jìn)行訪問控制。現(xiàn)有許多方法都是基于這一思想,他們雖然能夠在一定程度上保護(hù)內(nèi)核得安全,但存在以下一些局限:1)缺乏清晰地安全模型,比如文獻(xiàn)[1]僅僅考慮了Biba模型[2]中不能上寫的思想;2)過多地依賴專家知識,比如文獻(xiàn)[3]要求安全專家詳細(xì)指明內(nèi)核中那些客體應(yīng)受到保護(hù);3)大部分保護(hù)機(jī)制的實(shí)現(xiàn)都是基于模擬器(如Bochs emulator)的方法,其性能開銷非常大,比如文獻(xiàn)[1,3]都要求截獲操作系統(tǒng)運(yùn)行的每一條寫指令。
針對上述問題,本文提出了一種基于強(qiáng)制訪問控制(MAC, mandatory access control)的模型MOKIP。該模型為操作系統(tǒng)內(nèi)核空間提供了一套安全機(jī)制,其基本方法也是通過限制非可信內(nèi)核擴(kuò)展模塊的行為來保護(hù)操作系統(tǒng)內(nèi)核的完整性安全。MOKIP采用了信息流完整性模型的思想,將內(nèi)核空間中的不同主體和客體設(shè)置不同完整性的安全標(biāo)簽,然后應(yīng)用一些訪問控制的規(guī)則確保具有低完整性標(biāo)簽的主體(即非可信內(nèi)核模塊)不會影響具有高完整性標(biāo)簽的客體(主要包括操作系統(tǒng)內(nèi)核數(shù)據(jù)和內(nèi)核代碼)的安全。為了實(shí)現(xiàn)MOKIP模型,本文采用了最新的硬件輔助虛擬化技術(shù),通過合理使用硬件輔助的頁表機(jī)制(hardware assisted paging)將非可信內(nèi)核擴(kuò)展模塊從操作系統(tǒng)內(nèi)核隔離出來。利用虛擬機(jī)管理器(VMM, virtual machine monitor)的特權(quán)級動態(tài)截獲非可信內(nèi)核模塊對操作系統(tǒng)內(nèi)核數(shù)據(jù)的訪問以及對內(nèi)核代碼的調(diào)用,并保證其操作符合本文的訪問控制規(guī)則。對于那些違反安全規(guī)則的行為,VMM 將及時(shí)阻止并通知系統(tǒng)管理員。為了驗(yàn)證基于MOKIP模型的系統(tǒng)在實(shí)際運(yùn)行環(huán)境中的有效性,本文向操作系統(tǒng)內(nèi)核載入了8種包含不同惡意行為的內(nèi)核擴(kuò)展模塊。實(shí)驗(yàn)結(jié)果表明本系統(tǒng)能夠成功檢測出所有這些模塊的惡意行為。此外,還通過性能測試證明了本系統(tǒng)對上層應(yīng)用程序的性能影響較小。
MOKIP模型的基本思想是通過限制操作系統(tǒng)內(nèi)核空間中不同實(shí)體間的信息流來保證操作系統(tǒng)內(nèi)核的完整性安全。
MOKIP模型和傳統(tǒng)的訪問控制模型一樣,需要區(qū)分實(shí)體E中的主體S和客體O。在本模型中,主體S的定義為在內(nèi)核空間中發(fā)出訪問請求的實(shí)體;客體O的定義為在內(nèi)核空間中接受主體訪問的實(shí)體。其形式化表示為:
在操作系統(tǒng)內(nèi)核空間中,將主體S分為3類:操作系統(tǒng)內(nèi)核(SOS)、可信內(nèi)核模塊(STE)、非可信內(nèi)核模塊(SUE)。其中,SOS是指操作系統(tǒng)最基本的部分,它主要負(fù)責(zé)管理系統(tǒng)資源;STE是指對操作系統(tǒng)內(nèi)核的可信擴(kuò)展,它的引入通常需要額外的驗(yàn)證機(jī)制(比如微軟的驅(qū)動簽名技術(shù)[4])來證明其可信性;SUE是指對操作系統(tǒng)內(nèi)核的非可信擴(kuò)展,它通常由未知廠商或非可信個(gè)人開發(fā)。雖然能為用戶提供特定的功能,但由于可能包含惡意代碼,該類模塊被載入后有潛在破壞操作系統(tǒng)內(nèi)核安全的危險(xiǎn)。為了區(qū)分可信內(nèi)核模塊與非可信內(nèi)核模塊,可以采用微軟的驅(qū)動簽名技術(shù)[5]。
對于客體,主要關(guān)注操作系統(tǒng)內(nèi)核及其擴(kuò)展模塊的代碼,數(shù)據(jù)和堆棧部分,具體包括:內(nèi)核可信入口點(diǎn)代碼(OOS-TC)、內(nèi)核其他代碼(OOS-other)、內(nèi)核數(shù)據(jù)(OOS-data)、內(nèi)核堆棧(OOS-stack)、可信擴(kuò)展模塊代碼(OTE-code)、可信擴(kuò)展模塊數(shù)據(jù)(OTE-data)、可信擴(kuò)展模塊堆棧(OTE-stack)、非可信擴(kuò)展模塊代碼(OUE-code)、非可信擴(kuò)展模塊數(shù)據(jù)(OUE-data)、非可信擴(kuò)展模塊堆棧(OUE-stack)。需要說明的是,內(nèi)核數(shù)據(jù)(OOS-data)僅包括屬于內(nèi)核本身的數(shù)據(jù),不包括操作系統(tǒng)為內(nèi)核模塊動態(tài)分配的數(shù)據(jù)。此外,操作系統(tǒng)所依賴的特權(quán)寄存器(Oreg)也屬于本模型的客體。
為了實(shí)現(xiàn)主體S對客體O進(jìn)行訪問控制,在主體和客體的屬性中引入了安全標(biāo)簽L。每個(gè)實(shí)體僅有一個(gè)安全標(biāo)簽,不同的安全標(biāo)簽反應(yīng)了不同實(shí)體的安全級別,用形式化表示為
本模型定義了2類安全標(biāo)簽:高完整性標(biāo)簽Lh和低完整性標(biāo)簽Ll。進(jìn)一步定義了安全標(biāo)簽L1和L2之間的支配關(guān)系≤,即如果L1的完整性高于或等于L2,則稱L1支配L2,記做L2≤L1。該支配關(guān)系適用于多級安全模型。由于本模型僅包含2類等級,顯然有Ll≤Lh,即高完整性標(biāo)簽支配低完整性標(biāo)簽。此外,還定義了安全標(biāo)簽L1和L2之間的強(qiáng)支配關(guān)系<,即如果L1的完整性高于L2,則稱L1強(qiáng)支配L2,記做L2 當(dāng)某個(gè)主體s或客體o產(chǎn)生時(shí),需要對其設(shè)置相應(yīng)的安全標(biāo)簽。對于主體,為SOS和STE設(shè)置高完整性標(biāo)簽Lh,而為SUE設(shè)置低完整性標(biāo)簽Ll。對于客體,按照以下2條規(guī)則設(shè)置安全標(biāo)簽。 1)當(dāng)客體o被主體s創(chuàng)建時(shí),客體o繼承主體s的完整性標(biāo)簽,記做int(o)←int(s)。該規(guī)則表明由高(低)完整性主體創(chuàng)建的客體將擁有高(低)完整性標(biāo)簽。例如,由操作系統(tǒng)內(nèi)核SOS創(chuàng)建的內(nèi)核堆棧OOS-stack和內(nèi)核數(shù)據(jù)OOS-data都將擁有高完整性標(biāo)簽Lh。這里需要注意的是,認(rèn)為特權(quán)寄存器(Oreg)由SOS創(chuàng)建,因此Oreg擁有高完整性標(biāo)簽Lh。 2)當(dāng)主體s1請求另一主體s2創(chuàng)建客體o時(shí),該客體的完整性標(biāo)簽為s1和s2中被支配的,記做int(o)←dom(int(s1), int(s2)),即如果 int(s1)≤int(s2),則 dom(int(s1), int(s2))= int(s1),int(o)←int(s1)。該規(guī)則適用于這樣一些客體,它屬于某個(gè)主體,但不由該主體創(chuàng)建。例如,非可信內(nèi)核模塊(SUE)請求操作系統(tǒng)內(nèi)核(SOS)分配一片緩沖區(qū),而該區(qū)域中的數(shù)據(jù)區(qū)屬于SUE,其安全標(biāo)簽為Ll。 對于靜態(tài)客體,將非可信擴(kuò)展模塊數(shù)據(jù)(OUE-data)、非可信擴(kuò)展模塊堆棧(OUE-stack)和內(nèi)核其他代碼(OOS-other)標(biāo)記成低完整性標(biāo)簽Ll,而將內(nèi)核可信入口點(diǎn)代碼(OOS-TC)和內(nèi)核數(shù)據(jù)(OOS-data)設(shè)置成高完整性標(biāo)簽Lh。 在內(nèi)核空間中,操作系統(tǒng)內(nèi)核和擴(kuò)展模塊之間及內(nèi)部存在許多操作。例如,內(nèi)核擴(kuò)展模塊向操作系統(tǒng)內(nèi)核申請一片內(nèi)存空間,然后向這片內(nèi)存區(qū)寫入數(shù)據(jù)。從信息流的觀點(diǎn)[6]來看,所有的訪問操作都可以映射成讀類型(read)和寫類型(write)操作?;谶@2種操作,可以找出主體和客體在信息流之間的關(guān)系。如果主體s能夠?qū)懣腕wo,則存在信息流從s流向o,記做write(s,o)。另一方面,如果主體s能夠讀客體o,則存在信息流從o流向s,記做read(o,s)。此外,信息流之間的關(guān)系還可以描述成流轉(zhuǎn)換關(guān)系。如果主體s1能寫客體o,而該客體o又能被另一主體s2讀取,則存在信息流從s1到s2的轉(zhuǎn)換,記做flowtrans(s1,s2)。 傳統(tǒng)的信息流完整性模型(如Biba模型[2])要求信息流不能從低完整性客體流向高完整性主體。這樣雖然能保證系統(tǒng)具有較高的完整性,但很難在實(shí)際環(huán)境中應(yīng)用。例如,現(xiàn)實(shí)系統(tǒng)中許多高完整性主體都可能接收低完整性客體的輸入。因此,完備的信息流完整性模型需考慮信息流從低完整性流向高完整性的情況。Clark-Wilson[7]完整性模型能較好地處理這些情況,它通過引入過濾器(filter)來完成對低完整性數(shù)據(jù)的更新或舍棄。然而該模型的不足是它要求所有接收數(shù)據(jù)的輸入接口(input interface)都必須為過濾器,這極大影響了該模型的最終實(shí)現(xiàn)。為了在操作系統(tǒng)內(nèi)核保護(hù)中應(yīng)用完整性保護(hù)模型,借鑒Clark-Wilson-Lite[8]模型的思想,重點(diǎn)關(guān)注于那些可能會接收低完整性數(shù)據(jù)的輸入接口,只要能保證這些接口能正確處理非可信數(shù)據(jù),就能從很大程度上確保操作系統(tǒng)內(nèi)核的完整性安全。為了實(shí)現(xiàn)這個(gè)目標(biāo),本文設(shè)置了以下3條保護(hù)規(guī)則。 1) 當(dāng)主體s執(zhí)行客體o時(shí),必須滿足條件:客體o的完整性強(qiáng)支配主體o的完整性(即int(s) 2) 當(dāng)主體s讀取客體o時(shí),必須滿足以下2個(gè)條件之一:①客體o的完整性支配主體s的完整性(即int(s)≤int(o));②主體s通過具有過濾功能的輸入接口I讀取客體o。該規(guī)則表明只有客體o的完整性高于或等于主體s的完整性或者主體s通過過濾器接口I才能讀取客體o。例如,非可信內(nèi)核模塊(SUE)能夠讀取操作系統(tǒng)內(nèi)核數(shù)據(jù)(OOS-data),SOS可以通過濾器接口(即部分可信函數(shù)入口點(diǎn))讀取來源于SUE的低完整性數(shù)據(jù)。該規(guī)則的形式化表示如下 3) 當(dāng)主體s寫客體o時(shí),必須滿足條件:主體s的完整性支配客體o的完整性(即int(o)≤int(s))。該規(guī)則表明當(dāng)且僅當(dāng)主體s的完整性高于或等于客體的完整性時(shí),s才能寫o。例如:操作系統(tǒng)內(nèi)核(SOS)可以修改非可信內(nèi)核模塊數(shù)據(jù)(OUE-data),但非可信內(nèi)核模塊(SUE)卻不能修改操作系統(tǒng)內(nèi)核數(shù)據(jù)(OOS-data)。該規(guī)則的形式化表示如下 雖然本文的保護(hù)規(guī)則能保證系統(tǒng)的完整性,但是卻從一定程度上影響了系統(tǒng)的可用性。例如,本文的保護(hù)規(guī)則不允許高完整性主體從非過濾器接口讀取低完整性數(shù)據(jù),然而在實(shí)際中卻可能出現(xiàn)一些相反的情況。為增強(qiáng)MOKIP模型的可用性,設(shè)置了以下2條轉(zhuǎn)換規(guī)則。 1) 當(dāng)高完整性主體s從非過濾器接口I讀取低完整性客體o時(shí),該主體的高完整性將降至低完整性,該形式化表示為 該規(guī)則適用于這樣的可信內(nèi)核模塊,當(dāng)它通過非過濾器接口接收低完整性數(shù)據(jù)以后,其行為將受到限制,比如該模塊將無法寫高完整性數(shù)據(jù)。 2) 低完整性主體s能通過轉(zhuǎn)換器接口T提升為高完整性,從而能使該主體s能寫高完整性客體o,該形式化表示為 該規(guī)則可看成是保護(hù)規(guī)則的例外,它允許低完整性主體通過某種方式寫高完整性客體來實(shí)現(xiàn)某些特定功能,然而這些例外規(guī)則必須由系統(tǒng)管理員顯式指明。 在宏內(nèi)核構(gòu)架下,操作系統(tǒng)內(nèi)核和內(nèi)核擴(kuò)展模塊處于同一地址空間,可以不受限制地相互訪問,因此在傳統(tǒng)系統(tǒng)架構(gòu)下很難對它們之間的交互進(jìn)行訪問控制。針對這一問題,可以利用了硬件輔助的虛擬化技術(shù)。在虛擬化環(huán)境中,虛擬機(jī)管理器運(yùn)行在最底層,負(fù)責(zé)管理和調(diào)度上層客戶機(jī)操作系統(tǒng)(guest OS)的運(yùn)行。本文通過修改開源虛擬化平臺Xen[9]基本實(shí)現(xiàn)了MOKIP模型。假設(shè)操作系統(tǒng)在啟動時(shí)除操作系統(tǒng)內(nèi)核以外僅包含可信內(nèi)核模塊,并且可信內(nèi)核模塊總是通過過濾器接口讀取低完整性數(shù)據(jù)。因此,本文的實(shí)現(xiàn)可以簡化成怎樣利用虛擬機(jī)管理器監(jiān)控從操作系統(tǒng)外部載入的非可信內(nèi)核模塊的行為,其具體實(shí)現(xiàn)包括:對操作系統(tǒng)內(nèi)核對象的標(biāo)記機(jī)制和對內(nèi)核模塊的訪問控制機(jī)制。圖1給出了本原型系統(tǒng)的基本架構(gòu),其中系統(tǒng)的核心模塊位于虛擬機(jī)監(jiān)控器層,具體包括訪問控制模塊和標(biāo)記模塊。系統(tǒng)的工作流程可分為2步:首先,標(biāo)記模塊對內(nèi)核層的實(shí)體設(shè)置安全標(biāo)簽;其次,訪問控制模塊將根據(jù)安全標(biāo)簽的屬性控制內(nèi)核擴(kuò)展模塊對內(nèi)核代碼和內(nèi)核數(shù)據(jù)的訪問。 圖1 系統(tǒng)架構(gòu) MOKIP模型的實(shí)現(xiàn)依賴于硬件輔助的內(nèi)存虛擬化技術(shù)。利用Intel擴(kuò)展頁表技術(shù)(EPT, extended page tables)[10]來監(jiān)控內(nèi)核模塊在內(nèi)核空間中的活動。當(dāng)EPT功能被打開時(shí),客戶機(jī)內(nèi)存地址轉(zhuǎn)換過程如圖 2所示,客戶機(jī)頁表負(fù)責(zé)客戶機(jī)虛擬地址(GVA, guest virtual address)到客戶機(jī)物理地址(GPA,guest physical address)的轉(zhuǎn)換,EPT頁表負(fù)責(zé)客戶機(jī)物理地址(GPA)到主機(jī)物理地址(HPA, host physical address)的轉(zhuǎn)換。EPT頁表的結(jié)構(gòu)與傳統(tǒng)頁表相類似,其頁表項(xiàng)包含物理頁幀和相應(yīng)的權(quán)限位(RWX),其中,R代表可讀,W代表可寫,X代表可執(zhí)行。若權(quán)限位被置 1,則相應(yīng)物理頁幀上的權(quán)限被打開;若權(quán)限位被置 0,則相應(yīng)物理頁幀上的權(quán)限被關(guān)閉。 圖2 EPT地址轉(zhuǎn)換過程 實(shí)現(xiàn)標(biāo)記機(jī)制的目的是為了對內(nèi)核空間中的主體和客體設(shè)置相應(yīng)安全標(biāo)簽。以頁粒度為單位,利用了 EPT頁表項(xiàng)中的保留位對內(nèi)核空間中不同的頁面設(shè)置不同的安全標(biāo)簽。因?yàn)镋PT中的保留位沒有被VMM使用,改變它們的值將不會影響VMM的正常功能。目前,只使用了其中的一位,通過置1表示為高完整性標(biāo)簽Lh,通過置0表示低完整性標(biāo)簽Ll。該標(biāo)記機(jī)制的好處是不需要額外的內(nèi)存空間來存儲安全標(biāo)簽,并且還能從很大程度上減少了查找安全標(biāo)簽的時(shí)間開銷。 由于操作系統(tǒng)內(nèi)核所維護(hù)的內(nèi)存總是動態(tài)變化的,很難僅依賴VMM對這些動態(tài)內(nèi)存設(shè)置相應(yīng)安全標(biāo)簽。為了克服這種語義鴻溝[11],通過修改操作系統(tǒng)內(nèi)核讓其主動向VMM報(bào)告動態(tài)內(nèi)存信息,具體包括起始地址、物理頁幀和所屬類型(包括可信和非可信2類),然后VMM會根據(jù)這些信息對相應(yīng)的EPT頁面設(shè)置安全標(biāo)簽。圖3給出了基本的安全標(biāo)記算法。 圖3 安全標(biāo)記算法 當(dāng)操作系統(tǒng)啟動時(shí),將內(nèi)核空間中所有已分配的頁面設(shè)置成高完整性標(biāo)簽Lh。當(dāng)非可信內(nèi)核模塊被載入時(shí),操作系統(tǒng)將動態(tài)為其分配內(nèi)存。如果該非可信模塊所需的內(nèi)存是按頁大小對齊,操作系統(tǒng)將直接從空閑頁面中分配一些內(nèi)存頁面供它使用。對于這樣的情況,本系統(tǒng)直接將這些頁面設(shè)置成低完整性標(biāo)簽Ll。另一方面,如果非可信內(nèi)核模塊所需的內(nèi)存不是按頁大小對齊,操作系統(tǒng)將從現(xiàn)有非空閑頁面中為其分配內(nèi)存空間,這樣將導(dǎo)致內(nèi)核中的一些內(nèi)存頁面內(nèi)既包含可信部分(操作系統(tǒng)內(nèi)核和可信內(nèi)核模塊)又包含非可信部分(非可信內(nèi)核模塊)。對于這種情況,本系統(tǒng)將無法為這些混合頁面設(shè)置安全標(biāo)簽。 為了避免混合內(nèi)存頁面的出現(xiàn),本文修改了Linux操作系統(tǒng)中的slab內(nèi)存分配器[12]。其基本思想是使目標(biāo)操作系統(tǒng)為非可信實(shí)體分配的內(nèi)存不與為可信實(shí)體分配的內(nèi)存處于同一物理頁面。在Linux系統(tǒng)中,slab內(nèi)存分配器為不同的內(nèi)核對象生成不同的緩沖。某個(gè)對象的緩沖由一連串的slab構(gòu)成,每個(gè)slab又由一個(gè)或多個(gè)連續(xù)的物理頁組成,包含了若干同種類型的對象。通過修改Linux內(nèi)核將slab分成2類:一類為可信slab,專門為操作系統(tǒng)內(nèi)核和可信內(nèi)核模塊分配內(nèi)存;另一類為非可信slab,專門為非可信內(nèi)核模塊分配內(nèi)存。通過截獲slab的分配函數(shù)判斷其內(nèi)存分配請求是來源于可信部分還是非可信部分。對于操作系統(tǒng)內(nèi)核或可信內(nèi)核模塊的請求,使用可信slab分配內(nèi)存;對于非可信內(nèi)核模塊的請求,使用非可信slab分配內(nèi)存。這種分離可信和非可信slab的方法極大方便了本系統(tǒng)的標(biāo)記機(jī)制,將可信slab所在的內(nèi)存頁面設(shè)置成高完整性標(biāo)簽Lh,將非可信slab所在的頁面設(shè)置成低完整性標(biāo)簽Ll。 為了限制非可信擴(kuò)展模塊的行為,必須在內(nèi)核空間對其進(jìn)行訪問控制。根據(jù)MOKIP模型的保護(hù)規(guī)則,低完整性主體可以訪問低完整性客體但不能隨意訪問高完整性客體,即非可信擴(kuò)展模塊能夠讀寫自身的數(shù)據(jù),執(zhí)行自身代碼;但不能寫高完整性內(nèi)核數(shù)據(jù),不能任意執(zhí)行高完整性內(nèi)核代碼(可信入口點(diǎn)代碼除外)?;镜陌踩L問控制算法如圖 4所示。 圖4 安全訪問控制算法 為了使非可信擴(kuò)展模塊在運(yùn)行時(shí)滿足保護(hù)規(guī)則,根據(jù)不同安全標(biāo)簽隔離不同完整性的主體和客體。當(dāng)非可信內(nèi)核模塊被執(zhí)行時(shí),利用VMM將操作系統(tǒng)內(nèi)核數(shù)據(jù)和代碼所在的 EPT頁面設(shè)置成不可寫和不可執(zhí)行。如果此時(shí)非可信模塊試圖寫內(nèi)核數(shù)據(jù)或執(zhí)行內(nèi)核代碼,將會產(chǎn)生EPT頁異常而陷入到VMM中,使本系統(tǒng)可以通過VMM中的異常處理函數(shù)阻止其非法操作。另一方面,非可信模塊可能會執(zhí)行某些合法操作,比如調(diào)用內(nèi)核可信入口函數(shù)。為保證其正常運(yùn)行,使用VMM重置操作系統(tǒng)內(nèi)核及非可信擴(kuò)展模塊所對應(yīng)的EPT權(quán)限位,具體如圖5所示。將操作系統(tǒng)內(nèi)核數(shù)據(jù)置成可寫,將內(nèi)核代碼置成可執(zhí)行,同時(shí)將非可信模塊置成不可執(zhí)行。當(dāng)操作系統(tǒng)返回或又調(diào)用非可信模塊時(shí),再次利用VMM重置EPT權(quán)限位,保證非可信內(nèi)核模塊與操作系統(tǒng)內(nèi)核之間的隔離。 由于每次操作系統(tǒng)內(nèi)核和非可信內(nèi)核模塊的執(zhí)行進(jìn)行切換時(shí)都需要重置EPT頁表,這將給系統(tǒng)帶來較大的性能開銷。為了提升系統(tǒng)的性能,引入了2套EPT頁表分別對應(yīng)操作系統(tǒng)內(nèi)核和非可信模塊的執(zhí)行狀態(tài)。當(dāng)不同執(zhí)行狀態(tài)進(jìn)行切換時(shí),本系統(tǒng)只需要改變EPT基指針而無需重新設(shè)置EPT頁表。為了減少2套頁表切換時(shí)所引起的TLB刷新,為每套 EPT頁表設(shè)置不同的 VPID(virtual process ID)。此外,為保證2套EPT頁表的一致性,本系統(tǒng)需要截獲所有對 EPT的修改操作來完成它們之間的數(shù)據(jù)同步。 圖5 系統(tǒng)不同執(zhí)行狀態(tài)所對應(yīng)不同的EPT權(quán)限位 除了限制非可信內(nèi)核模塊訪問操作系統(tǒng)內(nèi)存數(shù)據(jù)以外,還需要防止非可信內(nèi)核模塊非法修改特權(quán)寄存器,比如本系統(tǒng)不允許非可信模塊使用LIDT指令重新加載IDT表。為此,利用Intel VT技術(shù)[10]將虛擬機(jī)控制結(jié)構(gòu)(VMCS)中描述符表退出(descriptor table exiting)字段值設(shè)為1,使VMM可以直接捕獲非可信內(nèi)核模塊對IDTR、GDTR等特權(quán)寄存器的修改操作。對于非法修改,通過VMM進(jìn)行指令模擬以跳過這些操作,從而保證特權(quán)寄存器的安全。 本文使用了Dell PowerEdge T310作為測試環(huán)境,其配置為Intel Xeon X3430 2.4 GHz CPU,4 GB內(nèi)存;Xen 64位3.4.2版本,Dom0主機(jī)為x86_64 Fedora 12(內(nèi)核版本為Linux-2.6.31),客戶機(jī)操作系統(tǒng)為x86_64 Ubuntu 8.04(內(nèi)核版本為Linux-2.6.24)。本文測試了原型系統(tǒng)對客戶機(jī)操作系統(tǒng)內(nèi)核保護(hù)的有效性和性能2方面。 有效性測試的目的是檢測基于 MOKIP模型的系統(tǒng)能否有效地抵御惡意內(nèi)核模塊對操作系統(tǒng)內(nèi)核的攻擊。通過Linux insmod命令向操作系統(tǒng)內(nèi)核分別載入了8種包含不同惡意行為的內(nèi)核擴(kuò)展模塊,具體見表1,其中前6種為真實(shí)的rootkit,后2種為自行開發(fā)的惡意內(nèi)核模塊。對于新引入的 ROP rootkit,由于其沒有使用能接收低完整性數(shù)據(jù)的輸入接口(即可信內(nèi)核API函數(shù)入口點(diǎn))調(diào)用內(nèi)核代碼,所以違反了本文的保護(hù)規(guī)則。實(shí)驗(yàn)結(jié)果表明所有這8個(gè)內(nèi)核模塊的惡意行為都被本系統(tǒng)成功檢測。 需要指出的是MOKIP模型僅適用于檢測那些破壞系統(tǒng)完整性的內(nèi)核模塊。如果有惡意內(nèi)核模塊用于破壞系統(tǒng)的機(jī)密性(比如讀取內(nèi)核中的敏感信息),本系統(tǒng)將無法檢測這類內(nèi)核攻擊。 本文設(shè)計(jì)了5個(gè)性能實(shí)驗(yàn),測試了MOKIP系統(tǒng)和原始的虛擬化平臺Xen對上層應(yīng)用程序的性能影響。實(shí)驗(yàn)1和實(shí)驗(yàn)2是通過監(jiān)控ext3文件系統(tǒng)測試解壓linux內(nèi)核壓縮包(即linux-2.6.24.tar.gz)和編譯linux內(nèi)核源代碼的時(shí)間;實(shí)驗(yàn)3和實(shí)驗(yàn)4是通過監(jiān)控8139too網(wǎng)卡驅(qū)動測試Apache服務(wù)器的傳輸率和Lighttpd服務(wù)器的吞吐率(2個(gè)Web服務(wù)器都加載了同一個(gè)132 Kbit大小的html網(wǎng)頁);實(shí)驗(yàn)5是通過監(jiān)控USB驅(qū)動測試從U盤拷貝文件的傳輸率。最終結(jié)果如表2所示。 表1 有效性實(shí)驗(yàn)測試結(jié)果 表2 應(yīng)用程序在虛擬機(jī)中的性能對比 與原始的Xen相比,MOKIP系統(tǒng)先后隔離并監(jiān)控了3個(gè)不同的內(nèi)核擴(kuò)展模塊,對相關(guān)應(yīng)用程序的性能開銷都在13%以內(nèi),因此能夠滿足一般的應(yīng)用需求。 為了測試MOKIP系統(tǒng)對內(nèi)核模塊裝載的內(nèi)存開銷,還測量了隔離ext3文件系統(tǒng)、8139too網(wǎng)卡驅(qū)動和USB驅(qū)動對應(yīng)slab所需的內(nèi)存頁面?zhèn)€數(shù)。表3給出了100次平均采樣的測量結(jié)果。與原始系統(tǒng)相比,本系統(tǒng)引入的內(nèi)存開銷不到1%。 表3 slab所需內(nèi)存頁面?zhèn)€數(shù)對比 美國CMU大學(xué)開發(fā)了一種輕量級虛擬機(jī)管理器 Secvisor[13],旨在保護(hù)操作系統(tǒng)內(nèi)核代碼的完整性安全。Secvisor通過解析和檢查對 MMU和IOMMU的修改操作,確保了只有被系統(tǒng)管理員認(rèn)證過的代碼才能在內(nèi)核態(tài)執(zhí)行。本文的工作MOKIP雖然借鑒了Secvisor利用虛擬機(jī)管理器管理MMU的思想,但主要不同在于:Secvisor禁止在內(nèi)核空間執(zhí)行非可信代碼,MOKIP能在保證操作系統(tǒng)內(nèi)核的完整性前提下執(zhí)行非可信內(nèi)核代碼。NICKLE[14]和 hvmHarvard[15]系統(tǒng)均采用了分離指令取址和數(shù)據(jù)訪問的思想,確保內(nèi)核指令僅能從可信內(nèi)核代碼區(qū)域取址。這種方法雖然也能保證內(nèi)核代碼的完整性,但是卻無法抵御利用現(xiàn)有內(nèi)核代碼的攻擊[16]。UCONKI[3]將UCON模型引入到操作系統(tǒng)內(nèi)核完整性保護(hù)中,實(shí)現(xiàn)了對非可信內(nèi)核模塊訪問控制的連續(xù)性和可變性。然而UCONKI需要依賴很多專家知識來制定內(nèi)核保護(hù)策略,因此不易在實(shí)際環(huán)境中應(yīng)用。美國加州大學(xué)Davis分校的Daniela等[1]通過采用Biba模型[2]中不能上寫的思想,提出了一種能感知虛擬化的操作系統(tǒng)和虛擬機(jī)管理器相協(xié)作的方法以保護(hù)操作系統(tǒng)內(nèi)核代碼和數(shù)據(jù)的安全。該方法雖然能較為全面地保護(hù)系統(tǒng)內(nèi)核,但由于需要其基于模擬器的VMM截獲每一個(gè)條對內(nèi)核代碼和數(shù)據(jù)的寫指令,其性能開銷較大,因此也不適合在實(shí)際環(huán)境中使用。LXFI[17]采用源代碼插樁技術(shù)實(shí)現(xiàn)了對脆弱內(nèi)核模塊的隔離。KFUR[18]結(jié)合源代碼插樁和動態(tài)監(jiān)控方法檢測內(nèi)核模塊調(diào)用內(nèi)核函數(shù)是否符合其使用規(guī)則。然而,LXFI和KFUR都需要修改內(nèi)核模塊源代碼,而且不能對內(nèi)核數(shù)據(jù)進(jìn)行有效地訪問控制。鄭豪等[19]利用虛擬化技術(shù)對內(nèi)核模塊中的故障進(jìn)行了隔離。該方法能有效提高系統(tǒng)可靠性,但無法阻止內(nèi)核模塊對內(nèi)核資源的非法訪問。 為了保護(hù)操作系統(tǒng)內(nèi)核完整性安全,本文提出了一種基于強(qiáng)制訪問控制的MOKIP模型,該模型根據(jù)其標(biāo)記規(guī)則將內(nèi)核空間中的不同主體和客體設(shè)置不同的安全標(biāo)簽,然后運(yùn)用保護(hù)規(guī)則限制低完整性主體訪問高完整性客體。為了提高模型的可用性,還設(shè)置了轉(zhuǎn)換規(guī)則以應(yīng)對例外的情況。為實(shí)現(xiàn)基于MOKIP模型的系統(tǒng),采用硬件輔助的虛擬化技術(shù)(比如Intel EPT和Intel VT技術(shù))將非可信內(nèi)核模塊從操作系統(tǒng)內(nèi)核空間隔離出來,然后對其行為進(jìn)行訪問控制。有效性和性能實(shí)驗(yàn)證明了本系統(tǒng)能夠檢測惡意內(nèi)核模塊破壞內(nèi)核完整性的攻擊,對應(yīng)用程序的性能開銷在可接受的范圍內(nèi)。 [1] DANIELA A S O, WU S F. Protecting kernel code and data with a virtualization-aware collaborative operating system[A]. Proceedings of the 25th Annual Computer Security Applications Conference (ACSAC)[C]. Honolulu, Hawaii, 2009. 451-460. [2] BIBA K J. Integrity consideration for secure compuer system[R].Technical report, Mitre Corp. Report TR-3153, Bedford, Mass, 1977. [3] XU M, JIANG X X, RAVI S,et al. Towards a VMM-based usage control framework for OS kernel integrity protection[A]. Proceedings of the 12th ACM Symposium on Access Control Models and Technologies[C]. Sophia Antipolis, France, 2007. 71-80. [4] Microsoft Corporation. Windows Driver Signing[EB/OL]. http://www.microsoft.com/. [5] Windows Vista Security Blog[EB/OL] http://blogs.msdn.com/ windowsvistasecurity/archive/2007/08/16/. [6] GUTTMAN J, HERZOG A, RAMSDELL J. Information flow in operating systems: eager formal methods[A]. Workshop on Issues in the Theory of Security (WITS)[C]. 2003. [7] SANDHU R S. Lattice-based access control models[J]. IEEE Computer, 1993, 26(11):9-19. [8] SHANKAR U, JAEGER T, SAILER R. Toward automated information-flow integrity verification for security-critical applications[A].Proceedings of the 13th Network and Distributed System Security Symposium (NDSS)[C]. 2006. [9] BARHAM P, DRAGOVIC B, FRASER K,et al. Xen and the art of virtualization[A]. Proceedings of the 19th ACM Symposium on Operating System Principles (SOSP)[C]. 2003. 164-177. [10] Intel Corporation. Intel 64 and IA-32 Architectures Software Developer's Manuals[EB/OL]. http://www.intel.com/Assets/PDF/manual/253669.pdf. [11] PETER M C, BRIAN D N. When virtual is better than real[A]. Proceedings of the 2001 Workshop on Hot Topics in Operating Systems(HotOS)[C]. 2001. 0133. [12] DANIEL B, MARCO C, Understanding the Linux Kernel[M]. O'Reilly& Associates Inc, third edition, 2005. [13] SESHADRI A L M Q N. PERRIG A. SecVisor: a tiny hypervisor to provide lifetime kernel code integrity for commodity OSes[A]. Proceedings of the 24th ACM Symposium on Operating System Principles(SOSP)[C]. 2007. 335-350. [14] RYAN R, JIANG X X, XU D Y. Guest-transparent prevention of kernel rootkits with VMM-based memory shadowing[A]. Proceedings of the 11th International Symposium on Recent Advances in Intrusion Detection (RAID)[C]. 2008. 1-20. [15] MICHAEL G, WANG Z, DEEPA S,et al. Transparent protection of commodity OS kernels using hardware virtualization[A]. Proceedings of the 6th International Conference on Security and Privacy in Communication Networks (SecureComm)[C]. 2010. 162-180. [16] RALF H, THORSTEN H, FELIX C F. Return-oriented rootkits: bypassing kernel code integrity protection mechanisms[A]. Proceedings of 18th Usenix Security Symposium (Usenix Security)[C]. 2009. 383-398. [17] MAO Y D, CHEN H G, ZHOU D,et al. Software fault isolation with API integrity and multi-principal modules[A]. Proceedings of the Twenty-Third ACM Symposium on Operating Systems Principles(SOSP)[C]. 2011.115-128. [18] 馬超, 尹杰, 劉虎球, 等. KFUR:一個(gè)新型內(nèi)核擴(kuò)展安全模型[J]. 計(jì)算機(jī)學(xué)報(bào), 2012, 35(10): 2091-2100.MA C, YIN J, LIU H Q,et al. KFUK: a new rernel extension security model[J]. Chinese Journal of Computers, 2012, 35(10): 2091-2100. [19] 鄭豪, 董小社, 王恩東, 等. VM內(nèi)部隔離驅(qū)動程序的可靠性架構(gòu)[J]. 軟件學(xué)報(bào), 2014, (10): 2235-2250.ZHENG H, DONG X S, WANG E D,et al. Reliability architecture to isolate the driver inside the VM[J]. Journal of Software, 2014, (10):2235-2252.2.3 保護(hù)規(guī)則
2.4 轉(zhuǎn)換規(guī)則
3 模型的基本實(shí)現(xiàn)
3.1 硬件輔助的虛擬化技術(shù)
3.2 標(biāo)記機(jī)制
3.3 訪問控制機(jī)制
4 實(shí)驗(yàn)評估
4.1 有效性測試
4.2 性能測試
5 相關(guān)工作
6 結(jié)束語