王明華,應凌云,馮登國
(1. 中國科學院 軟件研究所 可信計算與信息保障實驗室,北京 100190;2. 中國科學院大學,北京 100049)
軟件漏洞是信息系統(tǒng)安全的主要威脅,各大軟件廠商在不斷改進和完善軟件開發(fā)質(zhì)量管理,但軟件漏洞問題仍無法徹底消除。根據(jù)Secunia發(fā)布的漏洞數(shù)據(jù)[1],可以看到應用軟件漏洞占絕大多數(shù),并且漏洞數(shù)量逐年增多。此外,應用軟件漏洞種類多樣,包括Flash漏洞、瀏覽器漏洞、文件格式漏洞等,涉及到 Adobe Reader、Microsoft Office Word、Adobe Flash Player等被廣泛使用的軟件。
為了緩解應用軟件漏洞帶來的危害,新型操作系統(tǒng)引入了地址空間隨機化(ASLR)和數(shù)據(jù)執(zhí)行保護(DEP)等安全機制,一定程度上抑制了針對應用軟件和系統(tǒng)漏洞的利用攻擊。但是,攻擊者仍然能夠通過精妙的利用構(gòu)造,找到繞過這些安全機制的方法,通過劫持控制流實施利用攻擊。為了應對這些新安全環(huán)境下的利用攻擊,安全人員需要及時地發(fā)現(xiàn)攻擊威脅,以便快速做出響應,避免造成損失。近年來,學術(shù)界提出了控制流完整性檢測、污點分析等分析方法,來對程序執(zhí)行過程中的異??刂屏鬟M行檢測,取得了一定的效果。控制流完整性檢測方法[2],通過在CFG圖中構(gòu)造控制流轉(zhuǎn)移的合法目標地址集合,在控制流轉(zhuǎn)移發(fā)生時,校驗目標地址是否在合法的集合內(nèi),并以此作為攻擊檢測的依據(jù)。此種方法依賴CFG,無法解決動態(tài)生成代碼相關(guān)的惡意控制流轉(zhuǎn)移問題,如JIT Spraying攻擊等。動態(tài)污點分析方法[3~5]將程序輸入標記為污點源,通過監(jiān)控程序動態(tài)執(zhí)行過程,在污點數(shù)據(jù)被異常使用時產(chǎn)生警告。由于污點分析需要細粒度地監(jiān)控程序執(zhí)行,使得系統(tǒng)運行效率開銷很大,同時污點分析方法本身存在一些局限性,會使得檢測結(jié)果存在一定范圍的誤報率和漏報率。在工業(yè)界,如FireEye[6]等安全廠商提出了通過API行為攔截,利用一定的啟發(fā)策略來判定惡意行為的方法。然而,這些檢測方法在函數(shù)級別開展分析,但是漏洞利用攻擊可能發(fā)生在指令級別,僅通過API攔截無法獲知指令級的異??刂屏鬓D(zhuǎn)移,導致此類方法檢測漏洞利用攻擊的能力有限。
本文提出了一種針對應用軟件漏洞利用攻擊的檢測方法:通過對目標程序加載的二進制模塊進行靜態(tài)分析,獲得函數(shù)邊界和導出屬性等,構(gòu)建初始的合法控制流轉(zhuǎn)移邊界;結(jié)合在程序動態(tài)執(zhí)行時實時維護的控制流轉(zhuǎn)移記錄,構(gòu)建完整的控制流轉(zhuǎn)移安全輪廓。將程序執(zhí)行過程中,轉(zhuǎn)移至此輪廓之外的控制流轉(zhuǎn)移,判定為具有利用攻擊威脅的異常的控制流轉(zhuǎn)移。本文方法通過識別異常控制流轉(zhuǎn)移,在攻擊代碼執(zhí)行之前,檢測到利用攻擊。本方法能夠準確檢測包括動態(tài)生成代碼在內(nèi)的惡意控制流轉(zhuǎn)移的攻擊;另外,本方法不依賴于任何漏洞和攻擊代碼的先驗知識,同時具有較為理想的運行效率,可以作為漏洞攻擊實時檢測的解決方案。
本文方法的貢獻與創(chuàng)新點如下。
1) 提出了一種通過檢測異??刂屏鬓D(zhuǎn)移判定漏洞利用攻擊的方法,結(jié)合靜態(tài)和動態(tài)分析手段,構(gòu)造完整的程序安全執(zhí)行輪廓,識別安全輪廓之外的異常控制流轉(zhuǎn)移,檢測漏洞利用攻擊。該方法較傳統(tǒng)利用污點分析等細粒度數(shù)據(jù)流分析方法具有較高的準確性和較理想的運行效率。
2) 提出了一種檢測來自于動態(tài)生成代碼的利用攻擊的方法,通過分析內(nèi)存的頁面屬性、數(shù)據(jù)相似性等,對動態(tài)生成代碼的合法性進行判斷,從而識別轉(zhuǎn)移至非法動態(tài)生成代碼的控制流。該方法解決了控制流完整性校驗等方法無法處理的諸如 JIT Spraying攻擊的檢測問題。
3) 實現(xiàn)了漏洞利用攻擊檢測原型系統(tǒng),并通過對Word、IE、Flash Player等8個實際漏洞進行檢測實驗,驗證了本文方法的有效性。實驗表明,本方法不僅具有很高的檢測準確性,同時還具有較小的運行開銷,可用于漏洞利用攻擊實時檢測。
漏洞利用攻擊檢測相關(guān)研究主要包括基于動態(tài)污點傳播的方法和基于控制流完整性的方法2大類。在動態(tài)污點傳播方面,相關(guān)的漏洞攻擊檢測系統(tǒng)有 Argos[7,8]。Argos將網(wǎng)絡(luò)數(shù)據(jù)作為污點源,在動態(tài)執(zhí)行過程中監(jiān)控是否有sink函數(shù)使用污點。該系統(tǒng)能夠用來檢測0 Day漏洞攻擊,能夠支持針對Windows 7等操作系統(tǒng)上應用軟件的漏洞攻擊。該分析系統(tǒng)依靠污點分析實現(xiàn),由于污點方法自身存在的局限性,所以難以保證監(jiān)控結(jié)果的準確性,具有一定的誤報和漏報率,同時具有較大的運行開銷。相似的檢測系統(tǒng)還有 TaintCheck[4]、Panorama[9]等。
基于控制流完整性校驗(CFI,control flow integrity)的方法同樣可以用于檢測漏洞利用攻擊。該方法[2]首先由Abadi等人提出,通過構(gòu)造CFG圖中所有間接控制流轉(zhuǎn)移的合法目標地址的集合,在控制流轉(zhuǎn)移發(fā)生時校驗目標地址是否在合法的集合內(nèi),以此可以作為攻擊檢測的依據(jù)。然而,對于控制流轉(zhuǎn)移結(jié)構(gòu)復雜的程序而言,構(gòu)造 CFG的準確性難以保證,這會對檢測結(jié)果有一定的影響。
binCFI[10]也是基于CFI方法實現(xiàn),提出了間接控制流轉(zhuǎn)移目標地址的完整性校驗方法。這些目標地址包括地址指針常量,經(jīng)過算術(shù)運算得出的程序地址,以及函數(shù)返回地址等。對這些目標地址的校驗是基于靜態(tài)分析的結(jié)果,會引入一定的誤判,例如,方法沒有驗證函數(shù)返回的合法性,可能通過導致覆蓋函數(shù)地址控制執(zhí)行流的情況。這種異常情況需要結(jié)合動態(tài)執(zhí)行信息來進行判斷。
Total-CFI[11]同樣利用CFI手段來判斷間接控制流轉(zhuǎn)移的合法性,是動態(tài)分析方法。該方法利用了影子棧,監(jiān)測來自在用戶態(tài)和內(nèi)核態(tài)的控制流異常攻擊,系統(tǒng)具備較理想的運行效率;但是,該系統(tǒng)在檢測間接函數(shù)調(diào)用目標時粒度過粗,會帶來一定的誤判,同時對動態(tài)生成代碼分析的較弱,無法檢測通過JIT Spraying等實施的漏洞攻擊。
CCFIR[12]通過重寫二進制文件來加入控制流轉(zhuǎn)移校驗的過程,也具備漏洞檢測的能力。CCFIR在二進制文件中添加新的springboard節(jié)區(qū),用以隨機存放該模塊中所有間接控制流轉(zhuǎn)移目標地址,并改寫間接控制流轉(zhuǎn)移調(diào)用處代碼,使得在這些代碼執(zhí)行時,首先跳轉(zhuǎn)至springboard驗證合法性。該方法能夠抵御傳統(tǒng)的ret-to-libc和ROP攻擊,但是無法識別動態(tài)生成代碼有關(guān)的控制流合法性。FPGate[13]提出的方法與 CCFIR相似,但更關(guān)注函數(shù)調(diào)用的合法性。FPGate和CCFIR等方法基于二進制重新技術(shù)(binary rewriting)來實現(xiàn),需要用戶重新部署新的二進制模塊,適用性較差。
Windows 7等操作系統(tǒng)采用了ASLR和DEP等安全機制,傳統(tǒng)的函數(shù)地址覆蓋、異常處理覆蓋等漏洞利用手段已經(jīng)難以奏效。要成功利用Windows 7等平臺上應用軟件的漏洞,首先需要突破ASLR和DEP等機制的防護,常見的方法包括 ROP[14]和內(nèi)存噴射(spraying)[15]。ROP能夠通過重用內(nèi)存中已加載模塊中的代碼片段,達到修改shellcode數(shù)據(jù)所在內(nèi)存頁面屬性的目的,使數(shù)據(jù)執(zhí)行保護失效;內(nèi)存噴射技術(shù)通過在內(nèi)存某段區(qū)域中大量部署shellcode,從而在ASLR導致地址不確定的情況下,也能保證利用攻擊具有較高的成功率。圖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,實施攻擊。從圖中可以看出,漏洞利用攻擊所依賴的異常控制流轉(zhuǎn)移發(fā)生在函數(shù)返回時,此時的控制流不應該轉(zhuǎn)移至 0x7c345678處的ROP garget,而是應該轉(zhuǎn)移至call eax調(diào)用時壓入的下條指令地址處。在圖 1(b)中,攻擊者將vtable虛函數(shù)表中第 3個虛函數(shù)被篡改為0x0c0c0c0c,并且在內(nèi)存中噴射出很多包含了攻擊代碼的內(nèi)存區(qū)域,在函數(shù)調(diào)用call[eax+0x8]時,目標地址不應是0x0c0c0c0c處的動態(tài)生成代碼,而應該是由ecx所指定類中的虛函數(shù)。
根據(jù)上述分析,本文提出一種通過檢測異??刂屏鬓D(zhuǎn)移判定漏洞利用攻擊的方法。方法架構(gòu)如圖2所示。本方法通過對二進制目標程序進行靜態(tài)分析,構(gòu)造初始的安全執(zhí)行輪廓;在動態(tài)監(jiān)控程序運行階段,識別動態(tài)生成代碼,對安全執(zhí)行輪廓進行維護。結(jié)合構(gòu)建的完整安全執(zhí)行輪廓,檢測函數(shù)調(diào)用、函數(shù)返回、間接跳轉(zhuǎn)等控制流轉(zhuǎn)移的合法性,將異常控制流轉(zhuǎn)移判定為漏洞利用攻擊,進而捕獲完整的攻擊步驟。本文方法不但能夠檢測由于違反靜態(tài) CFG圖中限定的控制流轉(zhuǎn)移所導致的利用攻擊,而且支持動態(tài)生成代碼相關(guān)的利用攻擊。
圖1 ROP和內(nèi)存噴射利用原理示意
本文接下來將針對如何構(gòu)建安全執(zhí)行輪廓,如何判定漏洞利用攻擊,以及如何提取漏洞利用攻擊步驟進行詳細闡述。
圖2 漏洞利用攻擊檢測方法架構(gòu)
安全的控制流轉(zhuǎn)移輪廓,需要確保程序所運行的所有控制流轉(zhuǎn)移指令能夠轉(zhuǎn)移至合法的目標地址。Abadi等人提出的控制流完整性檢驗方法[2],通過靜態(tài)獲得的 CFG圖,構(gòu)造所有控制流轉(zhuǎn)移的合法目標地址。然而,程序在運行過程中可能出現(xiàn)動態(tài)生成代碼,例如:
1) 一些第三方軟件通過加殼等方式進行保護,在軟件運行時,首先開辟一塊具有可執(zhí)行屬性的內(nèi)存區(qū)域,然后將代碼拷貝至區(qū)域中,程序首先執(zhí)行此段動態(tài)生成的代碼,然后進行后續(xù)的執(zhí)行;
2) 某些程序在運行過程中,可能在函數(shù)起始地址等處添加hook,在此函數(shù)執(zhí)行時,程序?qū)⑻D(zhuǎn)至存放在另一個具有可執(zhí)行權(quán)限的內(nèi)存區(qū)域中,執(zhí)行hook處理代碼,如在 IE 8進程啟動并加載IEShims.dll模塊時,將在一些模塊函數(shù)入口處添加hook,劫持這些函數(shù)的運行,以完成所需要的處理;
3) 另外,某些應用程序支持JIT(just in time)代碼運行,例如Flash程序,可以通過Action Script編寫Flash程序,在程序運行時,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)移問題。
本文識別程序運行過程中所有可執(zhí)行代碼,將這些代碼所在模塊和函數(shù)作為安全執(zhí)行輪廓,并基于此,判定程序運行時控制流轉(zhuǎn)移的安全性。
為了闡述方便,做出如下定義。
1) 代碼塊tb:每一個代碼塊由若干條順序執(zhí)行的指令組成,其中,僅最后一條為控制流轉(zhuǎn)移指令,如call、ret和jxx等。它是進行控制流轉(zhuǎn)移檢測的最小檢測單元。
2) 加載模塊m:是指待分析程序在導入表中引入的模塊,或者在運行時動態(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):在程序運行過程中,在具有可執(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個階段:首先依賴二進制分析程序自身,構(gòu)造初始的安全執(zhí)行輪廓,此輪廓是靜態(tài)CFG圖中限定的所有執(zhí)行函數(shù)FL和加載模塊ML;然后,通過動態(tài)監(jiān)控程序執(zhí)行,識別所有DGC模塊{mdgc}和DGC函數(shù){fdgc},對安全執(zhí)行輪廓進行補充和維護。下面,首先討論初始安全執(zhí)行輪廓構(gòu)建的過程,然后討論如何通過動態(tài)監(jiān)控目標程序執(zhí)行,構(gòu)建完整的安全執(zhí)行輪廓。
依靠二進制目標程序自身構(gòu)造初始安全執(zhí)行輪廓。主要包括獲得二進制目標程序自身和其加載模塊的屬性,以及這些模塊中所有函數(shù)信息。
對于函數(shù),需要通過反匯編二進制模塊獲取每一個函數(shù)的起始地址。除此之外,還需要確定模塊中函數(shù)是否具有外部調(diào)用屬性,即此函數(shù)是否允許被其他模塊代碼調(diào)用,例如模塊A中代碼調(diào)用模塊B中函數(shù),那么,此函數(shù)應該被模塊B導出。為此,將函數(shù)分為2類,分別是外部調(diào)用函數(shù)和內(nèi)部調(diào)用函數(shù)。具有外部調(diào)用屬性的函數(shù),可以被除自身模塊之外的其他模塊調(diào)用,例如模塊導出的函數(shù),C++類實例中具有 public屬性的虛函數(shù)等;具有內(nèi)部調(diào)用屬性的函數(shù),則只能夠被自身模塊調(diào)用。
從模塊的導出表和重定位表來獲得具有外部調(diào)用屬性的函數(shù)。通過導出表,可以獲得此模塊中所有導出的函數(shù)。通過重定位表,獲得地址需要重定位的函數(shù)。具體方法是:依次掃描每一個重定位表項,如果該表項的數(shù)值與模塊基地址的和在模塊代碼段的范圍之內(nèi),那么就視其為一個地址需要重定位的函數(shù)。本文將這類函數(shù)和導出函數(shù)認為是具有外部調(diào)用屬性的函數(shù)。最后,模塊中除去這些外部調(diào)用屬性函數(shù)之外的函數(shù),認為是具有內(nèi)部調(diào)用屬性的函數(shù)。
通過分析函數(shù)外部調(diào)用屬性,能夠有效防范篡改虛函數(shù)地址的漏洞利用攻擊。由于在虛函數(shù)表中的函數(shù)地址需要被重定位,所以,所有虛函數(shù)都被劃歸為外部調(diào)用函數(shù)。如果類實例的某個虛函數(shù)被覆蓋為某惡意地址,并且此惡意地址不在此模塊的外部調(diào)用函數(shù)集合之內(nèi),那么能夠檢測到這一異??刂屏鬓D(zhuǎn)移。
對于漏洞程序運行所依賴的模塊,按照PE格式解析模塊文件,獲得模塊加載基地址和大小,是否具備隨機化屬性,以及導入、導出、重定位表等數(shù)據(jù)項的內(nèi)容。由于程序在運行時可以動態(tài)加載模塊,對這些模塊,雖然可以動態(tài)解析模塊文件,獲得上述模塊和其中所有函數(shù)屬性信息,但是這將使得系統(tǒng)運行效率受到較大的影響。所以,對系統(tǒng)中所有模塊文件進行預先分析,并將分析結(jié)果保存到文件中。在后續(xù)動態(tài)分析判定過程中可以直接讀取,從而提高了系統(tǒng)運行效率。
為了處理 DGC相關(guān)的控制流轉(zhuǎn)移,需要動態(tài)識別DGC模塊和DGC函數(shù),并將其加入到安全執(zhí)行輪廓中。雖然可以通過對二進制程序在運行時采取細粒度的跟蹤分析,來獲得DGC模塊和DGC函數(shù)在內(nèi)存位置,提取 DGC數(shù)據(jù),但是這需要較大的運行開銷。相反,選擇在DGC執(zhí)行時,識別DGC模塊和DGC函數(shù)。所用算法偽代碼如下。
算法1IdentifyDGC(M,F,ML,FL,tb)
//該算法識別DGC模塊和DGC函數(shù),并加入到模塊輪廓M和函數(shù)輪廓F中
輸入:當前的模塊輪廓M和函數(shù)輪廓F,進程加載模塊集合ML,模塊函數(shù)集合FL,當前執(zhí)行的tb
輸出:最新的模塊輪廓M和函數(shù)輪廓F
該算法在每一個tb執(zhí)行時被調(diào)用。函數(shù)參數(shù)ML、FL是通過構(gòu)建初始安全執(zhí)行輪廓時得到的。算法檢測當前執(zhí)行代碼是否在已加載模塊內(nèi)(第 1行),若不在,則說明當前正在執(zhí)行DGC,接下來提取DGC模塊和DGC函數(shù)(第2行之后)。
由于系統(tǒng)隨機化不僅針對加載模塊,而且包括例如TEB、PEB等關(guān)鍵數(shù)據(jù)結(jié)構(gòu)、棧和堆分配地址的隨機化,所以,攻擊者在考慮到利用攻擊的穩(wěn)定性,會通過噴射的方式保證攻擊的成功率。為此,充分利用這一特性,識別 DGC模塊,并區(qū)分其合法性和非法性。
本文將內(nèi)存區(qū)域認為是具備相同屬性的相鄰內(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實現(xiàn)。算法偽代碼如下。
算法2check_attacky(eip)
//該算法檢測eip所在的DGC是否具有攻擊特征
輸入:當前程序執(zhí)行的pc
算法首先獲取進程內(nèi)存空間中所有內(nèi)存區(qū)域RgnList,然后找到當前eip指向的區(qū)域RgnCur,以及與之相鄰的2個區(qū)域RgnFmr和RgnLtr。如果這些區(qū)域不都具備可執(zhí)行屬性,那么當前內(nèi)存區(qū)域不是噴射而來。否則,計算出要執(zhí)行的指令地址在當前內(nèi)存區(qū)域中的偏移,并且驗證在相鄰內(nèi)存區(qū)域上相同偏移處的數(shù)據(jù)相似性。算法中,設(shè)置了一個檢測窗口N,用于表示在各個內(nèi)存區(qū)域中讀取的字節(jié)數(shù)量,并用變量d表示數(shù)據(jù)相似性。如果d高于某一個閾值T,即認為高度相似,那么再反匯編當前內(nèi)存區(qū)域的指令序列,驗證指令序列中是否存在疑似shellcode的指令,最后返回驗證結(jié)果。
由于shellcode的形式具有多樣性,例如被多次加密或存在多個攻擊指令片段等,使得驗證shellcode疑似指令具有一定的誤報率;另外,驗證shellcode會對分析運行效率造成一定影響,所以,在相鄰內(nèi)存區(qū)域都具備可執(zhí)行屬性,并且相同偏移處數(shù)據(jù)高度相似之后,再驗證shellcode疑似指令。這種策略的可靠性在于,攻擊者為了提高漏洞利用的成功率,會通過內(nèi)存噴射等手段在內(nèi)存頁面中部署盡可能多的攻擊代碼,使得相鄰的內(nèi)存區(qū)域中的數(shù)據(jù)具有高度的相似性。
由于shellcode需要重定位獲得加載地址,以及可能需要實時獲得執(zhí)行所需API地址,所以通過檢測重定位指令和一些訪問進程數(shù)據(jù)結(jié)構(gòu)的敏感指令序列,來判定當前指令數(shù)據(jù)疑似shellcode的程度。其中,重定位指令包括call/pop、fnstenv/pop、fxsave/pop等常見指令組合,敏感指令包括獲得當前進程控制塊、獲得當前進程加載模塊的指令序列等。
如果經(jīng)過上述檢驗,此內(nèi)存區(qū)域不具備攻擊屬性,那么將此內(nèi)存區(qū)域作為合法的 DGC模塊,并獲取此區(qū)域的基地址和大小作為DGC模塊的基地址和大小,將此DGC模塊加入到維護的可執(zhí)行模塊的集合中。在程序執(zhí)行過程中,此段DGC可能重復執(zhí)行,集合元素的唯一性保證了此DGC模塊在可執(zhí)行模塊集合中僅出現(xiàn)一次。相反,如果檢驗發(fā)現(xiàn)此內(nèi)存區(qū)域具有攻擊屬性,那么當前轉(zhuǎn)移至此的DGC控制流非法,判定為漏洞利用攻擊。
對于 DGC函數(shù),由于無法像模塊函數(shù)那樣獲知 DGC函數(shù)的起始地址,所以,當程序控制流由非DGC模塊轉(zhuǎn)移至某段DGC時,將此次控制流轉(zhuǎn)移的目標地址視為 DGC函數(shù)起始地址,而在控制流由 DGC模塊返回至非 DGC模塊時,視為此段DGC函數(shù)執(zhí)行結(jié)束,并將在DGC模塊之間執(zhí)行的所有代碼塊視為一個DGC函數(shù)體。并且,將DGC函數(shù)視為具有外部調(diào)用屬性的函數(shù)。DGC函數(shù)示意如圖3所示。
圖3 DGC函數(shù)示意
根據(jù)構(gòu)建的安全執(zhí)行輪廓,對程序運行過程中發(fā)生的間接控制流轉(zhuǎn)移進行驗證,將不合法的控制流轉(zhuǎn)移判定為漏洞利用攻擊。為此,對3種間接控制流轉(zhuǎn)移進行分析:通過call指令進行的函數(shù)調(diào)用;通過ret執(zhí)行進行函數(shù)返回;以及通過jmp執(zhí)行進行程序跳轉(zhuǎn)。下面分別就這3種控制流轉(zhuǎn)移的驗證方式進行討論。
間接調(diào)用的目標地址僅能在運行時確定,需要根據(jù)構(gòu)建的安全執(zhí)行輪廓來驗證目標地址的合法性。如果間接函數(shù)調(diào)用目標地址不在當前調(diào)用模塊之內(nèi),首先驗證目標地址是否是函數(shù)的起始地址,再驗證此目標函數(shù)是否具有外部調(diào)用屬性;如果目標函數(shù)被所在模塊導出,則還需驗證調(diào)用模塊是否導入了此模塊。如果間接函數(shù)調(diào)用目標在當前調(diào)用模塊內(nèi),僅驗證目標地址是否是當前模塊的函數(shù),不限定此函數(shù)的屬性。只有通過驗證的間接函數(shù)調(diào)用,才被認為是合法。上述驗證過程的算法偽代碼如下。
算法3chk_call(dst,mc)
//檢測call指令目標地址的合法性
輸入:call指令的目標地址dst,call指令所在模塊的代碼段mc
工作Total-CFI[11]同樣檢測call控制流轉(zhuǎn)移合法性的問題,但與本文方法不同的是,它僅僅驗證call的目的地址是否是一個函數(shù)的起始,而不關(guān)心這個函數(shù)是否具有外部調(diào)用屬性,這導致驗證結(jié)果不夠準確,可能會產(chǎn)生漏報。另外,此系統(tǒng)還無法處理DGC相關(guān)的控制流轉(zhuǎn)移問題。
控制流可以通過函數(shù)返回指令進行轉(zhuǎn)移。正確的函數(shù)返回的目標地址,應該是此函數(shù)被調(diào)用時壓入棧中的地址。在函數(shù)返回時,如果驗證發(fā)現(xiàn)返回地址不合法,可以判定控制流被劫持,即有異??刂屏鬓D(zhuǎn)移。
與Total-CFI系統(tǒng)類似,通過影子棧來實現(xiàn)返回地址合法性的驗證。為每一個線程維護一個影子棧,在函數(shù)調(diào)用發(fā)生時,在對應的影子棧中壓入返回地址;在函數(shù)返回時,在對應影子棧中驗證壓入的地址與此返回地址是否一致??紤]到異常處理、setjump/longjmp等特殊情況,返回地址可能不在棧頂,但是一定在棧中。所以,在本文中僅驗證返回地址是否在影子棧中,并將棧頂?shù)酱隧椫g所有的項彈出影子棧。如果未在棧中,則判定為異??刂屏鬓D(zhuǎn)移。
另外,與Total-CFI不同的是,本文還考慮了另一種特殊情況:push addr、ret。這種ret實際上起到call的功能。由于addr值是由push 壓入,而非函數(shù)調(diào)用call壓入,所以在影子棧中無法找到。本文通過額外為每一個線程維護一個 push棧來記錄壓入的值,在函數(shù)返回 ret發(fā)生時,首先查看該線程的影子棧,如果沒有在棧中找到返回值,則在push棧中尋找。如果找到,將此值至棧頂?shù)脑厝繌棾?。否則,則說明當前 ret可疑,可能使程序控制流轉(zhuǎn)移至危險位置。
跳轉(zhuǎn)可分為直接跳轉(zhuǎn)和間接跳轉(zhuǎn)。對于直接跳轉(zhuǎn),目標地址一定在自身模塊內(nèi),無需檢測。對于間接跳轉(zhuǎn),需要檢測目標地址的合法性。
對于jmp [C+idx*idx’]模式的跳轉(zhuǎn),其中,idx、idx’為寄存器或立即數(shù),如果C值在程序代碼段或者數(shù)據(jù)段范圍內(nèi),那么認為此C值是程序中某個函數(shù)地址表的起始,其中的每個地址項占用4個字節(jié),此跳轉(zhuǎn)指令正是通過地址表C獲得偏移idx*idx’處的目標地址。本文將此類跳轉(zhuǎn)指令合法目標地址集合記為S
即從地址表C開始,依次查看每一表項的值是否在當前模塊的代碼段mc范圍內(nèi),并將符合此條件的值加入到S中,直至遇到不滿足此條件的地址項為止。在此類jmp執(zhí)行時,如果目標地址不在其合法地址S中,將此指令的執(zhí)行判定為異??刂屏鬓D(zhuǎn)移。
對于其他間接jmp跳轉(zhuǎn)指令,目標地址理論上可以是內(nèi)存中任意位置,但通過對實際應用程序的分析,發(fā)現(xiàn)合法的間接跳轉(zhuǎn)指令的目標地址都應在本模塊內(nèi)。所以,將跳轉(zhuǎn)至自身模塊代碼段之外的間接跳轉(zhuǎn),判定為異常的控制流轉(zhuǎn)移。
在捕獲到利用攻擊所需的異??刂屏鬓D(zhuǎn)移之后,捕獲后續(xù)漏洞利用攻擊的步驟。這些攻擊步驟有助于分析人員掌握攻擊細節(jié),對評估漏洞的危害性,以及制定防御方案等具有重要的意義。
當識別到異常控制流之后,開始單步執(zhí)行目標程序,記錄程序執(zhí)行指令和調(diào)用的函數(shù)。對于執(zhí)行的指令,記錄每一條指令類型以及操作數(shù)的值;對于調(diào)用的函數(shù)、記錄參數(shù)和返回值。通過監(jiān)控進程創(chuàng)建、用戶創(chuàng)建、文件操作、網(wǎng)絡(luò)訪問等系統(tǒng)API調(diào)用,能夠捕獲“下載并運行”、“添加新用戶”等惡意行為。
通過這些記錄,分析人員能夠還原漏洞利用攻擊的所有細節(jié)。例如,如果漏洞利用采用了 ROP方式,可以獲知為了構(gòu)造 ROP 鏈,利用代碼重用了哪些指令片段,攻擊載荷所在內(nèi)存區(qū)域如何獲得可執(zhí)行屬性,以及攻擊載荷所進行的惡意操作。再如,通過檢測利用攻擊點所在內(nèi)存區(qū)域相鄰的內(nèi)存區(qū)域的屬性,以及比對這些區(qū)域的數(shù)據(jù)相似性,可以獲知內(nèi)存噴射漏洞的噴射粒度和噴射范圍等信息,評估此漏洞利用的成功率等。安全分析人員可以利用這些信息,對軟件漏洞的危害性進行評估,制定漏洞補丁方案,或者生成檢測工具所需的漏洞特征等。
基于硬件模擬器 QEMU 1.6.1[17,18]實現(xiàn)原型系統(tǒng)ECfield (enhanced control flow integrity based exploit detector),并利用8個實際漏洞利用攻擊樣本對本文的系統(tǒng)進行實驗評估。在實驗中,原型系統(tǒng)運行在配備了四核 3.20 GHz Intel Core i5-3470 CPU、8 GB內(nèi)存、250 GB硬盤的Fedora Core 13計算機上。實驗漏洞攻擊樣本運行在QEMU Guest系統(tǒng)中。各個樣本運行的 CVE編號、漏洞程序和所運行的系統(tǒng)環(huán)境如表1所示。
ECfield包括靜態(tài)分析和動態(tài)分析2個組件。在靜態(tài)分析組件中,對二進制加載模塊和模塊內(nèi)的函數(shù)進行分析,構(gòu)建初始的安全執(zhí)行輪廓;在動態(tài)分析組件中,根據(jù)執(zhí)行狀態(tài),對安全執(zhí)行輪廓進行維護,同時,對控制流轉(zhuǎn)移進行驗證,將不合法的控制流轉(zhuǎn)移判定為利用攻擊,并提取攻擊步驟。
構(gòu)建初始的安全執(zhí)行輪廓時,通過在IDA Pro 6.1[19]中編寫IDA Python插件,提取二進制漏洞程序和其加載的動態(tài)鏈接庫中的所有模塊和函數(shù)屬性等信息。模塊信息包括加載地址、大小、導入表、導出表和重定位表、隨機化屬性等數(shù)據(jù)信息;函數(shù)屬性信息包括所屬模塊,函數(shù)起始地址相對模塊加載地址的偏移,函數(shù)的外部調(diào)用和內(nèi)部調(diào)用屬性等。本文將這些分析結(jié)果以文件形式保存,在動態(tài)分析階段,系統(tǒng)通過讀入文件內(nèi)容到內(nèi)存中,進行后續(xù)分析和驗證操作。
在 QEMU中添加進程識別、線程識別、模塊識別等功能模塊,分別獲得系統(tǒng)中新創(chuàng)建的進程、每一個進程所創(chuàng)建的線程、以及每一個進程加載的模塊。在系統(tǒng)運行過程中,根據(jù)當前代碼塊所在內(nèi)存地址,判定是否為 DGC。如果屬于DGC,遍歷進程虛擬空間描述符 VAD,獲得相鄰內(nèi)存區(qū)域,判定這些區(qū)域的數(shù)據(jù)相似度。當數(shù)據(jù)高度相似時,通過驗證當前執(zhí)行的DGC指令序列是否具有shellcode特征,來判定當前DGC是否具有攻擊屬性。如果具有攻擊屬性,則直接判定為利用攻擊;否則,提取DGC模塊和DGC函數(shù),加入到安全執(zhí)行輪廓中。在驗證相鄰內(nèi)存區(qū)域數(shù)據(jù)相似度時,將檢測窗口長度N設(shè)置為32 byte,并且相似度閾值T設(shè)置為80%。另外,從 Metasploit[20]中提取驗證過程中所用到的shellcode疑似指令特征。
表1 實驗樣本
在系統(tǒng)運行過程中,為目標程序中每一個線程維護一個影子棧,驗證所有發(fā)生在用戶態(tài)的函數(shù)返回的合法性。當間接函數(shù)調(diào)用發(fā)生時,通過安全執(zhí)行輪廓,驗證目標地址是否是目標模塊中具有外部調(diào)用屬性的函數(shù)。當間接跳轉(zhuǎn)時,根據(jù)跳轉(zhuǎn)指令的模式,驗證目標地址是否在合法的跳轉(zhuǎn)地址集合內(nèi)、或是否在當前模塊代碼段范圍之內(nèi)。如果驗證不合法,則判定為控制流轉(zhuǎn)移異常。
在檢測到異常控制流轉(zhuǎn)移后,ECfield Hook進程創(chuàng)建、用戶添加、網(wǎng)絡(luò)訪問等系統(tǒng)API,并開啟對目標程序的單步跟蹤分析。通過改變 QEMU代碼塊譯碼邏輯,使其每個代碼塊僅包含一條指令,實現(xiàn)單步執(zhí)行的效果。在每個代碼塊執(zhí)行時,ECfield檢測當前地址是否是被Hook函數(shù)的起始地址。如果是,就從棧中讀取函數(shù)參數(shù)和返回地址。在被Hook的函數(shù)返回時,ECfield讀取QEMU Guest系統(tǒng)的eax寄存器獲得函數(shù)返回值。單步執(zhí)行的指令信息和函數(shù)調(diào)用信息,最終保存在文件中,以便供分析人員還原攻擊細節(jié)。
本文選取了近年具有較嚴重威脅的漏洞,對實驗系統(tǒng)進行評估。這些漏洞涉及用戶廣泛使用的軟件,如IE、Adobe Reader、Word、Flash Player等,漏洞的利用攻擊類型也涵蓋多種,包括ret-to-libc、SEH exploit、ROP 攻擊、Heap Spraying、JIT Spraying等。實驗中檢測到的各個樣本程序的異??刂屏鬓D(zhuǎn)移指令地址、控制流轉(zhuǎn)移指令、攻擊類型等信息如表2所示。
從上述漏洞利用攻擊中可以看到,CVE-2012-0158這一針對Word 2007的利用攻擊仍然是通過直接覆蓋函數(shù)返回地址,采用 ret-to-libc的方式實現(xiàn)的。此攻擊能夠成功的原因在于,即使DEP機制已經(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)存地址隨機化安全機制,同時利用 ROP和 JIT 的方式來保證將攻擊代碼所在內(nèi)存區(qū)域可執(zhí)行。此種攻擊方法可以同時繞過DEP和ASLR機制。
實驗表明,本文的系統(tǒng)不但可以檢測 ret-tolibc、SEH exploit等傳統(tǒng)利用攻擊,也能成功檢測到APT攻擊所應用的ROP、JIT Spraying、Spraying結(jié)合ROP等方式的復雜漏洞利用攻擊。
表2 樣本程序分析結(jié)果
本文挑選 CVE-2013-2551和 CVE-2007-4607 2個案例來對 ECfield的檢測過程和效果進行詳細闡述。這2個漏洞分別利用了目前在APT等漏洞利用攻擊中廣泛使用的 Spraying結(jié)合 ROP、JIT Spraying攻擊方式。同時,2個漏洞程序在運行過程中都存在動態(tài)代碼執(zhí)行的情況。本文的系統(tǒng)能夠準確地識別合法的動態(tài)指令代碼場景,并對異常動態(tài)代碼執(zhí)行情況進行準確判定。
案例1CVE-2013-2551漏洞利用攻擊
此漏洞是由于 IE 8瀏覽器沒有對 dashstyle.array的長度做出正確的驗證,導致整數(shù)溢出。在本實驗中,樣本運行在Windows 7專業(yè)版系統(tǒng)中。
程序在運行時,共有256次執(zhí)行動態(tài)生成代碼的情況,其中包括執(zhí)行Hook代碼和Flash JIT 代碼等。ECfield準確地識別了這些正常的動態(tài)代碼執(zhí)行的情況,沒有產(chǎn)生漏報和誤報。
程序的異常控制流轉(zhuǎn)移發(fā)生在mshtml模塊中,偏移為0x1bc545處的指令:call [eax+0x8],目標地址是 0x7c348b05,該地址在 msvcr71.dll中。由于ECfield在每一次間接函數(shù)調(diào)用時,會對控制流轉(zhuǎn)移的合法性進行判斷,此次調(diào)用的目標地址不是一個外部調(diào)用函數(shù)的起始地址,ECfield將此次控制流轉(zhuǎn)移判定為不合法。
通過ECfield,可以進一步獲悉此漏洞利用的攻擊過程。msvcr71.dll是加載到IEXPLORE進程中的非隨機化模塊,模塊中地址 0x7c348b05處開始的指令片段是:xchg eax, esp; ret;通過這兩條指令來切換棧區(qū)域,棧頂變?yōu)?0x0c0c0c0c,并且通過 ret返回到存放在新棧頂處的地址0x7c341748,繼續(xù)執(zhí)行后續(xù)的 ROP片段。從系統(tǒng)單步跟蹤利用攻擊點之后的指令序列可知,0x0c0c0c70處存放了shellcode,攻擊者修改了所在頁面的執(zhí)行屬性,最終跳轉(zhuǎn)至shellcode執(zhí)行。另外,ECfield通過檢測相鄰的內(nèi)存區(qū)域,發(fā)現(xiàn)它們不但具有相同的執(zhí)行屬性,同時相同偏移處的數(shù)據(jù)相似度達到 100%。由此判定,此漏洞利用攻擊采用了Spraying結(jié)合ROP的攻擊方式。
案例2CVE-2007-4607漏洞利用攻擊
此漏洞利用采用了JIT Spraying的方式進行攻擊。攻擊樣本通過加載一段惡意的Flash視頻文件,使得其中的Flash腳本運行,腳本將shellcode噴射到大量內(nèi)存區(qū)域中,隨后通過觸發(fā)IE ActiveX插件的漏洞,促使控制流跳轉(zhuǎn)至內(nèi)存中某段shellcode,進而實施攻擊。此樣本運行在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保護,因此,攻擊者可以通過此攻擊方式,同時繞過 ASLR和 DEP;而且由于CFI方法[2]無法處理動態(tài)執(zhí)行代碼執(zhí)行的合法性,所以此攻擊方式也能夠繞過Total-CFI[11]、binCFI[10]提出的檢測方法。
Flash JIT代碼是程序運行過程中生成的動態(tài)代碼。在每一次控制流執(zhí)行至JIT代碼模塊時,ECfield確定此代碼模塊所在的內(nèi)存區(qū)域,檢測與之相鄰的內(nèi)存區(qū)域的可執(zhí)行屬性和相同偏移處的數(shù)據(jù)相似性。當高度相似時,進一步通過反匯編當前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)用的目標地址本應為SEH鏈中的異常處理例程函數(shù),但是實際目標地址卻為0x0c3f0101。0x0c3f0101處數(shù)據(jù)是 Flash JIT 動態(tài)生成代碼。該地址所在的內(nèi)存區(qū)域為[0x0c3f0000 ~ 0x0c3fffff]。在與之相鄰的內(nèi)存區(qū)域[0x0c3e0000 ~ 0x0c3effff]和[0x0c400000 ~0x0c40ffff]中,相同偏移處的數(shù)據(jù)與當前內(nèi)存區(qū)域中的數(shù)據(jù)相似度達到 100%。同時,0x0c3f0101開始的匯編指令序列中,包含了訪問當前進程PEB、獲得模塊列表LDR地址和獲得關(guān)鍵API內(nèi)存地址等疑似shellcode指令序列。由于相鄰內(nèi)存區(qū)域中數(shù)據(jù)高度相似,并且當前目標指令序列具有疑似攻擊指令,因此,ECfield將之判定為異常的控制流轉(zhuǎn)移。通過隨后的單步跟蹤發(fā)現(xiàn),shellcode頭部有大量重復的nop和cmp al, 0x35指令。這些滑板指令保證了控制流轉(zhuǎn)移至shellcode的成功率。
本文利用攻擊檢測方法具有較小的運行時間開銷。在原型系統(tǒng)ECfield中,測量在樣本開始運行至檢測到利用攻擊發(fā)生時的時間間隔t,同時,也在原生 QEMU模擬器中運行同樣的攻擊樣本,并測試這一時間間隔t’,具體數(shù)據(jù)如圖4所示。ECfield平均運行時間開銷約為原生QEMU系統(tǒng)的2.1倍。由此可見,本文的方法具有較高的利用攻擊檢測效率,能夠用于漏洞攻擊的實時檢測。
在運行效率上,本文的實驗系統(tǒng)比利用污點跟蹤分析實現(xiàn)的分析系統(tǒng),如Argos漏洞攻擊檢測系統(tǒng)[7],具有較明顯的優(yōu)勢。污點分析方法需要跟蹤每一條指令來處理污點狀態(tài)的傳播過程。要達到理想的效果,分析粒度需要在字節(jié)級別,這導致運行時間開銷大概增長 3~50倍[4,5]。另外,Argos僅采用直接數(shù)據(jù)依賴的污點分析,真實漏洞利用中還包含大量有關(guān)污點數(shù)據(jù)的間接數(shù)據(jù)流依賴和控制流依賴的情況,這使得這些基于污點分析實現(xiàn)的檢測系統(tǒng),很難保證檢測效果的準確率。
圖4 ECfield與原生QEMU運行時間開銷對比
本文方法對實際漏洞利用攻擊具有較好的檢測效果,但是也存在著一些局限性。首先,本文方法重點關(guān)注針對應用程序的漏洞利用攻擊檢測,無法檢測發(fā)生在內(nèi)核中的利用攻擊。其次,在間接函數(shù)調(diào)用時,驗證目標函數(shù)是否具有外部調(diào)用屬性,對于某些call-to-libc類型的利用來說,如果call的目標恰好是 call指令所在模塊導入的函數(shù)(如kernel32模塊中的WinExec),并且直接通過此函數(shù)執(zhí)行惡意行為,本文方法將認為此函數(shù)調(diào)用是正常的,造成漏報。由于Windows 7等操作系統(tǒng)中已經(jīng)加入SafeSEH、ASLR和DEP等安全機制,攻擊者很難僅通過一次call調(diào)用來繞過這些安全機制,完成所有的攻擊步驟,所以此種利用方法很難應用在實際的漏洞攻擊中。為了檢測此種類型的攻擊,可以重點關(guān)注如WinExec、CreateProcess等函數(shù),通過在這些函數(shù)調(diào)用時檢測函數(shù)參數(shù)是否包含惡意數(shù)據(jù)識別攻擊。
本文提出一種基于異??刂屏髯R別的漏洞利用攻擊檢測方法,能夠在惡意攻擊代碼執(zhí)行之前,檢測到攻擊發(fā)生。通過對二進制目標程序靜態(tài)分析和動態(tài)執(zhí)行監(jiān)測,構(gòu)建完整的安全執(zhí)行輪廓,并限定控制流轉(zhuǎn)移的合法目標。在函數(shù)調(diào)用、函數(shù)返回和跳轉(zhuǎn)等控制流轉(zhuǎn)移發(fā)生時,檢測目標地址的合法性,將異??刂屏鬓D(zhuǎn)移判定為漏洞攻擊,并捕獲完整的攻擊步驟。為驗證本文方法的正確性,本文實現(xiàn)了基于異??刂屏鬓D(zhuǎn)移檢測的漏洞利用攻擊原型系統(tǒng),并對若干實際高危漏洞進行實驗。實驗表明,本文的方法能夠準確檢測到利用攻擊,并具備良好的運行效率,可以作為漏洞利用攻擊的實時檢測工具。
[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.