王 燁 李清寶 曾光裕 陳志鋒
(解放軍信息工程大學(xué) 鄭州 450001) (數(shù)學(xué)工程與先進(jìn)計(jì)算國家重點(diǎn)實(shí)驗(yàn)室(解放軍信息工程大學(xué)) 鄭州 450001) (daguoli415@163.com)
?
基于代碼防泄漏的代碼復(fù)用攻擊防御技術(shù)
王 燁 李清寶 曾光裕 陳志鋒
(解放軍信息工程大學(xué) 鄭州 450001) (數(shù)學(xué)工程與先進(jìn)計(jì)算國家重點(diǎn)實(shí)驗(yàn)室(解放軍信息工程大學(xué)) 鄭州 450001) (daguoli415@163.com)
隨著地址空間布局隨機(jī)化被廣泛部署于操作系統(tǒng)上,傳統(tǒng)的代碼復(fù)用攻擊受到了較好的抑制.但新型的代碼復(fù)用攻擊能通過信息泄露分析程序的內(nèi)存布局而繞過地址空間布局隨機(jī)化(address space layout randomization, ASLR),對(duì)程序安全造成了嚴(yán)重威脅.通過分析傳統(tǒng)代碼復(fù)用攻擊和新型代碼復(fù)用攻擊的攻擊本質(zhì),提出一種基于代碼防泄漏的代碼復(fù)用攻擊防御方法VXnR,并在Bitvisor虛擬化平臺(tái)上實(shí)現(xiàn)了VXnR,該方法通過將目標(biāo)進(jìn)程的代碼頁設(shè)置可執(zhí)行不可讀(Execute-no-Read, XnR),使代碼可以被處理器正常執(zhí)行,但在讀操作時(shí)根據(jù)被讀物理頁面的存儲(chǔ)內(nèi)容對(duì)讀操作進(jìn)行訪問控制,從而阻止攻擊者利用信息泄露漏洞惡意讀進(jìn)程代碼頁的方法搜索gadgets,實(shí)驗(yàn)結(jié)果表明:該方法既能防御傳統(tǒng)的代碼復(fù)用攻擊,還能夠防御新型的代碼復(fù)用攻擊,且性能開銷在52.1%以內(nèi).
地址空間布局隨機(jī)化;代碼復(fù)用攻擊;程序安全;信息泄露;虛擬化
近年來,計(jì)算機(jī)軟件經(jīng)歷著一場(chǎng)漏洞利用攻擊與防御惡意攻擊行為之間的對(duì)抗.越來越多的攻擊方法被發(fā)現(xiàn),其中代碼復(fù)用攻擊(code reuse attack,CRA)正成為安全領(lǐng)域研究的熱點(diǎn),如return-into-libc[1],ROP(return-oriented programming)[2-5],JOP(jump-oriented programming)[6-8]和SROP(sigreturn-oriented programming)[9]等.代碼復(fù)用攻擊是一種新型的攻擊技術(shù),與傳統(tǒng)的惡意代碼攻擊不同,代碼復(fù)用攻擊不需要引入額外的惡意代碼,僅使用程序已有的代碼便能實(shí)施惡意攻擊,使得數(shù)據(jù)執(zhí)行保護(hù)(data execution protection, DEP)[4]和棧溢出保護(hù)(stack smashing protection, SSP)[10]等防御機(jī)制失效.
為了有效檢測(cè)和防御代碼復(fù)用攻擊,研究人員提出了多種檢測(cè)方法和防御技術(shù),其中應(yīng)用最廣泛的方法是ASLR[11].傳統(tǒng)的ASLR機(jī)制通過隨機(jī)化代碼段的基地址使得攻擊者無法預(yù)知代碼在內(nèi)存中的具體位置,從而阻止代碼復(fù)用攻擊.由于這種傳統(tǒng)的ASLR只是改變了整個(gè)代碼段的基地址,一旦泄漏一個(gè)指針值就可以通過它們的相對(duì)偏移發(fā)現(xiàn)所有g(shù)adget的地址.為了阻止攻擊者獲取所需gadgets的有效地址,一些更復(fù)雜的隨機(jī)化技術(shù)被研究提出,主要分為細(xì)粒度隨機(jī)化和加載時(shí)隨機(jī)化2類.細(xì)粒度隨機(jī)化通過將隨機(jī)化的基本塊粒度細(xì)化到函數(shù)級(jí)和指令級(jí),Pappas等人[12]就提出了一種in-place代碼隨機(jī)化技術(shù),通過指令重排列、等價(jià)指令替換和寄存器重賦值等方法阻止ROP攻擊;加載時(shí)隨機(jī)化技術(shù)主要是通過在程序加載時(shí)進(jìn)行地址隨機(jī)化處理,文獻(xiàn)[13]分析了Vista中的ASLR機(jī)制,如果可執(zhí)行文件被打上了ASLR標(biāo)記,進(jìn)程的代碼段基地址、棧基地址、堆基地址和PEB(process environment block)的位置等都在進(jìn)程加載時(shí)被隨機(jī)化.這類ASLR機(jī)制對(duì)系統(tǒng)的性能消耗較小,且能有效阻止攻擊者使用預(yù)先計(jì)算的gadget鏈完成事先設(shè)計(jì)的攻擊.
為了繞過上述ASLR機(jī)制,Snow等人[14]提出just-in-time代碼復(fù)用攻擊技術(shù)(下面簡(jiǎn)稱JIT-ROP,即時(shí)代碼復(fù)用攻擊),該攻擊技術(shù)是在腳本環(huán)境下通過一個(gè)內(nèi)存泄漏漏洞在線獲取程序的內(nèi)存布局,在收集到的內(nèi)存頁中動(dòng)態(tài)搜索API函數(shù)和gadgets,完成payload構(gòu)造,利用payload即時(shí)編譯攻擊代碼,完成代碼復(fù)用攻擊.JIT-ROP攻擊是一種動(dòng)態(tài)計(jì)算構(gòu)造gadgets鏈的攻擊方法,可以繞過現(xiàn)有的防御機(jī)制,是當(dāng)前最復(fù)雜的攻擊技術(shù)之一.
由于JIT-ROP攻擊需要利用一個(gè)信息泄漏后門讀取任意內(nèi)存位置內(nèi)容搜索gadgets,通過強(qiáng)制可執(zhí)行代碼不可被讀或者被反匯編,可以避免內(nèi)存中可執(zhí)行代碼信息泄漏的風(fēng)險(xiǎn),阻止攻擊者在線構(gòu)造gadgets鏈.根據(jù)上述思想,Backes等人[15]設(shè)計(jì)完成了XnR系統(tǒng).XnR只允許代碼可以被處理器取指令操作訪問和執(zhí)行,但不能以讀數(shù)據(jù)方式被訪問,由此可知XnR能阻止針對(duì)可執(zhí)行代碼的內(nèi)存泄漏攻擊和JIT-ROP攻擊.但該方法只能阻止未映射到內(nèi)存的代碼頁被非法訪問,攻擊者可以通過在內(nèi)存中的代碼頁進(jìn)行漏洞利用搜索gadgets,從而繞過保護(hù)機(jī)制發(fā)動(dòng)JIT-ROP攻擊.
為了有效防御代碼復(fù)用攻擊,本文借鑒W⊕X和XnR的設(shè)計(jì)思路,提出了一種基于代碼防泄漏的代碼復(fù)用攻擊防御方法VXnR.該方法利用內(nèi)存虛擬化技術(shù),在虛擬層實(shí)現(xiàn)對(duì)可疑漏洞程序的內(nèi)存代碼頁添加Execute-no-Read保護(hù)屬性,使得進(jìn)程的代碼頁可以被CPU取指執(zhí)行但不能被讀操作訪問,攻擊者無法通過內(nèi)存泄漏獲取到漏洞進(jìn)程的代碼頁信息,這種保護(hù)機(jī)制大大降低了攻擊者繞過防御機(jī)制的可能性.實(shí)現(xiàn)VXnR需要解決的挑戰(zhàn)性技術(shù)問題:
1) 無法直接區(qū)分對(duì)內(nèi)存的合法的數(shù)據(jù)訪問和對(duì)代碼的讀行為.雖然HideM[16]通過分立式TLB結(jié)構(gòu)ITLB和DTLB區(qū)分對(duì)數(shù)據(jù)和指令代碼的訪問操作,而目前的處理器已經(jīng)升級(jí)為統(tǒng)一式TLB結(jié)構(gòu),HideM方法需要依賴硬件結(jié)構(gòu),不具有普適性.
2) 具有不可讀但可執(zhí)行訪問權(quán)限的內(nèi)存并不存在.可執(zhí)行權(quán)限意味著必須可讀,無法直接對(duì)可執(zhí)行代碼頁設(shè)置“可執(zhí)行不可讀”權(quán)限.XnR通過修改頁錯(cuò)誤處理函數(shù)和請(qǐng)求頁面處理函數(shù),限制內(nèi)存中進(jìn)程虛擬頁面頁數(shù),在觸發(fā)缺頁異常時(shí)對(duì)訪問操作進(jìn)行判斷,根據(jù)判斷結(jié)果來限制對(duì)代碼頁的讀行為,該方法只能對(duì)不在內(nèi)存的虛擬頁訪問控制,攻擊者可以利用在內(nèi)存的虛擬頁繞過缺頁異常處理函數(shù),進(jìn)行代碼復(fù)用攻擊.
針對(duì)代碼復(fù)用攻擊的防御需求及面臨的技術(shù)挑戰(zhàn),本文主要貢獻(xiàn)如下:
1) 提出了一種基于代碼防泄漏的代碼復(fù)用攻擊防御方法VXnR.該方法通過阻止對(duì)進(jìn)程代碼非法讀訪問,使攻擊者無法搜索構(gòu)造gadget,實(shí)現(xiàn)了對(duì)新型代碼復(fù)用攻擊的防御.相比現(xiàn)有的防御方法的優(yōu)勢(shì)體現(xiàn)在:①無需修改客戶操作系統(tǒng);②避免客戶操作系統(tǒng)旁路甚至破壞代碼復(fù)用防御系統(tǒng),解決了VXnR的安全性問題;③性能開銷較小,可靠性高.
2) 針對(duì)主要技術(shù)挑戰(zhàn),提出了2項(xiàng)解決方法:基于缺頁異常的內(nèi)存訪問操作識(shí)別、基于硬件輔助頁面映射機(jī)制的XnR權(quán)限修改.2項(xiàng)技術(shù)均在虛擬機(jī)監(jiān)控層實(shí)現(xiàn),對(duì)上層操作系統(tǒng)透明,同時(shí)具有更高的安全性,即使客戶操作系統(tǒng)內(nèi)核被攻破也不影響底層安全機(jī)制.
3) 在一種虛擬化平臺(tái)Bitvisor上實(shí)現(xiàn)了VXnR原型系統(tǒng),并使用代碼復(fù)用攻擊測(cè)試程序評(píng)估了VXnR的有效性和性能.實(shí)驗(yàn)表明VXnR在保護(hù)客戶操作系統(tǒng)中的目標(biāo)進(jìn)程,防御代碼復(fù)用攻擊的同時(shí),僅帶來了不超過52.1%的運(yùn)行時(shí)開銷.
傳統(tǒng)的代碼復(fù)用攻擊利用逆向工程工具靜態(tài)分析目標(biāo)可執(zhí)行程序,通過搜索算法尋找以ret,jmp和call等轉(zhuǎn)移指令結(jié)尾的短指令序列g(shù)adgets,鏈接這些指令序列構(gòu)造payload,并將其地址以及指令序列需要的數(shù)據(jù)布置在堆棧中,當(dāng)目標(biāo)程序執(zhí)行時(shí)通過一個(gè)程序漏洞將控制流導(dǎo)向堆棧中的payload,進(jìn)行代碼復(fù)用攻擊.
隨著ASLR思想的提出,程序執(zhí)行的指令和代碼在內(nèi)存中的位置都被改變,靜態(tài)分析搜索到的gadgets地址并不可用,限制了傳統(tǒng)的代碼復(fù)用攻擊.為了繞過該防御機(jī)制,新型的代碼復(fù)用攻擊利用內(nèi)存泄漏漏洞使攻擊者在程序運(yùn)行時(shí)可以動(dòng)態(tài)獲取內(nèi)存布局,讀取被隨機(jī)化后的gadget的真實(shí)地址,成功利用程序已有代碼完成攻擊.
綜上,隨著有效防御機(jī)制的發(fā)展,傳統(tǒng)的代碼復(fù)用攻擊受到了一定的抑制,但新型的代碼復(fù)用攻擊仍然不斷涌現(xiàn).一種新型的代碼復(fù)用攻擊一般分為2個(gè)階段:1)需要針對(duì)具有某個(gè)漏洞的目標(biāo)程序進(jìn)行信息泄露以獲取到該程序的內(nèi)存分布;2)進(jìn)行實(shí)際的漏洞利用并發(fā)動(dòng)代碼復(fù)用攻擊.結(jié)合細(xì)粒度的地址空間布局隨機(jī)化機(jī)制,本文提出的防御方法旨在第1步阻止代碼復(fù)用攻擊,保護(hù)目標(biāo)程序的內(nèi)存布局,使攻擊者無法搜索讀取目標(biāo)程序的可執(zhí)行代碼,防御攻擊者利用目標(biāo)程序已有代碼進(jìn)行代碼復(fù)用攻擊.
1.1 總體架構(gòu)
若將代碼復(fù)用攻擊防御程序設(shè)置于內(nèi)核中,那么一旦內(nèi)核遭到破壞,防御程序就有可能被攻擊者禁用,從而被繞過.因此,我們引入虛擬機(jī)架構(gòu),并將防御程序放置于Hypervisor中,這種機(jī)制大大降低了攻擊者繞過防御系統(tǒng)的可能性.防御架構(gòu)如圖1所示:
Fig. 1 System architecture of VXnR.圖1 VXnR系統(tǒng)架構(gòu)
從圖1中可知,系統(tǒng)架構(gòu)由進(jìn)程檢測(cè)模塊process detector和在線保護(hù)代碼頁模塊runtime protect兩部分組成,分別對(duì)應(yīng)檢測(cè)漏洞進(jìn)程加載階段和在線保護(hù)階段.檢測(cè)漏洞進(jìn)程加載階段通過Hypervisor中的進(jìn)程檢測(cè)模塊檢測(cè)目標(biāo)進(jìn)程的加載運(yùn)行.當(dāng)目標(biāo)進(jìn)程processT在用戶層加載時(shí),進(jìn)程檢測(cè)模塊會(huì)檢測(cè)到目標(biāo)進(jìn)程的運(yùn)行,并通知在線保護(hù)代碼頁模塊對(duì)進(jìn)程processT執(zhí)行在線保護(hù).在線保護(hù)代碼頁模塊接收到進(jìn)程檢測(cè)模塊的消息后,系統(tǒng)進(jìn)入在線保護(hù)階段,目標(biāo)進(jìn)程對(duì)物理內(nèi)存的訪問操作都需要經(jīng)過在線保護(hù)代碼頁模塊,而未被保護(hù)進(jìn)程對(duì)內(nèi)存的訪問不需要通過在線保護(hù)代碼頁模塊.利用虛擬化內(nèi)存管理技術(shù),對(duì)目標(biāo)進(jìn)程processT的內(nèi)存頁執(zhí)行Execute-no-Read保護(hù).當(dāng)處理器訪問目標(biāo)進(jìn)程代碼頁進(jìn)行取指令執(zhí)行代碼(fetch)時(shí),該操作通過在線保護(hù)驗(yàn)證;當(dāng)處理器執(zhí)行讀(read)操作訪問目標(biāo)進(jìn)程代碼頁時(shí),在線保護(hù)代碼頁模塊認(rèn)為該操作為非法操作并拒絕服務(wù).本系統(tǒng)實(shí)現(xiàn)需要的關(guān)鍵技術(shù)主要有2個(gè):1)需要定位到目標(biāo)進(jìn)程代碼段在內(nèi)存中的位置,并設(shè)置目標(biāo)進(jìn)程代碼頁的訪問權(quán)限為只可執(zhí)行不可讀;2)在線保護(hù)代碼頁模塊需要區(qū)分2個(gè)內(nèi)存訪問操作,即合法的數(shù)據(jù)訪問和對(duì)代碼的讀行為.
1.2 基于缺頁異常的內(nèi)存訪問操作識(shí)別
本文將內(nèi)存訪問操作分為3種:取指令(instr-uction fetch)、讀數(shù)據(jù)(read data)和讀代碼(read code).取指令操作表示處理器從內(nèi)存取一個(gè)字節(jié),譯碼執(zhí)行指令,這是代碼執(zhí)行時(shí)發(fā)生的合法操作;讀數(shù)據(jù)操作表示指令執(zhí)行訪問內(nèi)存數(shù)據(jù)的行為,這里的數(shù)據(jù)不包含代碼,這是程序運(yùn)行時(shí)發(fā)生的合法操作;讀代碼操作表示指令執(zhí)行訪問內(nèi)存數(shù)據(jù)的行為,這里的數(shù)據(jù)僅指代碼,這是信息泄露的可疑行為,所以認(rèn)為是非法的操作.
Fig. 3 Memory access operations identification method based on page fault violation.圖3 基于缺頁異常的內(nèi)存訪問操作識(shí)別方法
為了發(fā)現(xiàn)非法的讀代碼行為,首先需要攔截對(duì)內(nèi)存的訪問操作,然后判斷該訪問操作類型.在虛擬層,攔截對(duì)內(nèi)存的訪問操作可以通過監(jiān)控與內(nèi)存訪問操作行為相關(guān)的指令,包括read,load和store等,修改編譯器對(duì)相關(guān)指令靜態(tài)插樁或者利用動(dòng)態(tài)插樁工具在程序運(yùn)行過程中動(dòng)態(tài)插樁,當(dāng)程序執(zhí)行與內(nèi)存訪問操作相關(guān)的指令時(shí)觸發(fā)異常,陷入虛擬機(jī)監(jiān)控器.但是靜態(tài)插樁需要程序的源碼,動(dòng)態(tài)插樁對(duì)系統(tǒng)的性能開銷較大,而且與內(nèi)存訪問操作行為相關(guān)的指令種類較多,因此,該方法有一定局限性且可行性較差.
利用操作系統(tǒng)虛擬內(nèi)存管理機(jī)制,本文提出基于缺頁異常的內(nèi)存訪問操作識(shí)別方法.新建進(jìn)程的虛擬地址空間是按寫時(shí)復(fù)制方式從創(chuàng)建者進(jìn)程中復(fù)制,屬于共享的虛擬地址空間,在進(jìn)程剛加載完新程序之后,它的虛擬地址空間幾乎是空的.而加載操作僅在虛擬地址空間與可執(zhí)行文件之間建立了映射關(guān)系,并未真正將文件的內(nèi)容讀入內(nèi)存.在虛擬機(jī)監(jiān)控器架構(gòu)下,客戶機(jī)的訪存操作需要利用硬件輔助頁面映射(hardware assisted paging, HAP)頁表項(xiàng)進(jìn)行地址轉(zhuǎn)換,HAP是基于硬件虛擬化實(shí)現(xiàn)虛擬機(jī)物理地址空間隔離的頁表映射機(jī)制,不同的硬件廠商提供特定平臺(tái)的HAP機(jī)制,如Intel處理器的EPT機(jī)制和AMD處理器的NPT機(jī)制.圖2為EPT機(jī)制下客戶操作系統(tǒng)訪存過程,其實(shí)現(xiàn)原理和x86架構(gòu)下的分頁機(jī)制是一致的,通過客戶機(jī)虛擬地址到客戶機(jī)物理地址(guest-physical address, GPA)和客戶機(jī)物理地址到宿主機(jī)物理地址(host-physical address, HPA)兩次地址映射轉(zhuǎn)換來支持地址空間的虛擬化.由于新加載的進(jìn)程并未建立HAP映射將可執(zhí)行文件的內(nèi)容讀入內(nèi)存,進(jìn)程對(duì)虛擬地址空間的讀、寫、執(zhí)行操作都會(huì)觸發(fā)HAP異常.HAP異常事件相關(guān)信息會(huì)存儲(chǔ)在exit qualifica-tion字段中,這些信息包括觸發(fā)異常的操作類型(例如取指令操作、讀數(shù)據(jù)和寫數(shù)據(jù)操作),該物理頁的HAP權(quán)限和引起異常的客戶物理地址.因此,新加載目標(biāo)進(jìn)程初始運(yùn)行時(shí)由于請(qǐng)求頁面引起缺頁異常事件,通過分析觸發(fā)異常事件的相關(guān)信息可以判斷該訪存操作類型.
Fig. 2 Access process in guest OS with EPT mechanism.圖2 EPT機(jī)制下guest OS 訪存過程
圖3以x86下Linux操作系統(tǒng)為例,Linux內(nèi)核采用Copy on Write機(jī)制,在請(qǐng)求頁面時(shí)觸發(fā)EPT violation,進(jìn)入do ept violation異常處理函數(shù)對(duì)異常事件進(jìn)行分析,在exit qualification字段尋找引起VM-exit的明細(xì)信息.其中bits0,bit1,bit2指示產(chǎn)生EPT violation時(shí)對(duì)GPA進(jìn)行哪些訪問:當(dāng)bit0=1時(shí),表示正在對(duì)GPA進(jìn)行讀訪問;當(dāng)bit1=1時(shí),表示正在對(duì)GPA進(jìn)行寫訪問;當(dāng)bit2=1時(shí),表示正在嘗試執(zhí)行GPA地址上的指令(fetch指令).通過分析exit qualification字段的bits0,bit1,bit2位的值,可以得到觸發(fā)EPT violation的訪問操作類型.當(dāng)bit2=1時(shí),CPU執(zhí)行instruction fetch指令訪問該物理頁面,由于進(jìn)程初始運(yùn)行階段并未建立EPT映射,虛擬頁面不在內(nèi)存中從而觸發(fā)EPT異常,因此,認(rèn)為該GPA通過EPT映射的物理頁存儲(chǔ)的是進(jìn)程的可執(zhí)行代碼段信息,所以記錄該GPA并標(biāo)記為代碼頁,然后建立EPT映射項(xiàng)將虛擬頁映射到物理內(nèi)存.當(dāng)bit0=1或bit1=1時(shí),CPU執(zhí)行readwrite指令訪問物理頁面,由于進(jìn)程初始運(yùn)行階段未建立EPT映射,虛擬頁面不在內(nèi)存中從而觸發(fā)EPT異常,因此,認(rèn)為該GPA通過EPT映射后的物理頁存儲(chǔ)的是進(jìn)程的數(shù)據(jù)信息,所以標(biāo)記該物理頁面為數(shù)據(jù)頁,然后建立EPT映射項(xiàng)將虛擬頁映射到物理內(nèi)存.
Fig. 5 Set XnR permission on the process code page.圖5 對(duì)進(jìn)程代碼頁設(shè)置XnR權(quán)限
1.3 基于硬件輔助頁面映射機(jī)制的XnR權(quán)限修改
在進(jìn)程初始運(yùn)行時(shí),利用基于缺頁異常的內(nèi)存訪問操作識(shí)別的方法可以實(shí)現(xiàn)對(duì)進(jìn)程代碼頁的定位收集,為了阻止非法的讀代碼行為,還需要將目標(biāo)進(jìn)程的代碼頁保護(hù)起來.
一種方法是通過在內(nèi)核層修改缺頁處理函數(shù)實(shí)現(xiàn)對(duì)進(jìn)程代碼頁設(shè)置XnR權(quán)限,該方法通過只保留N個(gè)代碼頁存在內(nèi)存中,程序運(yùn)行時(shí)對(duì)其它代碼頁的訪問操作都將觸發(fā)缺頁異常,在缺頁異常處理函數(shù)中處理該異常事件,被修改的缺頁異常處理函數(shù)會(huì)判斷觸發(fā)異常的訪問操作類型,當(dāng)取指令操作觸發(fā)異常時(shí),缺頁異常處理函數(shù)建立相應(yīng)映射項(xiàng)允許訪問并將內(nèi)存中已有的一個(gè)代碼頁移除,從而保證內(nèi)存中只保留程序的N個(gè)代碼頁;當(dāng)讀寫操作觸發(fā)異常時(shí),缺頁處理函數(shù)判斷該物理頁面是否為代碼頁,若是代碼頁則拒絕服務(wù),若是數(shù)據(jù)頁則建立相應(yīng)映射項(xiàng)允許訪問.該方法可限制映射到內(nèi)存的程序代碼頁數(shù)量為N,程序運(yùn)行到未映射的代碼頁即會(huì)觸發(fā)缺頁異常,當(dāng)程序運(yùn)行連續(xù)跳轉(zhuǎn)到未映射代碼頁時(shí)會(huì)頻繁觸發(fā)缺頁異常,嚴(yán)重影響程序的運(yùn)行效率,而且攻擊者也可以利用已映射到內(nèi)存的N個(gè)代碼頁搜索gadgets從而繞過該保護(hù)機(jī)制.
為解決上述問題,利用內(nèi)存虛擬化技術(shù),本文提出基于硬件輔助頁面映射機(jī)制的XnR權(quán)限修改的解決辦法.和傳統(tǒng)內(nèi)存管理類似,HAP使用頁表入口設(shè)置權(quán)限管理物理內(nèi)存.但HAP支持讀權(quán)限和present(虛擬頁在內(nèi)存)狀態(tài)的分立.如圖4所示,傳統(tǒng)的x86頁表第0位控制present狀態(tài)和讀權(quán)限,當(dāng)頁面為non-present且不可讀時(shí),第0位bit-0(P)被清零,因此,present的頁面總是可讀的.但HAP是通過將第0位bit-0(R)、第1位bit-1(W)和第2位bit-2(E)全清零代表頁面non-present(虛擬頁不在內(nèi)存).所以,只要將HAP入口第2位設(shè)置為1并將第0位和第1位清零,就可以實(shí)現(xiàn)對(duì)該頁面設(shè)置 “可執(zhí)行不可讀”權(quán)限.
Fig. 4 Page-table entry permission bits for x86PAE and HAP.圖4 x86PAE和HAP的頁表入口權(quán)限位
4K頁面下EPT頁表結(jié)構(gòu)由PML4T(page map level 4 table),PDPT(page-directory-pointer table),PD(page-directory)和PT(page table)共4級(jí)頁表構(gòu)成,如圖5所示,GPA被分割為5個(gè)部分,頂層頁表PML4T的物理地址由擴(kuò)展頁表指針(extended page table pointer, EPTP)字段提供,一級(jí)一級(jí)地往下查找,直到找到PTE,最后加上偏移值offset即可獲得真實(shí)的HPA,根據(jù)已定位的程序物理頁信息,查看該HPA所在物理頁面的標(biāo)記.若為代碼頁,則設(shè)置該HAP頁表入口權(quán)限為可執(zhí)行不可讀;若為數(shù)據(jù)頁,則默認(rèn)該HAP頁表入口權(quán)限的初始值,不對(duì)其修改.因此,程序在訪問該HPA上的內(nèi)容前,VXnR會(huì)檢查該物理頁面的訪問權(quán)限,在檢查通過后允許訪問.當(dāng)程序執(zhí)行讀操作訪問可執(zhí)行不可讀頁時(shí)觸發(fā)異常,VXnR對(duì)異常事件進(jìn)行分析處理,當(dāng)發(fā)生讀寫操作異常時(shí)繼續(xù)分析該頁面內(nèi)容,若該頁面被標(biāo)記為可執(zhí)行不可讀頁則拒絕該非法操作訪問,若該頁面為可讀可寫頁則允許訪問.
本文實(shí)現(xiàn)的VXnR采用x86架構(gòu)的CPU,而且CPU需要支持虛擬化技術(shù),目前大多數(shù)處理器都能滿足該要求,主機(jī)操作系統(tǒng)采用Ubuntu 12.04,且配置ASLR機(jī)制,使用gcc編譯器進(jìn)行開發(fā),虛擬機(jī)監(jiān)視器使用Bitvisor.VXnR的實(shí)現(xiàn)主要分為對(duì)進(jìn)程檢測(cè)模塊和在線保護(hù)代碼頁模塊2個(gè)模塊的實(shí)現(xiàn).
2.1 進(jìn)程檢測(cè)模塊
采用Ether[17]中提出的系統(tǒng)調(diào)用截獲技術(shù),當(dāng)截獲到execve系統(tǒng)調(diào)用,進(jìn)程檢測(cè)模塊在VMM中監(jiān)控CR3控制寄存器的更新來識(shí)別客戶機(jī)操作系統(tǒng)的當(dāng)前進(jìn)程,由于新進(jìn)程創(chuàng)建可能會(huì)重用之前撤銷的進(jìn)程頁目錄基地址,同時(shí)考慮頂層頁表中第1有效項(xiàng)從而創(chuàng)建唯一的標(biāo)識(shí)符.當(dāng)發(fā)現(xiàn)新進(jìn)程為目標(biāo)進(jìn)程時(shí),立即向在線保護(hù)代碼頁模塊發(fā)送消息,使系統(tǒng)進(jìn)入在線保護(hù)代碼頁階段.
2.2 在線保護(hù)代碼頁模塊
實(shí)現(xiàn)在線保護(hù)代碼頁模塊的關(guān)鍵技術(shù)難點(diǎn)主要有2個(gè):1)在目標(biāo)進(jìn)程加載完初始運(yùn)行時(shí)定位該進(jìn)程代碼頁;2)對(duì)目標(biāo)進(jìn)程代碼頁設(shè)置XnR訪問權(quán)限.通過基于缺頁異常的內(nèi)存訪問操作識(shí)別的方法,在目標(biāo)進(jìn)程初始運(yùn)行中實(shí)現(xiàn)對(duì)其代碼頁定位收集,并將該GPA與已記錄的代碼頁GPA進(jìn)行匹配.若沒有匹配項(xiàng),認(rèn)為該代碼頁為第1次請(qǐng)求頁面映射到物理內(nèi)存,則將該GPA添加到記錄中并標(biāo)記為代碼頁;若存在匹配項(xiàng),說明該代碼頁已經(jīng)收集到記錄中.然后利用基于硬件輔助頁面映射機(jī)制的XnR權(quán)限修改的方法,針對(duì)定位到的代碼頁建立EPT映射將虛擬頁映射到物理內(nèi)存,并修改該EPT頁表入口權(quán)限位,根據(jù)圖6所示的PTE頁表項(xiàng)結(jié)構(gòu)圖,對(duì)PTE頁表項(xiàng)的后3位修改為100來設(shè)置對(duì)應(yīng)頁面的可執(zhí)行不可讀權(quán)限.當(dāng)存在讀(read)該代碼頁操作時(shí),由于訪問權(quán)限不夠觸發(fā)EPT violation,此時(shí)系統(tǒng)認(rèn)為存在非法的讀取代碼行為,報(bào)警存在利用目標(biāo)進(jìn)程進(jìn)行內(nèi)存泄漏,阻止代碼復(fù)用攻擊.
Fig. 6 The structure of PTE.圖6 PTE結(jié)構(gòu)圖
本節(jié)從有效性和性能2個(gè)方面對(duì)VXnR進(jìn)行測(cè)試.有效性測(cè)試用于驗(yàn)證VXnR能否實(shí)現(xiàn)代碼復(fù)用攻擊防御;性能測(cè)試用于驗(yàn)證VXnR的效率和開銷.實(shí)驗(yàn)環(huán)境如下:主機(jī)CPU為Intel?CoreTMi7-4790 @ 3.60 GHz,內(nèi)存為16 GB;Hypervisor采用Bitvisor,其版本為1.4.0,Guest OS采用的是3.2.0-x86_32內(nèi)核的Ubuntu 12.04.
3.1 有效性測(cè)試
為了測(cè)試VXnR的有效性,我們構(gòu)造了一個(gè)具有棧溢出漏洞和內(nèi)存泄漏漏洞的目標(biāo)程序,選擇了文獻(xiàn)[2,5-7,14,18-22]實(shí)現(xiàn)的ROP 作為測(cè)試用例,并對(duì)其進(jìn)行修改使其能夠運(yùn)行在32位3.2.0-x86內(nèi)核的Ubuntu 12.04.
文獻(xiàn)[14]實(shí)現(xiàn)了just-in-time ROP,該攻擊重復(fù)利用內(nèi)存泄漏漏洞,映射出目標(biāo)程序的內(nèi)存布局,進(jìn)而搜索gadegts并即時(shí)編譯攻擊代碼.但由于其需要利用信息泄露后門讀取程序內(nèi)存可執(zhí)行代碼,所以攻擊會(huì)被VXnR阻止.文獻(xiàn)[6]實(shí)現(xiàn)了以非ret結(jié)尾轉(zhuǎn)移指令的ROP攻擊,但由于其復(fù)用的代碼中包含loadstore,在執(zhí)行l(wèi)oadstore指令對(duì)內(nèi)存代碼的操作時(shí)會(huì)被VXnR阻止.文獻(xiàn)[2]實(shí)現(xiàn)了return-into-libc攻擊,由于該攻擊在尋找所需動(dòng)態(tài)庫函數(shù)地址時(shí)違背了VXnR代碼不可讀原則,所以攻擊失效.文獻(xiàn)[18]實(shí)現(xiàn)了一種利用call-preceded gadget構(gòu)造call-preceded ROP攻擊.文獻(xiàn)[19]提出了一種新型的代碼復(fù)用攻擊LOP.文獻(xiàn)[20]實(shí)現(xiàn)了在不破壞ROP payload的語義的前提下構(gòu)建Long-NOP gadget.文獻(xiàn)[21]定義了2種類型的gadget:call-site(CS) gadgets和entry-point(EP) gadgets.其中CS gadgets與call-preceded gadget概念相同,而EP gadgets是從函數(shù)入口點(diǎn)指令開始,到間接跳轉(zhuǎn)或間接調(diào)用指令結(jié)束的指令序列,基于這2種gadget只能繞過控制流完整性保護(hù)從而實(shí)現(xiàn)ROP攻擊.文獻(xiàn)[7]提出了一種ROP攻擊的變種JOP攻擊,文獻(xiàn)[5]提出了一種增強(qiáng)型的代碼復(fù)用攻擊BIOP,文獻(xiàn)[22]利用內(nèi)存泄漏分析程序內(nèi)存布局實(shí)現(xiàn)ROP攻擊.但本系統(tǒng)配置了地址空間布局隨機(jī)化保護(hù)機(jī)制,文獻(xiàn)[5,7,18-22]都需要獲取程序內(nèi)存布局的前提去搜索gadget,所以違背了VXnR代碼頁不可讀的原則而攻擊失效.測(cè)試結(jié)果如表1所示,表1的列1為測(cè)試用例名稱,列2是測(cè)試用例的實(shí)現(xiàn)原理,列3表示VXnR能夠檢測(cè)到并防御列1所列的測(cè)試用例,列4表示VXnR認(rèn)為測(cè)試用例的非法行為.
Table 1 The Defense Results for ROP
Note:“√”means successful defense.
從表1可知,VXnR成功防御了這10類攻擊,表明本文提出的方法是有效的.
為了進(jìn)一步驗(yàn)證本方法的有效性,我們與目前主流的代碼復(fù)用攻擊防御工具kBoucer[23]和Isomeron[24]對(duì)比測(cè)試,測(cè)試結(jié)果如表2所示:
Table 2 Comparison of Different Defense Methods
Note:“√”means successful defense, “×”means failed defense.
根據(jù)表2,VXnR能夠防御所有的代碼復(fù)用攻擊,而kBoucer無法防御文獻(xiàn)[18]提出的攻擊方法,這是因?yàn)閗Boucer通過LBR (last branch recording)寄存器檢查與返回地址指向的指令位置相鄰的上一條指令是否為call指令,通過防止返回地址被修改的方法來防御ROP攻擊,而文獻(xiàn)[18]提出了call-preceded ROP并采用歷史記錄沖洗的方法在系統(tǒng)調(diào)用前使用一些無關(guān)的指令片段將LBR中存儲(chǔ)的真正的gadget信息給替換掉,從而使得kBouncer無法防御攻擊行為,kBoucer也無法防御文獻(xiàn)[19]提出的攻擊方法.因?yàn)槲墨I(xiàn)[19]是通過以整個(gè)函數(shù)為粒度搜索gadget,實(shí)現(xiàn)了call和ret指令是成對(duì)出現(xiàn)的LOP(loop-oriented programming)攻擊,能夠繞過控制流完整性(control-flow integrity, CFI)策略.Isomeron無法防御文獻(xiàn)[7,19]提出的攻擊方法,因?yàn)镮someron通過結(jié)合執(zhí)行路徑隨機(jī)化和代碼隨機(jī)化防御傳統(tǒng)的ROP和JIT-ROP攻擊,所以無法防御文獻(xiàn)[7,19]實(shí)現(xiàn)的ROP攻擊的變種JOP和LOP攻擊.文獻(xiàn)[20]實(shí)現(xiàn)了在不破壞ROP payload語義的前提下構(gòu)建Long-NOP gadget,使kBouncer對(duì)于gadget長度的檢測(cè)防御失效.文獻(xiàn)[21]基于CS gadgets和EP gadgets這2種gadget成功繞過kBouncer控制流完整性保護(hù)實(shí)現(xiàn)ROP攻擊.文獻(xiàn)[22]能夠利用內(nèi)存泄漏分析程序內(nèi)存布局繞過隨機(jī)化機(jī)制,所以Isomeron無法防御文獻(xiàn)[22]提出的攻擊方法.
為了檢驗(yàn)本文方法的誤報(bào)率,我們使用了一些常用應(yīng)用程序進(jìn)行對(duì)比檢測(cè).通過運(yùn)行500次表3列舉的應(yīng)用程序,觀察每次運(yùn)行過程中是否會(huì)產(chǎn)生誤報(bào),記錄產(chǎn)生誤報(bào)的次數(shù),測(cè)試結(jié)果如表3所示:
Table 3 Results of False Positive Test
由表3可知,沒有誤報(bào)產(chǎn)生,這也進(jìn)一步驗(yàn)證了本文方法的有效性.
3.2 性能測(cè)試
3.2.1 微基準(zhǔn)測(cè)試
由于本文對(duì)系統(tǒng)調(diào)用、內(nèi)存訪問等進(jìn)行監(jiān)控,選擇了lmbench中的與系統(tǒng)調(diào)用、文件處理、缺頁異常、信號(hào)處理以及進(jìn)程創(chuàng)建等相關(guān)事件作為測(cè)試項(xiàng).通過分別測(cè)試裸機(jī)、Bitvisor,VXnR三者下的性能開銷,并通過對(duì)比來分析VXnR所引入的性能開銷,測(cè)試結(jié)果如表4所示.
其中,在VXnR系統(tǒng)中,受保護(hù)程序用戶態(tài)和內(nèi)核態(tài)之間的切換會(huì)觸發(fā)陷入以及相應(yīng)EPT頁表的切換,因此上下文切換的處理時(shí)間會(huì)有所增加.由于在VXnR中對(duì)所有系統(tǒng)調(diào)用進(jìn)行截獲,系統(tǒng)調(diào)用的每次執(zhí)行都會(huì)陷入陷出Hypervisor,因此與系統(tǒng)調(diào)用相關(guān)的測(cè)試項(xiàng)都會(huì)受到VXnR的影響.pagefault以及fork proc,fork exec,sh proc執(zhí)行過程中會(huì)更新受保護(hù)程序頁表,訪問新的物理頁面時(shí)會(huì)觸發(fā)EPT violation異常陷入VMM,因此它們會(huì)引入較大的時(shí)間開銷.如圖7所示.
Table 4 LMBench Results: Time in Microseconds
Fig. 7 Microbenchmark results of VXnR.圖7 VXnR微基準(zhǔn)測(cè)試結(jié)果
3.2.2 微基準(zhǔn)測(cè)試
為了進(jìn)一步評(píng)估VXnR的性能,本文采用4種常用的應(yīng)用程序?qū)ζ湫阅荛_銷進(jìn)行測(cè)試,每項(xiàng)測(cè)試進(jìn)行500次取平均值,測(cè)試結(jié)果如表5所示.
壓縮(compression)和解壓縮(decompress)程序均為計(jì)算密集型應(yīng)用,VXnR所引入的性能開銷較小,分別為3.55%和7.89%.內(nèi)核編譯(kernel build)屬于綜合型應(yīng)用,既需要CPU時(shí)間,也會(huì)進(jìn)行大量的IO操作,VXnR引入了34%的性能開銷.Postmark是IO密集型應(yīng)用,用于測(cè)試系統(tǒng)的后端存儲(chǔ)性能,需要頻繁地存取小文件.我們配置postmark為并發(fā)的文件數(shù)500個(gè),文件大小的上下限分別是500 B和9.77 KB,讀寫塊大小均為512 B,讀追加發(fā)生的概率相等,創(chuàng)建刪除發(fā)生的概率相等,文件操作將使用標(biāo)準(zhǔn)的緩沖區(qū)IO,隨機(jī)數(shù)產(chǎn)生的種子是42,事務(wù)處理的數(shù)目為500000,由于VXnR對(duì)讀寫系統(tǒng)調(diào)用函數(shù)被調(diào)用時(shí)陷入Hypervisor,因此導(dǎo)致了一定的性能開銷(52.1%).如圖8所示.
Table 5 Application Benchmark Performance Test Results Time in Seconds
表5 應(yīng)用程序基準(zhǔn)測(cè)試時(shí)間結(jié)果 s
Fig. 8 Application benchmark performance test results.圖8 應(yīng)用基準(zhǔn)程序性能測(cè)試結(jié)果
為了有效防御代碼復(fù)用攻擊,研究人員提出了若干方法,主要分為2類:1)通過移除二進(jìn)制文件中g(shù)adget或者隨機(jī)化關(guān)鍵內(nèi)存區(qū)域來被動(dòng)阻止ROP攻擊;2)通過基于預(yù)定策略執(zhí)行檢查來有效防御ROP攻擊.
其中,第1類方法應(yīng)用最廣泛典型的是ASLR機(jī)制.然而,ASLR機(jī)制通過將程序代碼段加載到一個(gè)隨機(jī)的基地址使代碼段中每一條指令的地址都發(fā)生了變化,但容易被內(nèi)存泄漏攻擊繞過,為了提升ASLR機(jī)制,研究人員通過細(xì)粒度隨機(jī)化增加隨機(jī)化熵,將隨機(jī)化對(duì)象縮小到函數(shù)級(jí)和指令級(jí),Marlin[25]是一種函數(shù)粒度隨機(jī)化方法,該方法通過符號(hào)分析、函數(shù)重排和跳轉(zhuǎn)修復(fù)3個(gè)階段實(shí)現(xiàn)改變每一個(gè)gadget絕對(duì)地址,從而防御代碼復(fù)用攻擊.ILR(instruction location randomization)[26]將程序中每一條指令的地址進(jìn)行隨機(jī)化,并利用一個(gè)映射表引導(dǎo)指令的執(zhí)行,從而實(shí)現(xiàn)指令級(jí)隨機(jī)化.Pappas等人[12]提出了IPR(in-place randomization)的方法,通過用語義相同的指令替換gadget中的指令,減少可構(gòu)造的gadget,因?yàn)樵摲椒ú⑽锤淖兒瘮?shù)的位置,所以不能防御return-into-libc攻擊.Davi等人提出了一種基于隨機(jī)化有效防御JIT-ROP的防御方法Isomeron[24],通過結(jié)合執(zhí)行路徑隨機(jī)化和代碼隨機(jī)化來防御傳統(tǒng)的ROP和JIT-ROP攻擊,但該方法無法防御ROP攻擊的變種JOP和LOP攻擊.由于隨機(jī)化方法通常只是在程序加載前或加載時(shí)進(jìn)行一次隨機(jī)化處理,攻擊者可以利用信息泄露或暴力破解的方式在程序運(yùn)行時(shí)獲取gadget的有效地址.為了防止隨機(jī)化保護(hù)被繞過,Bigelow等人[27]提出了運(yùn)行時(shí)代碼隨機(jī)化的方法,該方法能夠在存在可疑內(nèi)存泄漏的時(shí)間點(diǎn)對(duì)程序進(jìn)行運(yùn)行時(shí)隨機(jī)化,從而阻止攻擊者獲取gadget的真實(shí)地址.但由于運(yùn)行時(shí)隨機(jī)化需要暫停當(dāng)前程序、保存現(xiàn)場(chǎng)、然后隨機(jī)化等操作,所以會(huì)帶來較大性能損耗.
第2類方法應(yīng)用最廣泛典型是CFI.該方法通過構(gòu)造程序的控制流圖(control-flow graph, CFG),在程序運(yùn)行時(shí)對(duì)比檢查程序執(zhí)行流是否遵循CFG中的有效路徑,從而確保程序運(yùn)行時(shí)的控制流完整性.KBouncer[23]通過在Windows API插入檢查點(diǎn),利用LBR寄存器檢查與返回地址指向的指令位置相鄰的上一條指令是否為call指令來防御ROP攻擊,由于LBR記錄在上下文切換時(shí)會(huì)產(chǎn)生記錄溢出或者污染記錄,所以其漏報(bào)率較高.為了克服KBouncer的漏報(bào)問題,ROPecker[28]將當(dāng)前LBR中的記錄和后續(xù)的記錄結(jié)合起來進(jìn)行檢查,但由于該方法是粗粒度的控制流完整性保護(hù),仍然存在被繞過的風(fēng)險(xiǎn).Kuznetsov等人[29]提出了一種細(xì)粒度的控制流完整性方法代碼指針完整性(code-pointer integrity, CPI),該方法通過使用靜態(tài)分析程序所有指向代碼的指針變量,在運(yùn)行時(shí)將存儲(chǔ)變量的內(nèi)存分為安全區(qū)和正常區(qū)2個(gè)區(qū)域,分別存儲(chǔ)代碼指針變量和其它變量.限制所有對(duì)安全區(qū)的訪問操作必須通過安全檢查來阻止控制流劫持.由于CPI需要靜態(tài)分析目標(biāo)程序源碼,無法確保動(dòng)態(tài)生成代碼的代碼指針完整性.相比于基于隨機(jī)化的方法,CFI通過執(zhí)行檢查主動(dòng)防御ROP攻擊,但帶來的開銷明顯更高.結(jié)合粗粒度CFI和隨機(jī)化方法,Opaque CFI[30]通過在控制流轉(zhuǎn)移前插入CFI檢查限制跳轉(zhuǎn)目標(biāo)地址的范圍,由于該閾值因隨機(jī)化而改變且隔離在安全區(qū)域,可以防御信息泄露攻擊,但是該方法仍然需要靜態(tài)分析程序源碼重構(gòu)跳轉(zhuǎn)地址,沒有考慮到動(dòng)態(tài)生成的代碼.XnR通過保護(hù)目標(biāo)程序部分代碼頁的隱私安全防御代碼復(fù)用攻擊,但攻擊者可以利用未受保護(hù)的代碼頁發(fā)動(dòng)攻擊.HideM彌補(bǔ)了XnR的缺陷,能夠?qū)δ繕?biāo)進(jìn)程的全部代碼頁進(jìn)行保護(hù),但HideM 需要依賴硬件結(jié)構(gòu),所以不具有普適性.
綜上,隨機(jī)化的方法只能在某種程度上減輕代碼復(fù)用攻擊,但攻擊者可以通過暴力破解和信息泄露的方式分析獲取可用gadget的地址,并完成代碼復(fù)用攻擊,而控制流完整性保護(hù)的性能開銷較大,且攻擊者可以通過程序運(yùn)行時(shí)動(dòng)態(tài)生成的代碼繞過完整性保護(hù)并構(gòu)造代碼復(fù)用攻擊.本文結(jié)合細(xì)粒度的隨機(jī)化機(jī)制,利用內(nèi)存虛擬化技術(shù),保護(hù)程序的內(nèi)存布局,阻止攻擊者讀取可執(zhí)行代碼的地址,避免代碼被攻擊者濫用進(jìn)行惡意攻擊,能夠更加有效地防御代碼復(fù)用攻擊.
本文提出了一種基于代碼防泄漏的代碼復(fù)用攻擊防御方法VXnR,并給出了VXnR的設(shè)計(jì)和具體實(shí)現(xiàn).VXnR通過對(duì)目標(biāo)進(jìn)程的可執(zhí)行代碼內(nèi)存區(qū)域進(jìn)行保護(hù),防止信息泄露,從而阻止攻擊者利用目標(biāo)進(jìn)程進(jìn)行代碼復(fù)用攻擊.VXnR在虛擬層實(shí)現(xiàn),無需修改客戶操作系統(tǒng)內(nèi)核,具有良好的兼容性和安全性.我們?cè)贐itvisor虛擬化平臺(tái)上實(shí)現(xiàn)了VXnR的原型系統(tǒng),并對(duì)VXnR的有效性和性能進(jìn)行了評(píng)測(cè).結(jié)果表明VXnR在有效防御代碼復(fù)用攻擊的同時(shí),引入的性能開銷不超過52.1%.我們的后續(xù)工作將側(cè)重于從運(yùn)行時(shí)代碼隨機(jī)化的角度研究防御代碼復(fù)用攻擊的方法.
[1]Tran M, Etheridge M, Bletsch T, et al. On the expressiveness of return-into-libc attacks[G] //LNCS 6961: Proc of the 14th Int Conf on Recent Advances in Intrusion Detection. Berlin: Springer, 2011: 121-141
[2]Shacham H. The geometry of innocent flesh on the bone: Return-into-libc without function calls (on the x86)[C] //Proc of the 14th ACM Conf on Computer and Communications Security. New York: ACM, 2007: 552-561
[3]Buchanan E, Roemer R, Shacham H, et al. When good instructions go bad: Generalizing return-oriented programming to RISC[C] //Proc of the 15th ACM Conf on Computer and Communications Security. New York: ACM, 2008: 27-38
[4]Hund R, Holz T, Freiling F C. Return-oriented rootkits: Bypassing kernel code integrity protection mechanisms[C] //Proc of the 18th Conf on USENIX Security Symp. Berkeley: USENIX Association, 2009: 383-398
[5]Xing Xiao, Chen Ping, Ding Wenbiao, et al. BIOP: Automatic construction of enhanced ROP attack[J]. Chinese Journal of Computers, 2014, 37(5): 1111-1123 (in Chinese)(邢驍, 陳平, 丁文彪, 等. BIOP:自動(dòng)構(gòu)造增強(qiáng)型ROP攻擊[J]. 計(jì)算機(jī)學(xué)報(bào), 2014, 37(5): 1111-1123)
[6]Checkoway S, Davi L, Dmitrienko A, et al. Return-oriented programming without returns[C] //Proc of the 17th ACM Conf on Computer and Communications Security. New York: ACM, 2010: 559-572
[7]Bletsch T, Jiang X, Freeh V W, et al. Jump-oriented programming: A new class of code-reuse attack[C] //Proc of the 6th ACM Symp on Information, Computer and Communications Security. New York: ACM, 2011: 303-307
[8]Sadeghi A A, Aminmansour F, Shahriari H R. Tiny jump-oriented programming attack (A class of code reuse attacks)[C] //Proc of the 12th Int Iranian Society of Cryptology Conf on Information Security and Cryptology. Piscataway, NJ: IEEE, 2015: 52-57
[9]Bosman E, Bos H. Framing signals—A return to portable shellcode[C] //Proc of the 35th IEEE Symp on Security and Privacy. Los Alamitos, CA: IEEE Computer Society, 2014: 243-258
[10]Cowan C, Pu C, Maier D, et al. StackGuard: Automatic adaptive detection and prevention of buffer-overflow attacks[C] //Proc of the 7th USENIX Security Symp. Berkeley, CA: USENIX Association, 1998: 63-78
[11]PaX Team. Address Space Layout Randomization (ASLR)[EB/OL].[2016-08-06]. http://pax.grsecurity.net/docs/aslr.txt
[12]Pappas V, Polychronakis M, Keromytis A D. Smashing the Gadgets: Hindering return-oriented programming using in-place code randomization[C] //Proc of the 33rd IEEE Symp on Security and Privacy. Piscataway, NJ: IEEE, 2012: 601-615
[13]Sotirov A, Dowd M. Bypassing browser memory protections in windows vista[EB/OL].[2016-08-06]. http://www.phreedom.org/research/bypassi-ng-browser-memory-protections
[14]Snow K Z, Monrose F, Davi L, et al. Just-in-time code reuse: On the effectiveness of fine-grained address space layout randomization[C] //Proc of the 34th Symp on Security and Privacy. Piscataway, NJ: IEEE, 2013: 574-588
[15]Backes M, Holz T, Kollenda B, et al. You can run but you can’t read: Preventing disclosure exploits in executable code[C] //Proc of the 2014 ACM SIGSAC Conf on Computer and Communications Security. New York: ACM, 2014: 1342-1353
[16]Gionta J, Enck W, Ning P. HideM: Protecting the contents of userspace memory in the face of disclosure vulnerabilities[C] //Proc of the 5th ACM Conf on Data and Application Security and Privacy. New York: ACM, 2015: 325-336
[17]Dinaburg A, Royal P, Sharif M, et al. Ether: Malware analysis via hardware virtualization extensions[C] //Proc of the 15th ACM Conf on Computer and Communications Security. New York: ACM, 2008: 51-62
[18]Carlini N, Wagner D. ROP is still dangerous: Breaking modern defenses[C] //Proc of the 23rd USENIX Security Symp. Berkeley, CA: USENIX Association, 2014: 385-399
[19]Lan B, Li Y, Sun H, et al. Loop-oriented programming: A new code reuse attack to bypass modern defenses[C] //Proc of the 2015 IEEE Trustcom/BigDataSE/ISPA. Piscataway, NJ: IEEE, 2015: 190-197
[20]Davi L, Sadeghi A R, Lehmann D, et al. Stitching the gadgets: On the ineffectiveness of coarse-grained control-flow integrity protection[C] //Proc of the 23rd USENIX Security Symp. Berkeley, CA: USENIX Association, 2014: 401-416
[21]Goktas E, Athanasopoulos E, Bos H, et al. Out of control: Overcoming control-flow integrity[C] //Proc of the 35th IEEE Symp on Security and Privacy. Piscataway, NJ: IEEE, 2014: 575-589
[22]Strackx R, Younan Y, Philippaerts P, et al. Breaking the memory secrecy assumption[C] //Proc of the 2nd European Workshop on System Security. New York: ACM, 2009: 1-8
[23]Pappas V, Polychronakis M, Keromytis A D. Transparent ROP exploit mitigation using indirect branch tracing[C] //Proc of the 22nd USENIX Conf on Security. Berkeley: USENIX Association, 2013: 447-462
[24]Davi L, Liebchen C, Sadeghi A-R, et al. Isomeron: Code randomization resilient to (just-in-time) return-oriented programming[C] //Proc of the 22nd Network and Distributed System Security Symp. Washington, DC: Internet Society: 2015
[25]Gupta A, Kerr S, Kirkpatrick M S, et al. Marlin: A fine grained randomization approach to defend against ROP attacks[G] //LNCS 7873: Proc of Network and System Security. Berlin: Springer, 2013: 293-306
[26]Davidson J W, Hall M, Co M, et al. ILR: Where’d my gadgets go?[C] //Proc of the 33rd IEEE Symp on Security and Privacy. Piscataway, NJ: IEEE, 2012: 571-585
[27]Bigelow D, Hobson T, Rudd R, et al. Timely rerandomization for mitigating memory disclosures[C] //Proc of the 22nd ACM SIGSAC Conf on Computer and Communications Security. New York: ACM, 2015: 268-279
[28]Cheng Y, Zhou Z, Yu M, et al. ROPecker: A generic and practical approach for defending against ROP attacks[C] //Proc of the 21st Network and Distributed System Security Symp. Washington, DC: Internet Society: 2014
[29]Kuznetsov V, Szekeres L, Payer M, et al. Code-pointer integrity[C] //Proc of the 11th USENIX Conf on Operating Systems Design and Implementation. Berkeley, CA: USENIX Association, 2014: 147-163
[30]Mohan V, Larsen P, Brunthaler S, et al. Opaque control-flow integrity[C] //Proc of the 22nd Network and Distributed System Security Symp. Washington, DC: Internet Society: 2015
Wang Ye, born in 1993. Master candidate. His main research interests include information security and trust computing.
Li Qingbao, born in 1967, Professor and PhD supervisor. Senior member of China Computer Federation. His main research interests include information security and trust computing.
Zeng Guangyu, born in 1966. Associate professor and master supervisor. Senior member of China Computer Federation. Her main research interests include information security and trust computing.
A Code Reuse Attack Protection Technique Based on Code Anti-Leakage
Wang Ye, Li Qingbao, Zeng Guangyu, and Chen Zhifeng
(PLAInformationEngineeringUniversity,Zhengzhou450001) (StateKeyLaboratoryofMathematicalEngineeringandAdvancedComputing(PLAInformationEngineeringUniversity),Zhengzhou450001)
As the address space layout randomization (ASLR) is widely deployed on operating systems, traditional code reuse attacks are suppressed. New code reuse attacks analyze program memory layout through information leak to bypass ASLR, which causes a serious threat to the safety of programs. By analyzing the nature of traditional code reuse attacks and new code reuse attacks, we propose a code reuse attack protection technique VXnR based on code anti-leakage. In this method, we set Execute-no-Read (XnR) permission for the code pages of the target process so that code can be properly executed by the processor, but a read operation is controlled according to the content in the physical page to be accessed, which can prevent attackers from maliciously reading code pages of process to search gadgets by using the information disclosure vulnerability, and defense both traditional code reuse attacks and new code reuse attacks. We have developed a prototype of VXnR and implemented it in a virtual machine monitor Bitvisor. We also evaluate the effectiveness and performance overhead of our approach by comprehensive experiments. The experimental results show that VXnR can effectively prevent attackers from exploiting executable code of the target process to launch code reuse attacks with less than 52.1% overhead.
address space layout randomization (ASLR); code reuse attack; program security; information leaks; virtualization
2016-06-15;
2016-08-10
國家社會(huì)科學(xué)基金項(xiàng)目(15AGJ012);“核高基”國家科技重大專項(xiàng)基金項(xiàng)目(2013JH00103)
TP303; TP309
This work was supported by the National Social Science Foundation of China (15AGJ012) and the National Science and Technology Major Projects of Hegaoji (2013JH00103).