王于葉,張皓天,許澤遙
(南京郵電大學(xué),江蘇 南京 210023)
漏洞檢測(cè)技術(shù)是保障軟件安全性的主要手段,是軟件安全領(lǐng)域不可或缺的一環(huán)。為了提升漏洞檢測(cè)的工作效率,將機(jī)器學(xué)習(xí)中具備良好性能的深度學(xué)習(xí)算法和漏洞檢測(cè)技術(shù)相結(jié)合已逐漸成為一種研究的趨勢(shì)。對(duì)于深度學(xué)習(xí)而言,選用特征明顯的樣本集往往會(huì)對(duì)深度學(xué)習(xí)的結(jié)果產(chǎn)生決定性影響,如何處理漏洞樣本才能突出其特征性是一個(gè)至關(guān)重要的問題。
根據(jù)分析對(duì)象的不同, 漏洞檢測(cè)技術(shù)可以分為基于源碼的漏洞挖掘技術(shù)和基于二進(jìn)制代碼的漏洞挖掘技術(shù)兩大類[1]。兩類檢測(cè)技術(shù)對(duì)被檢測(cè)對(duì)象也采用了不同的處理方式。
傳統(tǒng)的源代碼漏洞檢測(cè)技術(shù)對(duì)于被檢測(cè)對(duì)象,即源代碼的處理主要集中在對(duì)其語法語義的分析上??刂屏鞣治黾夹g(shù)就是直接從代碼中收集程序的各種語義信息,并通過相關(guān)算法推測(cè)程序的可能執(zhí)行路徑,例如DREAM[2]算法。2012年提出的在代碼中提取抽象語法樹[3]來分析漏洞的新方法,在后來基于Bi-LSTM的源代碼漏洞檢測(cè)[4]中被用作樣本預(yù)處理。
針對(duì)二進(jìn)制代碼的漏洞檢測(cè)技術(shù)對(duì)于被檢測(cè)對(duì)象,即二進(jìn)制程序的處理更側(cè)重于對(duì)程序執(zhí)行漏洞可疑行為的分析。以動(dòng)態(tài)污點(diǎn)跟蹤、模糊檢測(cè)為例,動(dòng)態(tài)污點(diǎn)跟蹤技術(shù)是指在程序中人為地引入被標(biāo)記的污點(diǎn)數(shù)據(jù)并執(zhí)行,通過跟蹤其運(yùn)行路徑找出漏洞。模糊測(cè)試技術(shù)通過構(gòu)造大量畸形樣本數(shù)據(jù)交由目標(biāo)程序處理從而遍歷程序狀態(tài)空間。
無論是針對(duì)源代碼,還是針對(duì)二進(jìn)制代碼,現(xiàn)存漏洞檢測(cè)技術(shù)以及它們對(duì)檢測(cè)對(duì)象的分析處理方式都各自存在不足。針對(duì)源代碼的檢測(cè),由于不斷擴(kuò)充特征庫或詞典,造成了檢測(cè)的結(jié)果集大、誤報(bào)率高[5]。針對(duì)二進(jìn)制代碼的檢測(cè),以匯編語言為例,由于缺少函數(shù)、變量、變量類型等信息,不容易找到分析點(diǎn),效率不高,難以實(shí)現(xiàn)自動(dòng)化發(fā)現(xiàn)[5],易導(dǎo)致漏報(bào)。
當(dāng)兩類漏洞檢測(cè)技術(shù)與深度學(xué)習(xí)算法結(jié)合時(shí),其缺陷客觀反映在深度學(xué)習(xí)的準(zhǔn)確率(precision)和回歸率(recall)上。
文章提出了一種在運(yùn)用Bi-LSTM深度學(xué)習(xí)對(duì)二進(jìn)制程序進(jìn)行漏洞檢測(cè),基于中間語言VEX IR,針對(duì)作為學(xué)習(xí)樣本的二進(jìn)制程序進(jìn)行處理的方法,其基本思路如下:
將二進(jìn)制可執(zhí)行程序轉(zhuǎn)換為一種兼具二進(jìn)制代碼和源代碼部分特性的中間語言代碼,并利用這種特性,從程序動(dòng)態(tài)執(zhí)行過程和代碼的語法語義兩個(gè)維度上對(duì)樣本代碼進(jìn)行分析,結(jié)合Word2Vec等字符處理工具,將分析后的代碼轉(zhuǎn)換為抽象的二維向量序列,將得到的數(shù)據(jù)作為深度學(xué)習(xí)的樣本集,從而在漏洞檢測(cè)的誤報(bào)率提升不明顯的前提下降低漏報(bào)率。
VEX IR是由二進(jìn)制分析框架Valgrind[6]生成的一種中間表示式(IR)。二進(jìn)制程序轉(zhuǎn)譯為VEX后被分成許多小的代碼塊“超級(jí)塊”,每個(gè)代碼塊中包含許多指令,這些指令具有語句(Statements)和表達(dá)式(expressions)兩種類型,語句一般表示寄存器寫入、緩存和變量賦值等操作;表達(dá)式一般表示算術(shù)操作、讀取內(nèi)存和常量表示等操作。此外,還包含函數(shù)名、變量名等匯編語言中不具有的語義信息。
以一條匯編指令addl %eax, %ebx對(duì)應(yīng)的VEX代碼為例:
因此,VEX IR所包含內(nèi)存讀寫和算術(shù)運(yùn)算等指令不僅能夠建立起二進(jìn)制程序數(shù)據(jù)流的靜態(tài)分析,確定函數(shù)輸入與輸出之間的聯(lián)系,而且實(shí)現(xiàn)了嵌套的二進(jìn)制控制流圖,能夠提取出程序的邏輯語義信息。
對(duì)于經(jīng)過輸出的VEX IR代碼,基于其語法語義的表達(dá)特性,以一個(gè)“超級(jí)塊”為最小單位,根據(jù)漏洞特征存在的層面先后對(duì)其進(jìn)行了函數(shù)名和語句跳轉(zhuǎn)關(guān)系的特征化處理。
對(duì)函數(shù)名進(jìn)行特征化處理,是因?yàn)閂EX IR代碼中的一些語句記錄了每個(gè)“超級(jí)塊”所在函數(shù)的函數(shù)名和地址信息,而這對(duì)判斷和函數(shù)名有直接關(guān)系的漏洞(危險(xiǎn)函數(shù)漏洞)十分有利,因此編寫自動(dòng)化腳本建立函數(shù)地址-函數(shù)名關(guān)系對(duì)照表十分必要,如圖1所示。
圖1 函數(shù)地址對(duì)照表(Vexfunction工作輸出)
隨后,對(duì)其中的已知函數(shù)(如memcpy等)進(jìn)行直接數(shù)字編號(hào),于是盡管同一函數(shù)在不同程序中擁有不同的函數(shù)地址,也能為其添加相同的數(shù)字標(biāo)注。對(duì)于未知函數(shù),采用二進(jìn)制比對(duì)工具Bindiff,對(duì)其進(jìn)行一定的修改,使其能夠?qū)Ρ萔EX IR中不同未知函數(shù)的內(nèi)容,將相似率超過85%的未知函數(shù)定義為同一函數(shù),并對(duì)其進(jìn)行數(shù)字編號(hào)。
為了體現(xiàn)和函數(shù)名沒有直接關(guān)聯(lián)的語法特征,通過提取超級(jí)塊中的跳轉(zhuǎn)語句,分析出程序語句的執(zhí)行順序,并按照每個(gè)超級(jí)塊在程序流程中被調(diào)用的先后關(guān)系,使用二進(jìn)制數(shù)對(duì)其編碼。對(duì)于函數(shù)名或跳轉(zhuǎn)關(guān)系的編碼,構(gòu)成二維向量的縱坐標(biāo)。
對(duì)于二進(jìn)制程序執(zhí)行維度的特征化處理,參考了Gascon等[7]學(xué)者關(guān)于使用行為特征圖進(jìn)行機(jī)器學(xué)習(xí)分類的算法研究,以每條指令為最小單位,通過判定運(yùn)行時(shí)刻的大量行為特征圖之間的相似之處,來體現(xiàn)惡意行為。以簡(jiǎn)化VEX IR為目的,從中提取出關(guān)鍵的算術(shù)和邏輯操作以及運(yùn)行時(shí)內(nèi)存空間發(fā)生的變化,最終選取了1 100個(gè)保留了必要信息的相關(guān)操作指令作為VEX IR的程序執(zhí)行過程描述。
對(duì)于一個(gè)IR塊,提取其關(guān)鍵指令并將其序列化,形成如[IMark,WrTmp,16Uto32,GET:I32,PUT,…]的形式。將這個(gè)文本向量視為具有含義的“句子”,其含義由向量的元素及其序列組成。將這些文本向量元素唯一地映射到一個(gè)整數(shù),將這些整數(shù)充當(dāng)“標(biāo)記”,唯一地標(biāo)識(shí)每個(gè)文本元素,以此構(gòu)成二維向量的橫坐標(biāo)。
二維向量的序列化過程中,使用Word2Vec工具來實(shí)現(xiàn),并使用主成分分析(Principal Component Analysis,PCA)將結(jié)果投影到二維平面,如圖2所示。由數(shù)字表示的VEX指令的平面位置將成為深度學(xué)習(xí)的樣本集。
圖2 向量投影
先將二進(jìn)制可執(zhí)行文件樣本用ida轉(zhuǎn)化為匯編語言,僅進(jìn)行程序執(zhí)行維度序列化的處理,將完全相同的二進(jìn)制可執(zhí)行文件樣本用valgrind處理成VEX IR后,采用二維序列化處理方法進(jìn)行樣本集預(yù)處理,作為Bi-LSTM的輸入,而后兩種方法對(duì)于測(cè)試集的預(yù)測(cè)結(jié)果對(duì)比如圖3所示。
從漏洞預(yù)測(cè)得到的結(jié)果數(shù)據(jù)可以看出,Vulnerable一欄的召回率相較單純,針對(duì)匯編語言的學(xué)習(xí)而言,從0.33增長到了0.77,有了明顯的提升。而深度學(xué)習(xí)的準(zhǔn)確率仍然維持在較高水平,為0.96。由此數(shù)據(jù)可以證明,文章提出的方法成功降低了二進(jìn)制漏洞檢測(cè)的漏報(bào)率。
圖3 針對(duì)不同代碼的深度學(xué)習(xí)檢測(cè)結(jié)果
經(jīng)驗(yàn)證,文章基于中間語言的代碼特征提出的一種深度學(xué)習(xí)樣本集預(yù)處理的方法,成功使原本基于純二進(jìn)制代碼的漏洞檢測(cè)技術(shù)具備了源碼檢測(cè)的一些優(yōu)勢(shì),最終實(shí)現(xiàn)了在基本不增加誤報(bào)的前提下減少漏報(bào)率。但該方法仍存在漏報(bào)率大于誤報(bào)率等二進(jìn)制檢測(cè)的固有缺陷,尚有較大的發(fā)展空間。