專利名稱:一種基于虛擬執(zhí)行模式的Flash漏洞檢測方法
技術領域:
本發(fā)明涉及一種基于虛擬執(zhí)行模式的Flash漏洞檢測方法。
背景技術:
Adobe公司的Flash Player是ー款目前使用極為廣泛的客戶端播放器,能夠在各種主流操作系統(tǒng)、瀏覽器、移動電話和移動設備上提供功能強大與內容豐富的視頻體驗?,F(xiàn)在,幾乎絕大部分PC機或其它終端都裝有Flash Player,但與此同吋,F(xiàn)lash Player漏洞也日益增多,并對互聯(lián)網(wǎng)的安全造成了嚴重的威脅。根據(jù)CVE公布的漏洞報告,F(xiàn)lash漏洞數(shù)量目前仍呈增長趨勢,F(xiàn)lash Player已成 為高危漏洞最多的黑客攻擊重災區(qū)。而2011年十大安全漏洞當中,F(xiàn)lash Player共曝出四次高危漏洞,其危險程度已超過微軟Windows操作系統(tǒng)。鑒于Flash Player飽受垢病的安全性,IOS等操作系統(tǒng)甚至已拒絕支持Flash,以保證客戶端安全。Flash漏洞檢測是對目標Flash文件是否為利用Flash漏洞編寫的惡意文件進行檢測的ー種方法,通過檢測,可以事先發(fā)現(xiàn)惡意Flash文件,阻止用戶訪問,從而保證用戶的網(wǎng)絡安全。目前傳統(tǒng)的Flash漏洞檢測方法主要有三種(I)基于特征碼匹配的Flash漏洞文件掃描此方法類似于傳統(tǒng)殺毒軟件的文件掃描,即將待檢測的Flash文件以ニ進制流的形式打開,通過匹配事先設定的特征碼來確定該文件是否具有漏洞。這種對包含漏洞的Flash文件進行掃描的方法,適用面較窄,且效果不佳。(2)基于靜態(tài)分析代碼的Flash漏洞檢測此方法首先將Flash文件中的ActionScript代碼進行反編譯,然后再對其代碼進行靜態(tài)分析,檢測是否具有觸發(fā)某ー漏洞的特定條件。如根據(jù)CVE-2011-2134的漏洞描述,當代碼中包含ー個深度大于16的表達式時,會導致溢出并觸發(fā)漏洞,例如"A". match(バ((((((((((((((((. *))))))))))))))))·)*/g);o因此當檢測到具有該類表達式時,則成功檢測出漏洞。由于大部分Flash漏洞需要根據(jù)變量值等當前狀態(tài)信息進行匹配,而靜態(tài)分析代碼無法得到此類執(zhí)行Flash代碼后的狀態(tài)信息,故該方法效果不佳。(3)基于虛擬執(zhí)行的Flash漏洞檢測該方案的原理主要是將Flash文件在Flash播放器的虛擬機(即AVM2,已開源)中執(zhí)行,通過其行為來檢測是否具有漏洞。如大部分緩沖區(qū)溢出漏洞,就可根據(jù)Flash是否崩潰,堆或棧是否溢出來判定。但該方案仍存在問題。如怎樣實現(xiàn)執(zhí)行Flash文件中的所有ActionScript代碼尚需解決,因為攻擊者可以將漏洞利用代碼編寫成需要特定觸發(fā)條件才會執(zhí)行,如點擊Flash中某ー按鈕,或使用Firefox瀏覽器打開時才會執(zhí)行等。此外,傳統(tǒng)虛擬執(zhí)行方法需要運行Flash文件,則在對大量Flash文件進行漏洞檢測吋,效率較低。
發(fā)明內容
本發(fā)明所要解決的技術問題是提供一種基于虛擬執(zhí)行模式的Flash漏洞檢測方法,該基于虛擬執(zhí)行模式的Flash漏洞檢測方法具有誤判率低,執(zhí)行效率高的特點。發(fā)明的技術解決方案如下一種基于虛擬執(zhí)行模式的Flash漏洞檢測方法,包括以下步驟步驟I :將待檢測的Flash文件進行反編譯,得到ActionScript代碼;步驟2 :對ActionScript代碼進行單詞掃描及詞法分析,即將ActionScript代碼轉換成單詞流,并對每個單詞的類型進行分析,單詞的類型包括保留字、標識符、符號、數(shù)字;
步驟3 :構建生成樹以生成樹存儲ActionScript代碼生成樹中姆個結點用于存儲ActionScript的一行語句,若某結點具有子結點,則每個子結點存儲的ActionScript語句是其父節(jié)點的ActionScript語句的子語句;步驟4 :對每個結點中的語句進行結構分析,得到類結構信息,其中語句結構包括類定義語句、類成員變量定義語句及類的成員函數(shù)定義語句;在分析ActionScript代碼結構時,對代碼逐行進行掃描,若發(fā)現(xiàn)關鍵字“class”則為類定義語句,關鍵字“function”則為類的成員函數(shù)定義語句;若找到關鍵字“var”或“const”則為類成員變量定義語句;標記所有函數(shù)的狀態(tài)為“未執(zhí)行”;步驟5 :基于類結構信息生成虛擬執(zhí)行流程,并將虛擬執(zhí)行流程放入虛擬執(zhí)行流程棧中;步驟6:漏洞檢測過程從虛擬執(zhí)行流程棧依次取出ー個流程并執(zhí)行,將該流程中調用過的函數(shù)標記為“已執(zhí)行”狀態(tài),在流程執(zhí)行過程中進行漏洞規(guī)則匹配,如果匹配成功,則提示存在漏洞,否則執(zhí)行下一個從虛擬執(zhí)行流程棧取出的流程;直到最后ー個流程執(zhí)行完成;步驟7 :輸出漏洞檢測結果,檢測結束。在步驟6的流程執(zhí)行過程中,判斷是否遇到分支語句,若遇到分支語句,根據(jù)判定覆蓋原理新增虛擬執(zhí)行流程,存入虛擬執(zhí)行流程棧中;在步驟6的流程執(zhí)行過程中,當虛擬執(zhí)行流程棧為空吋,即虛擬執(zhí)行流程棧中的流程都已經執(zhí)行完畢時,進一歩判斷是否仍有函數(shù)狀態(tài)為“未執(zhí)行”,如果是,則為未執(zhí)行的函數(shù)生產新的虛擬執(zhí)行流程并存入虛擬執(zhí)行流程棧中,并返回到步驟6的開始;否則跳轉至步驟7。漏洞規(guī)則匹配的過程為ー個虛擬執(zhí)行流程執(zhí)行完畢,根據(jù)當前變量信息進行漏洞規(guī)則匹配,若符合某漏洞規(guī)則,則表示該Flash文件具有漏洞,若所有漏洞規(guī)則都不符合,貝1J表示該Flash文件是安全的。漏洞規(guī)則存儲在漏洞規(guī)則庫中,漏洞規(guī)則庫是根據(jù)CVE(Common Vulnerabilities& Exposures,中文名稱為公共漏洞與暴露,是國際上著名的發(fā)布各種漏洞信息的字典表)關于Flash的漏洞報告所編寫的函數(shù)集,每個函數(shù)對應ー個Flash漏洞匹配規(guī)則。所述虛擬執(zhí)行流程的包括如下設置
I)虛擬執(zhí)行流程包含所需執(zhí)行代碼段的開始結點m_pBegNode和結束結點m_pEndNode,兩結點確定代碼段的范圍;包含一個指針m_pNode,指示當前所執(zhí)行語句的結點,指針的初始位置為虛擬執(zhí)行流程的開始結點;2)虛擬執(zhí)行流程包含兩個指針m_pFunction和m_pClass,m_pFunction指示所需執(zhí)行代碼段所屬的函數(shù),m_pClass指示所需執(zhí)行代碼段所屬的類;3)每個虛擬執(zhí)行流程包含一個變量m_VarS,用于存儲該流程所需的所有變量信
ο對本發(fā)明技術路線的說明 (I)反編譯Flash文件,得到ActionScript代碼由于Flash編譯器在編譯ActionScript代碼時,將其轉換成了ー種稱之為“字節(jié)碼”的中間碼格式,故需首先進行反編譯。(2)單詞掃描及詞法分析反編譯ActionScript代碼后,為了方便進行后續(xù)的分析及虛擬執(zhí)行,需要對代碼進行單詞掃描,即將ActionScript代碼轉換成單詞流,并對每個單詞的類型進行分析。例如對于語句“var num: int=10; ”,單詞掃描及詞法分析過后,應生成如下單詞流("var〃,保留字),(〃num〃,標識符),("〃,符號),(〃int〃,保留字),(〃=〃,符號),("10",數(shù)字),(〃;〃,符號)。(3)構建生成樹為方便后續(xù)的虛擬執(zhí)行,需要對單詞流進行整形,以生成樹的結構存儲ActionScript代碼。樹中姆個結點存儲ActionScript的一行語句,若某結點具有子結點,則姆個子結點存儲的ActionScript語句是其父節(jié)點的ActionScript語句的子語句。生成樹構建后,在虛擬執(zhí)行過程中,只需要從開始結點處,對其進行先序深度遍歷即可,且在查找上層語句時較方便。(4)分析 ActionScript 代碼結構構建完ActionScript代碼的生成樹后,此時并不虛擬執(zhí)行任何代碼,而是對其類結構進行分析,即包含哪些類,類的成員函數(shù)與成員變量有哪些,其類型是什么(與C++語言的頭文件類似),并設計一個類或數(shù)據(jù)結構保存這些信息。其具體分析方法是先序深度遍歷生成樹,對于每個結點中的語句,若找到關鍵字“class”則為類定義語句,此時關鍵字“class”后的第一個單詞為類名,再找到關鍵字“extends”則緊跟其后的第一個單詞為該類的基類名;在類定義語句結點的孩子結點中,若找到關鍵字“var”或“const”則為類成員變量定義語句,此時“var”或“const”后第一個單詞為變量名,“”后第一個單詞為變量類型,“=”后的單詞為變量值;在類定義語句結點的孩子結點中,若找到關鍵字“ function ”則為類的成員函數(shù)定義語句,此時關鍵字“ function”后的第一個單詞為函數(shù)名,關鍵字“(”和“之間的單詞為該函數(shù)的參數(shù)變量。(5)虛擬執(zhí)行 ActionScript 代碼與Flash Player播放Flash文件不同,這里并不真正執(zhí)行ActionScript代碼,由于Flash緩沖區(qū)溢出漏洞大多只與變量與內存空間相關,故虛擬執(zhí)行時只關心代碼中的各變量改變,而不關心各功能的實現(xiàn)。虛擬執(zhí)行流程的初始化,是根據(jù)可能最先執(zhí)行的函數(shù)生成虛擬執(zhí)行流程。由于ActionScript不同于C/C++,沒有類似main O這樣確定的入口函數(shù),故只能猜測哪些可能是最先執(zhí)行的函數(shù),這樣做的目的也是為了盡量模擬真實的執(zhí)行環(huán)境與順序。實際上此類函數(shù)的選擇對漏洞檢測結果影響不大,一般將各個類的構造函數(shù)及事件響應函數(shù)作為可能最先執(zhí)行的函數(shù)。初始化完畢后,依次選取各個虛擬執(zhí)行流程進行虛擬執(zhí)行。虛擬執(zhí)行時,遇到功能實現(xiàn)代碼或其它與變量變化無關的代碼不需要實現(xiàn)其執(zhí)行,如添加事件監(jiān)聽器或載入對象,以簡單方法的實現(xiàn)并提高執(zhí)行效率。但執(zhí)行諸如內存空間的分配與回收,或變量的新建、賦值與修改等,則記錄該變量名稱,類型,值以及作用域。若虛擬執(zhí)行過程中,遇到分支語句,則根據(jù)判定覆蓋的原理,根據(jù)每個分支的條件表達式修改相應變量的值,以覆蓋所有分支語句,并為其新增虛擬執(zhí)行流程,以待后續(xù)的執(zhí)行。(6)匹配漏洞的觸發(fā)條件 每當ー個虛擬執(zhí)行流程執(zhí)行完畢時,提取當前虛擬執(zhí)行流程的變量信息,并遍歷查詢漏洞規(guī)則庫,判斷目前條件或存儲的變量值是否符合漏洞觸發(fā)條件。漏洞規(guī)則庫是根據(jù)CVE發(fā)布的Flash的漏洞報告的漏洞原理,將其編寫成一個個漏洞匹配函數(shù)(根據(jù)漏洞報告中的漏洞原理編寫漏洞匹配函數(shù),本領域技術人員無需經過創(chuàng)造性勞動即可完成),每個函數(shù)對應ー個Flash漏洞匹配規(guī)則。若符合,則提示有漏洞,若當所有漏洞規(guī)則都與當前變量信息不匹配吋,則可以認為該Flash文件是安全的。( 7)對從未執(zhí)行函數(shù)進行虛擬執(zhí)行當虛擬執(zhí)行流程隊列中,所有的虛擬執(zhí)行流程都執(zhí)行完畢,還需對ActionScript代碼中所有函數(shù)再次進行掃描,若此時發(fā)現(xiàn)有函數(shù)的mJsExecute字段值為false,則表示該函數(shù)從未被虛擬執(zhí)行過,則為該函數(shù)新增虛擬執(zhí)行流程,并進行虛擬執(zhí)行。當此類流程也執(zhí)行完畢后,則表示所有函數(shù)都至少被執(zhí)行了一次。有益效果本發(fā)明的基于虛擬執(zhí)行模式的Flash漏洞檢測方法,與靜態(tài)代碼分析方法相比,采用判定覆蓋的方式,彌補了基于虛擬執(zhí)行方法當中不能虛擬執(zhí)行所有ActionScript代碼的缺陷;能檢測出更多的Flash漏洞數(shù)量,其正確率依賴于ActionScript代碼的復雜程度。對于大多數(shù)包含漏洞的Flash文件,編寫者往往注重漏洞利用的實現(xiàn),而不會將其ActionScript代碼寫得過于復雜與繁瑣,故正確率較靜態(tài)代碼分析方法和虛擬執(zhí)行方法更高。在誤判率方面,由于對Flash漏洞的檢測是根據(jù)CVE的漏洞報告進行精確漏洞規(guī)則匹配,其變量信息來源于虛擬執(zhí)行后的結果,因而能最大可能的保障誤判率小,正常的ActionScript代碼很難滿足以上要求。此外,與虛擬執(zhí)行方法相比,由于該方法只模擬執(zhí)行流程中變量的變化,而并不真正執(zhí)行ActionScript代碼中的方法,故效率更高。綜上說述,該方法通過采用判定覆蓋的方式,虛擬執(zhí)行所有ActionScript代碼,井根據(jù)執(zhí)行完畢后的變量狀態(tài)及其它信息進行漏洞規(guī)則匹配,以檢測是否具有漏洞,具有正確率高且效率高的優(yōu)點。
圖I為基于虛擬執(zhí)行模式的Flash漏洞檢測方法的流程圖;圖2為生成樹構建范例對應的示意圖。
具體實施例方式以下將結合附圖和具體實施例對本發(fā)明做進ー步詳細說明一種基于虛擬執(zhí)行模式的Flash漏洞檢測方法,包括以下步驟步驟I :將待檢測的Flash文件進行反編譯,得到ActionScript代碼;步驟2 :對ActionScript代碼進行單詞掃描及詞法分析,即將ActionScript代碼轉換成單詞流,并對每個單詞的類型進行分析,單詞的類型包括保留字、標識符、符號、數(shù)字;步驟3 :構建生成樹
以生成樹存儲ActionScript代碼生成樹中姆個結點用于存儲ActionScript的一行語句,若某結點具有子結點,則每個子結點存儲的ActionScript語句是其父節(jié)點的ActionScript語句的子語句;步驟4 :對每個結點中的語句進行結構分析,得到類結構信息,其中語句結構包括類定義語句、類成員變量定義語句及類的成員函數(shù)定義語句;在分析ActionScript代碼結構時,對代碼逐行進行掃描,若發(fā)現(xiàn)關鍵字“class”則為類定義語句,關鍵字“function”則為類的成員函數(shù)定義語句;若找到關鍵字“ var”或“const”則為類成員變量定義語句;標記所有函數(shù)的狀態(tài)為“未執(zhí)行”;步驟5 :基于類結構信息生成虛擬執(zhí)行流程,并將虛擬執(zhí)行流程放入虛擬執(zhí)行流程棧中;步驟6 :漏洞檢測過程從虛擬執(zhí)行流程棧依次取出ー個流程并執(zhí)行,將該流程中調用過的函數(shù)標記為“已執(zhí)行”狀態(tài),在流程執(zhí)行過程中進行漏洞規(guī)則匹配,如果匹配成功,則提示存在漏洞,否則執(zhí)行下一個從虛擬執(zhí)行流程棧取出的流程;直到最后ー個流程執(zhí)行完成;步驟7 :輸出漏洞檢測結果,檢測結束。在步驟6的流程執(zhí)行過程中,判斷是否遇到分支語句,若遇到分支語句,根據(jù)判定覆蓋原理新增虛擬執(zhí)行流程,存入虛擬執(zhí)行流程棧中;在步驟6的流程執(zhí)行過程中,當虛擬執(zhí)行流程棧為空吋,即虛擬執(zhí)行流程棧中的流程都已經執(zhí)行完畢時,進一歩判斷是否仍有函數(shù)狀態(tài)為“未執(zhí)行”,如果是,則為未執(zhí)行的函數(shù)生產新的虛擬執(zhí)行流程并存入虛擬執(zhí)行流程棧中,并返回到步驟6的開始;否則跳轉至步驟7。漏洞規(guī)則匹配的過程為ー個虛擬執(zhí)行流程執(zhí)行完畢,根據(jù)當前變量信息進行漏洞規(guī)則匹配,若符合某漏洞規(guī)則,則表示該Flash文件具有漏洞,若所有漏洞規(guī)則都不符合,貝1J表示該Flash文件是安全的。漏洞規(guī)則存儲在漏洞規(guī)則庫中,漏洞規(guī)則庫是根據(jù)CVE(Common Vulnerabilities
&Exposures,中文名稱為公共漏洞與暴露,是國際上著名的發(fā)布各種漏洞信息的字典表)關于Flash的漏洞報告所編寫的函數(shù)集,每個函數(shù)對應ー個Flash漏洞匹配規(guī)則。所述虛擬執(zhí)行流程的包括如下設置I)虛擬執(zhí)行流程包含所需執(zhí)行代碼段的開始結點m_pBegNode和結束結點m_pEndNode,兩結點確定代碼段的范圍;包含一個指針m_pNode,指示當前所執(zhí)行語句的結點,指針的初始位置為虛擬執(zhí)行流程的開始結點;2)虛擬執(zhí)行流程包含兩個指針m_pFunction和m_pClass,m_pFunction指示所需執(zhí)行代碼段所屬的函數(shù),m_pClass指示所需執(zhí)行代碼段所屬的類;3)每個虛擬執(zhí)行流程包含一個變量m_VarS,用于存儲該流程所需的所有變量信
ο實施例I :
圖I是本發(fā)明的流程圖,步驟如下(I)反編譯Flash文件,得到ActionScript代碼由于Flash編譯器在編譯ActionScript代碼時,將其轉換成了ー種稱之為“字節(jié)碼”的中間碼格式,故需首先進行反編譯。(2)單詞掃描及詞法分析反編譯ActionScript代碼后,為了方便進行后續(xù)的分析及虛擬執(zhí)行,需要對代碼進行單詞掃描,即將ActionScript代碼轉換成單詞流,并對每個單詞的類型進行分析。例如對于以下語句var num: int=10;,單詞掃描及詞法分析過后,應生成如下單詞流("var〃,保留字),(〃皿!11〃,標識符),(〃:〃,符號),(〃int〃,保留字),(〃=〃,符號),("10",數(shù)字),(〃;〃,符號)。(3)構建生成樹為方便后續(xù)的虛擬執(zhí)行,需要對單詞流進行整形,以生成樹的結構存儲ActionScript代碼。樹中姆個結點存儲ActionScript的一行語句,若某結點具有子結點,則姆個子結點存儲的ActionScript語句是其父節(jié)點的ActionScript語句的子語句。在構建生成樹結構時,先新建ー個結點指針,代表指向父節(jié)點,初始值為樹的根結點。然后新建一結點變量,再對單詞流進行遍歷,每遍歷ー個單詞時,將其加入到該結點當中。當遍歷到分號時,表明該行語句結束,將該結點鏈接到當前父節(jié)點的子結點當中;當遍歷到左大括號時,表明其后為子語句,此時將現(xiàn)有結點鏈接至父節(jié)點的子結點當中,然后指針指向該結點,然后再進行遍歷;當遍歷到右大括號時,表明子語句結束,將該結點鏈接至父節(jié)點的子結點后,指針指向其父結點的下ー個結點。根據(jù)該規(guī)則,最后直至所有單詞都遍歷結束。圖2為一段ActionScript示例代碼對應的生成樹結構。對每個結點中的語句進行結構分析,得到類結構信息,其中語句結構包括類定義語句、類成員變量定義語句及類的成員函數(shù)定義語句等;在分析ActionScript代碼結構吋,對代碼逐行進行掃描,若發(fā)現(xiàn)關鍵字“class”則為類定義語句,關鍵字“function”則為函數(shù)定義語句。然后用一種數(shù)據(jù)結構將該類信息存儲起來,以便后續(xù)的分析及執(zhí)行。存儲類信息的類設計結構如下class CClassInfo
I
string m name;// 炎名
string m_baseName;// . 類名
string m......PackName;// 所 W Package 名
tot in version;// 版本1づ% _AS2或AS3
vector<C¥arInfo> m_inenj¥ars; // 該類的成 4 變 Μ;
vector<C Function I nfo> mjriem F unc: //該類_成14函數(shù) CNode* mj)BegNode;// id錄 1 類的開始結點
CNode* IiijjEndNode;//記錄該類的結束結點
bool mJslnterface;Il 該類 1 足接 I—I
};
存儲函數(shù) ,Υ息的類設il·結構_下; class CFunctionInfo
{
stnng m name;// 函 A名
string m—retura;/7 該 PJq 數(shù)的返 F1I +炎型
vector<CVarlnfo> m^vare; Ii存儲該函數(shù)的參數(shù)變M CNode* mjjBegNode; //記采該_數(shù)_開德語句結點 CNode* mjjEndNode; I!記讀該ρ 數(shù)的結束if if J結點 tool mJsBeginer;// id泌該I#數(shù)足—f 為能的幵始點
bool m_IsExecute;H 改函數(shù)足否虛擬執(zhí)行過
};初始化虛擬執(zhí)行流程時,通過分析函數(shù)名是否與類型相同,來判斷構造函數(shù),通過分析函數(shù)的參數(shù)列表中是否含有關鍵字“Event”來判斷事件響應函數(shù),并為這兩種函數(shù)建立虛擬執(zhí)行流程。
虛擬執(zhí)行流程的類設計如下所示class CRecPoint
j_ _
CNode* mjNode;// Il if所指語ゎJ結點
CNode* mjBegNode;//開始語句結點
CNode* mjEndNode;Ii 結來語 Π]結點
CClassInfo *mj)Clas;//該1己)威點所屬的類
CFunetionInfo *m__pFune; // 該記錄點所 M 的 β 數(shù) vector<C VarI nfo>進jvars; //存儲該丨d磁點所南的變iS Iil息
I;其中變量信息的初始內容,為所屬類的成員變量及所屬函數(shù)的參數(shù)變量。虛擬執(zhí)行過程中,若遇到變量的新增、賦值、修改等操作,需要對其進行記錄,以備后續(xù)漏洞規(guī)則匹配之用。存儲變量信息的類設計如下所示
class CVarInio
I
string m name;//變量名稱
stringmJype;// 變歟類型
string m_¥alue;Il 5 It
string m_domain;H 變量作用域
bool mJsStalic;if 足I1 足靜態(tài)變量
bool mJsConst;// 足 是常:S
void* tnjArray;//如果該變量為數(shù)組》則此指計指向分配
的!·地址
void* mJtMem;// 存儲其它
vector<CVarInfo>m_attribule; //若該變歟為結—構炎-型,則此容器存儲其各個 成員變a
I;若在虛擬執(zhí)行過程中,遇到if語句,switch語句,while語句,for語句這四種分支語句吋,則根據(jù)判定覆蓋的原理,修改相應變量信息,并新增虛擬執(zhí)行流 程。例如遇到如下語句if (al>=0) {. . . }else if (al<0) . . }
若執(zhí)行到該if語句時,原來變量al的值大于等于0,則新增一個虛擬執(zhí)行流程,將其中的變量al的值修改為小于O (如值為-I ),并將該虛擬執(zhí)行流程的開始行號設置為條件表達式(al〈0)后的語句塊內的首條語句。一個虛擬執(zhí)行流程執(zhí)行完畢以后,需要根據(jù)當前變量信息進行漏洞規(guī)則匹配,若符合某漏洞規(guī)則,則表示該Flash文件具有漏洞,若所有漏洞規(guī)則都不符合,則表示該Flash文件是安全的。如對于CVE-2011-2137漏洞,其規(guī)則是若發(fā)現(xiàn)ー類型為FileReference的變量進行save操作,且操作的參數(shù)變量中存在ー個長度大于0x4000的string類型變量,則匹配成功,提示有漏洞。
當所有虛擬執(zhí)行流程都執(zhí)行完畢后,需檢查是否仍有函數(shù)從未執(zhí)行過。若存在該類函數(shù),則為其新增虛擬執(zhí)行流程,并依次虛擬執(zhí)行。采用本發(fā)明方法進行Flash漏洞檢測,與靜態(tài)代碼分析方法相比,能檢測出的Flash漏洞數(shù)量更多,且采用判定覆蓋的方式,彌補了基于虛擬執(zhí)行方法當中不能虛擬執(zhí)行所有ActionScript代碼的缺陷。此外,本發(fā)明的執(zhí)行效率較基于虛擬執(zhí)行的方法也更高。采用本發(fā)明方法進行Flash漏洞檢測,其正確率依賴于ActionScript代碼的復雜程度。對于大多數(shù)包含漏洞的Flash文件,編寫者往往注重漏洞利用的實現(xiàn),而不會將其ActionScript代碼寫得過于復雜與繁瑣,故正確率較靜態(tài)代碼分析方法和虛擬執(zhí)行方法更高。在誤判率方面,由于對Flash漏洞的檢測是根據(jù)CVE的漏洞報告進行精確漏洞規(guī)則匹配,其變量信息來源于虛擬執(zhí)行后的結果,正常的ActionScript代碼很難滿足以上要求,故誤判率極低。CVE所有漏洞報告及對應的漏洞利用的樣本文件均可在其網(wǎng)站上免費下載,抽選了其中十個較新的Flash漏洞對應的樣本文件,表I是分別采用靜態(tài)分析代碼方法和本發(fā)明方法是否能成功檢測出漏洞的結果表I靜態(tài)代碼分析方法與本發(fā)明方法檢測結果比較
權利要求
1.一種基于虛擬執(zhí)行模式的Flash漏洞檢測方法,其特征在于,包括以下步驟 步驟I :將待檢測的Flash文件進行反編譯,得到ActionScript代碼; 步驟2 :對ActionScript代碼進行單詞掃描及詞法分析,即將ActionScript代碼轉換成單詞流,并對每個單詞的類型進行分析,單詞的類型包括保留字、標識符、符號、數(shù)字; 步驟3 :構建生成樹 以生成樹存儲ActionScript代碼生成樹中姆個結點用于存儲ActionScript的一行語句,若某結點具有子結點,則每個子結點存儲的ActionScript語句是其父節(jié)點的ActionScript語句的子語句; 步驟4 :對每個結點中的語句進行結構分析,得到類結構信息,其中語句結構包括類定義語句、類成員變量定義語句及類的成員函數(shù)定義語句;在分析ActionScript代碼結構吋,對代碼逐行進行掃描,若發(fā)現(xiàn)關鍵字“class”則為類定義語句,關鍵字“function”則為類的成員函數(shù)定義語句;若找到關鍵字“ var”或“const”則為類成員變量定義語句; 標記所有函數(shù)的狀態(tài)為“未執(zhí)行”; 步驟5 :基于類結構信息生成虛擬執(zhí)行流程,并將虛擬執(zhí)行流程放入虛擬執(zhí)行流程棧中; 步驟6 :漏洞檢測過程 從虛擬執(zhí)行流程棧依次取出ー個流程并執(zhí)行,將該流程中調用過的函數(shù)標記為“已執(zhí)行”狀態(tài),在流程執(zhí)行過程中進行漏洞規(guī)則匹配,如果匹配成功,則提示存在漏洞,否則執(zhí)行下一個從虛擬執(zhí)行流程棧取出的流程;直到最后ー個流程執(zhí)行完成; 步驟7 :輸出漏洞檢測結果,檢測結束。
2.根據(jù)權利要求I所述的基于虛擬執(zhí)行模式的Flash漏洞檢測方法,其特征在于,在步驟6的流程執(zhí)行過程中,判斷是否遇到分支語句,若遇到分支語句,根據(jù)判定覆蓋原理新增虛擬執(zhí)行流程,存入虛擬執(zhí)行流程棧中;
3.根據(jù)權利要求I所述的基于虛擬執(zhí)行模式的Flash漏洞檢測方法,其特征在于,在步驟6的流程執(zhí)行過程中,當虛擬執(zhí)行流程棧為空吋,即虛擬執(zhí)行流程棧中的流程都已經執(zhí)行完畢時,進一歩判斷是否仍有函數(shù)狀態(tài)為“未執(zhí)行”,如果是,則為未執(zhí)行的函數(shù)生產新的虛擬執(zhí)行流程并存入虛擬執(zhí)行流程棧中,并返回到步驟6的開始;否則跳轉至步驟7。
4.根據(jù)權利要求I所述的基于虛擬執(zhí)行模式的Flash漏洞檢測方法,其特征在于,漏洞規(guī)則匹配的過程為一個虛擬執(zhí)行流程執(zhí)行完畢,根據(jù)當前變量信息進行漏洞規(guī)則匹配,若符合某漏洞規(guī)則,則表示該Flash文件具有漏洞,若所有漏洞規(guī)則都不符合,則表示該Flash文件是安全的。
5.根據(jù)權利要求I所述的基于虛擬執(zhí)行模式的Flash漏洞檢測方法,其特征在于,漏洞規(guī)則存儲在漏洞規(guī)則庫中,漏洞規(guī)則庫是根據(jù)CVE關于Flash的漏洞報告所編寫的函數(shù)集,每個函數(shù)對應ー個Flash漏洞匹配規(guī)則。
6.根據(jù)權利要求1-5任一項所述的基于虛擬執(zhí)行模式的Flash漏洞檢測方法,其特征在于,所述虛擬執(zhí)行流程的包括如下設置 O虛擬執(zhí)行流程包含所需執(zhí)行代碼段的開始結點m_pBegN0de和結束結點m_pEndNode,兩結點確定代碼段的范圍;包含一個指針m_pNode,指示當前所執(zhí)行語句的結點,指針的初始位置為虛擬執(zhí)行流程的開始結點;2)虛擬執(zhí)行流程包含兩個指針m_pFunction和m_pClass,m_pFunction指示所需執(zhí)行代碼段所屬的函數(shù),m_pClass指示所需執(zhí)行代碼段所屬的類; 3)每個虛擬執(zhí)行流程包含一個變量m_varS,用于存儲該流程所需的所有變量信息。
全文摘要
本發(fā)明公開了一種基于虛擬執(zhí)行模式的Flash漏洞檢測方法,對于待檢測的Flash文件,通過對其進行反編譯得到ActionScript代碼,然后對其類結構進行分析,根據(jù)分析的結果生成多個虛擬執(zhí)行流程,每個虛擬流程即是對某一段代碼的虛擬執(zhí)行。在虛擬執(zhí)行過程中,若遇到分支語句,則修改相應變量的值,使其能夠覆蓋所有分支,并為每一個分支新增虛擬執(zhí)行流程,以待執(zhí)行。當一次虛擬執(zhí)行流程結束以后,通過對相應變量值或其它條件進行漏洞匹配,若符合Flash漏洞的觸發(fā)條件,即成功檢測出漏洞,否則表明該Flash文件是安全的。本發(fā)明具有誤判率低,執(zhí)行效率高的特點。
文檔編號G06F21/22GK102693396SQ20121019020
公開日2012年9月26日 申請日期2012年6月11日 優(yōu)先權日2012年6月11日
發(fā)明者彭程, 王建新, 聶石婧, 董蘋蘋 申請人:中南大學