• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于異??刂屏髯R別的漏洞利用攻擊檢測方法

      2014-01-01 02:55:46王明華應(yīng)凌云馮登國
      通信學(xué)報(bào) 2014年9期
      關(guān)鍵詞:控制流漏洞內(nèi)存

      王明華,應(yīng)凌云,馮登國

      (1. 中國科學(xué)院 軟件研究所 可信計(jì)算與信息保障實(shí)驗(yàn)室,北京 100190;2. 中國科學(xué)院大學(xué),北京 100049)

      1 引言

      軟件漏洞是信息系統(tǒng)安全的主要威脅,各大軟件廠商在不斷改進(jìn)和完善軟件開發(fā)質(zhì)量管理,但軟件漏洞問題仍無法徹底消除。根據(jù)Secunia發(fā)布的漏洞數(shù)據(jù)[1],可以看到應(yīng)用軟件漏洞占絕大多數(shù),并且漏洞數(shù)量逐年增多。此外,應(yīng)用軟件漏洞種類多樣,包括Flash漏洞、瀏覽器漏洞、文件格式漏洞等,涉及到 Adobe Reader、Microsoft Office Word、Adobe Flash Player等被廣泛使用的軟件。

      為了緩解應(yīng)用軟件漏洞帶來的危害,新型操作系統(tǒng)引入了地址空間隨機(jī)化(ASLR)和數(shù)據(jù)執(zhí)行保護(hù)(DEP)等安全機(jī)制,一定程度上抑制了針對應(yīng)用軟件和系統(tǒng)漏洞的利用攻擊。但是,攻擊者仍然能夠通過精妙的利用構(gòu)造,找到繞過這些安全機(jī)制的方法,通過劫持控制流實(shí)施利用攻擊。為了應(yīng)對這些新安全環(huán)境下的利用攻擊,安全人員需要及時地發(fā)現(xiàn)攻擊威脅,以便快速做出響應(yīng),避免造成損失。近年來,學(xué)術(shù)界提出了控制流完整性檢測、污點(diǎn)分析等分析方法,來對程序執(zhí)行過程中的異??刂屏鬟M(jìn)行檢測,取得了一定的效果。控制流完整性檢測方法[2],通過在CFG圖中構(gòu)造控制流轉(zhuǎn)移的合法目標(biāo)地址集合,在控制流轉(zhuǎn)移發(fā)生時,校驗(yàn)?zāi)繕?biāo)地址是否在合法的集合內(nèi),并以此作為攻擊檢測的依據(jù)。此種方法依賴CFG,無法解決動態(tài)生成代碼相關(guān)的惡意控制流轉(zhuǎn)移問題,如JIT Spraying攻擊等。動態(tài)污點(diǎn)分析方法[3~5]將程序輸入標(biāo)記為污點(diǎn)源,通過監(jiān)控程序動態(tài)執(zhí)行過程,在污點(diǎn)數(shù)據(jù)被異常使用時產(chǎn)生警告。由于污點(diǎn)分析需要細(xì)粒度地監(jiān)控程序執(zhí)行,使得系統(tǒng)運(yùn)行效率開銷很大,同時污點(diǎn)分析方法本身存在一些局限性,會使得檢測結(jié)果存在一定范圍的誤報(bào)率和漏報(bào)率。在工業(yè)界,如FireEye[6]等安全廠商提出了通過API行為攔截,利用一定的啟發(fā)策略來判定惡意行為的方法。然而,這些檢測方法在函數(shù)級別開展分析,但是漏洞利用攻擊可能發(fā)生在指令級別,僅通過API攔截?zé)o法獲知指令級的異??刂屏鬓D(zhuǎn)移,導(dǎo)致此類方法檢測漏洞利用攻擊的能力有限。

      本文提出了一種針對應(yīng)用軟件漏洞利用攻擊的檢測方法:通過對目標(biāo)程序加載的二進(jìn)制模塊進(jìn)行靜態(tài)分析,獲得函數(shù)邊界和導(dǎo)出屬性等,構(gòu)建初始的合法控制流轉(zhuǎn)移邊界;結(jié)合在程序動態(tài)執(zhí)行時實(shí)時維護(hù)的控制流轉(zhuǎn)移記錄,構(gòu)建完整的控制流轉(zhuǎn)移安全輪廓。將程序執(zhí)行過程中,轉(zhuǎn)移至此輪廓之外的控制流轉(zhuǎn)移,判定為具有利用攻擊威脅的異常的控制流轉(zhuǎn)移。本文方法通過識別異常控制流轉(zhuǎn)移,在攻擊代碼執(zhí)行之前,檢測到利用攻擊。本方法能夠準(zhǔn)確檢測包括動態(tài)生成代碼在內(nèi)的惡意控制流轉(zhuǎn)移的攻擊;另外,本方法不依賴于任何漏洞和攻擊代碼的先驗(yàn)知識,同時具有較為理想的運(yùn)行效率,可以作為漏洞攻擊實(shí)時檢測的解決方案。

      本文方法的貢獻(xiàn)與創(chuàng)新點(diǎn)如下。

      1) 提出了一種通過檢測異常控制流轉(zhuǎn)移判定漏洞利用攻擊的方法,結(jié)合靜態(tài)和動態(tài)分析手段,構(gòu)造完整的程序安全執(zhí)行輪廓,識別安全輪廓之外的異??刂屏鬓D(zhuǎn)移,檢測漏洞利用攻擊。該方法較傳統(tǒng)利用污點(diǎn)分析等細(xì)粒度數(shù)據(jù)流分析方法具有較高的準(zhǔn)確性和較理想的運(yùn)行效率。

      2) 提出了一種檢測來自于動態(tài)生成代碼的利用攻擊的方法,通過分析內(nèi)存的頁面屬性、數(shù)據(jù)相似性等,對動態(tài)生成代碼的合法性進(jìn)行判斷,從而識別轉(zhuǎn)移至非法動態(tài)生成代碼的控制流。該方法解決了控制流完整性校驗(yàn)等方法無法處理的諸如 JIT Spraying攻擊的檢測問題。

      3) 實(shí)現(xiàn)了漏洞利用攻擊檢測原型系統(tǒng),并通過對Word、IE、Flash Player等8個實(shí)際漏洞進(jìn)行檢測實(shí)驗(yàn),驗(yàn)證了本文方法的有效性。實(shí)驗(yàn)表明,本方法不僅具有很高的檢測準(zhǔn)確性,同時還具有較小的運(yùn)行開銷,可用于漏洞利用攻擊實(shí)時檢測。

      2 相關(guān)工作

      漏洞利用攻擊檢測相關(guān)研究主要包括基于動態(tài)污點(diǎn)傳播的方法和基于控制流完整性的方法2大類。在動態(tài)污點(diǎn)傳播方面,相關(guān)的漏洞攻擊檢測系統(tǒng)有 Argos[7,8]。Argos將網(wǎng)絡(luò)數(shù)據(jù)作為污點(diǎn)源,在動態(tài)執(zhí)行過程中監(jiān)控是否有sink函數(shù)使用污點(diǎn)。該系統(tǒng)能夠用來檢測0 Day漏洞攻擊,能夠支持針對Windows 7等操作系統(tǒng)上應(yīng)用軟件的漏洞攻擊。該分析系統(tǒng)依靠污點(diǎn)分析實(shí)現(xiàn),由于污點(diǎn)方法自身存在的局限性,所以難以保證監(jiān)控結(jié)果的準(zhǔn)確性,具有一定的誤報(bào)和漏報(bào)率,同時具有較大的運(yùn)行開銷。相似的檢測系統(tǒng)還有 TaintCheck[4]、Panorama[9]等。

      基于控制流完整性校驗(yàn)(CFI,control flow integrity)的方法同樣可以用于檢測漏洞利用攻擊。該方法[2]首先由Abadi等人提出,通過構(gòu)造CFG圖中所有間接控制流轉(zhuǎn)移的合法目標(biāo)地址的集合,在控制流轉(zhuǎn)移發(fā)生時校驗(yàn)?zāi)繕?biāo)地址是否在合法的集合內(nèi),以此可以作為攻擊檢測的依據(jù)。然而,對于控制流轉(zhuǎn)移結(jié)構(gòu)復(fù)雜的程序而言,構(gòu)造 CFG的準(zhǔn)確性難以保證,這會對檢測結(jié)果有一定的影響。

      binCFI[10]也是基于CFI方法實(shí)現(xiàn),提出了間接控制流轉(zhuǎn)移目標(biāo)地址的完整性校驗(yàn)方法。這些目標(biāo)地址包括地址指針常量,經(jīng)過算術(shù)運(yùn)算得出的程序地址,以及函數(shù)返回地址等。對這些目標(biāo)地址的校驗(yàn)是基于靜態(tài)分析的結(jié)果,會引入一定的誤判,例如,方法沒有驗(yàn)證函數(shù)返回的合法性,可能通過導(dǎo)致覆蓋函數(shù)地址控制執(zhí)行流的情況。這種異常情況需要結(jié)合動態(tài)執(zhí)行信息來進(jìn)行判斷。

      Total-CFI[11]同樣利用CFI手段來判斷間接控制流轉(zhuǎn)移的合法性,是動態(tài)分析方法。該方法利用了影子棧,監(jiān)測來自在用戶態(tài)和內(nèi)核態(tài)的控制流異常攻擊,系統(tǒng)具備較理想的運(yùn)行效率;但是,該系統(tǒng)在檢測間接函數(shù)調(diào)用目標(biāo)時粒度過粗,會帶來一定的誤判,同時對動態(tài)生成代碼分析的較弱,無法檢測通過JIT Spraying等實(shí)施的漏洞攻擊。

      CCFIR[12]通過重寫二進(jìn)制文件來加入控制流轉(zhuǎn)移校驗(yàn)的過程,也具備漏洞檢測的能力。CCFIR在二進(jìn)制文件中添加新的springboard節(jié)區(qū),用以隨機(jī)存放該模塊中所有間接控制流轉(zhuǎn)移目標(biāo)地址,并改寫間接控制流轉(zhuǎn)移調(diào)用處代碼,使得在這些代碼執(zhí)行時,首先跳轉(zhuǎn)至springboard驗(yàn)證合法性。該方法能夠抵御傳統(tǒng)的ret-to-libc和ROP攻擊,但是無法識別動態(tài)生成代碼有關(guān)的控制流合法性。FPGate[13]提出的方法與 CCFIR相似,但更關(guān)注函數(shù)調(diào)用的合法性。FPGate和CCFIR等方法基于二進(jìn)制重新技術(shù)(binary rewriting)來實(shí)現(xiàn),需要用戶重新部署新的二進(jìn)制模塊,適用性較差。

      3 問題描述和方法框架

      Windows 7等操作系統(tǒng)采用了ASLR和DEP等安全機(jī)制,傳統(tǒng)的函數(shù)地址覆蓋、異常處理覆蓋等漏洞利用手段已經(jīng)難以奏效。要成功利用Windows 7等平臺上應(yīng)用軟件的漏洞,首先需要突破ASLR和DEP等機(jī)制的防護(hù),常見的方法包括 ROP[14]和內(nèi)存噴射(spraying)[15]。ROP能夠通過重用內(nèi)存中已加載模塊中的代碼片段,達(dá)到修改shellcode數(shù)據(jù)所在內(nèi)存頁面屬性的目的,使數(shù)據(jù)執(zhí)行保護(hù)失效;內(nèi)存噴射技術(shù)通過在內(nèi)存某段區(qū)域中大量部署shellcode,從而在ASLR導(dǎo)致地址不確定的情況下,也能保證利用攻擊具有較高的成功率。圖1中給出了2種利用攻擊過程。

      通過這些攻擊方式可以發(fā)現(xiàn),漏洞得以成功利用是由于程序執(zhí)行過程中發(fā)生了異??刂屏鬓D(zhuǎn)移。在圖 1(a)中,shellcode存放在 0x0c0c0c0c、0x7c345678、0x7c349654等地址處的指令序列為ROP 鏈中的garget。攻擊者首先利用ROP 鏈,將shellcode所在內(nèi)存區(qū)域處變?yōu)榭蓤?zhí)行,再將控制流轉(zhuǎn)移至shellcode,實(shí)施攻擊。從圖中可以看出,漏洞利用攻擊所依賴的異常控制流轉(zhuǎn)移發(fā)生在函數(shù)返回時,此時的控制流不應(yīng)該轉(zhuǎn)移至 0x7c345678處的ROP garget,而是應(yīng)該轉(zhuǎn)移至call eax調(diào)用時壓入的下條指令地址處。在圖 1(b)中,攻擊者將vtable虛函數(shù)表中第 3個虛函數(shù)被篡改為0x0c0c0c0c,并且在內(nèi)存中噴射出很多包含了攻擊代碼的內(nèi)存區(qū)域,在函數(shù)調(diào)用call[eax+0x8]時,目標(biāo)地址不應(yīng)是0x0c0c0c0c處的動態(tài)生成代碼,而應(yīng)該是由ecx所指定類中的虛函數(shù)。

      根據(jù)上述分析,本文提出一種通過檢測異??刂屏鬓D(zhuǎn)移判定漏洞利用攻擊的方法。方法架構(gòu)如圖2所示。本方法通過對二進(jìn)制目標(biāo)程序進(jìn)行靜態(tài)分析,構(gòu)造初始的安全執(zhí)行輪廓;在動態(tài)監(jiān)控程序運(yùn)行階段,識別動態(tài)生成代碼,對安全執(zhí)行輪廓進(jìn)行維護(hù)。結(jié)合構(gòu)建的完整安全執(zhí)行輪廓,檢測函數(shù)調(diào)用、函數(shù)返回、間接跳轉(zhuǎn)等控制流轉(zhuǎn)移的合法性,將異??刂屏鬓D(zhuǎn)移判定為漏洞利用攻擊,進(jìn)而捕獲完整的攻擊步驟。本文方法不但能夠檢測由于違反靜態(tài) CFG圖中限定的控制流轉(zhuǎn)移所導(dǎo)致的利用攻擊,而且支持動態(tài)生成代碼相關(guān)的利用攻擊。

      圖1 ROP和內(nèi)存噴射利用原理示意

      本文接下來將針對如何構(gòu)建安全執(zhí)行輪廓,如何判定漏洞利用攻擊,以及如何提取漏洞利用攻擊步驟進(jìn)行詳細(xì)闡述。

      圖2 漏洞利用攻擊檢測方法架構(gòu)

      4 安全執(zhí)行輪廓構(gòu)建

      安全的控制流轉(zhuǎn)移輪廓,需要確保程序所運(yùn)行的所有控制流轉(zhuǎn)移指令能夠轉(zhuǎn)移至合法的目標(biāo)地址。Abadi等人提出的控制流完整性檢驗(yàn)方法[2],通過靜態(tài)獲得的 CFG圖,構(gòu)造所有控制流轉(zhuǎn)移的合法目標(biāo)地址。然而,程序在運(yùn)行過程中可能出現(xiàn)動態(tài)生成代碼,例如:

      1) 一些第三方軟件通過加殼等方式進(jìn)行保護(hù),在軟件運(yùn)行時,首先開辟一塊具有可執(zhí)行屬性的內(nèi)存區(qū)域,然后將代碼拷貝至區(qū)域中,程序首先執(zhí)行此段動態(tài)生成的代碼,然后進(jìn)行后續(xù)的執(zhí)行;

      2) 某些程序在運(yùn)行過程中,可能在函數(shù)起始地址等處添加hook,在此函數(shù)執(zhí)行時,程序?qū)⑻D(zhuǎn)至存放在另一個具有可執(zhí)行權(quán)限的內(nèi)存區(qū)域中,執(zhí)行hook處理代碼,如在 IE 8進(jìn)程啟動并加載IEShims.dll模塊時,將在一些模塊函數(shù)入口處添加hook,劫持這些函數(shù)的運(yùn)行,以完成所需要的處理;

      3) 另外,某些應(yīng)用程序支持JIT(just in time)代碼運(yùn)行,例如Flash程序,可以通過Action Script編寫Flash程序,在程序運(yùn)行時,F(xiàn)lash代碼被加載到可執(zhí)行屬性的內(nèi)存頁面中,通過JIT方式執(zhí)行。

      上述動態(tài)生成代碼執(zhí)行情況,Total-CFI[11]、binCFI[10]等基于CFI的方法均無法處理。為此,本文通過靜態(tài)分析構(gòu)造初始安全執(zhí)行輪廓,在程序動態(tài)執(zhí)行階段,識別合法的動態(tài)生成代碼區(qū)域,構(gòu)建完整的控制流轉(zhuǎn)移安全輪廓,從而不但能夠判定模塊之間的控制流轉(zhuǎn)移的完整性,而且能夠處理動態(tài)生成代碼的安全控制流轉(zhuǎn)移問題。

      4.1 安全執(zhí)行輪廓構(gòu)定義

      本文識別程序運(yùn)行過程中所有可執(zhí)行代碼,將這些代碼所在模塊和函數(shù)作為安全執(zhí)行輪廓,并基于此,判定程序運(yùn)行時控制流轉(zhuǎn)移的安全性。

      為了闡述方便,做出如下定義。

      1) 代碼塊tb:每一個代碼塊由若干條順序執(zhí)行的指令組成,其中,僅最后一條為控制流轉(zhuǎn)移指令,如call、ret和jxx等。它是進(jìn)行控制流轉(zhuǎn)移檢測的最小檢測單元。

      2) 加載模塊m:是指待分析程序在導(dǎo)入表中引入的模塊,或者在運(yùn)行時動態(tài)加載的可執(zhí)行模塊;將加載模塊構(gòu)成的集合記為ML,即ML= {m}。

      3) 模塊函數(shù)fm:是指存在于模塊m中的函數(shù);將所有模塊函數(shù)的集合記為FL,F(xiàn)L= {fm|m∈ML}。

      4) 動態(tài)生成代碼(DGC,dynamic generated code):在程序運(yùn)行過程中,在具有可執(zhí)行內(nèi)存屬性頁面上、非加載模塊中的代碼;即DGC={tb|tbinPe&&tbnot inm, ?m∈ML,Pe為具有可執(zhí)行屬性的頁面}。本文將 DGC所在內(nèi)存區(qū)域視為一個 DGC模塊mdgc,將DGC中可以被調(diào)用的一個執(zhí)行單元記為DGC函數(shù)fdgc。具體DGC模塊和函數(shù)的提取方法見4.3節(jié)。

      5) 安全執(zhí)行輪廓(CFSO,control flow safety outline):具體包括模塊輪廓和函數(shù)輪廓。其中,模塊輪廓為M,M=ML∪{mdgc};函數(shù)輪廓為F,F(xiàn)=FL∪{fdgc}。

      安全執(zhí)行輪廓的構(gòu)建分為2個階段:首先依賴二進(jìn)制分析程序自身,構(gòu)造初始的安全執(zhí)行輪廓,此輪廓是靜態(tài)CFG圖中限定的所有執(zhí)行函數(shù)FL和加載模塊ML;然后,通過動態(tài)監(jiān)控程序執(zhí)行,識別所有DGC模塊{mdgc}和DGC函數(shù){fdgc},對安全執(zhí)行輪廓進(jìn)行補(bǔ)充和維護(hù)。下面,首先討論初始安全執(zhí)行輪廓構(gòu)建的過程,然后討論如何通過動態(tài)監(jiān)控目標(biāo)程序執(zhí)行,構(gòu)建完整的安全執(zhí)行輪廓。

      4.2 初始安全執(zhí)行輪廓建立

      依靠二進(jìn)制目標(biāo)程序自身構(gòu)造初始安全執(zhí)行輪廓。主要包括獲得二進(jìn)制目標(biāo)程序自身和其加載模塊的屬性,以及這些模塊中所有函數(shù)信息。

      對于函數(shù),需要通過反匯編二進(jìn)制模塊獲取每一個函數(shù)的起始地址。除此之外,還需要確定模塊中函數(shù)是否具有外部調(diào)用屬性,即此函數(shù)是否允許被其他模塊代碼調(diào)用,例如模塊A中代碼調(diào)用模塊B中函數(shù),那么,此函數(shù)應(yīng)該被模塊B導(dǎo)出。為此,將函數(shù)分為2類,分別是外部調(diào)用函數(shù)和內(nèi)部調(diào)用函數(shù)。具有外部調(diào)用屬性的函數(shù),可以被除自身模塊之外的其他模塊調(diào)用,例如模塊導(dǎo)出的函數(shù),C++類實(shí)例中具有 public屬性的虛函數(shù)等;具有內(nèi)部調(diào)用屬性的函數(shù),則只能夠被自身模塊調(diào)用。

      從模塊的導(dǎo)出表和重定位表來獲得具有外部調(diào)用屬性的函數(shù)。通過導(dǎo)出表,可以獲得此模塊中所有導(dǎo)出的函數(shù)。通過重定位表,獲得地址需要重定位的函數(shù)。具體方法是:依次掃描每一個重定位表項(xiàng),如果該表項(xiàng)的數(shù)值與模塊基地址的和在模塊代碼段的范圍之內(nèi),那么就視其為一個地址需要重定位的函數(shù)。本文將這類函數(shù)和導(dǎo)出函數(shù)認(rèn)為是具有外部調(diào)用屬性的函數(shù)。最后,模塊中除去這些外部調(diào)用屬性函數(shù)之外的函數(shù),認(rèn)為是具有內(nèi)部調(diào)用屬性的函數(shù)。

      通過分析函數(shù)外部調(diào)用屬性,能夠有效防范篡改虛函數(shù)地址的漏洞利用攻擊。由于在虛函數(shù)表中的函數(shù)地址需要被重定位,所以,所有虛函數(shù)都被劃歸為外部調(diào)用函數(shù)。如果類實(shí)例的某個虛函數(shù)被覆蓋為某惡意地址,并且此惡意地址不在此模塊的外部調(diào)用函數(shù)集合之內(nèi),那么能夠檢測到這一異??刂屏鬓D(zhuǎn)移。

      對于漏洞程序運(yùn)行所依賴的模塊,按照PE格式解析模塊文件,獲得模塊加載基地址和大小,是否具備隨機(jī)化屬性,以及導(dǎo)入、導(dǎo)出、重定位表等數(shù)據(jù)項(xiàng)的內(nèi)容。由于程序在運(yùn)行時可以動態(tài)加載模塊,對這些模塊,雖然可以動態(tài)解析模塊文件,獲得上述模塊和其中所有函數(shù)屬性信息,但是這將使得系統(tǒng)運(yùn)行效率受到較大的影響。所以,對系統(tǒng)中所有模塊文件進(jìn)行預(yù)先分析,并將分析結(jié)果保存到文件中。在后續(xù)動態(tài)分析判定過程中可以直接讀取,從而提高了系統(tǒng)運(yùn)行效率。

      4.3 安全執(zhí)行輪廓動態(tài)維護(hù)

      為了處理 DGC相關(guān)的控制流轉(zhuǎn)移,需要動態(tài)識別DGC模塊和DGC函數(shù),并將其加入到安全執(zhí)行輪廓中。雖然可以通過對二進(jìn)制程序在運(yùn)行時采取細(xì)粒度的跟蹤分析,來獲得DGC模塊和DGC函數(shù)在內(nèi)存位置,提取 DGC數(shù)據(jù),但是這需要較大的運(yùn)行開銷。相反,選擇在DGC執(zhí)行時,識別DGC模塊和DGC函數(shù)。所用算法偽代碼如下。

      算法1IdentifyDGC(M,F,ML,FL,tb)

      //該算法識別DGC模塊和DGC函數(shù),并加入到模塊輪廓M和函數(shù)輪廓F中

      輸入:當(dāng)前的模塊輪廓M和函數(shù)輪廓F,進(jìn)程加載模塊集合ML,模塊函數(shù)集合FL,當(dāng)前執(zhí)行的tb

      輸出:最新的模塊輪廓M和函數(shù)輪廓F

      該算法在每一個tb執(zhí)行時被調(diào)用。函數(shù)參數(shù)ML、FL是通過構(gòu)建初始安全執(zhí)行輪廓時得到的。算法檢測當(dāng)前執(zhí)行代碼是否在已加載模塊內(nèi)(第 1行),若不在,則說明當(dāng)前正在執(zhí)行DGC,接下來提取DGC模塊和DGC函數(shù)(第2行之后)。

      由于系統(tǒng)隨機(jī)化不僅針對加載模塊,而且包括例如TEB、PEB等關(guān)鍵數(shù)據(jù)結(jié)構(gòu)、棧和堆分配地址的隨機(jī)化,所以,攻擊者在考慮到利用攻擊的穩(wěn)定性,會通過噴射的方式保證攻擊的成功率。為此,充分利用這一特性,識別 DGC模塊,并區(qū)分其合法性和非法性。

      本文將內(nèi)存區(qū)域認(rèn)為是具備相同屬性的相鄰內(nèi)存頁面的集合。那么,在利用攻擊發(fā)生時,寄存器eip值一定在某個存放了shellcode等惡意代碼的具有可執(zhí)行屬性的內(nèi)存區(qū)域之內(nèi)。這個區(qū)域相鄰的內(nèi)存區(qū)域,一定也存放了與此內(nèi)存區(qū)域高度相似的惡意代碼數(shù)據(jù)。這些內(nèi)存區(qū)域是攻擊者為了保證利用攻擊的穩(wěn)定性,大量噴射操作的結(jié)果。本文通過檢測相鄰內(nèi)存區(qū)域中數(shù)據(jù)的相似度,來判斷控制流轉(zhuǎn)移至 DGC的合法性。此檢測過程由算法 1中check_attacky實(shí)現(xiàn)。算法偽代碼如下。

      算法2check_attacky(eip)

      //該算法檢測eip所在的DGC是否具有攻擊特征

      輸入:當(dāng)前程序執(zhí)行的pc

      算法首先獲取進(jìn)程內(nèi)存空間中所有內(nèi)存區(qū)域RgnList,然后找到當(dāng)前eip指向的區(qū)域RgnCur,以及與之相鄰的2個區(qū)域RgnFmr和RgnLtr。如果這些區(qū)域不都具備可執(zhí)行屬性,那么當(dāng)前內(nèi)存區(qū)域不是噴射而來。否則,計(jì)算出要執(zhí)行的指令地址在當(dāng)前內(nèi)存區(qū)域中的偏移,并且驗(yàn)證在相鄰內(nèi)存區(qū)域上相同偏移處的數(shù)據(jù)相似性。算法中,設(shè)置了一個檢測窗口N,用于表示在各個內(nèi)存區(qū)域中讀取的字節(jié)數(shù)量,并用變量d表示數(shù)據(jù)相似性。如果d高于某一個閾值T,即認(rèn)為高度相似,那么再反匯編當(dāng)前內(nèi)存區(qū)域的指令序列,驗(yàn)證指令序列中是否存在疑似shellcode的指令,最后返回驗(yàn)證結(jié)果。

      由于shellcode的形式具有多樣性,例如被多次加密或存在多個攻擊指令片段等,使得驗(yàn)證shellcode疑似指令具有一定的誤報(bào)率;另外,驗(yàn)證shellcode會對分析運(yùn)行效率造成一定影響,所以,在相鄰內(nèi)存區(qū)域都具備可執(zhí)行屬性,并且相同偏移處數(shù)據(jù)高度相似之后,再驗(yàn)證shellcode疑似指令。這種策略的可靠性在于,攻擊者為了提高漏洞利用的成功率,會通過內(nèi)存噴射等手段在內(nèi)存頁面中部署盡可能多的攻擊代碼,使得相鄰的內(nèi)存區(qū)域中的數(shù)據(jù)具有高度的相似性。

      由于shellcode需要重定位獲得加載地址,以及可能需要實(shí)時獲得執(zhí)行所需API地址,所以通過檢測重定位指令和一些訪問進(jìn)程數(shù)據(jù)結(jié)構(gòu)的敏感指令序列,來判定當(dāng)前指令數(shù)據(jù)疑似shellcode的程度。其中,重定位指令包括call/pop、fnstenv/pop、fxsave/pop等常見指令組合,敏感指令包括獲得當(dāng)前進(jìn)程控制塊、獲得當(dāng)前進(jìn)程加載模塊的指令序列等。

      如果經(jīng)過上述檢驗(yàn),此內(nèi)存區(qū)域不具備攻擊屬性,那么將此內(nèi)存區(qū)域作為合法的 DGC模塊,并獲取此區(qū)域的基地址和大小作為DGC模塊的基地址和大小,將此DGC模塊加入到維護(hù)的可執(zhí)行模塊的集合中。在程序執(zhí)行過程中,此段DGC可能重復(fù)執(zhí)行,集合元素的唯一性保證了此DGC模塊在可執(zhí)行模塊集合中僅出現(xiàn)一次。相反,如果檢驗(yàn)發(fā)現(xiàn)此內(nèi)存區(qū)域具有攻擊屬性,那么當(dāng)前轉(zhuǎn)移至此的DGC控制流非法,判定為漏洞利用攻擊。

      對于 DGC函數(shù),由于無法像模塊函數(shù)那樣獲知 DGC函數(shù)的起始地址,所以,當(dāng)程序控制流由非DGC模塊轉(zhuǎn)移至某段DGC時,將此次控制流轉(zhuǎn)移的目標(biāo)地址視為 DGC函數(shù)起始地址,而在控制流由 DGC模塊返回至非 DGC模塊時,視為此段DGC函數(shù)執(zhí)行結(jié)束,并將在DGC模塊之間執(zhí)行的所有代碼塊視為一個DGC函數(shù)體。并且,將DGC函數(shù)視為具有外部調(diào)用屬性的函數(shù)。DGC函數(shù)示意如圖3所示。

      圖3 DGC函數(shù)示意

      5 漏洞利用攻擊判定

      根據(jù)構(gòu)建的安全執(zhí)行輪廓,對程序運(yùn)行過程中發(fā)生的間接控制流轉(zhuǎn)移進(jìn)行驗(yàn)證,將不合法的控制流轉(zhuǎn)移判定為漏洞利用攻擊。為此,對3種間接控制流轉(zhuǎn)移進(jìn)行分析:通過call指令進(jìn)行的函數(shù)調(diào)用;通過ret執(zhí)行進(jìn)行函數(shù)返回;以及通過jmp執(zhí)行進(jìn)行程序跳轉(zhuǎn)。下面分別就這3種控制流轉(zhuǎn)移的驗(yàn)證方式進(jìn)行討論。

      5.1 函數(shù)調(diào)用的檢測方法

      間接調(diào)用的目標(biāo)地址僅能在運(yùn)行時確定,需要根據(jù)構(gòu)建的安全執(zhí)行輪廓來驗(yàn)證目標(biāo)地址的合法性。如果間接函數(shù)調(diào)用目標(biāo)地址不在當(dāng)前調(diào)用模塊之內(nèi),首先驗(yàn)證目標(biāo)地址是否是函數(shù)的起始地址,再驗(yàn)證此目標(biāo)函數(shù)是否具有外部調(diào)用屬性;如果目標(biāo)函數(shù)被所在模塊導(dǎo)出,則還需驗(yàn)證調(diào)用模塊是否導(dǎo)入了此模塊。如果間接函數(shù)調(diào)用目標(biāo)在當(dāng)前調(diào)用模塊內(nèi),僅驗(yàn)證目標(biāo)地址是否是當(dāng)前模塊的函數(shù),不限定此函數(shù)的屬性。只有通過驗(yàn)證的間接函數(shù)調(diào)用,才被認(rèn)為是合法。上述驗(yàn)證過程的算法偽代碼如下。

      算法3chk_call(dst,mc)

      //檢測call指令目標(biāo)地址的合法性

      輸入:call指令的目標(biāo)地址dst,call指令所在模塊的代碼段mc

      工作Total-CFI[11]同樣檢測call控制流轉(zhuǎn)移合法性的問題,但與本文方法不同的是,它僅僅驗(yàn)證call的目的地址是否是一個函數(shù)的起始,而不關(guān)心這個函數(shù)是否具有外部調(diào)用屬性,這導(dǎo)致驗(yàn)證結(jié)果不夠準(zhǔn)確,可能會產(chǎn)生漏報(bào)。另外,此系統(tǒng)還無法處理DGC相關(guān)的控制流轉(zhuǎn)移問題。

      5.2 函數(shù)返回的的檢測方法

      控制流可以通過函數(shù)返回指令進(jìn)行轉(zhuǎn)移。正確的函數(shù)返回的目標(biāo)地址,應(yīng)該是此函數(shù)被調(diào)用時壓入棧中的地址。在函數(shù)返回時,如果驗(yàn)證發(fā)現(xiàn)返回地址不合法,可以判定控制流被劫持,即有異??刂屏鬓D(zhuǎn)移。

      與Total-CFI系統(tǒng)類似,通過影子棧來實(shí)現(xiàn)返回地址合法性的驗(yàn)證。為每一個線程維護(hù)一個影子棧,在函數(shù)調(diào)用發(fā)生時,在對應(yīng)的影子棧中壓入返回地址;在函數(shù)返回時,在對應(yīng)影子棧中驗(yàn)證壓入的地址與此返回地址是否一致。考慮到異常處理、setjump/longjmp等特殊情況,返回地址可能不在棧頂,但是一定在棧中。所以,在本文中僅驗(yàn)證返回地址是否在影子棧中,并將棧頂?shù)酱隧?xiàng)之間所有的項(xiàng)彈出影子棧。如果未在棧中,則判定為異常控制流轉(zhuǎn)移。

      另外,與Total-CFI不同的是,本文還考慮了另一種特殊情況:push addr、ret。這種ret實(shí)際上起到call的功能。由于addr值是由push 壓入,而非函數(shù)調(diào)用call壓入,所以在影子棧中無法找到。本文通過額外為每一個線程維護(hù)一個 push棧來記錄壓入的值,在函數(shù)返回 ret發(fā)生時,首先查看該線程的影子棧,如果沒有在棧中找到返回值,則在push棧中尋找。如果找到,將此值至棧頂?shù)脑厝繌棾觥7駝t,則說明當(dāng)前 ret可疑,可能使程序控制流轉(zhuǎn)移至危險位置。

      5.3 跳轉(zhuǎn)轉(zhuǎn)移的檢測方法

      跳轉(zhuǎn)可分為直接跳轉(zhuǎn)和間接跳轉(zhuǎn)。對于直接跳轉(zhuǎn),目標(biāo)地址一定在自身模塊內(nèi),無需檢測。對于間接跳轉(zhuǎn),需要檢測目標(biāo)地址的合法性。

      對于jmp [C+idx*idx’]模式的跳轉(zhuǎn),其中,idx、idx’為寄存器或立即數(shù),如果C值在程序代碼段或者數(shù)據(jù)段范圍內(nèi),那么認(rèn)為此C值是程序中某個函數(shù)地址表的起始,其中的每個地址項(xiàng)占用4個字節(jié),此跳轉(zhuǎn)指令正是通過地址表C獲得偏移idx*idx’處的目標(biāo)地址。本文將此類跳轉(zhuǎn)指令合法目標(biāo)地址集合記為S

      即從地址表C開始,依次查看每一表項(xiàng)的值是否在當(dāng)前模塊的代碼段mc范圍內(nèi),并將符合此條件的值加入到S中,直至遇到不滿足此條件的地址項(xiàng)為止。在此類jmp執(zhí)行時,如果目標(biāo)地址不在其合法地址S中,將此指令的執(zhí)行判定為異??刂屏鬓D(zhuǎn)移。

      對于其他間接jmp跳轉(zhuǎn)指令,目標(biāo)地址理論上可以是內(nèi)存中任意位置,但通過對實(shí)際應(yīng)用程序的分析,發(fā)現(xiàn)合法的間接跳轉(zhuǎn)指令的目標(biāo)地址都應(yīng)在本模塊內(nèi)。所以,將跳轉(zhuǎn)至自身模塊代碼段之外的間接跳轉(zhuǎn),判定為異常的控制流轉(zhuǎn)移。

      6 漏洞利用攻擊步驟捕獲

      在捕獲到利用攻擊所需的異??刂屏鬓D(zhuǎn)移之后,捕獲后續(xù)漏洞利用攻擊的步驟。這些攻擊步驟有助于分析人員掌握攻擊細(xì)節(jié),對評估漏洞的危害性,以及制定防御方案等具有重要的意義。

      當(dāng)識別到異??刂屏髦?,開始單步執(zhí)行目標(biāo)程序,記錄程序執(zhí)行指令和調(diào)用的函數(shù)。對于執(zhí)行的指令,記錄每一條指令類型以及操作數(shù)的值;對于調(diào)用的函數(shù)、記錄參數(shù)和返回值。通過監(jiān)控進(jìn)程創(chuàng)建、用戶創(chuàng)建、文件操作、網(wǎng)絡(luò)訪問等系統(tǒng)API調(diào)用,能夠捕獲“下載并運(yùn)行”、“添加新用戶”等惡意行為。

      通過這些記錄,分析人員能夠還原漏洞利用攻擊的所有細(xì)節(jié)。例如,如果漏洞利用采用了 ROP方式,可以獲知為了構(gòu)造 ROP 鏈,利用代碼重用了哪些指令片段,攻擊載荷所在內(nèi)存區(qū)域如何獲得可執(zhí)行屬性,以及攻擊載荷所進(jìn)行的惡意操作。再如,通過檢測利用攻擊點(diǎn)所在內(nèi)存區(qū)域相鄰的內(nèi)存區(qū)域的屬性,以及比對這些區(qū)域的數(shù)據(jù)相似性,可以獲知內(nèi)存噴射漏洞的噴射粒度和噴射范圍等信息,評估此漏洞利用的成功率等。安全分析人員可以利用這些信息,對軟件漏洞的危害性進(jìn)行評估,制定漏洞補(bǔ)丁方案,或者生成檢測工具所需的漏洞特征等。

      7 實(shí)驗(yàn)評估

      基于硬件模擬器 QEMU 1.6.1[17,18]實(shí)現(xiàn)原型系統(tǒng)ECfield (enhanced control flow integrity based exploit detector),并利用8個實(shí)際漏洞利用攻擊樣本對本文的系統(tǒng)進(jìn)行實(shí)驗(yàn)評估。在實(shí)驗(yàn)中,原型系統(tǒng)運(yùn)行在配備了四核 3.20 GHz Intel Core i5-3470 CPU、8 GB內(nèi)存、250 GB硬盤的Fedora Core 13計(jì)算機(jī)上。實(shí)驗(yàn)漏洞攻擊樣本運(yùn)行在QEMU Guest系統(tǒng)中。各個樣本運(yùn)行的 CVE編號、漏洞程序和所運(yùn)行的系統(tǒng)環(huán)境如表1所示。

      7.1 系統(tǒng)實(shí)現(xiàn)

      ECfield包括靜態(tài)分析和動態(tài)分析2個組件。在靜態(tài)分析組件中,對二進(jìn)制加載模塊和模塊內(nèi)的函數(shù)進(jìn)行分析,構(gòu)建初始的安全執(zhí)行輪廓;在動態(tài)分析組件中,根據(jù)執(zhí)行狀態(tài),對安全執(zhí)行輪廓進(jìn)行維護(hù),同時,對控制流轉(zhuǎn)移進(jìn)行驗(yàn)證,將不合法的控制流轉(zhuǎn)移判定為利用攻擊,并提取攻擊步驟。

      構(gòu)建初始的安全執(zhí)行輪廓時,通過在IDA Pro 6.1[19]中編寫IDA Python插件,提取二進(jìn)制漏洞程序和其加載的動態(tài)鏈接庫中的所有模塊和函數(shù)屬性等信息。模塊信息包括加載地址、大小、導(dǎo)入表、導(dǎo)出表和重定位表、隨機(jī)化屬性等數(shù)據(jù)信息;函數(shù)屬性信息包括所屬模塊,函數(shù)起始地址相對模塊加載地址的偏移,函數(shù)的外部調(diào)用和內(nèi)部調(diào)用屬性等。本文將這些分析結(jié)果以文件形式保存,在動態(tài)分析階段,系統(tǒng)通過讀入文件內(nèi)容到內(nèi)存中,進(jìn)行后續(xù)分析和驗(yàn)證操作。

      在 QEMU中添加進(jìn)程識別、線程識別、模塊識別等功能模塊,分別獲得系統(tǒng)中新創(chuàng)建的進(jìn)程、每一個進(jìn)程所創(chuàng)建的線程、以及每一個進(jìn)程加載的模塊。在系統(tǒng)運(yùn)行過程中,根據(jù)當(dāng)前代碼塊所在內(nèi)存地址,判定是否為 DGC。如果屬于DGC,遍歷進(jìn)程虛擬空間描述符 VAD,獲得相鄰內(nèi)存區(qū)域,判定這些區(qū)域的數(shù)據(jù)相似度。當(dāng)數(shù)據(jù)高度相似時,通過驗(yàn)證當(dāng)前執(zhí)行的DGC指令序列是否具有shellcode特征,來判定當(dāng)前DGC是否具有攻擊屬性。如果具有攻擊屬性,則直接判定為利用攻擊;否則,提取DGC模塊和DGC函數(shù),加入到安全執(zhí)行輪廓中。在驗(yàn)證相鄰內(nèi)存區(qū)域數(shù)據(jù)相似度時,將檢測窗口長度N設(shè)置為32 byte,并且相似度閾值T設(shè)置為80%。另外,從 Metasploit[20]中提取驗(yàn)證過程中所用到的shellcode疑似指令特征。

      表1 實(shí)驗(yàn)樣本

      在系統(tǒng)運(yùn)行過程中,為目標(biāo)程序中每一個線程維護(hù)一個影子棧,驗(yàn)證所有發(fā)生在用戶態(tài)的函數(shù)返回的合法性。當(dāng)間接函數(shù)調(diào)用發(fā)生時,通過安全執(zhí)行輪廓,驗(yàn)證目標(biāo)地址是否是目標(biāo)模塊中具有外部調(diào)用屬性的函數(shù)。當(dāng)間接跳轉(zhuǎn)時,根據(jù)跳轉(zhuǎn)指令的模式,驗(yàn)證目標(biāo)地址是否在合法的跳轉(zhuǎn)地址集合內(nèi)、或是否在當(dāng)前模塊代碼段范圍之內(nèi)。如果驗(yàn)證不合法,則判定為控制流轉(zhuǎn)移異常。

      在檢測到異??刂屏鬓D(zhuǎn)移后,ECfield Hook進(jìn)程創(chuàng)建、用戶添加、網(wǎng)絡(luò)訪問等系統(tǒng)API,并開啟對目標(biāo)程序的單步跟蹤分析。通過改變 QEMU代碼塊譯碼邏輯,使其每個代碼塊僅包含一條指令,實(shí)現(xiàn)單步執(zhí)行的效果。在每個代碼塊執(zhí)行時,ECfield檢測當(dāng)前地址是否是被Hook函數(shù)的起始地址。如果是,就從棧中讀取函數(shù)參數(shù)和返回地址。在被Hook的函數(shù)返回時,ECfield讀取QEMU Guest系統(tǒng)的eax寄存器獲得函數(shù)返回值。單步執(zhí)行的指令信息和函數(shù)調(diào)用信息,最終保存在文件中,以便供分析人員還原攻擊細(xì)節(jié)。

      7.2 利用攻擊檢測結(jié)果

      本文選取了近年具有較嚴(yán)重威脅的漏洞,對實(shí)驗(yàn)系統(tǒng)進(jìn)行評估。這些漏洞涉及用戶廣泛使用的軟件,如IE、Adobe Reader、Word、Flash Player等,漏洞的利用攻擊類型也涵蓋多種,包括ret-to-libc、SEH exploit、ROP 攻擊、Heap Spraying、JIT Spraying等。實(shí)驗(yàn)中檢測到的各個樣本程序的異??刂屏鬓D(zhuǎn)移指令地址、控制流轉(zhuǎn)移指令、攻擊類型等信息如表2所示。

      從上述漏洞利用攻擊中可以看到,CVE-2012-0158這一針對Word 2007的利用攻擊仍然是通過直接覆蓋函數(shù)返回地址,采用 ret-to-libc的方式實(shí)現(xiàn)的。此攻擊能夠成功的原因在于,即使DEP機(jī)制已經(jīng)部署到Windows 7系統(tǒng)中,但是由于Word自身沒有開啟DEP,使得棧中的shellcode仍然能夠得以執(zhí)行。

      另外,CVE-2010-2883、CVE-2011-0611、CVE-2007-4607等樣本展示了Spraying和ROP結(jié)合的攻擊方式。通過噴射將攻擊代碼大量部署在內(nèi)存中,能夠有效突破內(nèi)存地址隨機(jī)化安全機(jī)制,同時利用 ROP和 JIT 的方式來保證將攻擊代碼所在內(nèi)存區(qū)域可執(zhí)行。此種攻擊方法可以同時繞過DEP和ASLR機(jī)制。

      實(shí)驗(yàn)表明,本文的系統(tǒng)不但可以檢測 ret-tolibc、SEH exploit等傳統(tǒng)利用攻擊,也能成功檢測到APT攻擊所應(yīng)用的ROP、JIT Spraying、Spraying結(jié)合ROP等方式的復(fù)雜漏洞利用攻擊。

      7.3 案例分析

      表2 樣本程序分析結(jié)果

      本文挑選 CVE-2013-2551和 CVE-2007-4607 2個案例來對 ECfield的檢測過程和效果進(jìn)行詳細(xì)闡述。這2個漏洞分別利用了目前在APT等漏洞利用攻擊中廣泛使用的 Spraying結(jié)合 ROP、JIT Spraying攻擊方式。同時,2個漏洞程序在運(yùn)行過程中都存在動態(tài)代碼執(zhí)行的情況。本文的系統(tǒng)能夠準(zhǔn)確地識別合法的動態(tài)指令代碼場景,并對異常動態(tài)代碼執(zhí)行情況進(jìn)行準(zhǔn)確判定。

      案例1CVE-2013-2551漏洞利用攻擊

      此漏洞是由于 IE 8瀏覽器沒有對 dashstyle.array的長度做出正確的驗(yàn)證,導(dǎo)致整數(shù)溢出。在本實(shí)驗(yàn)中,樣本運(yùn)行在Windows 7專業(yè)版系統(tǒng)中。

      程序在運(yùn)行時,共有256次執(zhí)行動態(tài)生成代碼的情況,其中包括執(zhí)行Hook代碼和Flash JIT 代碼等。ECfield準(zhǔn)確地識別了這些正常的動態(tài)代碼執(zhí)行的情況,沒有產(chǎn)生漏報(bào)和誤報(bào)。

      程序的異??刂屏鬓D(zhuǎn)移發(fā)生在mshtml模塊中,偏移為0x1bc545處的指令:call [eax+0x8],目標(biāo)地址是 0x7c348b05,該地址在 msvcr71.dll中。由于ECfield在每一次間接函數(shù)調(diào)用時,會對控制流轉(zhuǎn)移的合法性進(jìn)行判斷,此次調(diào)用的目標(biāo)地址不是一個外部調(diào)用函數(shù)的起始地址,ECfield將此次控制流轉(zhuǎn)移判定為不合法。

      通過ECfield,可以進(jìn)一步獲悉此漏洞利用的攻擊過程。msvcr71.dll是加載到IEXPLORE進(jìn)程中的非隨機(jī)化模塊,模塊中地址 0x7c348b05處開始的指令片段是:xchg eax, esp; ret;通過這兩條指令來切換棧區(qū)域,棧頂變?yōu)?0x0c0c0c0c,并且通過 ret返回到存放在新棧頂處的地址0x7c341748,繼續(xù)執(zhí)行后續(xù)的 ROP片段。從系統(tǒng)單步跟蹤利用攻擊點(diǎn)之后的指令序列可知,0x0c0c0c70處存放了shellcode,攻擊者修改了所在頁面的執(zhí)行屬性,最終跳轉(zhuǎn)至shellcode執(zhí)行。另外,ECfield通過檢測相鄰的內(nèi)存區(qū)域,發(fā)現(xiàn)它們不但具有相同的執(zhí)行屬性,同時相同偏移處的數(shù)據(jù)相似度達(dá)到 100%。由此判定,此漏洞利用攻擊采用了Spraying結(jié)合ROP的攻擊方式。

      案例2CVE-2007-4607漏洞利用攻擊

      此漏洞利用采用了JIT Spraying的方式進(jìn)行攻擊。攻擊樣本通過加載一段惡意的Flash視頻文件,使得其中的Flash腳本運(yùn)行,腳本將shellcode噴射到大量內(nèi)存區(qū)域中,隨后通過觸發(fā)IE ActiveX插件的漏洞,促使控制流跳轉(zhuǎn)至內(nèi)存中某段shellcode,進(jìn)而實(shí)施攻擊。此樣本運(yùn)行在Windows 7專業(yè)版系統(tǒng)中,F(xiàn)lash Player的版本為10.3.4。

      由于在程序執(zhí)行過程中Flash 的JIT指令所在的內(nèi)存區(qū)域具有可執(zhí)行屬性,所以通過JIT Spraying能夠?qū)⑶度氲紽lash中的shellcode直接噴射到大量的具有可執(zhí)行屬性的內(nèi)存中,攻擊者不用額外構(gòu)造ROP鏈來繞過DEP保護(hù),因此,攻擊者可以通過此攻擊方式,同時繞過 ASLR和 DEP;而且由于CFI方法[2]無法處理動態(tài)執(zhí)行代碼執(zhí)行的合法性,所以此攻擊方式也能夠繞過Total-CFI[11]、binCFI[10]提出的檢測方法。

      Flash JIT代碼是程序運(yùn)行過程中生成的動態(tài)代碼。在每一次控制流執(zhí)行至JIT代碼模塊時,ECfield確定此代碼模塊所在的內(nèi)存區(qū)域,檢測與之相鄰的內(nèi)存區(qū)域的可執(zhí)行屬性和相同偏移處的數(shù)據(jù)相似性。當(dāng)高度相似時,進(jìn)一步通過反匯編當(dāng)前JIT 代碼模塊中指令序列,檢測是否有高度疑似shellcode的指令,以此判定Flash JIT代碼相關(guān)的控制流轉(zhuǎn)移的合法性。

      在此案例中,ECfield共發(fā)現(xiàn)17 828次正常的JIT 代碼相關(guān)的控制流轉(zhuǎn)移,在每次提取相關(guān)DGC模塊和DGC函數(shù)之后,ECfield將它們加入到安全執(zhí)行輪廓中。異常的程序控制流轉(zhuǎn)移發(fā)生在 ntdll模塊偏移為0x465f7的指令call ecx處。此函數(shù)調(diào)用的目標(biāo)地址本應(yīng)為SEH鏈中的異常處理例程函數(shù),但是實(shí)際目標(biāo)地址卻為0x0c3f0101。0x0c3f0101處數(shù)據(jù)是 Flash JIT 動態(tài)生成代碼。該地址所在的內(nèi)存區(qū)域?yàn)閇0x0c3f0000 ~ 0x0c3fffff]。在與之相鄰的內(nèi)存區(qū)域[0x0c3e0000 ~ 0x0c3effff]和[0x0c400000 ~0x0c40ffff]中,相同偏移處的數(shù)據(jù)與當(dāng)前內(nèi)存區(qū)域中的數(shù)據(jù)相似度達(dá)到 100%。同時,0x0c3f0101開始的匯編指令序列中,包含了訪問當(dāng)前進(jìn)程PEB、獲得模塊列表LDR地址和獲得關(guān)鍵API內(nèi)存地址等疑似shellcode指令序列。由于相鄰內(nèi)存區(qū)域中數(shù)據(jù)高度相似,并且當(dāng)前目標(biāo)指令序列具有疑似攻擊指令,因此,ECfield將之判定為異常的控制流轉(zhuǎn)移。通過隨后的單步跟蹤發(fā)現(xiàn),shellcode頭部有大量重復(fù)的nop和cmp al, 0x35指令。這些滑板指令保證了控制流轉(zhuǎn)移至shellcode的成功率。

      7.4 時間運(yùn)行開銷

      本文利用攻擊檢測方法具有較小的運(yùn)行時間開銷。在原型系統(tǒng)ECfield中,測量在樣本開始運(yùn)行至檢測到利用攻擊發(fā)生時的時間間隔t,同時,也在原生 QEMU模擬器中運(yùn)行同樣的攻擊樣本,并測試這一時間間隔t’,具體數(shù)據(jù)如圖4所示。ECfield平均運(yùn)行時間開銷約為原生QEMU系統(tǒng)的2.1倍。由此可見,本文的方法具有較高的利用攻擊檢測效率,能夠用于漏洞攻擊的實(shí)時檢測。

      在運(yùn)行效率上,本文的實(shí)驗(yàn)系統(tǒng)比利用污點(diǎn)跟蹤分析實(shí)現(xiàn)的分析系統(tǒng),如Argos漏洞攻擊檢測系統(tǒng)[7],具有較明顯的優(yōu)勢。污點(diǎn)分析方法需要跟蹤每一條指令來處理污點(diǎn)狀態(tài)的傳播過程。要達(dá)到理想的效果,分析粒度需要在字節(jié)級別,這導(dǎo)致運(yùn)行時間開銷大概增長 3~50倍[4,5]。另外,Argos僅采用直接數(shù)據(jù)依賴的污點(diǎn)分析,真實(shí)漏洞利用中還包含大量有關(guān)污點(diǎn)數(shù)據(jù)的間接數(shù)據(jù)流依賴和控制流依賴的情況,這使得這些基于污點(diǎn)分析實(shí)現(xiàn)的檢測系統(tǒng),很難保證檢測效果的準(zhǔn)確率。

      圖4 ECfield與原生QEMU運(yùn)行時間開銷對比

      8 局限性

      本文方法對實(shí)際漏洞利用攻擊具有較好的檢測效果,但是也存在著一些局限性。首先,本文方法重點(diǎn)關(guān)注針對應(yīng)用程序的漏洞利用攻擊檢測,無法檢測發(fā)生在內(nèi)核中的利用攻擊。其次,在間接函數(shù)調(diào)用時,驗(yàn)證目標(biāo)函數(shù)是否具有外部調(diào)用屬性,對于某些call-to-libc類型的利用來說,如果call的目標(biāo)恰好是 call指令所在模塊導(dǎo)入的函數(shù)(如kernel32模塊中的WinExec),并且直接通過此函數(shù)執(zhí)行惡意行為,本文方法將認(rèn)為此函數(shù)調(diào)用是正常的,造成漏報(bào)。由于Windows 7等操作系統(tǒng)中已經(jīng)加入SafeSEH、ASLR和DEP等安全機(jī)制,攻擊者很難僅通過一次call調(diào)用來繞過這些安全機(jī)制,完成所有的攻擊步驟,所以此種利用方法很難應(yīng)用在實(shí)際的漏洞攻擊中。為了檢測此種類型的攻擊,可以重點(diǎn)關(guān)注如WinExec、CreateProcess等函數(shù),通過在這些函數(shù)調(diào)用時檢測函數(shù)參數(shù)是否包含惡意數(shù)據(jù)識別攻擊。

      9 結(jié)束語

      本文提出一種基于異??刂屏髯R別的漏洞利用攻擊檢測方法,能夠在惡意攻擊代碼執(zhí)行之前,檢測到攻擊發(fā)生。通過對二進(jìn)制目標(biāo)程序靜態(tài)分析和動態(tài)執(zhí)行監(jiān)測,構(gòu)建完整的安全執(zhí)行輪廓,并限定控制流轉(zhuǎn)移的合法目標(biāo)。在函數(shù)調(diào)用、函數(shù)返回和跳轉(zhuǎn)等控制流轉(zhuǎn)移發(fā)生時,檢測目標(biāo)地址的合法性,將異??刂屏鬓D(zhuǎn)移判定為漏洞攻擊,并捕獲完整的攻擊步驟。為驗(yàn)證本文方法的正確性,本文實(shí)現(xiàn)了基于異??刂屏鬓D(zhuǎn)移檢測的漏洞利用攻擊原型系統(tǒng),并對若干實(shí)際高危漏洞進(jìn)行實(shí)驗(yàn)。實(shí)驗(yàn)表明,本文的方法能夠準(zhǔn)確檢測到利用攻擊,并具備良好的運(yùn)行效率,可以作為漏洞利用攻擊的實(shí)時檢測工具。

      [1] Secunia[EBOL]. http://secunia.com/vulnerability-review/.2014.

      [2] ABADI M, MIHAIBUDIU, ERLINGSSON U. Control-flow integrity[A]. Proceedings of the 12th ACM conference on Computer and Communications Security[C]. Raleigh, NC, USA, 2005.340-353.

      [3] BOSMAN E, SLOWINSKA A, BOS H. Minemu: the world’s fastest taint tracker[J]. Recent Advances in Intrusion Detection, 2011, 6961:1-20.

      [4] NEWSOME J, SONG D. Dynamic taint analysis for automatic detection, analysis, and signature generation of exploits on commodity software[A]. Network and Distributed System Security Symposium[C].San Diego, California, USA: Internet Society, 2005.

      [5] SCHWARTZ E L, AVGERINOS T, BRUMLEY D. All you ever wanted to know about dynamic taint analysis and forward symbolic execution (but might have been afraid to ask)[A]. IEEE Symposium on Security and Privacy[C].Oakland, CA, USA, 2010.317-331.

      [6] FireEye[EB/OL]. http://www.fireeye.com/.2014.

      [7] Argos[EB/OL]. http://www.few.vu.nl/argos/.2014.

      [8] PORTOKALIDIS G, SLOWINSKA A, BOS H. Argos: an emulator for fingerprinting zero-day attacks for advertised honeypots with automatic signature generation[J]. Proceedings of the 1st ACM SIGOPS/EuroSys European Conference on Computer Systems 2006[C]. New York, NY, USA: ACM, 2006.15-27.

      [9] YIN H, SONG D, EGELE M. Capturing system-wide information flow for malware detection and analysis[A]. Proceeding of the 14th ACM Conference of Computer and Communication Security[C]. Alexandria, VA, USA, 2007.116-127.

      [10] ZHANG M W, SEKAR R. Control flow integrity for COTS binaries[A]. Proceedings of the 22nd USENIX Conference on Security 2013[C]. Berkeley, CA, USA, 2013.

      [11] PRAKASH A, YIN H, LIANG Z K. Enforcing system-wide control flow integrity for exploit detection and diagnosis[A]. 8th ACM Symposium on Information, Computer and Communications Security[C].Hangzhou, China, 2013.311-322.

      [12] ZHANG C, WEI T, CHEN Z F. Practical control flow integrity &randomization for binary executables[A]. The 34th IEEE Symposium on Security & Privacy[C]. San Francisco, CA, USA, 2013.559-573.

      [13] ZHANG C, WEI T, CHEN ZF. FPGate: The Last Building Block For A Practical CFI Solution[R]. Technical Report For Microsoft BlueHat Prize Contest, 2012.

      [14] ROEMER R, BUCHANAN E, SHACHAM H. Return-oriented programming: systems, languages, and applications[J]. ACM Transactions on Information and System Security, 2012,15(1).

      [15] DING Y, WEI T, WANG TL. Heap Taichi: exploiting memory allocation granularity in heap-spraying attacks[A]. Proceedings of the 26th Annual Computer Security Applications Conference[C]. New York,NY, USA: ACM, 2010.327-336.

      [16] Heap FengShui[EB/OL]. https://www.blackhat.com/presentations/bheurope-07/ Sotirov/Presentation/bh-eu-07-sotirov-apr19.pdf.2014.

      [17] BELLARD F. Qemu, a fast and portable dynamic translator[A]. Proceedings of the 14th USENIX conference on Security [C]. Baltimore,MD, USA, 2005.

      [18] WANG MH, SU PR, LI Q. Automatic polymorphic exploit generation for software vulnerabilities[A]. 9th International Conference on Security and Privacy in Communication Networks[C]. Sydney, Australia.2013.216-233.

      [19] IDA Pro[EB/OL]. https://www.hex-rays.com/products/ida/,2014.

      [20] Metasploit[EB/OL]. http://www.metasploit.com/,2014.

      猜你喜歡
      控制流漏洞內(nèi)存
      漏洞
      抵御控制流分析的Python 程序混淆算法
      工控系統(tǒng)中PLC安全漏洞及控制流完整性研究
      電子科技(2021年2期)2021-01-08 02:25:58
      抵御控制流分析的程序混淆算法
      “春夏秋冬”的內(nèi)存
      三明:“兩票制”堵住加價漏洞
      漏洞在哪兒
      兒童時代(2016年6期)2016-09-14 04:54:43
      高鐵急救應(yīng)補(bǔ)齊三漏洞
      基于控制流隱藏的代碼迷惑
      基于內(nèi)存的地理信息訪問技術(shù)
      交口县| 台前县| 体育| 商水县| 延庆县| 内乡县| 鄂托克旗| 湄潭县| 应城市| 剑川县| 长治县| 政和县| 黑龙江省| 绥宁县| 宁强县| 涞水县| 寿光市| 达州市| 洛隆县| 哈密市| 花垣县| 三穗县| 图木舒克市| 大庆市| 永兴县| 古蔺县| 定日县| 湾仔区| 遂川县| 闽侯县| 明光市| 绥芬河市| 铜山县| 邢台市| 旬邑县| 洪泽县| 故城县| 泰州市| 平潭县| 广东省| 菏泽市|