何紅旗 王奕森 董衛(wèi)宇 朱懷東
(信息工程大學(xué)數(shù)學(xué)工程與先進(jìn)計(jì)算國家重點(diǎn)實(shí)驗(yàn)室 河南 鄭州 450001)
基于編譯置換的指令隨機(jī)化系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
何紅旗 王奕森 董衛(wèi)宇 朱懷東
(信息工程大學(xué)數(shù)學(xué)工程與先進(jìn)計(jì)算國家重點(diǎn)實(shí)驗(yàn)室 河南 鄭州 450001)
指令集隨機(jī)化技術(shù)是一種通過隨機(jī)變換程序指令編碼來抵御代碼注入攻擊的新型防御技術(shù)?,F(xiàn)有指令集隨機(jī)化技術(shù)還存在一定缺陷,如性能損耗大、指令數(shù)據(jù)混雜造成的編碼難等。針對(duì)這些問題,提出一種基于編譯置換的指令隨機(jī)化技術(shù)。該技術(shù)在不降低防御效果的同時(shí)減少了隨機(jī)化指令的數(shù)量,并在編譯過程中實(shí)現(xiàn)了關(guān)鍵指令的隨機(jī)置換,提高了指令隨機(jī)化的性能和編碼精確度。設(shè)計(jì)并實(shí)現(xiàn)了一套基于編譯置換的指令隨機(jī)化原型系統(tǒng),驗(yàn)證了該技術(shù)的有效性。
指令隨機(jī)化 編譯置換 ShellCode DynamoRIO 指令定位
隨著信息技術(shù)的快速發(fā)展,互聯(lián)網(wǎng)在給人們帶來便利的同時(shí)也帶來了巨大的威脅。各類硬件和軟件漏洞層出不窮,黑客為了獲得非法利益利用漏洞對(duì)目標(biāo)用戶進(jìn)行網(wǎng)絡(luò)攻擊,獲取網(wǎng)絡(luò)用戶隱私信息并出售。因此提升軟件的抗攻擊性能對(duì)提升互聯(lián)網(wǎng)的安全至關(guān)重要。根據(jù)OWASP組織在2013年公布的Web十大關(guān)鍵風(fēng)險(xiǎn)[1]顯示,注入型攻擊排名第一。代碼注入型攻擊是攻擊者通過改變控制流來執(zhí)行惡意代碼從而達(dá)到攻擊目的,其破壞性很大。目前最常見的代碼注入型攻擊為緩沖區(qū)溢出攻擊(如棧溢出攻擊和堆溢出攻擊等)。
目前已經(jīng)有很多針對(duì)緩沖區(qū)溢出攻擊行之有效的防御技術(shù)。對(duì)棧溢出攻擊的防御有在關(guān)鍵數(shù)據(jù)和緩沖區(qū)之間加入一個(gè)隨機(jī)的canary字的Stack Guard防御策略及其衍生出的防御策略;構(gòu)建與普通棧隔絕的全局返回地址堆棧的Stack Shield防御策略;在棧幀中引入隨機(jī)長度的填充區(qū)使攻擊者無法準(zhǔn)確定位函數(shù)返回地址或調(diào)用方函數(shù)EBP的防御策略。對(duì)堆溢出攻擊的防御有增加安全cookie;堆塊元數(shù)據(jù)加密;動(dòng)態(tài)改變堆分配算法;函數(shù)替換與指針編碼等多種方法。
針對(duì)當(dāng)前漏洞攻擊防御技術(shù)被動(dòng)、易被繞過的現(xiàn)狀,安全人員希望研究出一種主動(dòng)防御技術(shù),能夠?qū)σ阎臀粗┒催M(jìn)行全方位防御,隨機(jī)化防御技術(shù)應(yīng)運(yùn)而生。隨機(jī)化技術(shù)通過對(duì)程序進(jìn)行部分功能等價(jià)替換,模糊程序的控制流信息、地址信息和數(shù)據(jù)信息等,功能的等價(jià)替換可以打破漏洞利用所需要的穩(wěn)態(tài)環(huán)境?,F(xiàn)有的隨機(jī)化技術(shù)主要有地址空間布局隨機(jī)化(ASLR)、指令集隨機(jī)化(ISR)、數(shù)據(jù)隨機(jī)化(DR)和操作系統(tǒng)接口隨機(jī)化(OSIR),部分隨機(jī)化技術(shù)已經(jīng)在漏洞攻擊防御中被廣泛使用,如地址空間隨機(jī)化技術(shù)已經(jīng)在大多數(shù)現(xiàn)代操作系統(tǒng)中使用。
本文提出的隨機(jī)化技術(shù)是一種新型指令隨機(jī)化技術(shù),與現(xiàn)有指令集隨機(jī)化技術(shù)不同,該技術(shù)在編譯階段實(shí)現(xiàn)了指令的隨機(jī)改變,可以在低性能損耗下防御代碼注入型攻擊。該技術(shù)解決了以下幾個(gè)問題:
(1) 對(duì)ShellCode執(zhí)行模式進(jìn)行分析,選取參與指令隨機(jī)化的關(guān)鍵指令。
(2) 在指令隨機(jī)化規(guī)則的指導(dǎo)下,編譯時(shí)對(duì)程序中的部分指令進(jìn)行隨機(jī)置換。
(3) 實(shí)現(xiàn)隨機(jī)化程序的動(dòng)態(tài)執(zhí)行。
在網(wǎng)絡(luò)攻防中攻擊者通常會(huì)利用逆向工程對(duì)源程序和程序補(bǔ)丁進(jìn)行比對(duì)[2]來發(fā)現(xiàn)并利用程序漏洞,進(jìn)而發(fā)動(dòng)攻擊;也可以通過內(nèi)存泄露信息學(xué)習(xí)目標(biāo)系統(tǒng)的防御機(jī)制并繞過[3],對(duì)目標(biāo)系統(tǒng)作進(jìn)一步攻擊。1996年出現(xiàn)的代碼注入型攻擊很快成為了攻擊者的最愛。為了防御代碼注入型攻擊,現(xiàn)代操作系統(tǒng)采用了DEP防護(hù),通過改變內(nèi)存頁屬性,使內(nèi)存頁不可同時(shí)具有寫與執(zhí)行屬性。而隨即出現(xiàn)的代碼重用攻擊[4]即ROP攻擊可以成功繞過DEP防護(hù)。2010年出現(xiàn)了一種新型代碼注入型攻擊技術(shù)JIT spraying攻擊, 2013年Snow等提出的新型ROP攻擊技術(shù)[5],利用內(nèi)存泄露信息獲得目標(biāo)程序內(nèi)的代碼布局,搜集代碼片段組合成攻擊代碼對(duì)目標(biāo)系統(tǒng)進(jìn)行攻擊,可以繞過系統(tǒng)的ASLR防護(hù)。內(nèi)存信息泄露會(huì)對(duì)用戶安全造成很大威脅,如2014年爆發(fā)的OpenSSL心臟流血漏洞[6],讓整個(gè)世界的互聯(lián)網(wǎng)陷入不安全,黑客利用內(nèi)存泄漏的漏洞從服務(wù)器中獲取64 KB的數(shù)據(jù),里面可能包含用戶賬號(hào)、密碼等敏感資源。
面對(duì)不斷出現(xiàn)的攻擊技術(shù),防御技術(shù)也在快速發(fā)展。1997年Forrest等闡述了多樣化技術(shù)的整體框架,首次提出數(shù)據(jù)隨機(jī)化和代碼布局隨機(jī)化的思想。2000年Cowan等根據(jù)隨機(jī)化所依賴的環(huán)境對(duì)隨機(jī)化技術(shù)進(jìn)行了分類:接口隨機(jī)化技術(shù)和系統(tǒng)功能實(shí)現(xiàn)隨機(jī)化技術(shù)。1996年Cowan等提出數(shù)據(jù)布局隨機(jī)化技術(shù),2002年Chew和Song利用系統(tǒng)調(diào)用多樣化技術(shù)成功防御了緩沖區(qū)溢出漏洞攻擊。2003年初次出現(xiàn)指令集隨機(jī)化技術(shù),該技術(shù)可以防御大多數(shù)代碼注入型攻擊,但會(huì)帶來400%的性能損耗,同年,PaX小組提出地址空間布局隨機(jī)化(ASLR)技術(shù)。2010年Georgios等對(duì)ELF文件格式的程序?qū)崿F(xiàn)了基于動(dòng)態(tài)二進(jìn)制分析平臺(tái)Pin的指令集隨機(jī)化。2012年Giuffrida等提出了粒度更細(xì)的地址空間隨機(jī)化技術(shù)[7]。ASLR技術(shù)可以防御代碼注入型、代碼重用型攻擊,被廣泛地應(yīng)用在現(xiàn)代高級(jí)操作系統(tǒng)中,但可以通過內(nèi)存泄露來繞過[8]。
指令集隨機(jī)化技術(shù)是一種基于加密實(shí)現(xiàn)的隨機(jī)化技術(shù),經(jīng)過國內(nèi)外學(xué)者不斷的研究,目前指令集隨機(jī)化已經(jīng)日趨成熟[9]。2003年Kc等提出了一種實(shí)現(xiàn)指令集隨機(jī)化的思路,與RISE相似,都是對(duì)二進(jìn)制機(jī)器碼進(jìn)行修改。2004年Boyd和Keromytis實(shí)現(xiàn)了SQL語言的隨機(jī)化,通過利用服務(wù)器上的代理應(yīng)用實(shí)現(xiàn)。2012年Hiser等[10]設(shè)計(jì)了基于加密的代碼布局隨機(jī)化技術(shù),同一年Shioji等[11]設(shè)計(jì)了基于加密的代碼地址隨機(jī)化技術(shù),可以防御代碼注入型攻擊和細(xì)粒度的代碼重用攻擊。
數(shù)據(jù)結(jié)構(gòu)隨機(jī)化技術(shù)也是當(dāng)前研究的熱點(diǎn),2009年Lin等開始使用編譯器對(duì)數(shù)據(jù)結(jié)構(gòu)體變量進(jìn)行更加細(xì)致的隨機(jī)化處理;2014年南京大學(xué)的辛知等[12]展開了自動(dòng)的結(jié)構(gòu)體隨機(jī)化工作的研究,將基于編譯器的結(jié)構(gòu)體以及數(shù)據(jù)分布隨機(jī)化向前推進(jìn)了一步;2012年Giuffrida等[7]的工作是將數(shù)據(jù)結(jié)構(gòu)隨機(jī)化從應(yīng)用程序擴(kuò)展到了內(nèi)核,實(shí)現(xiàn)了全空間的數(shù)據(jù)結(jié)構(gòu)隨機(jī)化。
隨機(jī)化防御技術(shù)已經(jīng)得到了很大的發(fā)展,在網(wǎng)絡(luò)安全領(lǐng)域發(fā)揮了巨大的作用,但仍然面臨防御攻擊單一、推廣代價(jià)大的問題,表1為主流的幾種隨機(jī)化技術(shù)性能統(tǒng)計(jì)表?,F(xiàn)有的指令集隨機(jī)化技術(shù)可以防御大多數(shù)代碼注入型攻擊,但由于缺乏硬件支持,軟件實(shí)現(xiàn)還不成熟,因此沒有得到廣泛的推廣,但該技術(shù)的應(yīng)用前景很好,具有很大的研究意義。
表1 隨機(jī)化技術(shù)性能統(tǒng)計(jì)表
針對(duì)當(dāng)前指令隨機(jī)化技術(shù)存在的不足,本文提出一種基于編譯置換的指令隨機(jī)化技術(shù)。該技術(shù)的實(shí)現(xiàn)思路為在程序編譯階段根據(jù)隨機(jī)化規(guī)則的指導(dǎo)對(duì)部分指令隨機(jī)置換,從而達(dá)到指令隨機(jī)化的目的。
2.1 Phoenix編譯器框架
Phoenix是由Microsoft公司提供的一套接口開放、擴(kuò)展性強(qiáng)的編譯器框架,該框架支持多種計(jì)算機(jī)語言,可以幫助用戶開發(fā)新的編譯器或其他程序分析工具。Phoenix編譯器通過對(duì)程序源碼進(jìn)行處理,將源碼表示成中間表示的形式,即IR (IntermediateRepresentation)的形式,Phoenix編譯器和各種基于Phoenix的工具對(duì)程序后期的處理工作都是在IR層次上進(jìn)行的。Phoenix可以幫助用戶完成基本塊分析、內(nèi)存跟蹤、代碼覆蓋、實(shí)時(shí)編譯和全系統(tǒng)優(yōu)化等工作。圖1為Phoenix編譯器框架圖。
圖1 Phoenix編譯器框架圖
從框架圖可以看出Phoenix有三種輸入方式:CIL(Compiler Intermediate Language)、MSIL(Microsoft Intermediate Language)、PE(Portable Executable),Phoenix將這三種輸入文件轉(zhuǎn)換為中間表示(IR,Intermediate Representation)形式。Phoenix對(duì)外提供了一些API函數(shù),用戶可以利用這些API函數(shù)來開發(fā)分析工具(Analysis Tools)、插樁工具(Instrumentation Tools)和優(yōu)化工具(Optimization Tools)。Phoenix編譯器的編譯階段對(duì)外,開發(fā)人員可以在編譯的不同階段(Phases)裝入自己的分析工具或編寫插入自己的Phase對(duì)程序進(jìn)行分析優(yōu)化。最后可以根據(jù)不同的需要使用COFF Writer模塊生成目標(biāo)對(duì)象文件Obj文件,或用連接器Linker生成EXE文件或者DLL文件。
2.2 隨機(jī)化指令篩選
指令隨機(jī)化技術(shù)是通過在動(dòng)態(tài)執(zhí)行過程中改變惡意代碼內(nèi)指令的語義,使其無法正常執(zhí)行,從而達(dá)到防御效果。因此,不需要對(duì)目標(biāo)程序全部指令進(jìn)行隨機(jī)化處理,只要使惡意代碼內(nèi)關(guān)鍵指令語義發(fā)生改變即可阻止其正常執(zhí)行。本文根據(jù)這一思路通過對(duì)惡意代碼構(gòu)成規(guī)則進(jìn)行分析,選擇出參加隨機(jī)化的關(guān)鍵指令。隨機(jī)化指令選擇的原則是使惡意代碼中指令的隨機(jī)化率盡可能高,同時(shí)用戶程序內(nèi)指令的隨機(jī)化率盡可能低,使由指令隨機(jī)化帶來的性能損耗保持在一個(gè)可控范圍內(nèi)。
通過對(duì)ShellCode執(zhí)行模式進(jìn)行分析,本文選取了參加指令隨機(jī)化的指令186條,除了ShellCode中出現(xiàn)的高頻關(guān)鍵指令,還摻加了部分程序中低頻出現(xiàn)的混淆指令,混淆指令的添加用很低的性能損耗提升了ShellCode的隨機(jī)化率。在編譯階段對(duì)指令隨即改變需遵守等長置換的原則,即在指令變換過程中不能改變指令的長度。如果不等長指令置換則會(huì)造成指令不完整或覆蓋相鄰指令,如將 inc eax (0x40) 置換為 call eax (oxFFD0) ,導(dǎo)致部分指令在動(dòng)態(tài)執(zhí)行時(shí)無法被識(shí)別而執(zhí)行失敗。即使是操作碼等長指令,由于指令類型不同,有些指令有操作數(shù),有些指令無操作數(shù),如果相互置換也會(huì)在指令執(zhí)行過程中出錯(cuò),如將指令 push eax (0x50)置換為jnc addr (0x73 + addr),雖然操作碼指令長度相同,但這兩條指令置換后動(dòng)態(tài)執(zhí)行時(shí)會(huì)出錯(cuò)。因此本文對(duì)篩選出來的關(guān)鍵指令按照操作碼長度、是否有操作數(shù)進(jìn)行了分類。表2列出了部分隨機(jī)化指令信息。
表2 部分隨機(jī)化指令信息
指令隨機(jī)化規(guī)則在程序編譯時(shí)指導(dǎo)指令的隨機(jī)置換,并在隨機(jī)化程序動(dòng)態(tài)執(zhí)行時(shí)指導(dǎo)隨機(jī)化指令的還原。規(guī)則制定需要滿足兩方面要求:指令變換后可以在動(dòng)態(tài)執(zhí)行時(shí)還原;指令變換隨機(jī)。因此制定的指令隨機(jī)化規(guī)則需要在等長置換的原則下對(duì)指令在不同集合下進(jìn)行隨機(jī)配對(duì),變換時(shí)根據(jù)配對(duì)相互置換。
2.3 前端編譯信息獲取
編譯器對(duì)程序編譯過程中會(huì)分為不同的編譯階段(Phases),每個(gè)Phase會(huì)執(zhí)行特定的功能。Phoenix將編譯、優(yōu)化等處理過程分成若干個(gè)Phases。Phoenix允許用戶制定Phase-List并開發(fā)特定功能的Phase,在編譯器下次編譯程序過程中,Phoenix編譯器框架會(huì)解析Phase-List并執(zhí)行其中的Phase。圖2為Phoenix中Phase原理圖。
圖2 Phoenix中Phase原理圖
指令隨機(jī)化規(guī)則在程序編譯時(shí)指導(dǎo)指令的隨機(jī)置換,并在隨機(jī)化程序動(dòng)態(tài)執(zhí)行時(shí)指導(dǎo)隨機(jī)化指令的不同編譯階段完成不同的功能。為了實(shí)現(xiàn)隨機(jī)化分析框架的特定功能,需要在程序編譯過程中加入指令分析和處理的相關(guān)工作。因此設(shè)計(jì)編譯隨機(jī)化PhaseList,抽取Phoenix的 C2編譯器的前期處理階段,C2編譯器的前期處理階段主要完成各種檢查和編譯優(yōu)化工作。圖3為本文構(gòu)造的指令隨機(jī)化PhaseList。完成編譯前期階段工作后,按照PhaseList的順序,開始進(jìn)入隨機(jī)化分析階段??梢酝ㄟ^phase.next與phase.previous查看當(dāng)前phase的前一個(gè)與后一個(gè)phase。
圖3 指令隨機(jī)化PhaseList
在指令隨機(jī)化PhaseList中包含了函數(shù)單元分析、指令流分析、編碼、反匯編、指令隨機(jī)化和垃圾指令注入等階段。其中函數(shù)單元分析和指令流分析是為了從編譯的中間表示信息中得到指令隨機(jī)化所需要的有用信息,編碼、反匯編和指令隨機(jī)化是指令隨機(jī)化技術(shù)需要完成的工作。
2.4 指令隨機(jī)置換技術(shù)
指令置換需要換的主體是指令的操作碼,對(duì)操作數(shù)暫時(shí)不作處理。
定位了指令在函數(shù)單元內(nèi)的偏移并得到指令操作碼長度后,可以開始對(duì)指令進(jìn)行隨機(jī)置換。指令隨機(jī)置換實(shí)現(xiàn)的思想是:在編譯的優(yōu)化階段后,寫入目標(biāo)文件前根據(jù)指令在函數(shù)單元內(nèi)的偏移以及指令操作碼的長度提取指令的操作碼,將操作碼與相應(yīng)的指令隨機(jī)化規(guī)則遍歷匹配,如果操作碼在規(guī)則內(nèi)則按照規(guī)則進(jìn)行置換,否則讀取下一條指令。指令隨機(jī)化依賴的條件有:
(1) Phase在編譯優(yōu)化階段后,寫入目標(biāo)文件前。指令的隨機(jī)化工作會(huì)對(duì)指令進(jìn)行改變,如果在優(yōu)化階段前進(jìn)行,則改變的指令很可能被優(yōu)化掉。如果編譯階段已經(jīng)將機(jī)器碼寫入目標(biāo)文件,則無法再進(jìn)行指令置換。選取在Encoding階段之后即Post-compilation phases進(jìn)行,這時(shí)IR為EIR形式,即最終寫入obj文件中的形式,而且在這個(gè)階段置換指令不會(huì)被優(yōu)化掉。
(2) 規(guī)則指導(dǎo)。指令的隨機(jī)置換需要在一定的規(guī)則指導(dǎo)下進(jìn)行,不能盲目置換,在動(dòng)態(tài)執(zhí)行階段需要再次根據(jù)規(guī)則將指令還原。
(3) 指令數(shù)據(jù)分開。指令數(shù)據(jù)混合會(huì)導(dǎo)致數(shù)據(jù)被當(dāng)做指令,使隨機(jī)置換錯(cuò)誤,只有在編譯階段才能做到指令與數(shù)據(jù)的嚴(yán)格分離。
(4) 指令在函數(shù)單元偏移。指令隨機(jī)化需要根據(jù)指令的偏移來確定指令位置,進(jìn)而進(jìn)行指令的隨機(jī)置換。
滿足以上四點(diǎn)要求后,可以開始指令的隨機(jī)置換。圖4為指令置換階段流程圖。指令置換的流程為:首先對(duì)EncodedIR內(nèi)的機(jī)器碼進(jìn)行反匯編,得到指令在函數(shù)單元內(nèi)的偏移。根據(jù)偏移取出每條指令的操作碼并與相應(yīng)的規(guī)則進(jìn)行匹配,即遍歷規(guī)則判定操作碼是否在其中,若在則進(jìn)行指令置換,并將置換結(jié)果回寫入EncodedIR;若不在則該指令不需進(jìn)行隨機(jī)化處理,讀取下一條指令進(jìn)行匹配,直到將函數(shù)單元內(nèi)所有指令處理完,繼續(xù)處理下一個(gè)函數(shù)單元的指令。
圖4 指令置換流程圖
2.5 隨機(jī)化程序執(zhí)行
經(jīng)過指令隨機(jī)化處理的程序在運(yùn)行時(shí)需要進(jìn)行指令回譯,通過指令回譯可以達(dá)到兩方面的目的:一方面使得用戶程序內(nèi)被隨機(jī)化的指令還原為正常指令;另一方面防止惡意代碼的執(zhí)行,如果攻擊者向用戶進(jìn)程內(nèi)注入惡意代碼,由于該惡意代碼沒有經(jīng)過編譯期間的指令置換,則即使控制流轉(zhuǎn)移到惡意代碼,它也不能正常執(zhí)行。
隨機(jī)化指令回譯需要在動(dòng)態(tài)二進(jìn)制分析平臺(tái)上利用指令級(jí)插樁來實(shí)現(xiàn),選DynamoRIO作為隨機(jī)化指令回譯的動(dòng)態(tài)二進(jìn)制平臺(tái)。因?yàn)樵诰幾g階段部分指令的語義發(fā)生了改變,只有在指令執(zhí)行前將其語義還原才可正常執(zhí)行,通過在指令執(zhí)行前插入分析代碼來判斷指令是否被隨機(jī)化?;谝陨纤枷?,隨機(jī)化指令回譯的流程為從基本塊內(nèi)讀取一條指令,判斷指令的操作碼長度,并與隨機(jī)化指令規(guī)則進(jìn)行匹配,匹配規(guī)則分為操作碼長度決定,如果遍歷規(guī)則可以找到該操作碼,則根據(jù)規(guī)則構(gòu)造指令并置換,如果不匹配則讀取下一條指令。如此循環(huán)直至基本塊內(nèi)所有指令處理結(jié)束讀取下一基本塊。圖5為隨機(jī)化指令回譯流程圖。
圖5 隨機(jī)化指令回譯流程圖
攻擊者如果在程序執(zhí)行期間發(fā)起攻擊,注入惡意代碼并劫持控制流去執(zhí)行惡意代碼,即使如此,攻擊者也會(huì)攻擊失敗。因?yàn)橥獠孔⑷氲膼阂獯a沒有經(jīng)過前期的隨機(jī)化處理,在執(zhí)行時(shí)惡意代碼的關(guān)鍵指令會(huì)被變換為一個(gè)不可預(yù)知的指令,導(dǎo)致惡意代碼對(duì)系統(tǒng)攻擊成功的概率降低到一個(gè)極小的值。通過對(duì)單次隨機(jī)化程序執(zhí)行來模擬被破壞的惡意代碼的執(zhí)行環(huán)境,并對(duì)執(zhí)行結(jié)果做了大量統(tǒng)計(jì),被隨機(jī)化的指令執(zhí)行結(jié)果可以分為三類:被隨機(jī)化為非法指令,執(zhí)行時(shí)錯(cuò)誤;被隨機(jī)化為合法指令,向下執(zhí)行會(huì)進(jìn)入一個(gè)死循環(huán),或跳入一段合法代碼段;其他類型的錯(cuò)誤。圖6為單個(gè)隨機(jī)化指令執(zhí)行時(shí)的流向圖。
圖6 隨機(jī)化指令執(zhí)行流向圖
如圖6所示,其中“隨機(jī)指令逃逸”狀態(tài)為分支指令跳轉(zhuǎn)到進(jìn)程內(nèi)的可執(zhí)行內(nèi)存中。單個(gè)隨機(jī)化指令執(zhí)行時(shí)有三種流向:
1) 經(jīng)過隨機(jī)化處理后指令發(fā)生改變,執(zhí)行時(shí)產(chǎn)生錯(cuò)誤信號(hào)。定義系統(tǒng)對(duì)這種類型的錯(cuò)誤信號(hào)處理為直接終止執(zhí)行。
2) 經(jīng)過隨機(jī)化處理后的指令分支跳轉(zhuǎn),控制流轉(zhuǎn)移到進(jìn)程的可執(zhí)行內(nèi)存中,不產(chǎn)生錯(cuò)誤信號(hào)。
3) 經(jīng)過隨機(jī)化處理后的指令依然是可執(zhí)行指令,正常執(zhí)行。
為了驗(yàn)證所提技術(shù)的有效性,設(shè)計(jì)并實(shí)現(xiàn)了指令隨機(jī)化原型系統(tǒng)CIRE(Compiled Instruction Randomization Emulation)。該系統(tǒng)在編譯階段實(shí)現(xiàn)了指令的隨機(jī)變換,并在DynamoRIO上執(zhí)行對(duì)隨機(jī)化程序,該系統(tǒng)可以防御絕大多數(shù)的已知和未知代碼注入型攻擊。為了驗(yàn)證CIRE系統(tǒng)的有效性,從ShellCode指令隨機(jī)化率和防御攻擊效果兩個(gè)方面測(cè)試該系統(tǒng)的實(shí)用效果。實(shí)驗(yàn)環(huán)境及配置如下:
硬件環(huán)境:
? 三臺(tái)PC機(jī):攻擊機(jī)、防御機(jī)和ISR實(shí)驗(yàn)用機(jī)
? AMD Athlon(tm) 3800+ 2.00 GHz,4.00 GB內(nèi)存
軟件環(huán)境:
? 操作系統(tǒng):WindowsXP 32位、Ubuntu12.04 32位
? 動(dòng)態(tài)二進(jìn)制分析平臺(tái):DynamoRIO,Pin
? 漏洞檢測(cè)工具:Metasploit 4.13
? 靜態(tài)二進(jìn)制分析工具:IDA 6.2
? 編譯器:Phoenix、Microsoft Visual Studio 2008
3.1 ShellCode隨機(jī)化率
為了增大CIRE的防御效果,同時(shí)控制由于指令隨機(jī)化帶來的效能損耗,根據(jù)ShellCode構(gòu)造原理篩選出ShellCode常用的關(guān)鍵指令進(jìn)行隨機(jī)化,CIRE盡量使ShellCode中指令隨機(jī)化比率盡量高而用戶程序內(nèi)指令隨機(jī)化比率盡量低。為了驗(yàn)證該思想的可行性,抽取Metasploit 4.13下470個(gè)ShellCode進(jìn)行測(cè)試。分別將470個(gè)ShellCode機(jī)器碼與本文篩選出的隨機(jī)化指令進(jìn)行比對(duì),統(tǒng)計(jì)出ShellCode內(nèi)指令的隨機(jī)化率,并對(duì)ShellCode進(jìn)行調(diào)試,跟蹤變換后ShellCode的執(zhí)行,分析隨機(jī)化后ShellCode的執(zhí)行流向。表3為部分ShellCode隨機(jī)化率測(cè)試。
表3 部分ShellCode隨機(jī)化率測(cè)試
續(xù)表3
通過對(duì)470個(gè)目標(biāo)ShellCode做統(tǒng)計(jì),篩選出來的隨機(jī)化指令使得470個(gè)ShellCode的指令平均隨機(jī)化率為39%。
3.2 CIRE防御效果測(cè)試
為了驗(yàn)證CIRE系統(tǒng)防御代碼注入型攻擊的防御效果,選取了100個(gè)開源樣本軟件,并在樣本程序中構(gòu)造了緩沖區(qū)溢出漏洞。利用Metasploit對(duì)樣本程序分別在無CIRE保護(hù)和有CIRE保護(hù)下進(jìn)行攻擊,每個(gè)樣本攻擊100次,并對(duì)結(jié)果進(jìn)行統(tǒng)計(jì),如表4所示。
表4 CIRE防御效果部分統(tǒng)計(jì)表
理論上,在沒有其他安全加固的前提下,對(duì)含有緩沖區(qū)溢出漏洞的程序進(jìn)行攻擊會(huì)100%成功,而通過指令隨機(jī)化處理后,由于關(guān)鍵指令發(fā)生了變化,攻擊會(huì)100%失敗。編寫自動(dòng)化測(cè)試腳本,對(duì)網(wǎng)上搜集的100個(gè)開源Windows軟件和1 000個(gè)Microsoft Visual Studio編寫的程序進(jìn)行測(cè)試。測(cè)試結(jié)果顯示,在沒有CIRE保護(hù)下,對(duì)樣本的攻擊成功率達(dá)到100%,而在CIRE保護(hù)下,對(duì)樣本的攻擊成功率為0,證明CIRE可以成功防御代碼注入型攻擊。
本文通過對(duì)傳統(tǒng)指令集隨機(jī)化技術(shù)的研究,針對(duì)其性能損耗大、安全性低及可擴(kuò)展性差的缺點(diǎn),提出一種基于編譯置換的新型指令隨機(jī)化技術(shù)。該技術(shù)在編譯階段對(duì)目標(biāo)程序的部分指令在指令隨機(jī)化規(guī)則的指導(dǎo)下進(jìn)行隨機(jī)置換,攻擊者不了解這套指令規(guī)則,無法構(gòu)造與當(dāng)前指令兼容的攻擊代碼,該技術(shù)可以防御絕大多數(shù)的外部代碼注入型攻擊。并在此基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了基于編譯置換的指令隨機(jī)化原型系統(tǒng)CIRE,經(jīng)過大量測(cè)試,該系統(tǒng)可以在低開銷的情況下防御所有的測(cè)試攻擊,具有較高的實(shí)用性和有效性。
[1] OWASP T. Top 10-2013[EB]. The Ten Most Critical Web Application Security Risks, 2013.
[2] Coppens B, De Sutter B, De Bosschere K. Protecting your software updates[J]. IEEE Security & Privacy, 2013, 11(2): 47-54.
[3] Tang F Y, Feng C, Tang C J. Memory Vulnerability Diagnosis for Binary Program[C]//ITM Web of Conferences. EDP Sciences, 2016, 7: 03004.
[4] Davi L, Sadeghi A R. Background and Evolution of Code-Reuse Attacks[M]//Building Secure Defenses Against Code-Reuse Attacks. Springer International Publishing, 2015: 7-25.
[5] 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]//Security and Privacy (SP), 2013 IEEE Symposium on. IEEE, 2013: 574-588.
[6] Durumeric Z, Kasten J, Adrian D, et al. The matter of heartbleed[C]//Proceedings of the 2014 Conference on Internet Measurement Conference. ACM, 2014: 475-488.
[7] Giuffrida C, Kuijsten A, Tanenbaum A S. Enhanced Operating System Security Through Efficient and Fine-grained Address Space Randomization[C]// Security’12 Proceedings of the 21st USENIX conference on Security symposium. 2012: 475-490.
[8] Bittau A, Belay A, Mashtizadeh A, et al. Hacking blind[C]//Security and Privacy (SP), 2014 IEEE Symposium on. IEEE, 2014: 227-242.
[9] Sinha K, Kemerlis V, Pappas V, et al. Enhancing Security by Diversifying Instruction Sets[R]. Columbia University Computer Science Technical Reports,2014.
[10] Hiser J, Nguyen-Tuong A, Co M, et al. ILR: Where’d my gadgets go?[C]//Security and Privacy (SP), 2012 IEEE Symposium on. IEEE, 2012: 571-585.
[11] Shioji E, Kawakoya Y, Iwamura M, et al. Code shredding: byte-granular randomization of program layout for detecting code-reuse attacks[C]//Proceedings of the 28th Annual Computer Security Applications Conference. ACM, 2012: 309-318.
[12] 辛知, 陳惠宇, 韓浩, 等. 基于結(jié)構(gòu)體隨機(jī)化的內(nèi)核 Rootkit 防御技術(shù)[J]. 計(jì)算機(jī)學(xué)報(bào), 2014, 37(5): 1100-1110.
DESIGNANDIMPLEMENTATIONOFINSTRUCTIONRANDOMIZATIONBASEDONCOMPILINGSUBSTITUTION
He Hongqi Wang Yisen Dong Weiyu Zhu Huaidong
(StateKeyLaboratoryofMathematicalEngineeringandAdvancedComputing,PLAInformationEngineeringUniversity,Zhengzhou450001,Henan,China)
Instruction set randomization technology is a new type of defense technology that protects against code injection attacks by random transformation program instruction coding. The existing instruction set randomization technology also has some defects, such as large performance loss, mixed instruction and data can enhance the difficult of encoding. In order to solve these problems, a randomization technique based on compiler permutation was proposed. This technique reduces the number of randomization instructions without reducing the defense effect, and achieves the random replacement of the critical instruction in the compiling process, which improves the performance and coding accuracy of the instruction randomization. This paper designed and implemented compiled instruction randomization emulation based on compiling substitution and verified the effectiveness of the technique.
Instruction randomization Compiling substitution Shellcode DynamoRIO Instruction addressing
2017-02-22。何紅旗,副教授,主研領(lǐng)域:信息安全。王奕森,博士生。董衛(wèi)宇,副教授。朱懷東,碩士生。
TP309.1
A
10.3969/j.issn.1000-386x.2017.12.059