一種用于漏洞發(fā)掘的動(dòng)態(tài)符號(hào)執(zhí)行路徑搜索方法
【專利摘要】一種用于漏洞發(fā)掘的動(dòng)態(tài)符號(hào)執(zhí)行路徑搜索方法,涉及軟件測(cè)試領(lǐng)域,目的在于更快的觸發(fā)漏洞,提高大型軟件漏洞檢測(cè)的效率。該方法在使用動(dòng)態(tài)符號(hào)執(zhí)行對(duì)被測(cè)程序的可能執(zhí)行路徑進(jìn)行搜索的過(guò)程中,標(biāo)記實(shí)際執(zhí)行被測(cè)程序時(shí)觸發(fā)漏洞的路徑,對(duì)于路徑探索過(guò)程中生成的每一個(gè)新的測(cè)試用例,計(jì)算該測(cè)試用例執(zhí)行路徑與上次觸發(fā)漏洞路徑的相關(guān)度r,并以此計(jì)算該測(cè)試用例對(duì)應(yīng)執(zhí)行路徑的權(quán)重分?jǐn)?shù)score,在下次執(zhí)行測(cè)試時(shí)選擇score值最大的測(cè)試用例執(zhí)行。
【專利說(shuō)明】一種用于漏洞發(fā)掘的動(dòng)態(tài)符號(hào)執(zhí)行路徑搜索方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及軟件測(cè)試領(lǐng)域,提供了一種用于漏洞發(fā)掘的動(dòng)態(tài)符號(hào)執(zhí)行路徑搜索方法。
【背景技術(shù)】
[0002]軟件開發(fā)是一項(xiàng)腦力密集型且需要豐富編程經(jīng)驗(yàn)的一項(xiàng)工作,因此,開發(fā)一款正確性、穩(wěn)定性、安全性都符合要求的軟件非常困難。軟件測(cè)試是保證軟件可靠性和安全性的關(guān)鍵技術(shù),在軟件開發(fā)周期中占據(jù)著非常重要的地位。動(dòng)態(tài)符號(hào)執(zhí)行是目前軟件安全、軟件測(cè)試研究領(lǐng)域的熱點(diǎn)技術(shù)之一,它通過(guò)自動(dòng)生成測(cè)試用例,可以以獲取高代碼覆蓋率,被用于當(dāng)前許多主流軟件測(cè)試工具中。利用動(dòng)態(tài)符號(hào)執(zhí)行技術(shù),通過(guò)符號(hào)化的方法探索遍歷程序的所有可能執(zhí)行路徑,產(chǎn)生路徑約束,并對(duì)約束條件求解,自動(dòng)化產(chǎn)生測(cè)試用例,在理論上能夠?qū)崿F(xiàn)對(duì)被測(cè)程序全路徑的覆蓋,再輔助其他漏洞檢測(cè)技術(shù),可以全面、準(zhǔn)確地檢測(cè)程序中潛在的漏洞。
[0003]使用動(dòng)態(tài)符號(hào)執(zhí)行進(jìn)行漏洞發(fā)掘的一般過(guò)程如下:首先對(duì)分析的程序文件(可執(zhí)行文件或者字節(jié)碼文件)進(jìn)行二進(jìn)制插樁,在第一次執(zhí)行時(shí),給程序提供一個(gè)隨機(jī)的或選擇的初始輸入數(shù)據(jù),然后借助插樁代碼對(duì)輸入數(shù)據(jù)符號(hào)化,在程序執(zhí)行過(guò)程中,同時(shí)進(jìn)行符號(hào)執(zhí)行。插樁代碼會(huì)記錄符號(hào)化的變量在每個(gè)執(zhí)行路徑下的操作。在執(zhí)行過(guò)程中調(diào)用漏洞檢測(cè)模塊檢測(cè)程序中的漏洞;符號(hào)執(zhí)行在程序的條件分支語(yǔ)句處搜集符號(hào)變量的路徑分支條件(路徑約束條件)。在一次執(zhí)行完之后,根據(jù)搜集到的約束條件形成一個(gè)約束表達(dá)式,對(duì)這些表達(dá)式按照路徑搜索算法將其中某個(gè)條件取反,調(diào)用約束求解器進(jìn)行求解,從而生成新的測(cè)試用例。然后新的測(cè)試用例會(huì)沿不同路徑進(jìn)行下一次執(zhí)行過(guò)程,如果在執(zhí)行過(guò)程中檢測(cè)到漏洞,則將記錄漏洞信息并保存相應(yīng)測(cè)試用例。符號(hào)執(zhí)行過(guò)程將一直繼續(xù)直到所有可能的執(zhí)行路徑都被測(cè)試完。
[0004]漏洞發(fā)掘方式可以分為被動(dòng)式和主動(dòng)式,傳統(tǒng)的漏洞發(fā)掘方式大多都是被動(dòng)式。被動(dòng)式漏洞發(fā)掘指的是當(dāng)某個(gè)測(cè)試用例觸發(fā)了軟件漏洞,那么該軟件漏洞就被挖掘出來(lái);而主動(dòng)式漏洞發(fā)掘是指測(cè)試用例本身沒有觸發(fā)漏洞,但在執(zhí)行過(guò)程中,通過(guò)某種方法產(chǎn)生了約束,通過(guò)求解該約束,產(chǎn)生新的測(cè)試用例,而該新測(cè)試用例能夠觸發(fā)漏洞。被動(dòng)式漏洞發(fā)掘適合檢測(cè)路徑不變的漏洞,而對(duì)于路徑變化的漏洞,則需采用主動(dòng)式的檢測(cè)方式。
[0005]路徑搜索算法是動(dòng)態(tài)符號(hào)執(zhí)行過(guò)程中一個(gè)重要的組成部分,路徑搜索的目的是實(shí)現(xiàn)高的代碼覆蓋率,保證執(zhí)行過(guò)程能夠遍歷程序的所有可能執(zhí)行路徑,從而能夠全面的產(chǎn)生測(cè)試用例對(duì)程序進(jìn)行檢測(cè)。到目前為止,已出現(xiàn)很多路徑搜索方法可供選擇,如:廣度優(yōu)先搜索、代搜索、隨機(jī)搜索、元策略等算法。
[0006]但是,傳統(tǒng)的廣度優(yōu)先路徑搜索算法,沒有針對(duì)漏洞發(fā)掘進(jìn)行優(yōu)化。其他的路徑搜索算法(代搜索、隨機(jī)搜索等)主要目的是提高代碼覆蓋率,也不是針對(duì)漏洞發(fā)掘的。本發(fā)明提出了一種基于代搜索算法的路徑搜索算法優(yōu)化方法,標(biāo)記每次觸發(fā)漏洞的路徑與深度。對(duì)于每一個(gè)新的測(cè)試用例,我們計(jì)算該用例執(zhí)行路徑與上次觸發(fā)漏洞路徑的相似度r,并以此計(jì)算該路徑的權(quán)重分?jǐn)?shù)score,在下次執(zhí)行測(cè)試時(shí)選擇執(zhí)行score值最大的測(cè)試用例,以減少測(cè)試中漏洞觸發(fā)需要的時(shí)間,使測(cè)試能夠在更短的時(shí)間內(nèi)發(fā)現(xiàn)更多的漏洞。
[0007]在利用符號(hào)執(zhí)行進(jìn)行漏洞檢測(cè)時(shí),傳統(tǒng)路徑搜索算法側(cè)重于路徑搜索,是通用的高代碼覆蓋率路徑搜索算法,不是針對(duì)漏洞發(fā)掘的路徑搜索算法;同時(shí),傳統(tǒng)路徑選擇算法沒有利用觸發(fā)漏洞的路徑約束條件,路徑選擇的標(biāo)準(zhǔn)是提高代碼覆蓋率,在路徑選擇時(shí),能夠觸發(fā)漏洞的執(zhí)行路徑可能不一定能優(yōu)先得到執(zhí)行,從而使觸發(fā)漏洞的時(shí)間具有一定的隨機(jī)性,降低了測(cè)試大型軟件漏洞的效率。
【發(fā)明內(nèi)容】
[0008]本發(fā)明的目的在于在傳統(tǒng)代搜索算法的基礎(chǔ)之上,設(shè)計(jì)了一個(gè)改進(jìn)的路徑搜索方法。一個(gè)觸發(fā)漏洞路徑的兄弟路徑,是潛在的在漏洞觸發(fā)路徑。在路徑探索時(shí),記錄每次觸發(fā)漏洞的路徑,對(duì)于該路徑的兄弟路徑,在下次執(zhí)行測(cè)試時(shí)優(yōu)先選擇執(zhí)行,以便更早的對(duì)這些區(qū)域進(jìn)行測(cè)試,從而更快的觸發(fā)漏洞,提高大型軟件漏洞檢測(cè)的效率。
[0009]本發(fā)明為了實(shí)現(xiàn)上述目的采用以下技術(shù)方案:
一種用于漏洞發(fā)掘的動(dòng)態(tài)符號(hào)執(zhí)行路徑搜索算法,其特征在于:在使用動(dòng)態(tài)符號(hào)執(zhí)行對(duì)被測(cè)程序的可能執(zhí)行路徑進(jìn)行搜索的過(guò)程中,標(biāo)記實(shí)際執(zhí)行被測(cè)程序時(shí)觸發(fā)漏洞的路徑,對(duì)于路徑探索過(guò)程中生成的每一個(gè)新的測(cè)試用例,計(jì)算該測(cè)試用例執(zhí)行路徑與上次觸發(fā)漏洞路徑的相關(guān)度r,并以此計(jì)算該測(cè)試用例對(duì)應(yīng)執(zhí)行路徑的權(quán)重分?jǐn)?shù)score,在下次執(zhí)行測(cè)試時(shí)選擇score值最大的測(cè)試用例執(zhí)行。
[0010]上述技術(shù)方案中,所述的路徑搜索具體步驟為:
2-1、給出一個(gè)初始測(cè)試輸入作為測(cè)試用例;
2-2、將初始測(cè)試輸入加入符號(hào)執(zhí)行工作集,并初始化該初始測(cè)試輸入的路徑權(quán)重分?jǐn)?shù)為O ;
2-3、用初始測(cè)試輸入作為測(cè)試用例實(shí)際執(zhí)行測(cè)試程序,查看初始測(cè)試用例是否觸發(fā)漏
洞;
2-4、如果符號(hào)執(zhí)行工作集不為空,從符號(hào)執(zhí)行工作集中選擇一個(gè)路徑權(quán)重分?jǐn)?shù)最大的測(cè)試用例,如果有相同分?jǐn)?shù)的,隨機(jī)選擇;首次執(zhí)行選擇初始測(cè)試輸入;如果符號(hào)執(zhí)行工作集為空,則結(jié)束;
2-5、對(duì)選擇的測(cè)試用例進(jìn)行符號(hào)執(zhí)行,獲得新的子測(cè)試輸入集;
2-6、如果獲得的子測(cè)試輸入集不為空,從子測(cè)試輸入集中隨機(jī)選擇一個(gè)測(cè)試用例,跳轉(zhuǎn)至步驟2-7執(zhí)行;如果獲得的子測(cè)試輸入集為空則跳轉(zhuǎn)至步驟2-4 ;
2-7、對(duì)于步驟2-6選擇的測(cè)試用例,實(shí)際執(zhí)行并檢測(cè)是否觸發(fā)漏洞,并在執(zhí)行過(guò)程中對(duì)測(cè)試用例進(jìn)行路徑權(quán)重分?jǐn)?shù)計(jì)算,執(zhí)行完畢后加入到符號(hào)執(zhí)行工作集中,并從子測(cè)試輸入集中刪除,跳轉(zhuǎn)至步驟2-6。
[0011]上述技術(shù)方案中,符號(hào)執(zhí)行的過(guò)程如下:
3-1、首先將生成的子測(cè)試輸入集初始化為空集;
3-2、以步驟2-4中選擇的測(cè)試用例作為程序輸入,符號(hào)執(zhí)行該測(cè)試程序,首先獲取測(cè)試程序當(dāng)前指令,依據(jù)指令類型的不同,進(jìn)行不同的符號(hào)執(zhí)行操作,同時(shí)進(jìn)行漏洞檢測(cè),如果觸發(fā)程序漏洞,則標(biāo)記當(dāng)前程序的執(zhí)行路徑的父路徑,將從程序入口處到觸發(fā)漏洞處形成的一條程序路徑視為父路徑,記錄路徑深度,并搜集路徑約束,如果沒有觸發(fā)漏洞,則僅搜集路徑約束條件;
3-3、對(duì)于搜集到的路徑約束條件,逐一進(jìn)行約束取反;
3-4、調(diào)用求解器對(duì)約束表達(dá)式進(jìn)行求解,生成后續(xù)的測(cè)試輸入;
3-5、將后續(xù)的測(cè)試輸入加入到子測(cè)試輸入集中。
[0012]上述技術(shù)方案中,上述路徑權(quán)重分?jǐn)?shù)計(jì)算方法如下:
4-1、初始化第i個(gè)測(cè)試用例所對(duì)應(yīng)的執(zhí)行路徑權(quán)重分?jǐn)?shù)score(i)為一個(gè)初始設(shè)定值S_initial,第i 個(gè)測(cè)試用例所對(duì)應(yīng)執(zhí)行路徑的路徑深度d (i) =0,第i個(gè)測(cè)試用例對(duì)應(yīng)執(zhí)行路徑的路徑相關(guān)度r (i ) =R_max, R_max是一個(gè)初始設(shè)置的路徑最大相關(guān)度,代表某條路徑和漏洞觸發(fā)路徑的相似度,這里默認(rèn)相似度為最大值;
4-2、如果程序沒有運(yùn)行結(jié)束,獲取當(dāng)前程序的執(zhí)行指令;
4-3、如果指令為條件跳轉(zhuǎn)類指令,則判斷是否與符號(hào)執(zhí)行相關(guān),相關(guān)則將第i條路徑深度d (i)加1,再判斷該指令所屬執(zhí)行路徑是否為上次觸發(fā)漏洞路徑的父路徑(可能存在多條漏洞路徑,只要該路徑是某一條漏洞路徑的父路徑即可),如
果不是則將r(i)減1,然后計(jì)算路徑權(quán)重分?jǐn)?shù),計(jì)算公式如下:score = val_path.r(i),vul_path為預(yù)設(shè)的一個(gè)漏洞路徑權(quán)重;如果d(i)大于該路徑R.',的觸發(fā)漏洞路徑深度Αψε
Hr Ul
,執(zhí)行步驟4-2所述的當(dāng)前程序的執(zhí)行指令后跳轉(zhuǎn)至4-4,否則執(zhí)行步驟4-2所述的當(dāng)前程序的執(zhí)行指令,跳轉(zhuǎn)至4-2;
4-4、返回權(quán)重分?jǐn)?shù)score,執(zhí)行完程序后續(xù)指令。
[0013]因?yàn)楸景l(fā)明采用以上設(shè)計(jì)方案,所以具有以下有益效果:
本發(fā)明改進(jìn)的漏洞發(fā)掘動(dòng)態(tài)符號(hào)執(zhí)行路徑搜索算法,是在現(xiàn)有符號(hào)執(zhí)行路徑搜索算法的基礎(chǔ)上進(jìn)行的改進(jìn)。本發(fā)明通過(guò)在路徑探索中對(duì)觸發(fā)漏洞路徑進(jìn)行標(biāo)記,在路徑權(quán)重計(jì)算時(shí)給予上次觸發(fā)漏洞路徑的兄弟路徑一定的高權(quán)重分?jǐn)?shù),使得在路徑選擇時(shí),能夠優(yōu)先的執(zhí)行上次觸發(fā)漏洞路徑的兄弟路徑,使得漏洞存在概率大的路徑優(yōu)先執(zhí)行,從而縮短了漏洞觸發(fā)需要的時(shí)間,加快了大型軟件漏洞檢測(cè)發(fā)掘的效率。
【專利附圖】
【附圖說(shuō)明】
[0014]圖1為本發(fā)明的搜索算法執(zhí)行流程圖;
圖2為本發(fā)明的評(píng)分算法流程圖;
圖3為本發(fā)明的方案實(shí)例流程圖。
【具體實(shí)施方式】
[0015]本實(shí)施案例詳細(xì)講述了一種實(shí)現(xiàn)本發(fā)明的方式,但本發(fā)明的保護(hù)范圍不僅僅局限于采用這種方式,凡是采用本發(fā)明思想的實(shí)施方式都在本發(fā)明的保護(hù)范圍內(nèi)。
[0016]二進(jìn)制插樁模塊
本模塊是對(duì)被測(cè)程序進(jìn)行運(yùn)行時(shí)動(dòng)態(tài)二進(jìn)制插樁。在動(dòng)態(tài)符號(hào)執(zhí)行過(guò)程中,通過(guò)對(duì)被測(cè)程序插樁,來(lái)追蹤符號(hào)的操作和傳播過(guò)程,并在分支語(yǔ)句處收集路徑約束條件。目前成熟的二進(jìn)制插樁工具有 Dyninst、DynamoRIO、Valgrind、PIN、PEBIL、HDTrans, LLVM 等,本實(shí)施案例使用PIN工具。
[0017]漏洞發(fā)掘模塊
本模塊中,混合主動(dòng)式和被動(dòng)式漏洞檢測(cè)方式,使用被動(dòng)式漏洞檢測(cè)模塊檢測(cè)程序中路徑不變的程序漏洞,使用主動(dòng)式漏洞檢測(cè)模塊檢測(cè)執(zhí)行路徑可變的程序漏洞。在漏洞檢測(cè)過(guò)程中,我們?cè)诼窂綏l件搜集時(shí)標(biāo)記觸發(fā)漏洞的路徑條件和執(zhí)行路徑,這個(gè)標(biāo)記用于對(duì)其兄弟路徑對(duì)應(yīng)測(cè)試輸入的權(quán)重計(jì)算。
[0018]約束否定模塊
本模塊的功能是將在路徑探索過(guò)程中獲取的路徑約束條件形成的約束表達(dá)式進(jìn)行取反操作。取反后形成的條件表達(dá)式構(gòu)成一個(gè)新的路徑約束。取反過(guò)程為:每次對(duì)一個(gè)條件表達(dá)式取反,通過(guò)求解器進(jìn)行求解,再產(chǎn)生新的測(cè)試用例,然后繼續(xù)符號(hào)執(zhí)行?;蛘呦葘?duì)所有條件表達(dá)式進(jìn)行求解,再選擇其中一個(gè)求解結(jié)果進(jìn)行符號(hào)執(zhí)行。
[0019]混合執(zhí)行模塊(符號(hào)執(zhí)行和實(shí)際執(zhí)行)
本模塊是動(dòng)態(tài)符號(hào)執(zhí)行的一個(gè)主要模塊,將會(huì)運(yùn)行檢測(cè)程序,并且同時(shí)進(jìn)行符號(hào)執(zhí)行過(guò)程,在運(yùn)行過(guò)程中,使用漏洞檢測(cè)模塊進(jìn)行主動(dòng)式和被動(dòng)式地漏洞發(fā)掘工作。第一次運(yùn)行時(shí),我們使用的輸入是測(cè)試人員提供的輸入數(shù)據(jù),以后運(yùn)行則是根據(jù)第一次的運(yùn)行產(chǎn)生的測(cè)試用例繼續(xù)驅(qū)動(dòng)符號(hào)執(zhí)行過(guò)程,自動(dòng)化地測(cè)試程序所有的可能執(zhí)行路徑。
[0020]符號(hào)執(zhí)行過(guò)程中,會(huì)將新的輸入符號(hào)化,加入符號(hào)執(zhí)行過(guò)程,跟蹤其傳播以及在分支跳轉(zhuǎn)語(yǔ)句處形成的路徑條件約束。
[0021]在符號(hào)執(zhí)行路徑條件計(jì)算時(shí),根據(jù)路徑是否有已檢測(cè)漏洞標(biāo)記,對(duì)其進(jìn)行權(quán)重計(jì)算。并且在下次執(zhí)行時(shí),選擇權(quán)重最大的路徑進(jìn)行符號(hào)執(zhí)行。
[0022]求解器求解模塊
約束求解器模塊,是對(duì)符號(hào)執(zhí)行過(guò)程中形成的路徑條件約束表達(dá)式進(jìn)行求解,通過(guò)求解結(jié)果,產(chǎn)生新的測(cè)試用例,從而驅(qū)動(dòng)符號(hào)執(zhí)行過(guò)程。路徑約束條件是由不同條件表達(dá)式組成的,約束求解過(guò)程就是給出一組滿足該條件表達(dá)式的解,即具體值。本案例我們采用STP求解器。
[0023]本實(shí)施案例的流程圖見附圖3。
【權(quán)利要求】
1.一種用于漏洞發(fā)掘的動(dòng)態(tài)符號(hào)執(zhí)行路徑搜索算法,其特征在于:在使用動(dòng)態(tài)符號(hào)執(zhí)行對(duì)被測(cè)程序的可能執(zhí)行路徑進(jìn)行搜索的過(guò)程中,標(biāo)記實(shí)際執(zhí)行被測(cè)程序時(shí)觸發(fā)漏洞的路徑,對(duì)于路徑探索過(guò)程中生成的每一個(gè)新的測(cè)試用例,計(jì)算該測(cè)試用例執(zhí)行路徑與上次觸發(fā)漏洞路徑的相關(guān)度r,并以此計(jì)算該測(cè)試用例對(duì)應(yīng)執(zhí)行路徑的權(quán)重分?jǐn)?shù)score,在下次執(zhí)行測(cè)試時(shí)選擇score值最大的測(cè)試用例執(zhí)行。
2.根據(jù)權(quán)利要求1所述的一種用于漏洞發(fā)掘的動(dòng)態(tài)符號(hào)執(zhí)行路徑搜索算法,其特征在于:所述的路徑搜索具體步驟為: 2-1、給出一個(gè)初始測(cè)試輸入作為測(cè)試用例; 2-2、將初始測(cè)試輸入加入符號(hào)執(zhí)行工作集,并初始化該初始測(cè)試輸入的路徑權(quán)重分?jǐn)?shù)為O ; 2-3、用初始測(cè)試輸入作為測(cè)試用例實(shí)際執(zhí)行測(cè)試程序,查看初始測(cè)試用例是否觸發(fā)漏洞; 2-4、如果符號(hào)執(zhí)行工作集不為空,從符號(hào)執(zhí)行工作集中選擇一個(gè)路徑權(quán)重分?jǐn)?shù)最大的測(cè)試用例,如果有相同分?jǐn)?shù)的,隨機(jī)選擇;首次執(zhí)行選擇初始測(cè)試輸入;如果符號(hào)執(zhí)行工作集為空,則結(jié)束; 2-5、對(duì)選擇的測(cè)試用例進(jìn)行符號(hào)執(zhí)行,獲得新的子測(cè)試輸入集; 2-6、如果獲得的子測(cè)試 輸入集不為空,從子測(cè)試輸入集中隨機(jī)選擇一個(gè)測(cè)試用例,跳轉(zhuǎn)至步驟2-7執(zhí)行;如果獲得的子測(cè)試輸入集為空則跳轉(zhuǎn)至步驟2-4 ; 2-7、對(duì)于步驟2-6選擇的測(cè)試用例,實(shí)際執(zhí)行并檢測(cè)是否觸發(fā)漏洞,并在執(zhí)行過(guò)程中對(duì)測(cè)試用例進(jìn)行路徑權(quán)重分?jǐn)?shù)計(jì)算,執(zhí)行完畢后加入到符號(hào)執(zhí)行工作集中,并從子測(cè)試輸入集中刪除,跳轉(zhuǎn)至步驟2-6。
3.根據(jù)權(quán)利要求1所述的一種用于漏洞發(fā)掘的動(dòng)態(tài)符號(hào)執(zhí)行路徑搜索算法,其特征在于,符號(hào)執(zhí)行的過(guò)程如下: 3-1、首先將生成的子測(cè)試輸入集初始化為空集; 3-2、以步驟2-4中選擇的測(cè)試用例作為程序輸入,符號(hào)執(zhí)行該測(cè)試程序,首先獲取測(cè)試程序當(dāng)前指令,依據(jù)指令類型的不同,進(jìn)行不同的符號(hào)執(zhí)行操作,同時(shí)進(jìn)行漏洞檢測(cè),如果觸發(fā)程序漏洞,則標(biāo)記當(dāng)前程序的執(zhí)行路徑的父路徑,將從程序入口處到觸發(fā)漏洞處形成的一條程序路徑視為父路徑,記錄路徑深度,并搜集路徑約束,如果沒有觸發(fā)漏洞,則僅搜集路徑約束條件; 3-3、對(duì)于搜集到的路徑約束條件,逐一進(jìn)行約束取反; 3-4、調(diào)用求解器對(duì)約束表達(dá)式進(jìn)行求解,生成后續(xù)的測(cè)試輸入; 3-5、將后續(xù)的測(cè)試輸入加入到子測(cè)試輸入集中。
4.根據(jù)權(quán)利要求1所述的一種用于漏洞發(fā)掘的動(dòng)態(tài)符號(hào)執(zhí)行路徑搜索算法,其特征在于:上述路徑權(quán)重分?jǐn)?shù)計(jì)算方法如下: 4-1、初始化第i個(gè)測(cè)試用例所對(duì)應(yīng)的執(zhí)行路徑權(quán)重分?jǐn)?shù)score(i)為一個(gè)初始設(shè)定值S_initial=0,第i個(gè)測(cè)試用例所對(duì)應(yīng)執(zhí)行路徑的路徑深度d (i) =0,第i個(gè)測(cè)試用例對(duì)應(yīng)執(zhí)行路徑的路徑相關(guān)度r (i) =R_max, R_max是一個(gè)初始設(shè)置的路徑最大相關(guān)度,代表某條路徑和漏洞觸發(fā)路徑的相似度,這里默認(rèn)相似度為最大值; 4-2、如果程序沒有運(yùn)行結(jié)束,獲取當(dāng)前程序的執(zhí)行指令;4-3、如果指令為條件跳轉(zhuǎn)類指令,則判斷是否與符號(hào)執(zhí)行相關(guān),相關(guān)則將第i條路徑深度d (i)加1,再判斷該指令所屬執(zhí)行路徑是否為上次觸發(fā)漏洞路徑 的父路徑(可能存在多條漏洞路徑,只要該路徑是某一條漏洞路徑的父路徑即可),如果不是則將r(i)減I,然后計(jì)算路徑權(quán)重分?jǐn)?shù),計(jì)算公式如下:soore = ¥al_patli.r(i),vul_path為預(yù)設(shè)的一個(gè)漏洞路徑權(quán)重;如果d (i)大于該路徑P-的觸發(fā)漏洞路徑深度depths,執(zhí)行步驟4-2所述的當(dāng)前程序的執(zhí)行指令后跳轉(zhuǎn)至4-4,否則執(zhí)行步驟4_2所述的當(dāng)前程序的執(zhí)行指令,跳轉(zhuǎn)至4-2 ; 4-4、返回權(quán)重分?jǐn)?shù)sc ore,執(zhí)行完程序后續(xù)指令。
【文檔編號(hào)】G06F11/36GK104008053SQ201410230479
【公開日】2014年8月27日 申請(qǐng)日期:2014年5月28日 優(yōu)先權(quán)日:2014年5月28日
【發(fā)明者】張小松, 黃金, 牛偉納, 陳瑞東, 王東, 徐浩然, 白金, 賴特, 李金栓, 于洲 申請(qǐng)人:電子科技大學(xué)