呂華輝,劉欣,農(nóng)彩勤
(1.中國南方電網(wǎng)有限責(zé)任公司,廣東廣州 510000;2.南方電網(wǎng)數(shù)字電網(wǎng)研究院有限公司,廣東廣州 510663)
隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,軟件的應(yīng)用范圍迅速擴(kuò)大。為了保證終端軟件在使用過程中的安全性與穩(wěn)定性,需要對終端軟件缺陷進(jìn)行檢測。傳統(tǒng)的軟件缺陷檢測方法主要應(yīng)用了靜態(tài)分析技術(shù),通過這種檢測技術(shù)可實現(xiàn)對軟件代碼的分析與評估,同時不需要執(zhí)行運行程序,能夠及時發(fā)現(xiàn)終端軟件中存在的缺陷,但隨著軟件應(yīng)用環(huán)境的日漸復(fù)雜與軟件數(shù)量的激增,傳統(tǒng)的軟件缺陷檢測方法在對終端軟件的缺陷進(jìn)行檢測時,出現(xiàn)了漏報與誤報情況[1-2]。
為此,國內(nèi)專家學(xué)者對此展開相關(guān)研究。文獻(xiàn)[3]提出基于N-gram 模型的終端軟件缺陷檢測方法,該方法建立了終端軟件缺陷N-gram 模型,通過該模型提取終端軟件的缺陷數(shù)據(jù),將終端軟件缺陷數(shù)據(jù)存儲到數(shù)據(jù)庫中,然后對模型進(jìn)行優(yōu)化,最后通過優(yōu)化后的終端軟件缺陷N-gram 模型實現(xiàn)了終端軟件缺陷的檢測,該方法容易實現(xiàn),并且檢測誤報率較低,但檢測漏報率較高。
為了解決以上問題,該文提出了基于關(guān)聯(lián)規(guī)則的終端軟件缺陷檢測方法。
在終端軟件中,二進(jìn)制軟件的尾指令較為復(fù)雜,無法直接進(jìn)行分析,需要對二進(jìn)制軟件賦予中間指令集,并增加代碼量,從二進(jìn)制軟件的路徑與匯編指令入手,提取軟件缺陷特征[4]。
二進(jìn)制軟件基本塊執(zhí)行順序根據(jù)軟件底層指令確定,軟件底層指令位于尾指令前面,由多個匯編指令構(gòu)成,基本塊在執(zhí)行第一行代碼時,不需要執(zhí)行二進(jìn)制程序,此時,基本塊可表示為返回指令集合設(shè)置為a={b1,b2,…,bm},m為基本塊a的地址長度,b1表示基本塊a的跳轉(zhuǎn)指令,bm表示基本塊a的匯編指令。
二進(jìn)制軟件的第一行代碼程序可表示為若干基本塊的集合A={a1,a2,…,ai},i表示基本塊的控制信息[5-6]。
為了提取終端軟件特征信息,需要根據(jù)尾指令中的自定義函數(shù)將基本塊分為條件跳轉(zhuǎn)基本塊與返回基本塊,條件跳轉(zhuǎn)基本塊中的語句可通過jmp、je進(jìn)行判斷,如果歸為同一類別,則條件跳轉(zhuǎn)基本塊的代碼顯示為true,如果條件條狀基本塊中含有庫函數(shù)與自定義函數(shù),不歸為同一類別,則代碼程序顯示為false。
在劃分完成后,自定義基本庫中包含缺陷,需要提取自定義基本庫中的缺陷特征信息進(jìn)行分析?;緣K通過自定義返回指令可由基本塊an返回到基本塊aj,基本塊an與基本塊aj之間的缺陷路徑可由rn,j={an,aj,c|j∈An} 表示,其中,an為缺陷路徑中點,aj表示缺陷路徑終點,c表示缺陷路徑變量,An表示基本塊an的特征集合[7-8]。
在終端軟件中如果多次進(jìn)行循環(huán)與基本塊判斷,會導(dǎo)致終端軟件的缺陷路徑以指數(shù)形式增加,從而造成缺陷路徑爆炸,為降低缺陷路徑的增加速度,在提取缺陷路徑特征時,只提取終端軟件中相鄰基本塊的缺陷路徑,并以自定義調(diào)用方式記錄軟件程序的判斷與基本塊循環(huán)。為了使缺陷路徑迭代過程更優(yōu),采用廣度優(yōu)先的方式使缺陷路徑循環(huán)。缺陷路徑特征提取過程如下。
首先,在二進(jìn)制程序中將匯編指令集轉(zhuǎn)換為跳轉(zhuǎn)指令集,并將底層指令集進(jìn)行返回操作,在返回過程中將其劃分為多個不同的基本塊,并根據(jù)基本塊第一行代碼的數(shù)量將其由高到低進(jìn)行排序,標(biāo)記為A={a1,a2,…,ai} 。通過反匯編技術(shù)[9-10]將基本塊作為節(jié)點,基本塊之間的返回作為特征變量,構(gòu)建控制流圖G={rn,j,A,Begin,Exit|n,j<A|},G表示二進(jìn)制程序中代碼的控制流信息。
然后,提取二進(jìn)制程序中代碼特征,將第一行代碼中的底層指令轉(zhuǎn)換為條件跳轉(zhuǎn)指令,并提取特征變量。通過基本塊中的缺陷路徑提取路徑復(fù)雜度,根據(jù)出入度的頻率對基本塊進(jìn)行調(diào)用,挖掘自定義基本庫函數(shù)的基本塊數(shù)據(jù),對數(shù)據(jù)進(jìn)行靜態(tài)分析,提取自定義基本庫中的基本塊出入度[11]。
最后,采用廣度優(yōu)先方法對缺陷路徑進(jìn)行遍歷,根據(jù)基本塊的復(fù)雜度與出入度特征提取缺陷路徑特征,缺陷路徑特征包括代碼程序的匯編指令特征與底層指令特征,可以表示為:
其中,t表示基本塊的缺陷路徑特征維度。
根據(jù)以上缺陷特征提取結(jié)果,采用關(guān)聯(lián)規(guī)則方法檢測終端軟件的缺陷。在檢測過程中需要申請終端軟件的匹配權(quán)限,并將基本塊中的頻繁項進(jìn)行檢測,權(quán)限匹配程度與基本塊數(shù)量的比值能夠體現(xiàn)終端軟件缺陷的支持度,采用關(guān)聯(lián)規(guī)則算法計算終端軟件中基本塊的缺陷度,計算公式為:
其中,L表示終端軟件基本塊的缺陷度;d表示終端軟件中基本塊的數(shù)量;Nd表示基本塊與二進(jìn)制程序代碼的關(guān)聯(lián)度;Td表示終端軟件中基本塊經(jīng)過跳轉(zhuǎn)指令與相鄰基本塊的缺陷路徑[12]。
根據(jù)計算的基本塊缺陷度判斷終端軟件在缺陷檢測過程中是否存在缺陷家族,如果存在缺陷家族,需要計算軟件缺陷檢測的誤報率,選取檢測誤報閾值p,將終端軟件識別的基本塊數(shù)量進(jìn)行統(tǒng)計,并通過路徑頻繁項檢測基本塊的指令地址,采用關(guān)聯(lián)規(guī)則算法計算終端軟件缺陷檢測誤報率wFalsealarmrate為:
其中,M表示終端軟件被二進(jìn)制程序正確識別的數(shù)量;δ表示關(guān)聯(lián)規(guī)則算法中的支持系數(shù);K表示終端軟件中被識別出來的缺陷家族。
根據(jù)數(shù)據(jù)計算結(jié)果以及提取出軟件缺陷特征信息,采用關(guān)聯(lián)規(guī)則算法對終端軟件缺陷進(jìn)行檢測的流程如圖1 所示。
圖1 終端軟件缺陷檢測流程
首先,建立終端軟件缺陷訓(xùn)練樣本庫,樣本庫中包含若干個軟件缺陷家族,缺陷家族中包含大量終端軟件缺陷特征數(shù)據(jù)。采用靜態(tài)檢測方法對缺陷家族中缺陷特征數(shù)據(jù)反編譯,獲得終端軟件中的缺陷文件,并從該文件中獲得終端軟件的缺陷申請列表[13-14]。
然后,采用關(guān)聯(lián)規(guī)則方法構(gòu)建缺陷檢測模型。在關(guān)聯(lián)規(guī)則方法中引入倒排理論,可以提升終端軟件缺陷檢測的速度,迅速生成缺陷路徑中的頻繁項,通過關(guān)聯(lián)規(guī)則方法融合匯編指令集與底層指令集,根據(jù)軟件缺陷支持度挖掘候選項集的缺陷數(shù)據(jù)集,采用靜態(tài)檢測工具為檢測出的缺陷數(shù)據(jù)集提供缺陷可能值,以便識別出終端軟件中非缺陷項,降低終端軟件缺陷檢測的誤報率與漏報率。通過檢測出的缺陷數(shù)據(jù)集建立缺陷檢測模型圖,如圖2 所示。
圖2 缺陷檢測模型
通過該模型對終端軟件二進(jìn)制程序代碼進(jìn)行檢測,輸出檢測結(jié)果,并利用一級處理程序輸出Tool-i結(jié)果并生成優(yōu)化結(jié)果,在優(yōu)化過程中,根據(jù)二級處理程序標(biāo)識出終端軟件缺陷項,分析并查找軟件缺陷項的描述項,作為誤報規(guī)則,根據(jù)輸出結(jié)果將缺陷重復(fù)項與重報項進(jìn)行人工確認(rèn),并給予不同的確認(rèn)級別,當(dāng)可信度級別為1 時,表示標(biāo)識出來的重復(fù)缺陷項的優(yōu)先級別較高,此時需要對重復(fù)缺陷項進(jìn)行優(yōu)化檢測。
最后,進(jìn)行匹配檢測。與模型中重復(fù)缺陷項與描述項進(jìn)行匹配,如果匹配的程度大于檢測的程度,則終端軟件缺陷項被成功檢測出來,此時輸出檢測結(jié)果[15-16]。
為驗證該文提出的基于關(guān)聯(lián)規(guī)則的終端軟件缺陷檢測方法的有效性,選用該文提出的方法與傳統(tǒng)的基于N-gram 模型的終端軟件缺陷檢測方法和基于數(shù)據(jù)挖掘的終端軟件缺陷檢測方法進(jìn)行實驗。設(shè)置實驗參數(shù)如表1 所示。
表1 實驗參數(shù)
根據(jù)上述參數(shù),選用該文提出的檢測方法和傳統(tǒng)方法進(jìn)行檢測,為了確保實驗結(jié)果的權(quán)威性,分別對已知缺陷軟件和未知缺陷軟件進(jìn)行檢測,分析缺陷終端檢測結(jié)果的命中率,非缺陷終端軟件的誤報率。命中率計算公式為:
其中,wHitrate為檢測的命中率,T表示缺陷軟件被準(zhǔn)確識別的數(shù)目,F(xiàn)表示存在缺陷的終端軟件被錯誤識別成非缺陷軟件的數(shù)量。命中率實驗結(jié)果如圖3 所示。
圖3 命中率實驗結(jié)果
根據(jù)圖3 可知,隨著檢測樣本數(shù)量的增加,檢測命中率呈現(xiàn)下降趨勢,這種趨勢在檢測軟件未知缺陷上尤為明顯。對于軟件已知缺陷,數(shù)據(jù)挖掘檢測方法的檢測命中率最高,當(dāng)檢測樣本數(shù)量為70 個時,命中率仍然在80%以上,該文提出的檢測方法檢測命中率為70%,而基于N-gram 檢測方法的檢測命中率則降低到40%。對于軟件未知缺陷,該文提出的檢測方法檢測命中率要遠(yuǎn)遠(yuǎn)高于傳統(tǒng)檢測方法,當(dāng)檢測數(shù)量為70 個時,該文檢測方法命中率高達(dá)90%,基于N-gram 檢測方法的檢測命中率則降低到40%,數(shù)據(jù)挖掘檢測方法的檢測命中率降低到15%。
根據(jù)式(3)計算缺陷檢測的誤報率,得到的誤報率實驗結(jié)果如圖4 所示。
根據(jù)圖4 可知,對于軟件未知缺陷,三種方法的誤報率均比軟件已知缺陷的誤報率要高,但是傳統(tǒng)誤報率最高,已經(jīng)超過用戶要求,而該文提出的檢測方法誤報率始終低于5%,驗證了該文提出的檢測方法實用性更強,更適合應(yīng)用于實際工作中。
圖4 誤報率實驗結(jié)果
隨著軟件數(shù)量的增加及應(yīng)用環(huán)境的復(fù)雜,軟件缺陷逐漸暴露。為滿足終端軟件缺陷檢測的需求,并解決傳統(tǒng)軟件缺陷檢測方法出現(xiàn)的問題,提出基于關(guān)聯(lián)規(guī)則的終端軟件缺陷檢測方法,實現(xiàn)對終端軟件的缺陷檢測,該文檢測方法可有效檢測出終端軟件的缺陷,使終端軟件的運行更穩(wěn)定。