本發(fā)明涉及計算機操作系統(tǒng)內存安全技術領域,尤其涉及一種arm平臺上的模塊安全隔離方法。
背景技術:
長期以來,計算機內存安全是計算機操作系統(tǒng)安全的基礎。計算機內存中存儲的數(shù)據信息包括敏感內容,也包括代碼信息和操作系統(tǒng)數(shù)據。內存中的數(shù)據信息需要被保護以不被惡意竊取或篡改。
例如linux系統(tǒng)中的驅動模塊。故障的linux設備驅動將有可能對整個linux系統(tǒng)造成危害。linux設備驅動是軟件系統(tǒng)和硬件設備交互的接口,它將軟件的設備請求命令轉化為特定設備的控制命令,使得linux中的設備能正常運轉并被linux用戶程序使用。另一方面,設備驅動將設備的狀態(tài)及時通知給軟件包括linux系統(tǒng)。近年來,因設備驅動發(fā)生故障造成的事故層出不窮。linux設備驅動的高復雜性是影響設備驅動的可靠性和正確性的重要因素之一。異步事件如中斷導致代碼交錯執(zhí)行、復雜的靜態(tài)數(shù)據結構互相交織、驅動開發(fā)者開發(fā)的高難度是設備驅動存在錯誤的原因。為保證設備驅動的可靠性,一個重要的方法是將設備驅動故障隔離。它是通過使用故障隔離和恢復的手段,使得設備驅動程序的故障不會導致自身或操作系統(tǒng)的運行被中止,從而一定程度上保證了系統(tǒng)的可靠性。
arm架構有著低功耗、易擴展、可靠性等優(yōu)勢,而armv8架構的推出大大促使了arm架構處理器在傳統(tǒng)pc、服務器領域的流行。隨之而來,arm架構的linux系統(tǒng)上的安全被關注。
但是不同于傳統(tǒng)x86架構,arm架構尤其是armv8架構,有著不同的硬件特性,導致架構特定的linux系統(tǒng)的實現(xiàn)存在相當差異?;趚86架構的安全隔離機制大多依賴x86硬件屬性,不適用于arm架構的安全隔離。
技術實現(xiàn)要素:
本發(fā)明的目的是提供一種arm平臺上的模塊安全隔離方法,該方法能夠保護linux系統(tǒng)免受來自非可信模塊的威脅,提高linux系統(tǒng)的安全可靠性。
為達上述目的,本發(fā)明所采用的技術方案為:
一種arm平臺上的模塊安全隔離方法,其步驟包括:
1)將linux內核空間分為可信內核空間和非可信空間;其中可信內核空間中運行l(wèi)inux內核;非可信空間中運行被隔離的模塊(非可信模塊);
2)當可信內核空間代碼跳轉到非可信空間代碼或訪問非可信空間的數(shù)據時,在可信內核空間產生instructionabort(指令中止)或dataabort(數(shù)據中止),若所述instructionabort或dataabort由可信內核空間與非可信空間的隔離機制產生,則由el2特權層的hypervisormonitor(安全監(jiān)控器)將可信內核空間切換至非可信空間;
3)執(zhí)行非可信空間代碼,直到非可信空間產生mmufault異常,該mmufault異常被el1特權層的trampoline處理后陷入hypervisormonitor;
4)hypervisormonitor將上述mmufault異常發(fā)生時的lr、far_el1、elr_el1寄存器內容與el2特權層的accesspolicy(安全規(guī)則)進行對比,如果所述寄存器內容符合正常的調用和訪問關系,則由el2特權層的hypervisormonitor將非可信空間切換至可信內核空間。
進一步地,步驟2)中當檢測到所述instructionabort或dataabort發(fā)生的位置的對應頁表項權限為notpresent(即該頁表項不存在或非法)時,則所述instructionabort或dataabort由可信內核空間與非可信空間的隔離機制產生。
進一步地,步驟2)中若所述instructionabort或dataabort不是由可信內核空間與非可信空間的隔離機制產生,則作為正常mmufault異常由linux內核中現(xiàn)有的內核異常處理機制進行處理。
進一步地,步驟2)中所述可信內核空間切換至非可信空間是通過修改頁表基地址寄存器ttbr1_el1和異常向量基地址寄存器vabr_el1為對應非可信空間的值完成。
進一步地,步驟2)還包括:hypervisormonitor將hcr_el2.tvm控制位置1,以限制切換后的非可信空間代碼對hcr_el2.tvm指定的寄存器的寫訪問。
更進一步地,步驟3)還包括:所述異常向量基地址寄存器vabr_el1指定異常向量表的基地址,不同類型的mmufault異常由該異常向量表被導向至各個異常處理例程。
進一步地,步驟3)中所述mmufault異常不僅僅包括步驟2)中的instructionabort和dataabort。
進一步地,步驟3)中所述trampoline是屬于.fi_trampoline區(qū)的輔助安全隔離的組件;且trampoline包含異常處理代碼和超級調用(hvc指令)相關代碼。
進一步地,步驟4)中所述非可信空間切換至可信內核空間是通過修改頁表基地址寄存器ttbr1_el1和異常向量基地址寄存器vabr_el1為對應可信內核空間的值完成。
進一步地,步驟4)還包括:hypervisormonitor將hcr_el2.tvm控制位置0,以恢復切換后的可信內核空間代碼對hcr_el2.tvm指定的寄存器的寫訪問。
本發(fā)明的有益效果在于:本發(fā)明提供一種arm平臺上的模塊安全隔離方法,該方法根據虛擬內存布局將linux內核空間分割以隔離虛擬地址空間,其中l(wèi)inux內核空間被分為運行l(wèi)inux內核的可信內核空間和運行非可信模塊的非可信空間,以提高linux系統(tǒng)的安全可靠性。本發(fā)明方法還借助arm硬件特性,更安全高效地限制非可信模塊,以保證linux系統(tǒng)的可靠穩(wěn)定性。
附圖說明
圖1是本發(fā)明可信內核空間與非可信空間的隔離機制的組件示意圖;
圖2是本發(fā)明可信內核空間和非可信空間的內存映射示意圖;
圖3是本發(fā)明可信內核空間和非可信空間切換的流程圖。
具體實施方式
為使本發(fā)明的上述特征和優(yōu)點能更明顯易懂,下文特舉實施例,并配合所附圖作詳細說明如下。
本發(fā)明是基于linux系統(tǒng)的方案,其中所涉及的現(xiàn)有的系統(tǒng)調用、結構、函數(shù)的名稱在本領域均習慣使用英文,對于沒有公認中文釋義的名稱,使用中文反而有可能讓本領域技術人員迷惑;且這些名稱在linux系統(tǒng)中均有特定含義,技術人員能夠明確各名稱所表示的內容,而不會產生誤解。因此本發(fā)明中所涉及的linux系統(tǒng)中現(xiàn)有的、無公認中文翻譯的名稱均使用英文表示。
本發(fā)明提供一種arm平臺上的模塊安全隔離方法,其步驟為:
1)根據虛擬內存布局將linux內核空間分割以隔離虛擬地址空間,且linux內核空間分為可信內核空間和非可信空間。其中非可信空間中運行被隔離的模塊(即非可信模塊);可信內核空間中運行l(wèi)inux內核(即linuxkernel)。
2)當可信內核空間代碼跳轉到非可信空間的代碼或訪問非可信空間的數(shù)據時,在可信內核空間中產生instructionabort或dataabort(即兩種mmufault異常),由可信內核空間中內核異常處理代碼接管處理,并在期間檢查判斷安全性,以決定是否陷入至arm的el2特權層。若該instructionabort或dataabor由可信內核空間與非可信內核空間的隔離機制產生,即檢測到該instructionabort或dataabort發(fā)生的位置的對應頁表項權限為notpresent時,則陷入至el2特權層;反之,將作為正常mmufault異常,由linux內核中現(xiàn)有的內核異常處理機制進行處理。
3)如果陷入至el2特權層,那么將由el2特權層的hypervisormonitor進行處理。hypervisormonitor將切換空間,即由可信內核空間切換至非可信空間。此操作通過修改頁表基地址寄存器ttbr1_el1和異常向量基地址寄存器vabr_el1為對應非可信空間的值完成。同時,hypervisormonitor將hcr_el2.tvm控制位置1,限制切換后的非可信空間代碼對hcr_el2.tvm指定的寄存器的寫訪問。
4)在切換后,非可信空間代碼將被執(zhí)行,直到非可信空間產生的mmufault異常被el1特權層的trampoline截獲,之后trampoline對所述mmufault異常進行處理后陷入hypervisormonitor。異常向量基地址寄存器vabr_el1指定異常向量表的基地址,不同類型的mmufault異常由該異常向量表被導向至各個異常處理例程。對于el1_sync類異常,保存異常上下文后,使用超級調用(hvc指令)陷入hypervisormonitor。
5)el2特權層的hypervisormonitor根據上述instructionabort或dataabort發(fā)生時的lr、far_el1、elr_el1寄存器內容,將這一組寄存器內容與el2特權層的accesspolicy進行對比,以確定是否符合正常的調用和訪問關系。
6)如果上述寄存器內容符合正常的調用和訪問關系,則由el2特權層的hypervisormonitor切換空間即由非可信空間切換至可信內核空間。此操作是通過修改頁表基地址寄存器ttbr1_el1和異常向量基地址寄存器vabr_el1為對應可信內核空間的值實現(xiàn)。同時,hypervisormonitor將hcr_el2.tvm控制位置0,恢復切換后的非可信空間代碼對hcr_el2.tvm指定的寄存器的寫訪問。
下面舉一具體實施例來解釋說明本發(fā)明方法。
一種arm平臺上的模塊安全隔離方法,其步驟包括:
1、請參考圖1,本發(fā)明提供的可信內核空間與非可信空間的隔離機制的組件包括el1特權層的trampoline、el2特權層的hypervisormonitor、el2特權層的accesspolicy。其中el1、el2分別是armv8處理器的特權級別,且el2的特權級別高于el1。hypervisormonitor是安全監(jiān)控器,accesspolicy是安全規(guī)則,trampoline則是輔助安全隔離的組件。
2、對linux系統(tǒng)的源代碼進行修改,使用gcc編譯器的_attribute_屬性,修改非可信空間代碼,建立多個如同.unstrusted.text和.untrusted.data等類型的區(qū)(section)。之后修改vmlinux.lds.s的鏈接腳本,將區(qū)映射到vmlinux鏡像中的段(segment)中。
下面是一小段代碼,這段代碼將在鏈接時以頁大小對齊.untrusted.text區(qū),將.untrusted.text區(qū)映射到.text段,并獲得段起始位置值_untrusted_stext和結束位置值_untrusted_etext。
通過上述方法,可以將代碼和數(shù)據分別合并且對齊頁面大小。.untrusted.data和.untrusted.text區(qū)將分別包含非可信對象數(shù)據和函數(shù)。
3、為了實現(xiàn)非可信空間到可信內核空間的切換,引入一個trampoline,處理來自非可信空間的mmufault異常,該mmufault異常不僅僅包括instructionabort和dataabort。trampoline屬于.fi_trampoline區(qū)。trampoline包含異常處理代碼和超級調用(hvc指令)相關代碼。
4、在初始內核頁表建立初始內存映射布局,即paging_init后加入fi_create_init_mapping函數(shù)。通過此函數(shù),將.unstrusted.text、.untrusted.data和.fi_trampoline區(qū)的對象映射至非可信空間,同時將這些區(qū)的對象在初始內核頁表中的對應頁表項權限位設置為notpresent(即該頁表項不存在或非法),這便建立了初始內存映射布局。如圖2所示,該圖中rx表示頁表項權限為讀、可執(zhí)行;rw表示頁表項權限為讀、寫。初始內核頁表的布局即是圖中可信內核空間的內存映射情況,僅有可信內核空間代碼、內核數(shù)據被映射;而非可信空間的內存映射中,僅有非可信空間代碼、非可信數(shù)據、trampoline被映射。
5、對非可信空間的對象使用基于arm硬件的限制方法。使用armv8中的hcr_el2.tvm控制位使得非可信空間對象無法對包括tcr_el1、ttbr1_el1等寄存器進行寫訪問。對可信內核空間對象則關閉了此控制位。這是通過在可信內核空間和非可信空間切換過程中置位\清零tvm位實現(xiàn)的。
6、針對從可信內核空間切換至非可信空間的操作,如圖3中箭頭b指示的路徑??尚艃群丝臻g訪問非可信空間時,可信內核空間切換至非可信內核空間的arm指令產生instructionabort或dataabort(即兩種mmufault異常),并保存instructionabort或dataabort的上下文信息。當上述instructionabort或dataabort是由可信內核空間與非可信空間的隔離機制產生時,則陷入el2特權層的hypervisormonitor;當上述instructionabort或dataabort不是由可信內核空間與非可信空間的隔離機制產生時,則作為正常mmufault異常由linux內核中現(xiàn)有的內核異常處理機制進行處理。其中當產生mmufault異常的指令是一個控制流切換指令時,則產生instructionabort;當產生mmufault異常的指令是一個store(內存寫)和load(內存讀)指令時,則產生dataabort??尚艃群丝臻g中現(xiàn)有的內核異常處理代碼,在內核異常處理入口如el1_inv和el1_da分別對instructionabort和dataabort進行處理。對內核異常處理流程進行hook操作,對于el1_inv,在bad_mode函數(shù)中插入檢查代碼檢查此次mmufault異常是否由非可信空間導致,并檢查當前線程信息是否被映射至非可信空間,若是則使用超級調用進入hypervisormonitor進行后續(xù)處理。對于el1_da,在do_mem_abort函數(shù)中插入檢查代碼,這些代碼檢查此次mmufault異常是否由非可信空間導致,若是則使用超級調用進入hypervisormonitor進行后續(xù)安全檢查。
7、在步驟6之后,處于el2特權層的hypervisormonitor通過讀取esr_el1的信息,區(qū)分instructionabort或dataabort的異常類型。對于instructionabort區(qū)分由bl還是ret指令引起的異常,得到控制流轉換的目標地址,接著恢復上下文直接進入非可信空間。對于dataabort則讀取esr_el1中信息,區(qū)分由store還是load指令引起的異常,通過hypervisormonitor對數(shù)據訪問進行模擬,最終恢復上下文,進入非可信空間。
8、在步驟7之后,為了從hypervisormonitor返回到非可信空間,使用了步驟6中描述的instructionabort或dataabort異常發(fā)生時保存的上下文信息,使用x0作為臨時寄存器,將sp_el1、elr、esr、spsr_el2、elr_el2、x2–x29、lr寄存器恢復至未產生異常時的上下文,并在最后使用ldrx0,x1[x0,#16*0]恢復x0和x1未產生異常時的值。以下宏代碼示例展示了返回過程的步驟。
.macroel2_to_el1
restoresp
shiftx0contenttofitwithhypmapping
loadvaluetoelr_el2andspsr_el2
recoverx2-x29usingx0assp
recoverlrusingx0assp
recoverx0andx1usingx0assp
exceptionreturn
.endm
9、針對從非可信空間切換至可信內核空間的操作,如圖3中箭頭a指示的路徑。非可信空間對象執(zhí)行可信內核空間的指令,在非可信空間產生mmufault異常。這種mmufault異常將由trampoline進行處理,通過的異常向量表如下:
trampoline中kvm_el1_sync分支處理這類mmufault異常,在保存了當前異常的上下文信息到內核棧后,使用一個超級調用(hvc指令)陷入處于el2特權層的hypervisormonitor。
10、在步驟9之后,hypervisormonitor通過讀取far_el1、elr_el1、lr寄存器內容,分辨此次mmufault異常類型。對于異常類型為instructionabort而言,通過檢查far_el1寄存器內容,辨別此次來自非可信空間的instructionabort是否正常,對于正常instructionabort則切換ttbr1_el1和vbar_el1并返回到非可信空間。若檢查為非正常的instructionabort則報告故障。對于異常類型為dataabort而言,通過檢查esr_el1寄存器內容,區(qū)分load、store,檢查是否為來自非可信空間的正常的操作。對于正常的操作,在hypervisormonitor中模擬讀寫操作,完成后返回非可信空間,跳過引起異常的此條指令。若為非正常的操作則報告故障。
11、在步驟10之后,為從hypervisormonitor返回到可信內核空間,使用了步驟9中異常發(fā)生時保存的上下文信息,同樣使用類似步驟8的宏代碼,以返回到可信內核空間。
以上實施僅用以說明本發(fā)明的技術方案而非對其進行限制,本領域的普通技術人員可以對本發(fā)明的技術方案進行修改或者等同替換,而不脫離本發(fā)明的精神和范圍,本發(fā)明的保護范圍應以權利要求書所述為準。