一種基于qemu的內(nèi)核級代碼重用型攻擊檢測方法
【技術領域】
[0001]本發(fā)明屬于計算機科學與技術領域,涉及惡意軟件的防護,具體是一種基于QEMU的內(nèi)核級代碼重用型攻擊檢測方法。
【背景技術】
[0002]作為一種當代新型的攻擊方法,內(nèi)核級代碼重用型攻擊不需要注入任何新的代碼,僅僅利用(或重用)內(nèi)核中已有的(合法)代碼就能構造完整攻擊并從根本上顛覆整個操作系統(tǒng),它能夠逃過內(nèi)核代碼完整性保護機制的防護,給用戶計算機系統(tǒng)安全帶來了巨大威脅。
[0003]代碼重用型攻擊需要兩步來完成:(I)攻擊者精心選擇可用的指令片段,并將它們通過特定的指令(比如ret)串接起來;(2)改變系統(tǒng)原有的執(zhí)行流程(通過篡改內(nèi)核執(zhí)行中的某個控制數(shù)據(jù),比如函數(shù)指針或函數(shù)返回地址),跳轉(zhuǎn)到攻擊者選擇的首個指令片段,實施攻擊。
[0004]最早的代碼重用型攻擊是ROP (return-oriented programming)攻擊。由于它精心選擇的指令片段都以ret指令結尾,其構造的工具集會包含許多ret指令,這在正常的系統(tǒng)中是不合理的。由此,Chen等人[ICISS 2009]提出了一種通過檢測系統(tǒng)指令執(zhí)行流程中ret指令調(diào)用的頻繁程度,從而發(fā)現(xiàn)ROP攻擊的技術方法。北卡州立大學的Li等人[ACMEuroSys 2010]通過修改編譯器,去除內(nèi)核中所有的ret指令操作碼字節(jié),使攻擊者無法找到可用的指令片段構造攻擊。而最新的代碼重用型攻擊變種已經(jīng)不再依賴于ret指令,而是改為利用類似的跳轉(zhuǎn)指令(比如間接jmp或“pop+jmp”指令)來串接指令片段,更加難以對付。為此,北卡州立大學的Li等人[IEEE TIFS 2011]提出了一種基于編譯器的方法,通過修改內(nèi)核相關指令(比如間接call和ret指令)保護內(nèi)核中的控制數(shù)據(jù)(包括函數(shù)指針和函數(shù)返回地址)來防止代碼重用型攻擊。EPFL的Kuznetsov等人[0SDI2014]同樣提出了一種基于編譯器方法,他們對程序中所有的code-pointer進行保護,從而抵御代碼重用型攻擊。
[0005]應該說,當前的研究成果對代碼重用型攻擊的檢測已經(jīng)有一定的效果。但是,已有檢測方法大都有技術限制。它們要么需要額外的硬件支持,要么需要修改內(nèi)核源代碼。前者會增加硬件成本且可擴展性較差,而后者對于非開源操作系統(tǒng)內(nèi)核(比如Windows)則不適用。
[0006]本發(fā)明提出的檢測方法是基于QEMU虛擬機管理器完成的。QEMU是一款快速、便捷的動態(tài)二進制翻譯器,它可以啟動虛擬機并支持多種不同的CPU架構。由于QEMU以二進制指令翻譯的形式執(zhí)行,它能夠?qū)μ摂M機內(nèi)核執(zhí)行的每一條指令進行干涉(或介入)。而代碼重用型攻擊均需要改變系統(tǒng)原有的執(zhí)行流程(第二步),本發(fā)明通過對改變內(nèi)核執(zhí)行流程的指令(和地點)進行監(jiān)測,就可以有效檢測和發(fā)現(xiàn)攻擊。并且,現(xiàn)有檢測方法中都沒有提供對內(nèi)核中斷流程的檢測,而攻擊者同樣能夠通過改變內(nèi)核中斷處理中的流程實施攻擊。本發(fā)明提供了對于內(nèi)核中斷流程的檢測和驗證。
【發(fā)明內(nèi)容】
[0007]為了彌補現(xiàn)有技術的不足,本發(fā)明提出了一種基于QEMU的內(nèi)核級代碼重用型攻擊檢測方法,該方法用以檢測各種內(nèi)核級代碼重用型攻擊(及其變種)的行為,保護操作系統(tǒng)的安全。
[0008]為了實現(xiàn)上述目的,本發(fā)明所采用的技術方案包括以下步驟:
[0009]1)預處理
[0010]1.1)創(chuàng)建一個空的臨時文件temp_file,并將操作系統(tǒng)內(nèi)核鏡像文件中的內(nèi)容輸出到臨時文件temp_file中;
[0011]1.2)創(chuàng)建一個記錄內(nèi)核中函數(shù)入口地址的文件func_addr_file,從temp_file文件中依次取得內(nèi)核所有函數(shù)的入口地址,并將這些地址寫入func_addr_file文件中;
[0012]1.3)創(chuàng)建一個記錄內(nèi)核中函數(shù)返回地址的文件ret_addr_file,從temp_file文件中依次取得系統(tǒng)中所有有效的函數(shù)返回地址,并將這些地址寫入re t_addr_f i 1 e文件中;
[0013]2)基于QEMU的跳轉(zhuǎn)指令目標地址的記錄和中斷流程驗證
[0014]3)跳轉(zhuǎn)指令目標地址驗證
[0015]在指令翻譯的同時,對QEMU記錄的跳轉(zhuǎn)指令的目標地址進行驗證,檢測是否發(fā)生了攻擊。
[0016]本發(fā)明進一步的改進在于:
[0017]所述步驟2)中,基于QEMU的跳轉(zhuǎn)指令目標地址的記錄和中斷流程驗證的具體方法如下:
[0018]2.1)使用QEMU啟動虛擬機內(nèi)核;
[0019]2.2)在QEMU的從客戶機指令到主機指令的翻譯階段,取得內(nèi)核指令中的一條指令I ;
[0020]2.3)在對指令I進行翻譯之前,首先判斷是否發(fā)生了中斷事件,如果發(fā)生了中斷,則跳轉(zhuǎn)到步驟2.7);
[0021]2.4)判斷指令I的類型:如果I是間接call指令,則跳轉(zhuǎn)到步驟2.5);如果I是ret指令,則跳轉(zhuǎn)到步驟2.6);否則跳轉(zhuǎn)到步驟2.8);
[0022]2.5)對間接call指令I進行如下操作:
[0023]2.5a)若文件call_addr.0ut不存在,則創(chuàng)建記錄間接call指令目標地址的文件call_addr.0ut ;
[0024]2.5b)在翻譯間接call指令I時,對其標志call_flag賦值為1 ;
[0025]2.5c)若此時發(fā)生中斷,進入中斷處理函數(shù)時判斷call_flag是否為1,若是,則記錄中斷處理時壓棧的返回地址到call_addr.0ut文件中,然后將call_flag賦值為0,跳轉(zhuǎn)到步驟2.5e);
[0026]2.5d) QEMU跳轉(zhuǎn)到間接cal 1指令的目標地址進行翻譯,在翻譯之前判斷標志call_flag是否為1,若是,則記錄翻譯塊首地址到call_addr.0ut文件中,即為間接call指令的目標地址,然后將call_flag賦值為0 ;
[0027]2.5e)跳轉(zhuǎn)到步驟 2.8);
[0028]2.6)對ret指令I進行如下操作:
[0029]2.6a)若文件ret_addr.0ut不存在,則創(chuàng)建記錄ret指令的目標地址的文件ret_addr.0ut ;
[0030]2.6b)在翻譯ret指令I時,對其標志ret_flag賦值為1 ;
[0031]2.6c)若此時發(fā)生中斷,進入中斷處理函數(shù)時判斷ret_flag是否為1,若是,則記錄中斷處理時壓桟的返回地址到ret_addr.0ut文件中,然后將ret_flag賦值為0,跳轉(zhuǎn)到步驟2.6e);
[0032]2.6d) QEMU跳轉(zhuǎn)到ret指令的目標地址進行翻譯,在翻譯之前判斷ret_f lag是否為1,若是,則記錄翻譯塊首地址到:ret_addr.0ut文件中,即為ret指令的目標地址,然后將ret_flag 賦值為 0 ;
[0033]2.6e)跳轉(zhuǎn)到步驟 2.8);
[0034]2.7)對中斷進行如下操作:
[0035]2.7a)若int_addr.0ut文件不存在,貝丨彳倉ll建記錄中斷信息的文件int_addr.0ut ;
[0036]2.7b)若無自定義桟,則初始化桟int_addr,桟頂指針指向第一個位置;
[0037]2.7c)在QEMU處理中斷的函數(shù)中將系統(tǒng)壓棧的返回地址同時壓入自定義棧int_addr 中;
[0038]2.7d)當QEMU執(zhí)行中斷程序完畢后,調(diào)用中斷返回指令時,將自定義棧int_addr中的返回地址出棧,與中斷返回指令的返回地址相比較,如果二者不同,則報告發(fā)生了攻擊,并將對比結果不同的返回地址記錄到int_addr.0ut文件中;
[0039]2.7e)跳轉(zhuǎn)到步驟 2.4);
[0040]2.8)如果操作系統(tǒng)內(nèi)核還有未處理的指令,返回步驟2.2),開始下一條指令的處理;否則結束。
[0041]所述步驟2.4)中,指令I的類型是QEMU通過識別二進制指令的操作碼進行判斷的。
[0042]所述步驟3)中,跳轉(zhuǎn)指令目標地址驗證步驟具體如下:
[0043]3.1)讀取call_addr.0ut中的每個新增的目標地址,驗證其是否是func_addr_file文件中的函數(shù)入口地址,如果不是,則報告發(fā)生了攻擊;
[0044]3.2)讀取ret_addr.0ut中的每個新增的目標地址,驗證其是否是ret_addr_f ile文件中的有效函數(shù)返回地址,如果不是,則報告發(fā)生了攻擊;
[0045]3.3)返回到 3.1)。
[0046]本發(fā)明與現(xiàn)