?

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

2014-01-01 02:55王明華應凌云馮登國
通信學報 2014年9期
關鍵詞:漏洞內存代碼

王明華,應凌云,馮登國

(1. 中國科學院 軟件研究所 可信計算與信息保障實驗室,北京 100190;2. 中國科學院大學,北京 100049)

1 引言

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

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

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

本文方法的貢獻與創新點如下。

1) 提出了一種通過檢測異??刂屏鬓D移判定漏洞利用攻擊的方法,結合靜態和動態分析手段,構造完整的程序安全執行輪廓,識別安全輪廓之外的異??刂屏鬓D移,檢測漏洞利用攻擊。該方法較傳統利用污點分析等細粒度數據流分析方法具有較高的準確性和較理想的運行效率。

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

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

2 相關工作

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

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

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

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

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

3 問題描述和方法框架

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

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

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

圖1 ROP和內存噴射利用原理示意

本文接下來將針對如何構建安全執行輪廓,如何判定漏洞利用攻擊,以及如何提取漏洞利用攻擊步驟進行詳細闡述。

圖2 漏洞利用攻擊檢測方法架構

4 安全執行輪廓構建

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

1) 一些第三方軟件通過加殼等方式進行保護,在軟件運行時,首先開辟一塊具有可執行屬性的內存區域,然后將代碼拷貝至區域中,程序首先執行此段動態生成的代碼,然后進行后續的執行;

2) 某些程序在運行過程中,可能在函數起始地址等處添加hook,在此函數執行時,程序將跳轉至存放在另一個具有可執行權限的內存區域中,執行hook處理代碼,如在 IE 8進程啟動并加載IEShims.dll模塊時,將在一些模塊函數入口處添加hook,劫持這些函數的運行,以完成所需要的處理;

3) 另外,某些應用程序支持JIT(just in time)代碼運行,例如Flash程序,可以通過Action Script編寫Flash程序,在程序運行時,Flash代碼被加載到可執行屬性的內存頁面中,通過JIT方式執行。

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

4.1 安全執行輪廓構定義

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

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

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

2) 加載模塊m:是指待分析程序在導入表中引入的模塊,或者在運行時動態加載的可執行模塊;將加載模塊構成的集合記為ML,即ML= {m}。

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

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

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

安全執行輪廓的構建分為2個階段:首先依賴二進制分析程序自身,構造初始的安全執行輪廓,此輪廓是靜態CFG圖中限定的所有執行函數FL和加載模塊ML;然后,通過動態監控程序執行,識別所有DGC模塊{mdgc}和DGC函數{fdgc},對安全執行輪廓進行補充和維護。下面,首先討論初始安全執行輪廓構建的過程,然后討論如何通過動態監控目標程序執行,構建完整的安全執行輪廓。

4.2 初始安全執行輪廓建立

依靠二進制目標程序自身構造初始安全執行輪廓。主要包括獲得二進制目標程序自身和其加載模塊的屬性,以及這些模塊中所有函數信息。

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

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

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

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

4.3 安全執行輪廓動態維護

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

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

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

輸入:當前的模塊輪廓M和函數輪廓F,進程加載模塊集合ML,模塊函數集合FL,當前執行的tb

輸出:最新的模塊輪廓M和函數輪廓F

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

由于系統隨機化不僅針對加載模塊,而且包括例如TEB、PEB等關鍵數據結構、棧和堆分配地址的隨機化,所以,攻擊者在考慮到利用攻擊的穩定性,會通過噴射的方式保證攻擊的成功率。為此,充分利用這一特性,識別 DGC模塊,并區分其合法性和非法性。

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

算法2check_attacky(eip)

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

輸入:當前程序執行的pc

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

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

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

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

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

圖3 DGC函數示意

5 漏洞利用攻擊判定

根據構建的安全執行輪廓,對程序運行過程中發生的間接控制流轉移進行驗證,將不合法的控制流轉移判定為漏洞利用攻擊。為此,對3種間接控制流轉移進行分析:通過call指令進行的函數調用;通過ret執行進行函數返回;以及通過jmp執行進行程序跳轉。下面分別就這3種控制流轉移的驗證方式進行討論。

5.1 函數調用的檢測方法

間接調用的目標地址僅能在運行時確定,需要根據構建的安全執行輪廓來驗證目標地址的合法性。如果間接函數調用目標地址不在當前調用模塊之內,首先驗證目標地址是否是函數的起始地址,再驗證此目標函數是否具有外部調用屬性;如果目標函數被所在模塊導出,則還需驗證調用模塊是否導入了此模塊。如果間接函數調用目標在當前調用模塊內,僅驗證目標地址是否是當前模塊的函數,不限定此函數的屬性。只有通過驗證的間接函數調用,才被認為是合法。上述驗證過程的算法偽代碼如下。

算法3chk_call(dst,mc)

//檢測call指令目標地址的合法性

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

工作Total-CFI[11]同樣檢測call控制流轉移合法性的問題,但與本文方法不同的是,它僅僅驗證call的目的地址是否是一個函數的起始,而不關心這個函數是否具有外部調用屬性,這導致驗證結果不夠準確,可能會產生漏報。另外,此系統還無法處理DGC相關的控制流轉移問題。

5.2 函數返回的的檢測方法

控制流可以通過函數返回指令進行轉移。正確的函數返回的目標地址,應該是此函數被調用時壓入棧中的地址。在函數返回時,如果驗證發現返回地址不合法,可以判定控制流被劫持,即有異??刂屏鬓D移。

與Total-CFI系統類似,通過影子棧來實現返回地址合法性的驗證。為每一個線程維護一個影子棧,在函數調用發生時,在對應的影子棧中壓入返回地址;在函數返回時,在對應影子棧中驗證壓入的地址與此返回地址是否一致??紤]到異常處理、setjump/longjmp等特殊情況,返回地址可能不在棧頂,但是一定在棧中。所以,在本文中僅驗證返回地址是否在影子棧中,并將棧頂到此項之間所有的項彈出影子棧。如果未在棧中,則判定為異??刂屏鬓D移。

另外,與Total-CFI不同的是,本文還考慮了另一種特殊情況:push addr、ret。這種ret實際上起到call的功能。由于addr值是由push 壓入,而非函數調用call壓入,所以在影子棧中無法找到。本文通過額外為每一個線程維護一個 push棧來記錄壓入的值,在函數返回 ret發生時,首先查看該線程的影子棧,如果沒有在棧中找到返回值,則在push棧中尋找。如果找到,將此值至棧頂的元素全部彈出。否則,則說明當前 ret可疑,可能使程序控制流轉移至危險位置。

5.3 跳轉轉移的檢測方法

跳轉可分為直接跳轉和間接跳轉。對于直接跳轉,目標地址一定在自身模塊內,無需檢測。對于間接跳轉,需要檢測目標地址的合法性。

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

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

對于其他間接jmp跳轉指令,目標地址理論上可以是內存中任意位置,但通過對實際應用程序的分析,發現合法的間接跳轉指令的目標地址都應在本模塊內。所以,將跳轉至自身模塊代碼段之外的間接跳轉,判定為異常的控制流轉移。

6 漏洞利用攻擊步驟捕獲

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

當識別到異??刂屏髦?,開始單步執行目標程序,記錄程序執行指令和調用的函數。對于執行的指令,記錄每一條指令類型以及操作數的值;對于調用的函數、記錄參數和返回值。通過監控進程創建、用戶創建、文件操作、網絡訪問等系統API調用,能夠捕獲“下載并運行”、“添加新用戶”等惡意行為。

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

7 實驗評估

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

7.1 系統實現

ECfield包括靜態分析和動態分析2個組件。在靜態分析組件中,對二進制加載模塊和模塊內的函數進行分析,構建初始的安全執行輪廓;在動態分析組件中,根據執行狀態,對安全執行輪廓進行維護,同時,對控制流轉移進行驗證,將不合法的控制流轉移判定為利用攻擊,并提取攻擊步驟。

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

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

表1 實驗樣本

在系統運行過程中,為目標程序中每一個線程維護一個影子棧,驗證所有發生在用戶態的函數返回的合法性。當間接函數調用發生時,通過安全執行輪廓,驗證目標地址是否是目標模塊中具有外部調用屬性的函數。當間接跳轉時,根據跳轉指令的模式,驗證目標地址是否在合法的跳轉地址集合內、或是否在當前模塊代碼段范圍之內。如果驗證不合法,則判定為控制流轉移異常。

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

7.2 利用攻擊檢測結果

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

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

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

實驗表明,本文的系統不但可以檢測 ret-tolibc、SEH exploit等傳統利用攻擊,也能成功檢測到APT攻擊所應用的ROP、JIT Spraying、Spraying結合ROP等方式的復雜漏洞利用攻擊。

7.3 案例分析

表2 樣本程序分析結果

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

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

此漏洞是由于 IE 8瀏覽器沒有對 dashstyle.array的長度做出正確的驗證,導致整數溢出。在本實驗中,樣本運行在Windows 7專業版系統中。

程序在運行時,共有256次執行動態生成代碼的情況,其中包括執行Hook代碼和Flash JIT 代碼等。ECfield準確地識別了這些正常的動態代碼執行的情況,沒有產生漏報和誤報。

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

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

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

此漏洞利用采用了JIT Spraying的方式進行攻擊。攻擊樣本通過加載一段惡意的Flash視頻文件,使得其中的Flash腳本運行,腳本將shellcode噴射到大量內存區域中,隨后通過觸發IE ActiveX插件的漏洞,促使控制流跳轉至內存中某段shellcode,進而實施攻擊。此樣本運行在Windows 7專業版系統中,Flash Player的版本為10.3.4。

由于在程序執行過程中Flash 的JIT指令所在的內存區域具有可執行屬性,所以通過JIT Spraying能夠將嵌入到Flash中的shellcode直接噴射到大量的具有可執行屬性的內存中,攻擊者不用額外構造ROP鏈來繞過DEP保護,因此,攻擊者可以通過此攻擊方式,同時繞過 ASLR和 DEP;而且由于CFI方法[2]無法處理動態執行代碼執行的合法性,所以此攻擊方式也能夠繞過Total-CFI[11]、binCFI[10]提出的檢測方法。

Flash JIT代碼是程序運行過程中生成的動態代碼。在每一次控制流執行至JIT代碼模塊時,ECfield確定此代碼模塊所在的內存區域,檢測與之相鄰的內存區域的可執行屬性和相同偏移處的數據相似性。當高度相似時,進一步通過反匯編當前JIT 代碼模塊中指令序列,檢測是否有高度疑似shellcode的指令,以此判定Flash JIT代碼相關的控制流轉移的合法性。

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

7.4 時間運行開銷

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

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

圖4 ECfield與原生QEMU運行時間開銷對比

8 局限性

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

9 結束語

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

[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.

猜你喜歡
漏洞內存代碼
漏洞
筆記本內存已經在漲價了,但幅度不大,升級擴容無須等待
“春夏秋冬”的內存
創世代碼
創世代碼
創世代碼
創世代碼
三明:“兩票制”堵住加價漏洞
漏洞在哪兒
高鐵急救應補齊三漏洞
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合