劉 豪,馬慧芳,龔 楠,閆彩瑞
(西北師范大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院,甘肅 蘭州 730070)
軟件開發(fā)項(xiàng)目組通常進(jìn)行代碼復(fù)用以提高生產(chǎn)力和效率,目前最常用的方式是直接復(fù)制開源代碼以及引用第三方代碼庫。然而,在此過程中如果監(jiān)管不善,就可能會(huì)導(dǎo)致沒有經(jīng)過補(bǔ)丁修正的漏洞程序傳播至不同軟件程序,進(jìn)而傳播至不同操作系統(tǒng)乃至平臺(tái)架構(gòu);其次,不同編譯器在編譯過程中可能會(huì)產(chǎn)生交叉優(yōu)化二進(jìn)制文件,而且源代碼可能會(huì)隨著時(shí)間推進(jìn)發(fā)生演變(例如經(jīng)過補(bǔ)丁優(yōu)化),產(chǎn)生交叉版本二進(jìn)制文件,這些潛在因素都可能導(dǎo)致二進(jìn)制漏洞的產(chǎn)生。一旦這些漏洞被別有用心之人利用,將對(duì)公司資產(chǎn)和運(yùn)營產(chǎn)生不利影響。例如,若信息管理系統(tǒng)因漏洞未及時(shí)修補(bǔ)而受到黑客攻擊或控制,將導(dǎo)致用戶私人信息泄露,并且受攻擊系統(tǒng)也可以作為黑客攻擊其他系統(tǒng)的跳板。
相關(guān)研究人員已經(jīng)開展了很多基于代碼克隆的二進(jìn)制文件相似度檢測和二進(jìn)制漏洞搜索工作,這些工作主要基于二進(jìn)制函數(shù)的控制流圖CFG(Control Flow Graph)來進(jìn)行漏洞檢測。這些方法的性能在合理配置下均表現(xiàn)良好,但是可能會(huì)導(dǎo)致大規(guī)模二進(jìn)制文件損失以及漏洞搜索的低準(zhǔn)確率。例如,Genius[1]利用譜聚類算法生成代碼本,并基于二部圖匹配算法計(jì)算特定屬性控制流圖ACFG(Attribute Control Flow Graph)與代碼本中每個(gè)有代表性的屬性控制流圖(ACFG)之間的相似度,但此方法相當(dāng)耗費(fèi)時(shí)間,且準(zhǔn)確率低;Gemini[2]提取出與Genius[1]相同的輕量級(jí)特征,并只依賴屬性控制流圖(ACFG)通過深度神經(jīng)網(wǎng)絡(luò)DNN(Deep Neural Network)來生成二進(jìn)制函數(shù)嵌入向量,但由于特征提取不夠合理,其搜索效率仍然較低;VulSeeker[3]優(yōu)化了特征提取方式,以提取控制流圖(CFG)和數(shù)據(jù)流圖DFG(Data Flow Graph),組成標(biāo)記語義流圖LSFG(Labeled Semantic Flow Graph),并通過深度神經(jīng)網(wǎng)絡(luò)來獲取二進(jìn)制函數(shù)的嵌入表示;CACompare[4]通過模擬函數(shù)執(zhí)行過程來提取函數(shù)中的語義簽名,基于提取出的語義簽名進(jìn)行相似度檢測,但是其模擬函數(shù)執(zhí)行過程相當(dāng)耗時(shí),導(dǎo)致整體搜索效率低下;BinSeeker[5]則首先提取出函數(shù)的控制流圖(CFG)和數(shù)據(jù)流圖(DFG)組成標(biāo)記語義流圖,并通過深度神經(jīng)網(wǎng)絡(luò)(DNN)先篩選出一批漏洞函數(shù),再進(jìn)一步進(jìn)行函數(shù)模擬來篩選出漏洞函數(shù);Bingo[6]則利用選擇性代碼嵌入和長度可變部分追蹤來計(jì)算函數(shù)語義,這些語義用于構(gòu)建函數(shù)模型,以進(jìn)行相似度的比較以及漏洞搜索,但Bingo不支持跨平臺(tái)的漏洞搜索。α Diff[7]旨在應(yīng)對(duì)交叉版本二進(jìn)制文件相似度檢測挑戰(zhàn),將二進(jìn)制文件分為函數(shù)級(jí)和模塊級(jí)進(jìn)行相似度檢測;趙鵬磊等[8]實(shí)現(xiàn)了基于標(biāo)準(zhǔn)化的無監(jiān)督特征提取方法,并通過引入注意力機(jī)制來自動(dòng)學(xué)習(xí)屬性控制流圖中不同節(jié)點(diǎn)的權(quán)重。這些方法在合理的實(shí)驗(yàn)配置下有著不錯(cuò)的搜索性能,然而,其分析二進(jìn)制文件和漏洞文件的語義過于單一,進(jìn)一步限制了其搜索性能及效率的提升。
本文提出了一種基于多粒度語義特征進(jìn)行相似度比較的跨平臺(tái)二進(jìn)制漏洞搜索方法Taurus,解決了跨平臺(tái)以及交叉優(yōu)化所帶來的二進(jìn)制文件代碼差異問題。給定待檢測二進(jìn)制文件和數(shù)據(jù)庫中的二進(jìn)制漏洞,Taurus分別對(duì)基本塊、函數(shù)和模塊3種不同粒度下的語義進(jìn)行提取及分析,并計(jì)算3種粒度下的語義特征相似度。在獲取到3種粒度下語義特征的特征相似度后,Taurus將計(jì)算其總體相似度,然后對(duì)相似度得分進(jìn)行降序排序,最終判定目標(biāo)二進(jìn)制文件中是否含有疑似漏洞。
目前本文已實(shí)現(xiàn)Taurus原型程序,并將其與各種配置下的最新漏洞搜索方法進(jìn)行了比較,結(jié)果表明Taurus具有更好的搜索性能。本文貢獻(xiàn)如下所示:
(1)首次提出基于多粒度語義特征分析的二進(jìn)制漏洞搜索方法,以提高漏洞搜索的準(zhǔn)確性和效率。
(2)優(yōu)化了原始的語義特征學(xué)習(xí)方法,通過標(biāo)記語義流圖(LSFG),深度神經(jīng)網(wǎng)絡(luò)(DNN)學(xué)習(xí)出的嵌入表示信息更加豐富。
本節(jié)主要介紹Taurus方法及其實(shí)現(xiàn)原理。Taurus的任務(wù)是確定目標(biāo)二進(jìn)制文件中是否包含與已知漏洞相似的函數(shù),其輸入是來自待檢測二進(jìn)制文件和數(shù)據(jù)庫中的二進(jìn)制漏洞。如圖1所示,Taurus共包含3個(gè)部分:多粒度語義特征提取、語義生成和相似度計(jì)算。給定待檢測二進(jìn)制文件以及數(shù)據(jù)庫中的某個(gè)二進(jìn)制漏洞,Taurus首先通過交匯式反匯編工具IDA Pro[8]提供的插件IDA Python提取2個(gè)文件中每個(gè)函數(shù)的控制流圖(CFG),同時(shí)通過LLVM RR[9]插件推斷2個(gè)基本塊之間是否具有數(shù)據(jù)指向邊緣,從而生成數(shù)據(jù)流圖(DFG),最后將控制流圖(CFG)和數(shù)據(jù)流圖(DFG)整合為標(biāo)記語義流圖(LSFG),并通過特定的語義提取規(guī)則將其轉(zhuǎn)換為初始數(shù)值向量,通過深度神經(jīng)網(wǎng)絡(luò)(DNN)計(jì)算出其在基本塊粒度下的相似度值;然后,Taurus提取出2個(gè)文件的函數(shù)調(diào)用圖,并獲取函數(shù)調(diào)用圖的入度和出度,通過歐氏距離計(jì)算出其在函數(shù)粒度下的相似度值;最后,Taurus提取出2個(gè)文件的導(dǎo)入函數(shù)集,通過集合交并關(guān)系獲得其數(shù)值向量,亦通過歐氏距離計(jì)算出其模塊粒度下的相似度值。在獲取到3種粒度下的相似度后,Taurus將整合這3種相似度并計(jì)算2個(gè)文件中函數(shù)的總體相似度得分。在計(jì)算出待檢測二進(jìn)制文件與數(shù)據(jù)庫中每一個(gè)二進(jìn)制漏洞的相似度后,Taurus將所有的相似度得分進(jìn)行降序排序,輸出該二進(jìn)制文件的漏洞檢測報(bào)告。
Figure 1 Framework of binary vulnerability search method based on multi-granularity semantic analysis圖1 基于多粒度語義分析的二進(jìn)制漏洞搜索方法框架
2.1.1 標(biāo)記語義流圖
標(biāo)記語義流圖(LSFG)包含控制流圖(CFG)和數(shù)據(jù)流圖(DFG),它們的邊緣分別標(biāo)記為0和1,其中0代表控制關(guān)系,1代表數(shù)據(jù)關(guān)系。使用標(biāo)記語義流圖(LSFG),目的是提高模塊間語義生成的準(zhǔn)確性,其同時(shí)考慮了函數(shù)中基本塊的控制關(guān)系和數(shù)據(jù)關(guān)系,這將有效地緩解不同平臺(tái)之間不同控制流圖(CFG)引入的結(jié)構(gòu)干擾。本文使用IDA Pro提供的IDAPython為每個(gè)二進(jìn)制函數(shù)的基本塊創(chuàng)建控制流圖(CFG),并利用IDA Pro的LLVM RR插件推斷2個(gè)基本塊之間是否有數(shù)據(jù)指向邊緣。對(duì)于來自2個(gè)不同的基本塊中滿足控制流圖(CFG)拓?fù)涞?條指令i和j,如果指令i為一個(gè)寫存儲(chǔ)器操作,而指令j讀取相同的存儲(chǔ)器地址,則為這2個(gè)基本塊創(chuàng)建一條數(shù)據(jù)相關(guān)的邊。另外,僅保留不同塊之間的數(shù)據(jù)相關(guān)性,并且2個(gè)基本塊之間至多存在有一條數(shù)據(jù)相關(guān)性邊。Taurus將每個(gè)函數(shù)的控制邊和數(shù)據(jù)邊存儲(chǔ)在2個(gè)文件中。
2.1.2 基本塊間特征提取
通過參考已有工作[3]中使用的特征,并針對(duì)不同的特征集執(zhí)行一系列代碼克隆實(shí)驗(yàn),本文最終確定使用表1所示的8種類型特征作為每個(gè)基本塊的初始語義表示。這些選定特征可以在各種體系結(jié)構(gòu)和編譯優(yōu)化配置下輕松提取和更改。利用IDA Python為每個(gè)基本塊提取特征,然后根據(jù)表1將基本塊中的8種特征指令按照特征數(shù)量編碼為數(shù)值向量,如圖2所示。對(duì)于每個(gè)二進(jìn)制函數(shù),函數(shù)中所有基本塊的數(shù)值向量都存儲(chǔ)在單獨(dú)的文件中。
Table 1 Basic-block level features used by Taurus表1 Taurus使用的8種基本塊特征
Figure 2 An example of the block feature extraction圖2 特征提取的一個(gè)例子
對(duì)于基本塊間的特征提取,本文通過語義感知深度神經(jīng)網(wǎng)絡(luò)(DNN)模型來完成。在該模型中,輸入為函數(shù)中所有基本塊的d維初始特征向量,輸出則是表示函數(shù)語義的p維嵌入向量。為了精確捕捉函數(shù)語義,還要考慮到控制流圖中基本塊之間的數(shù)據(jù)以及控制關(guān)系。受VulSeeker[3]的啟發(fā),并參照Structure2vec[10]神經(jīng)網(wǎng)絡(luò)和Siamese[11]網(wǎng)絡(luò)結(jié)構(gòu),本文提出如圖3所示的語義感知深度神經(jīng)網(wǎng)絡(luò)(DNN)模型。
第t層嵌入的處理過程通過式(1)獲得:
(1)
Figure 3 DNN model of Taurus圖3 Taurus的深度神經(jīng)網(wǎng)絡(luò)模型
其中,w1是每層更新過程中的d×p維的待訓(xùn)練參數(shù)矩陣,C和D為待表示節(jié)點(diǎn)的控制流鄰居節(jié)點(diǎn)集合和數(shù)據(jù)流鄰居節(jié)點(diǎn)集合,σc和σd是以ReLU作為激活函數(shù)的n層全連接神經(jīng)網(wǎng)絡(luò),如式(2)所示:
(2)
其中,n代表每個(gè)向量的嵌入深度,即全連接神經(jīng)網(wǎng)絡(luò)的層數(shù);Ti和Oi(1≤i≤n)為每層用到的p×p維的參數(shù)矩陣;lc和ld分別為式(1)中待表示節(jié)點(diǎn)v的控制流鄰居節(jié)點(diǎn)和數(shù)據(jù)流鄰居節(jié)點(diǎn)的向量和。
基本塊間語義特征提取過程如算法1所示。
算法1標(biāo)記語義流圖嵌入生成
輸入:標(biāo)記語義流圖G=〈V,Ec,Ed〉。
輸出:嵌入向量u。
步驟2 fort=1toTdo
步驟3forv∈Vdo
步驟6endfor
步驟7 endfor{將所有更新后的向量累加}
在得到待檢測二進(jìn)制文件的嵌入Ea和待檢測二進(jìn)制漏洞的嵌入Ev之后,通過式(3)計(jì)算其基本塊間語義特征距離:
(3)
首先要明確的是函數(shù)不能單獨(dú)運(yùn)行,其需要在同一個(gè)二進(jìn)制文件中調(diào)用其他函數(shù)或者被其他函數(shù)調(diào)用運(yùn)行,這種特征稱為函數(shù)間語義特征,可以用函數(shù)間的調(diào)用圖來表示。值得注意的是,相似函數(shù)有相同調(diào)用圖,理想狀態(tài)下,需要考慮所有函數(shù)的調(diào)用圖。
本文只從函數(shù)調(diào)用圖中提取出1個(gè)節(jié)點(diǎn)的入度和出度來作為函數(shù)間語義特征,記為g(Ia)。具體來說,以目標(biāo)函數(shù)Ia為例,令in(Ia)和out(Ia)表示函數(shù)Ia的函數(shù)調(diào)用圖的入度和出度,如式(4)所示:
g(Ia)=(in(Ia),out(Ia))
(4)
然后通過歐氏距離來獲取函數(shù)間語義特征距離,如式(5)所示:
D2(Ia,Iv)=‖g(Ia)-g(Iv)‖
(5)
對(duì)于目標(biāo)二進(jìn)制函數(shù),它需要調(diào)用一組導(dǎo)入函數(shù),記為S(Ia)。值得注意的是,即使在版本更新過程中這些函數(shù)發(fā)生了變化,相似函數(shù)也會(huì)調(diào)用相似的導(dǎo)入函數(shù),因?yàn)樵谀K開發(fā)過程中未替換導(dǎo)入函數(shù)集,因此也可將導(dǎo)入函數(shù)集視為第3種語義,稱為模塊間語義。對(duì)于模塊間語義特征的提取,通過處理2個(gè)文件導(dǎo)入函數(shù)集的集合交并關(guān)系,將其轉(zhuǎn)換為數(shù)值向量,并通過計(jì)算歐氏距離來獲取二者在模塊粒度下的相似度。對(duì)于集合關(guān)系的獲取,通過式(6)將導(dǎo)入的函數(shù)集嵌入到超集的空間中:
h(A,B)=〈x1,x2,…,xs,…,xt〉
(6)
其中,集合B為集合A的超集,t為超集B的勢。若超集B中的第s個(gè)元素xs存在于集合A中,則記xs為1,否則為0。
對(duì)于目標(biāo)函數(shù)Ia和漏洞函數(shù)Iv,記其二進(jìn)制文件分別是Ba和Bv,則其導(dǎo)入函數(shù)集分別為imp(Ia)和imp(Iv),其二進(jìn)制文件的導(dǎo)入函數(shù)集分別imp(Ba)和imp(Bv)。接下來,將超集定義為imp(Ba)∩imp(Bv),并利用式(6)分別將二進(jìn)制文件和二進(jìn)制漏洞在模塊粒度下的語義特征轉(zhuǎn)換為數(shù)值向量,然后利用式(7)計(jì)算其模塊粒度下的語義特征相似度:
D3(Ia,Iv)=‖h(imp(Ia),imp(Ba)∩imp(Bv))-
h(imp(Iv),imp(Ba)∩imp(Bv))‖2
(7)
給定2個(gè)函數(shù)Ia和Iv,根據(jù)前文所述,可以計(jì)算出它們的基本塊間特征距離(D1)、函數(shù)間特征距離(D2)和模塊間特征距離(D3)。
由于函數(shù)的導(dǎo)入函數(shù)集通常比較穩(wěn)定,因此通常模塊粒度下的語義特征相似度D3數(shù)值位于0~1;其次,基本塊粒度下的語義特征相似度D1同樣也是位于0~1。由于交叉版本的二進(jìn)制文件中的相似函數(shù)可以有不同的調(diào)用圖,特別是不同的入度和出度,因此函數(shù)粒度下可能會(huì)有相對(duì)較大的距離D2。為了解決這個(gè)問題,本文預(yù)定義了一個(gè)(0,1)內(nèi)的超參數(shù)λ,以抑制D2數(shù)值過大的影響。因此,2個(gè)函數(shù)的總體相似度計(jì)算方法如式(8)所示:
D(Ia,Iv)=D1(Ia,Iv)+1-λD2(Ia,Iv)+D3(Ia,Iv)
(8)
對(duì)于任意待檢測二進(jìn)制文件,可以計(jì)算出其與數(shù)據(jù)庫中每一個(gè)二進(jìn)制漏洞總體相似度得分,然后依照相似度得分進(jìn)行降序,從而獲取該二進(jìn)制文件的漏洞檢測報(bào)告。
Taurus程序主要由3個(gè)模塊構(gòu)成:函數(shù)內(nèi)語義特征提取組件、函數(shù)間語義特征提取組件和基本塊間語義特征提取組件。Taurus使用的工具以及插件均基于IDA Pro 7.0。本節(jié)評(píng)估并測試Taurus在不同平臺(tái)以及版本優(yōu)化下的漏洞搜索性能,旨在回答以下3個(gè)問題:
(1)在跨平臺(tái)二進(jìn)制函數(shù)搜索中,Taurus是否比其他二進(jìn)制漏洞搜索方法更準(zhǔn)確?
(2)Taurus完成漏洞搜索任務(wù)所耗費(fèi)的時(shí)間如何?
(3)Taurus是否可以在實(shí)際應(yīng)用中進(jìn)行漏洞搜索?
本文實(shí)驗(yàn)平臺(tái)配置為:Intel i7-8750H CPU,6核12線程,3.90 GHz ,6 GB顯存 NVIDIA GTX 1060 GPU、內(nèi)存為16 GB,且操作系統(tǒng)版本為64位Windows 10,版本號(hào)為2004。
3.1.1 數(shù)據(jù)集配置
為了公平地驗(yàn)證Taurus的漏洞搜索性能,本文沿用了Genius[1]和Gemini[2]中構(gòu)造的2個(gè)人工數(shù)據(jù)集來評(píng)估不同的搜索任務(wù)。其中,數(shù)據(jù)集I用來訓(xùn)練Taurus,同時(shí)將Taurus與Genius、Gemini以及Taurus的2個(gè)變種Taurus-1和Taurus-2進(jìn)行比較,Taurus-1是Taurus刪除了函數(shù)間語義特征提取模塊的版本,而Taurus-2是Taurus刪除了模塊間語義特征提取模塊的版本;數(shù)據(jù)集II用于測試Taurus的漏洞搜索效率,由于其他工具涉及跨平臺(tái)漏洞搜索,因此需要在不同平臺(tái)上進(jìn)行漏洞搜索。
數(shù)據(jù)集I沿用Gemini中的人工數(shù)據(jù)集,從5個(gè)不同的開源程序中編譯了一組二進(jìn)制文件:libjepg,Wget,OpenSSL,Coreutils和curl。通過具有4個(gè)優(yōu)化配置(O0~O3)的2個(gè)編譯器(GCC和Clang)將這些開源程序分別編譯至3種體系結(jié)構(gòu)(Windows X86/X64,MIPS32/MIPS64,ARM34/ARM64)。這個(gè)數(shù)據(jù)集中包含735 540個(gè)具有9 345×103個(gè)基本塊的二進(jìn)制函數(shù),具體信息如表2所示。
Table 2 Open-source programs表2 開源程序列表
數(shù)據(jù)集II由從各種不同的平臺(tái)選擇的4 649個(gè)物聯(lián)網(wǎng)固件鏡像組成,并且這些固件鏡像來自Genius[1]。
3.1.2 基線設(shè)置
Taurus需要一個(gè)帶有大量標(biāo)記的相似和不相似二元函數(shù)對(duì)的數(shù)據(jù)集進(jìn)行訓(xùn)練,可以通過以下方法在數(shù)據(jù)集I中自動(dòng)標(biāo)記樣本:將代碼中的函數(shù)f編譯為一組二進(jìn)制函數(shù),記為set(f)={f1,f2,…,fn}。對(duì)于set(f)中的每一個(gè)函數(shù)fi,隨機(jī)選擇一個(gè)不同的函數(shù)fj(i≠j)組成一個(gè)相似的樣本對(duì),記為Sam(fi,fj,+1)。同時(shí)隨機(jī)選擇set(f)中不存在的另一個(gè)二進(jìn)制函數(shù)gk來模擬一個(gè)包含fi的不相似樣本,記為Dis(fi,gk,-1)。最后,總共構(gòu)造了大約3 677×103個(gè)樣本對(duì),且沒有完全相同的樣本對(duì),只有相似和不相似的樣本對(duì)。
3.1.3 訓(xùn)練方法
為了獲得更準(zhǔn)確的實(shí)驗(yàn)結(jié)果,本文通過10折交叉驗(yàn)證對(duì)Taurus進(jìn)行訓(xùn)練和評(píng)估,即將樣本對(duì)分為10個(gè)子集,9個(gè)子集用來訓(xùn)練模型,1個(gè)子集用來測試模型,重復(fù)此操作10次,每次選擇一個(gè)不同的子集進(jìn)行測試。每次完成訓(xùn)練后將隨機(jī)調(diào)整訓(xùn)練集。訓(xùn)練的目的是獲得模型Taurus中的參數(shù):w1,T1,…,O1,…,On和w2,以優(yōu)化式(9)所示的目標(biāo)函數(shù):
(9)
其中yi為待預(yù)測二進(jìn)制文件的真實(shí)標(biāo)簽。
為了獲得基本塊間特征提取模型的最合適參數(shù),本文通過隨機(jī)梯度下降優(yōu)化(即式(9)),直到模型可以達(dá)到最佳分類性能,終止訓(xùn)練。經(jīng)過上述訓(xùn)練過程,Taurus中的基本塊粒度語義特征提取模型將有效地將標(biāo)記語義流圖(LSFG)轉(zhuǎn)換為嵌入。
本節(jié)主要探討問題(1),即本文方法是否可以更準(zhǔn)確地進(jìn)行跨平臺(tái)漏洞搜索。
Taurus的任務(wù)是準(zhǔn)確識(shí)別存在漏洞函數(shù)的二進(jìn)制文件,通過數(shù)據(jù)集I對(duì)Taurus,Taurus-1,Taurus-2和Gemini的漏洞搜索效率進(jìn)行評(píng)估。分別從數(shù)據(jù)集I中隨機(jī)抽取2 100對(duì)二進(jìn)制文件來比較Taurus與Gemini的漏洞搜索效率,其中3個(gè)不同平臺(tái)各700對(duì),最終結(jié)果如圖4所示。
Figure 4 ROC curves of Taurus,Taurus-1,Taurus-2,and Gemini圖4 Taurus,Taurus-1,Taurus-2和Gemini的ROC曲線
從圖4可以觀察到,Taurus及其2個(gè)變種的ROC曲線都位于Gemini[2]之上,可以推斷出Taurus有較大的可能性先對(duì)漏洞函數(shù)進(jìn)行分類。Taurus的AUC值為86.49%,比Gemini[2]的高13.19%,由此可以看出在漏洞搜索效率方面Taurus要優(yōu)于Gemini[2],因?yàn)槠淇梢垣@取到更多的語義信息,有助于高效地識(shí)別漏洞函數(shù)。
另外,值得注意的是,當(dāng)分別刪除函數(shù)間語義特征提取模塊和模塊間語義特征提取模塊時(shí),Taurus-1和Taurus-2的漏洞搜索性能依然呈上升態(tài),進(jìn)一步表明了本文方法的有效性??刂普Z義粒度的目的是分別探究函數(shù)間語義特征和模塊間語義特征對(duì)漏洞的搜索效率的影響,實(shí)驗(yàn)結(jié)果表明,在分別去除函數(shù)間語義特征提取模塊(Taurus-1)和模塊間語義特征提取模塊(Taurus-2)后,Taurus-1的AUC值比Taurus-2的小13.76%,這表明對(duì)于二進(jìn)制文件相似性檢測而言,函數(shù)級(jí)語義要比模塊級(jí)語義重要得多。
本節(jié)主要回答有關(guān)Taurus完成漏洞搜索任務(wù)的時(shí)間成本的問題(2)和有關(guān)現(xiàn)實(shí)生活中搜索性能的問題(3),在此分別討論了對(duì)數(shù)據(jù)集II進(jìn)行漏洞搜索的時(shí)間和對(duì)數(shù)據(jù)集I進(jìn)行訓(xùn)練的時(shí)間。表3列出了Genius、Gemini和Taurus的程序搜索時(shí)間,第2列可以觀察到每個(gè)程序包含的函數(shù)數(shù)量,而第3~5列是每種方法執(zhí)行漏洞搜索所耗費(fèi)的時(shí)間。
Table 3 Searching time of three methods表3 3種方法所耗費(fèi)的搜索時(shí)間
表3中,所有程序平均包含1 895個(gè)函數(shù)。在搜索效率方面,Gemini和Taurus所需的時(shí)間較短,平均只需284 s和502 s即可完成漏洞搜索,這意味著Gemini和Taurus平均只需要0.15 s和0.26 s來計(jì)算目標(biāo)函數(shù)和漏洞函數(shù)之間的相似度。但是,Genius需要2 976 s才能完成1 895個(gè)函數(shù)中的漏洞搜索。與Gemini和Taurus相比,Genius的時(shí)間成本要高得多,比前二者分別高10.48倍和5.93倍。結(jié)合圖4綜合來看,盡管Taurus比Gemini花費(fèi)了更多的時(shí)間,但它卻以少量的時(shí)間為代價(jià)實(shí)現(xiàn)了更高的搜索準(zhǔn)確性,因此Taurus更適用于大規(guī)模代碼的漏洞搜索任務(wù)。
對(duì)于本文配置的100 000對(duì)函數(shù)樣本,Genius通過譜聚類算法生成模型大約需要50天。而Gemini和Taurus受機(jī)器配置的限制,模型訓(xùn)練的時(shí)間成本分別約為17天和23天。但是,訓(xùn)練過程為一次性,之后幾乎不會(huì)影響漏洞搜索效率。這意味著一旦完成模型參數(shù)訓(xùn)練,就可在任何情況下重用它,而無需再花費(fèi)時(shí)間訓(xùn)練。
本節(jié)主要討論如何設(shè)置參數(shù)可以使得Taurus達(dá)到最佳性能,同時(shí)還評(píng)估了不同參數(shù)對(duì)漏洞搜索性能的影響。Taurus語義學(xué)習(xí)模塊的參數(shù)主要包括:嵌入尺寸、嵌入深度和迭代次數(shù)。
3.4.1 嵌入尺寸
嵌入尺寸是指用于表示函數(shù)語義的嵌入向量的維數(shù)p。與前文相同,本節(jié)還是通過ROC曲線來評(píng)估嵌入尺寸對(duì)漏洞搜索性能的影響。圖5是Taurus在不同嵌入尺寸下的ROC曲線,可以推斷,當(dāng)嵌入尺寸為64時(shí),Taurus的AUC值相當(dāng)可觀。同時(shí)考慮到訓(xùn)練和預(yù)測時(shí)間的成本,本文最終選擇64作為默認(rèn)嵌入尺寸。
Figure 5 ROC curves of different embedding sizes圖5 不同嵌入尺寸下的ROC曲線
3.4.2 嵌入深度
嵌入深度是指Taurus中基本塊間語義特征提取模塊中全連接神經(jīng)網(wǎng)絡(luò)的層數(shù)n。圖6為改變嵌入深度的效果。當(dāng)嵌入深度為2時(shí),可以獲得相對(duì)最佳的AUC值。結(jié)果表明,通過添加2層全連接神經(jīng)網(wǎng)絡(luò),生成的嵌入向量將具有更高的表示性能和更好的函數(shù)語義捕獲。但是,當(dāng)嵌入深度大于2時(shí),只會(huì)徒增時(shí)間成本和人工成本。
Figure 6 ROC curves of different embedding depths圖6 不同嵌入深度下的ROC曲線
3.4.3 迭代次數(shù)
如前文所述,迭代次數(shù)是指Taurus中基本塊間語義特征提取模塊的隱藏層層數(shù)T。圖7為Taurus在不同迭代次數(shù)下的ROC曲線。從圖7中可以推斷當(dāng)?shù)螖?shù)為6時(shí),本文方法將獲得漏洞搜索的最佳性能,且在條件允許的情況下,迭代次數(shù)越多,結(jié)果越好。
Figure 7 ROC curves of different iterations圖7 不同迭代次數(shù)下的ROC曲線
本文提出了一種基于3種語義特征的跨平臺(tái)二進(jìn)制漏洞搜索方法Taurus,通過集合基本塊間語義特征、函數(shù)間語義特征和模塊間語義特征進(jìn)一步提高了漏洞搜索的效率及準(zhǔn)確性。實(shí)驗(yàn)表明,Taurus在漏洞搜索準(zhǔn)確性上比其他相關(guān)工作高,且在不同平臺(tái)上都略有提高,適用于現(xiàn)實(shí)生活中的跨平臺(tái)二進(jìn)制漏洞搜索。