呂雅帥
(中國人民解放軍裝備學院 國防科技重點實驗室,北京 101416)
?
基于指令校驗的軟硬件協(xié)同代碼重用攻擊防護方法
呂雅帥
(中國人民解放軍裝備學院 國防科技重點實驗室,北京 101416)
面向x86處理器的代碼重用攻擊難于防護的一個重要原因是,在x86程序代碼中存在大量合法但非編程者預期要執(zhí)行的指令.這些在代碼中大量存在的非預期指令可被用于構造實現(xiàn)CRA的組件.先前研究均采用軟件方法解決非預期指令問題,運行開銷大且應用受限.本文的主要貢獻之一是提出了一種低開銷的軟硬件協(xié)同方法來解決x86的非預期指令問題.實驗表明,本文的實現(xiàn)方法僅給應用程序帶來了-0.093%~2.993%的額外運行開銷.此外,本文還提出采用硬件實現(xiàn)的控制流鎖定作為一項補充技術.通過同時采用兩個技術,可以極大降低x86平臺遭受代碼重用攻擊的風險.
代碼重用攻擊;非預期指令;指令校驗
長期以來,代碼注入攻擊是最常用的一種惡意代碼攻擊手段.為了阻止代碼注入攻擊,研究者與業(yè)界提出并實現(xiàn)了一種名為W⊕X的保護機制.W⊕X機制限制了操作系統(tǒng)一個存儲頁的寫入和執(zhí)行是互斥的.W⊕X目前已被主流的處理器和操作系統(tǒng)如Windows、Linux等采用.W⊕X機制基本杜絕了進行代碼注入攻擊的可能性.但近年又出現(xiàn)了一種新的攻擊手段可以繞過W⊕X防護機制,即代碼重用攻擊(code-reuse attack,CRA).CRA利用應用程序自身的代碼實現(xiàn)惡意攻擊,而不用像代碼注入那樣對運行中的程序進行修改.CRA最早源于return-to-libc技術.在return-to-libc攻擊中,攻擊者首先破壞運行棧并將控制流轉移至一個現(xiàn)有的libc函數(shù),然后通過調用系統(tǒng)函數(shù)來加載惡意代碼并繞過W⊕X防護機制.在2007年的論文[1]中,Shacham提出了return-oriented programming (ROP)攻擊技術.與return-to-libc相比,ROP攻擊不但同樣可以繞過W⊕X機制,并且被證明是圖靈完備的.ROP利用所謂的一系列組件(gadget,以函數(shù)返回指令ret為結束的短代碼序列)來構造惡意代碼.自從ROP出現(xiàn)后,研究者提出了一系列應對ROP攻擊的方法[2,3].然而,一種新的CRA方法—jump-oriented programming(JOP)[4,5]又被開發(fā)出來.JOP不需要以ret指令作為組件的結束指令.JOP不但大大降低了在CRA中構造惡意代碼的困難程度,而且使得原先應對ROP攻擊的防護技術都完全失效.
在x86平臺的二進制代碼中尋找CRA組件要遠比RISC處理器平臺容易.這是因為在x86二進制代碼中存在著大量合法但不是編程者預期要執(zhí)行的指令(unintended instruction).ROP和JOP攻擊往往利用這些非預期指令構造CRA所需的組件.目前缺乏有效應對面向x86處理器代碼重用攻擊的一個重要原因就在于,非預期指令問題沒有得到很好地解決.本文的貢獻主要有以下幾點:(1)提出了一種軟硬件協(xié)同實現(xiàn)方法,解決了x86處理器的非預期指令問題,該方法只需對處理器和操作系統(tǒng)進行細微修改,且不需要對二進制應用程序本身進行任何修改;(2)進一步提出了利用硬件實現(xiàn)的控制流鎖定作為一項補充技術,兩者相結合可以極大增加面向x86處理器代碼重用攻擊的難度;(3)上述技術通過用周期精確CPU模擬器進行測試,實驗結果表明,本文提出的方法對應用程序運行性能的影響非常小.
自從CRA出現(xiàn)后,研究者提出了一系列防護技術來應對,但絕大部分針對ROP攻擊.文獻[6,7]提出用影子棧技術防止攻擊者通過破壞運行棧來改變程序的控制流.文獻[2,3]通過監(jiān)測返回指令的運行狀態(tài)來探測CRA組件,而文獻[8,9]則通過監(jiān)測call-ret指令對來檢測ROP攻擊.另外一些研究通過修改庫代碼[10,11],消滅那些可能被用作組件的代碼片段來降低利用系統(tǒng)庫代碼進行CRA的可能性.這些研究中所提出的方法主要是應對ROP攻擊,對JOP攻擊而言,這些防護技術是無效的.
相對于ROP而言,JOP是較近提出的CRA技術,所以針對JOP的防護技術比較少.在已提出的JOP防護方法中,文獻[12,13]采用的是純軟件方式.純軟件方式必須依賴動態(tài)二進制翻譯,這意味著應用程序運行性能會受嚴重影響.Kayaalp等在文獻[9]中采用的是軟硬件相結合的手段.該方法僅阻止了函數(shù)間組件的跳轉,但攻擊者還是有可能利用一個函數(shù)內的組件實現(xiàn)攻擊.Kayaalp等在文獻[14]中又提出了一種基于已知CRA特征,通過硬件在線識別并阻止CRA的方法.該方法不需要對軟件進行修改,但需要用戶設定檢測閾值來探測CRA攻擊.該方法的一個主要缺陷在于要依賴已知的CRA特征來檢測,對于未知的攻擊特征則無法檢測.
實現(xiàn)面向x86處理器CRA攻擊的一個重要手段是借助x86代碼中的非預期指令序列.在CRA被提出之前,有研究者已經意識到非預期指令是x86處理器潛在的安全隱患,提出了在應用程序沙箱中對非預期指令進行檢測[15].這種軟件檢測非預期指令的方法給應用程序帶來的性能損失較大.與前述研究相比,本文的一個重要貢獻是通過軟硬件協(xié)同手段解決了x86處理器的非預期指令這一潛在安全隱患,極大增加了實施CRA攻擊的難度.
本文提出的CRA防護方法主要解決兩個方面的問題:(1)防止處理器執(zhí)行非預期指令;(2)防止處理器進行非預期的控制流轉移.
3.1 校驗非預期指令
像x86這樣CISC處理器的一個重要特點就是指令長度是可變的,每條指令不需要像RISC處理器那樣對齊到32位或64位地址邊界上,代碼段每一個起始地址都有可能是一條新指令的開始.這造成的一個結果就是一段二進制代碼可被解釋成多個完全不同的有效指令序列.CRA正是利用了x86處理器的這一特點來構造惡意攻擊所需的組件.圖1展示了這一現(xiàn)象.
圖1中反匯編代碼片段抽取自libc-2.12-32的-IO-vfprintf函數(shù).在正常解碼的情況下,該片段包含三條指令(圖1的上半部分所示).然而,如果從call指令的第三個字節(jié)開始解碼,就是一個完全不同的代碼序列(圖1的下半部分所示).該序列同樣包含三條合法指令,但卻不是編程人員想要執(zhí)行的.由于最后一條指令恰好為間接跳轉指令,因此這三條非預期指令極有可能被用作CRA攻擊的組件.值得指出的是,在x86平臺上從非預期指令中尋找間接跳轉指令是非常容易的.因為字節(jié)FF正好是間接跳轉指令的操作碼,而FF又恰好是很多指令的操作數(shù).由此可見,要提升面向x86平臺的CRA防護能力,非預期指令是必須要解決的一個重要問題.
3.1.1 PC校驗表
處理器流水線中取指是比較適合進行非預期指令檢測的地方.如何在取指時判斷PC所指向的指令是否是非預期指令呢?前面提到過,所有非預期指令都是合法指令,也就是說,僅從指令編碼本身是無法作出判斷的,只有通過PC,也就是該指令的地址,才能判斷一條指令是否是非預期指令.那如何判斷一個PC是否是合法的呢?本文借助一個合法的PC校驗列表進行比較.
一種獲取合法PC列表的方式是在程序運行前對程序的代碼段進行反匯編.當可執(zhí)行程序被加載至內存時,操作系統(tǒng)會知道每個代碼段在虛存中的起始地址.從某個代碼段的首字節(jié)開始,依次對每條指令進行反匯編,從而可以獲取每條指令的正確起始地址.當操作系統(tǒng)采用Address Space Layout Randomization(ASLR)機制時,由于僅是代碼段入口地址隨機化,且該入口地址對于操作系統(tǒng)是已知的,所以依然可以從代碼段入口對指令進行反匯編.有了合法PC列表后,下一個問題是以何種形式保存這個合法PC列表.如果直接以地址形式保存的話,那么處理器在對一個PC進行判斷時就要在這個列表中進行查找,這種方式顯然效率很低,其搜索時間為O(logn).另一種方式是用有效位“1”或“0”來表示某個地址是否是一條合法指令的起始地址,如圖2所示.通過用圖2中有效位的方式來表示合法指令,在對一個PC進行判斷時僅需O(1)時間.3.1.2 分支地址校驗
理論上,要確保只有合法指令才能被執(zhí)行,就需要對每一條將要被取指的指令地址進行校驗.然而,如果程序的第一條指令指向的是合法地址(即程序沒有在一開始就被破壞),那么實際上不需對所有指令地址進行校驗,只需校驗控制轉移指令的目標地址即可.也就是說,正常指令的取指執(zhí)行操作不需要被校驗過程打斷,直至遇到分支轉移指令.所以,非預期指令校驗僅需在分支指令的分支目標地址被處理器流水線計算出來后進行.此外,如果系統(tǒng)采用了W⊕X機制的話,那么理論上只需校驗間接分支指令即可.這是因為直接分支指令的地址是寫在指令操作數(shù)中的,當使用W⊕X機制時,惡意代碼是無法修改指令操作數(shù)的.
圖3給出了簡要的校驗流程.首先,待校驗的分支目標地址會與已校驗地址緩存中的地址進行比較,如果命中則表明該地址合法.已校驗地址緩存中存放了最近校驗成功的分支目標地址.當沒有命中已校驗地址緩存時,則需要與存放在內存中的校驗數(shù)據(jù)進行比較.訪問內存中的數(shù)據(jù)需要首先確定待校驗地址屬于哪個代碼段,這一過程借助代碼段查找表完成.代碼段查找表中存放了校驗數(shù)據(jù)在內存中的對應位置,獲取校驗數(shù)據(jù)位置之后,便可以按圖2中的方法來獲取待校驗地址所對應的校驗數(shù)據(jù).下面將分別闡述已校驗地址緩存和代碼段查找表的設計,以及如何在處理器流水線中實現(xiàn)該校驗流程.
已校驗地址緩存的結構如圖4所示,其功能是緩存最近校驗通過的分支目標地址,從而減少因校驗地址引起的處理器停頓.該已校驗地址緩存的結構與組相連cache相似,其存儲空間被劃分為N行和M組.待校驗分支目標地址通過一個hash函數(shù)決定屬于哪個組.每個組包含N個校驗過的地址項或無效項.待校驗的地址與一個組中的所有地址進行并行比較,以快速決定該地址是否命中緩存.該緩存實現(xiàn)時可采用偽LRU算法作為組內校驗地址項的替換策略.顯而易見,已校驗地址緩存的硬件開銷主要依賴于其所需存儲空間,本文將在實驗部分討論該問題.
代碼段查找表里存放代碼段的起始地址和相應校驗數(shù)據(jù)在內存中的存放位置.代碼段查找表中的項與應用程序實際代碼段沒有必要一一對應.可以把連續(xù)的代碼段合并為代碼段查找表中的一項,以減少代碼段查找表的項數(shù).
如圖5所示,完整的代碼段查找表存放在內存中,并由操作系統(tǒng)進行維護.像TLB一樣,在處理器中也有相應的代碼段查找表緩存,該緩存存放了最近使用的代碼段查找表項.待校驗地址首先訪問該緩存,如果命中則從內存相應位置訪問校驗數(shù)據(jù),否則引發(fā)處理器中斷,操作系統(tǒng)從完整的代碼段查找表中尋找相應項,并加載至緩存.
接下來闡述如何將校驗過程與亂序發(fā)射處理器流水線集成,圖6給出了集成方案的示意圖.前面提到過,沒有必要對每一條取出的指令地址進行校驗,而只需校驗分支地址即可.所以可把校驗過程從處理器流水線的取指階段轉移到提交階段.這主要基于兩點考慮:(1)一個分支指令的分支目標只有在經過執(zhí)行階段后才能確定;(2)對于亂序發(fā)射流水線來說,只有進入了提交階段的分支指令才是真正要執(zhí)行的分支指令.然而,如果在一條分支指令正要提交時對其分支地址進行校驗,那么即使能夠命中已校驗地址緩存,也需要流水線停頓一到兩個時鐘周期來確定校驗結果.一種較好的處理方法是在分支指令位于ROB隊列前面但還未提交時進行校驗,并用一位來表示是否校驗成功.
圖6同時也給出了在處理器流水線中的具體校驗流程.首先,當分支指令接近ROB頂端時,在已校驗地址緩存中檢查是否存在該分支目標地址.如果未命中,便查詢分支預測器中的分支目標緩存(BTB).如果BTB也沒有命中,則需要從內存調取校驗數(shù)據(jù).這一過程首先要通過代碼段查找表緩存查詢校驗數(shù)據(jù)在內存中的位置,然后通過ITLB轉換成物理地址,從而去內存中獲取數(shù)據(jù).接下來的流程有兩種選擇方案,一種是單獨設置一個指令校驗cache(即圖中的IV-Cache)存放校驗數(shù)據(jù);另一種方案是利用指令cache存放校驗數(shù)據(jù).利用指令cache顯然會擠占指令的緩存空間,但實驗部分的測試數(shù)據(jù)表明,利用指令cache的方案并不會對應用程序性能造成太大影響.
3.2 控制流校驗
本小節(jié)介紹如何通過進一步措施來防護CRA.前面介紹過,目前CRA主要有ROP攻擊和JOP攻擊兩類.采用低開銷硬件機制如安全調用棧等技術,可以有效地阻止ROP攻擊.因此,這里主要討論如何阻止JOP攻擊.
當系統(tǒng)使用W⊕X機制時,攻擊者無法利用直接控制轉移指令進行惡意攻擊,因為跳轉地址直接寫在操作數(shù)中,攻擊者無法進行修改.實際上,JOP攻擊可利用的也只能是間接跳轉指令.值得指出的是,一個應用程序在實現(xiàn)時,如果嚴格遵循結構化編程的原則,而不刻意使用goto語句或以嵌入匯編方式使用間接跳轉指令,那么程序控制流轉移的地址實際上在高級語言編譯時均是可知的.因此,可以采用Bletsch等人在文獻[16]中提出的一種叫控制流鎖定(Control-Flow Locking)的技術來校驗程序控制流是否在進行正常轉移.
控制流鎖定的思想類似于多線程同步機制中互斥變量加解鎖的概念.Bletsch等人所提出的控制流鎖定技術采用軟件手段實現(xiàn),每條間接跳轉指令之前都會加入一個“加鎖”代碼片段,在跳轉的目的地址處加入一個“解鎖”代碼片段.顯然,如果程序運行過程中每次間接跳轉均需要運行“加解鎖”代碼的話,其開銷是非常大的.本文在這里提出一種硬件實現(xiàn)的方式,不需要加入“加解鎖”代碼片段.而是在每個跳轉目標指令前加一個前綴以標明該指令為特殊的“解鎖”指令.對于每條成功提交的間接跳轉指令,處理器自動進入一個“跳轉加鎖”的狀態(tài).若提交的下一條指令是“解鎖”指令,則處理器解除“跳轉鎖定”狀態(tài),否則觸發(fā)處理器異常.
圖7給出了一個示例.地址0x451處間接跳轉指令的目的地址是0x4f0.處理器完成jmp rax指令的提交后會進入“跳轉鎖定”狀態(tài).地址0x4f0處原本應該是一條ret指令,但由于它是一個跳轉的目標地址,所以在編譯器編譯源代碼時,會將該指令修改為一條帶“解鎖”前綴的ret指令(即unlock ret).帶有“解鎖”前綴的指令除完成該指令自身的功能外,還可解除處理器的“跳轉鎖定”狀態(tài).如果處理器沒有處于“跳轉鎖定”時執(zhí)行了有“解鎖”前綴的指令,則會忽略“解鎖”前綴,僅執(zhí)行該指令的正常功能.硬件上實現(xiàn)上述控制流鎖定機制十分簡單,一是增加一個處理器狀態(tài)來標識“跳轉鎖定”狀態(tài),二是在指令譯碼部分增加對“解鎖”前綴的譯碼.而在軟件上,則需編譯器在對高級語言進行編譯時,將所有跳轉目標處的指令修改為帶有“解鎖”前綴的指令,從而實現(xiàn)程序運行時處理器“跳轉鎖定”狀態(tài)的正確解鎖.
通過實現(xiàn)非預期指令和控制流的雙重校驗,可以極大降低x86平臺代碼重用攻擊的概率.
對于本文所提出的方法,我們在gem5模擬器上實現(xiàn)并進行性能模擬.本文實驗在一臺高性能臺式機上完成,處理器為3.4GHz Core i7-4770,內存16GB,操作系統(tǒng)為CentOS 6.4 x86-64.本文從SPECCPU 2006測試集中選取了21個程序進行測試評估.對于每一個應用,測試運行100億條指令或直至其運行完畢.
首先,對已校驗地址緩存的大小進行評估.設計已校驗地址緩存的目的是提供快速校驗地址查詢以減少處理器停頓.為了能夠進行低延遲并行比較,組內的項數(shù)不能設置太多.在本文工作中,每組設置4項,并用偽LRU算法作為替換策略.而對于hash函數(shù),本文工作使用地址的低位作為組索引,既易于實現(xiàn)同時也有很高的命中率.有了這些假定后,現(xiàn)在所要關注的是需要設置多少組才能提供足夠高的命中率.
圖8給出了校驗所有控制轉移指令時,組數(shù)目與緩存命中率間關系,圖9則給出了僅校驗間接跳轉指令時,組數(shù)目與緩存命中率間關系.從兩個圖的數(shù)據(jù)可以看出,這些應用程序可以大致分為兩類:計算密集型和控制密集型.計算密集型應用在組數(shù)目非常小時依然可以獲得較高的命中率.如果把標準設定為64組命中率在90%以上,那么對于圖8來說,計算密集型應用包括bzip2、mcf、milc、zeusmp、cactusADM、leslie3d、namd、soplex、calculix、hmmer、GemsFDTD、libquantum、h264ref和lbm.由于圖9中的實驗僅校驗間接跳轉指令,所以地址沖突要小于圖8,并可以看到,對于同樣的組數(shù)和應用,圖9的命中率要高于圖8.此外,從兩個圖的數(shù)據(jù)可以得出的一個重要結論是,當組數(shù)高于128時,命中率變化趨于平穩(wěn).在圖8中,平均命中率在組數(shù)為128、256和512時,分別是94.68%、97.35%和98.84%;在圖9中,平均命中率在組數(shù)為128、256和512時,分別是99.11%、99.61%和99.70%.基于這樣的觀察,本文選擇128作為下面實驗中已校驗地址緩存的組數(shù),那么緩存的總項數(shù)為128×4=512.
接下來使用三種不同的配置進行進一步的性能評估.第一種配置是校驗所有控制轉移指令并使用系統(tǒng)自帶分支預測器作為后備已校驗地址緩存(記作BP&AC);第二種配置是僅校驗間接跳轉指令并使用系統(tǒng)自帶分支預測器作為后備已校驗地址緩存(記作BP&IC);第三種是僅校驗間接跳轉指令但不使用系統(tǒng)自帶分支預測器作為后備已校驗地址緩存(記作IC).圖10展示了基準配置與上述三種配置下的指令吞吐率(IPC)對比.這里將x86指令分解后的微操作記為一條指令.為了能更清楚地進行對比,圖11~圖13展示了上述三種配置相對基準配置的性能損失.
從圖10可以看到,無論對于哪一種配置,本文所提出校驗機制對于應用程序的性能影響均是比較小的.對于BP&AC配置來說,平均性能損失為2.492%,其中性能損失最高為12.623%(omnetpp),最低為-0.039%(bzip2,負值意味著有一定性能提升),且有11個應用性能損失低于1%.正如可以預見的那樣,BP&IC配置性能損失最低,在-0.093%至2.993%之間,平均為0.284%.其中僅有兩個應用性能損失超過1%,18個應用性能損失低于0.3%.在沒有自帶分支預測器的支持下,IC配置性能損失略高,但優(yōu)于BP&AC配置,其性能損失在0.043%至5.247%之間,平均為0.616%.
如果將圖10~圖13的性能測試數(shù)據(jù)與圖8和圖9的已校驗地址緩存命中率數(shù)據(jù)進行對比可以發(fā)現(xiàn),命中率通常與性能損失成反比.舉例來說,omnetpp在所有應用中命中率是最低的,其性能損失在所有三種配置中也是最高的.觀察性能數(shù)據(jù)可以發(fā)現(xiàn)一個有意思的現(xiàn)象是,有些應用實際上性能還有略微提升.經過進一步分析發(fā)現(xiàn),首先,這些應用的已校驗地址緩存命中率都比較高;其次,2級cache命中率比基準配置均有提升.這意味著處理器在從內存中取校驗數(shù)據(jù)時,對2級cache行為造成了影響,從而使得這些應用有一定的性能提升.由于W⊕X保護機制已廣泛應用于當前的計算機系統(tǒng),所以僅校驗間接跳轉指令是足夠安全的.圖12的測試數(shù)據(jù)表明,僅校驗間接跳轉指令對應用程序的性能影響是非常小的.即使校驗所有控制指令,與BP&IC配置相比,IC配置也僅帶來0.332%的平均性能損失.總體而言,BP&IC配置的性能損失在-0.093% ~2.993%之間.
表1 建立校驗數(shù)據(jù)所需開銷
需要指出的是,除了應用程序正常運行時校驗過程所帶來的開銷外,還有在程序運行前對程序反匯編建立校驗數(shù)據(jù)所帶來的開銷.表1給出了應用程序反匯編并建立校驗數(shù)據(jù)所需開銷.實驗數(shù)據(jù)在前述3.4GHz Core i7-4770平臺上獲取的.在所有28個應用中,僅有6個應用耗時超過了0.1秒.由于構建校驗數(shù)據(jù)只在程序運行前進行,所以可以認作是程序的啟動開銷,并不影響程序運行時的性能.
本文主要提出了一套解決x86平臺代碼重用攻擊的硬件實現(xiàn)方法.該方法主要由兩個校驗機制組成:一是對非預期指令的校驗,二是對程序控制流的校驗.相對于先前的研究工作,本文的貢獻主要在對非預期指令的校驗上.本文通過實驗數(shù)據(jù)對所提出的方法進行了評估,實驗結果表明,對于BP&IC配置實現(xiàn)來說,應用程序的性能損失在-0.093%~2.993%,性能影響很小.
[1]Shacham H.The geometry of innocent flesh on the bone:return-into-libc without function calls (on the x86)[A].ACM Conference on Computer and Communications Security[C].New York:ACM Press,2007.552-561.
[2]Davi L.Dynamic integrity measurement and attestation:towards defense against return-oriented programming attacks[A].ACM Workshop on Scalable Trusted Computing[C].New York:ACM Press,2009.49-54.
[3]Chen P.Drop:Detecting return-oriented programming malicious code[A].5th International Conference on Information Systems Security[C].Berlin,Heidelberg:Springer-Verlag,2009.163-177.
[4]Bletsch T.Jump-oriented programming:a new class of code-reuse attack[A].ACM Symposium on InformAtion,Computer and Communications Security[C].New York:ACM Press,2011.30-40.
[5]Checkoway S.Return-oriented programming without returns[A].ACM Conference on Computer and Communications Security[C].New York:ACM Press,2010.559-572.
[6]Davi L.ROPdefender:A Detection Tool to Defend Against Return-Oriented Programming Attacks[A].ACM Symposium on InformAtion,Computer and Communications Security[C].New York:ACM Press,2011.40-51.
[7]Francillon A.Defending embedded systems against control flow attacks[A].Proceedings of the first ACM workshop on Secure execution of untrusted code[C].New York:ACM Press,2011.19-26.
[8]Chen P.Efficient Detection of the Return-Oriented Programming Malicious Code[A].Information Systems Security:6th International Conference,ICISS 2010[C].Berlin,Heidelberg:Springer-Verlag,2010.140-155.
[9]Kayaalp M.Branch regulation:Low-overhead protection from code reuse attacks[A].39th Annual International Symposium on Computer Architecture[C].New York:ACM Press,2012.94-105.
[10] Hiser J.ILR:Where′d My Gadgets Go?[A].2012 IEEE Symposium on Security and Privacy[C].San Francisco,CA:IEEE,2012.571-585.
[11]Pappas V.Smashing the Gadgets:Hindering Return-Oriented Programming Using In-place Code Randomization[A].2012 IEEE Symposium on Security and Privacy[C].San Francisco,CA:IEEE,2012.601-615.
[12]Huang Z.A dynamic detection method against ROP and JOP[A].2012 International Conference on Systems and Informatics (ICSAI)[C].Yantai,China:IEEE,2012.1072-1077.
[13]Jacobson E.Detecting code reuse attacks with a model of conformant program execution[A].In Proceedings of the 6th International Symposium on Engineering Secure Software and Systems (ESSoS)[C].Berlin,Heidelberg:Springer-Verlag,2014.1-18.
[14]Kayaalp M.SCRAP:Architecture for signature-based protection from code reuse attacks[A].19th International Symposium on High Performance Computer Architecture (HPCA2013)[C].Shenzhen,China:IEEE,2013.258-269.
[15]Yee B.Native Client:A sandbox for portable,untrusted x86 native code[A].Proceedings of the 2009 30th IEEE Symposium on Security and Privacy[C].New York:ACM Press,2009.79-93.
[16]Bletsch T.Mitigating code-reuse attacks with control-flow locking[A].27th Annual Computer Security Applications Conference (ACSAC)[C].New York:ACM Press,2011.353-362.
呂雅帥 男,1981年生于河北邯鄲.2009年在國防科學技術大學取得計算機科學與技術博士學位.目前為中國人民解放軍裝備學院國防科技重點實驗室助理研究員.研究方向為處理器體系結構.
E-mail:freelancer-lys@163.com
An Instruction Verification Based Hardware/Software Co-design Approach for Mitigating Code-Reuse Attacks
Lü Ya-shuai
(KeyLaboratory,AcademyofEquipment,Beijing101416,China)
Code-reuse attacks (CRAs) are difficult to detect and defend,especially on widely used x86 processors.One reason is that lots of unintended but legal instructions exist in x86 binary codes.The unintended instructions make the finding of so called gadgets for CRAs is much easier than that of RISC processors.Previous studies rely on software-only means to tackle the unintended instruction problem,which makes their approaches are either very costly or can only be applied under restricted conditions.In this paper,we propose a hardware/software co-design approach to tackle the unintended instruction problem.The proposed mechanism has little performance impact on the examined SPEC CPU 2006 benchmarks.We also propose using hardware control-flow locking as a complementary technique.By using the two techniques together,an attacker will have little chance to carry out CRAs on x86 processors.
code-reuse attack; unintended instruction; instruction verification
2015-01-28;
2016-05-22;責任編輯:藍紅杰
國家自然科學基金(No.61202129)
TP303
A
0372-2112 (2016)10-2403-07
??學報URL:http://www.ejournal.org.cn
10.3969/j.issn.0372-2112.2016.10.018