本發(fā)明屬于網(wǎng)絡(luò)安全,尤其涉及一種基于得分矩陣的高效模糊測(cè)試方法。
背景技術(shù):
1、現(xiàn)有的定向模糊測(cè)試方法(如aflgo)作為發(fā)現(xiàn)軟件應(yīng)用程序的潛在漏洞和安全重要問題的一種自動(dòng)化測(cè)試方法,在fuzzing的前期,因?yàn)樘剿鞯降穆窂接邢蓿藭r(shí)離目標(biāo)點(diǎn)的距離可能還很遠(yuǎn),此時(shí)重點(diǎn)在探索,即盡可能擴(kuò)大覆蓋率,當(dāng)覆蓋率到一定程度時(shí),再利用距離較近的seed來變異,以此快速覆蓋到使用者期望到達(dá)的目標(biāo)點(diǎn)。
2、aflgo在進(jìn)行定向模糊測(cè)試時(shí)。首先,編譯源碼,得到待fuzz程序的控制流圖(controlflowgraph,cfg)和函數(shù)調(diào)用圖(callgraph,cg)。這一步由afl中的llvmpass完成。
3、其次,通過cfg和cg,以及給定的target,計(jì)算所有的基本塊(basicblock,bb)到target所在的基本塊的距離。這一步由python腳本完成。
4、然后,再編譯一次源碼,對(duì)程序進(jìn)行插樁,除了afl原有的插樁邏輯外,添加向指定地址增加每個(gè)基本塊距離的指令,即指定一個(gè)共享內(nèi)存地址為記錄distance的變量,在基本塊中插樁,插入如下指令:distance+=current_bb_distance,向distance變量增加當(dāng)前基本塊的距離。
5、最后是fuzzing部分的邏輯,根據(jù)插樁反饋的信息,aflgo可以在每一個(gè)測(cè)試用例作為輸入給程序執(zhí)行的時(shí)候得到這個(gè)測(cè)試用例對(duì)應(yīng)的distance,也就是測(cè)試用例執(zhí)行路徑距離目標(biāo)點(diǎn)的距離,然后根據(jù)距離對(duì)測(cè)試用例進(jìn)行打分,這個(gè)打分的算法就是模擬退火算法,距離越近,打分越高,測(cè)試用例得到變異的機(jī)會(huì)越多。
6、當(dāng)前定向模糊測(cè)試方法(如aflgo)作為發(fā)現(xiàn)軟件應(yīng)用程序的潛在漏洞和安全重要問題的一種自動(dòng)化測(cè)試方法,使用代碼覆蓋率反饋生成輸入引導(dǎo)定向模糊器探索大多數(shù)不相關(guān)的代碼,通過訪問這些代碼,定向模糊器在達(dá)到目標(biāo)或觸發(fā)指定漏洞方面幾乎沒有任何進(jìn)展,而且這種路徑探索策略會(huì)導(dǎo)致模糊測(cè)試工具浪費(fèi)大量精力探索不相關(guān)的代碼,從而嚴(yán)重限制定向模糊器的性能,導(dǎo)致模糊器需要包括cpu時(shí)間和內(nèi)存在內(nèi)的大量的計(jì)算資源,這使得它們無法大規(guī)模應(yīng)用于待測(cè)軟件系統(tǒng)的安全性檢測(cè)工作中去。
技術(shù)實(shí)現(xiàn)思路
1、為解決上述問題,本發(fā)明提供一種基于得分矩陣的高效模糊測(cè)試方法,實(shí)現(xiàn)了對(duì)待測(cè)軟件精確識(shí)別定向模糊器應(yīng)該探索的相關(guān)代碼
2、一種基于得分矩陣的高效模糊測(cè)試方法,包括以下步驟:
3、s1:對(duì)待測(cè)服務(wù)軟件的程序代碼進(jìn)行分塊,得到多個(gè)基本塊,同時(shí)從各基本塊中篩選出目標(biāo)基本塊,其余作為普通基本塊;
4、s2:獲取各基本塊對(duì)應(yīng)的塊距離;
5、s3:根據(jù)各普通基本塊對(duì)應(yīng)的塊距離獲取各普通基本塊相對(duì)于各目標(biāo)基本塊的塊得分;
6、s4:對(duì)于每一個(gè)普通基本塊,將其對(duì)應(yīng)于所有目標(biāo)基本塊的塊得分的平均值作為自身最終對(duì)應(yīng)的塊得分;
7、s5:選擇塊得分大于0的普通基本塊進(jìn)行插樁操作,得到插樁后的待測(cè)服務(wù)軟件的程序代碼;
8、s6:根據(jù)插樁后的待測(cè)服務(wù)軟件的程序代碼構(gòu)建包含各普通基本塊的塊得分以及被插樁的普通基本塊的位置信息的基本塊標(biāo)定圖譜;
9、s7:在插樁后的待測(cè)服務(wù)軟件的程序代碼中的關(guān)鍵位置插入設(shè)定的代碼片段,得到待測(cè)代碼;所述關(guān)鍵位置需滿足漏洞特征庫中的任一漏洞特征;
10、s8:隨機(jī)生成測(cè)試用例,然后將測(cè)試用例輸入待測(cè)代碼,根據(jù)基本塊標(biāo)定圖譜識(shí)別出測(cè)試用例在待測(cè)代碼的執(zhí)行過程中所涉及的被插樁普通基本塊;
11、s9:根據(jù)識(shí)別出來的被插樁普通基本塊對(duì)應(yīng)的塊得分對(duì)當(dāng)前測(cè)試用例進(jìn)行評(píng)分,得到分?jǐn)?shù)a;同時(shí),根據(jù)當(dāng)前測(cè)試用例是否引起待測(cè)代碼的關(guān)鍵變量發(fā)生變化對(duì)當(dāng)前測(cè)試用例進(jìn)行評(píng)分,得到分?jǐn)?shù)b;將分?jǐn)?shù)a和分?jǐn)?shù)b加權(quán)求和,得到當(dāng)前測(cè)試用例的最終得分;
12、s10:判斷當(dāng)前時(shí)刻是否達(dá)到設(shè)定的循環(huán)時(shí)間,若為否,則進(jìn)入步驟s11,若為是,結(jié)束循環(huán);
13、s11:判斷當(dāng)前測(cè)試用例是否觸發(fā)任一普通基本塊到達(dá)任一目標(biāo)基本塊的新路徑或者觸發(fā)待測(cè)代碼中的漏洞,若為是,則將當(dāng)前測(cè)試用例存入種子池,并為當(dāng)前測(cè)試用例設(shè)定一個(gè)變異概率,進(jìn)入步驟s12;若為否,則丟棄當(dāng)前測(cè)試用例,進(jìn)入步驟s12;
14、s12:判斷種子池是否為空,若為是,則隨機(jī)生成新的測(cè)試用例重新執(zhí)行s8~s11;若為否,根據(jù)種子池中各測(cè)試用例對(duì)應(yīng)的最終得分和變異概率選擇出一個(gè)測(cè)試用例來進(jìn)行變異,并將變異后的測(cè)試用例重新執(zhí)行步驟s8~s11,直到達(dá)到設(shè)定的循環(huán)時(shí)間。
15、進(jìn)一步地,步驟s3中各普通基本塊相對(duì)于各目標(biāo)基本塊的塊得分的獲取方法如下:
16、依次將每一個(gè)普通基本塊作為當(dāng)前普通基本塊、每一個(gè)目標(biāo)基本塊作為當(dāng)前普通基本塊執(zhí)行以下步驟:
17、s31:獲取當(dāng)前普通基本塊到當(dāng)前目標(biāo)基本塊之間的所有可能路徑,并根據(jù)每一條可能路徑上包含的普通基本塊是否具有分支語句將所有可能路徑劃分為分支路徑和非分支路徑;其中,對(duì)于分支路徑,每一條分支路徑均執(zhí)行塊得分獲取操作,對(duì)于非分支路徑,選擇其中距離最短的非分支路徑執(zhí)行塊得分獲取操作;其中,所述塊得分獲取操作為:
18、獲取當(dāng)前路徑上,位于當(dāng)前普通基本塊bj與目標(biāo)基本塊之間的后續(xù)基本塊,并將后續(xù)基本塊的數(shù)量記為n;
19、將各后續(xù)基本塊對(duì)應(yīng)的塊距離代入如下公式,得到當(dāng)前普通基本塊bj在當(dāng)前路徑上的塊得分:
20、
21、其中,t(bj)為當(dāng)前普通基本塊bj在當(dāng)前路徑上的塊得分,d(i)為當(dāng)前普通基本塊bj的第i個(gè)后續(xù)基本塊對(duì)應(yīng)的塊距離,fi(bj)為當(dāng)前普通基本塊bj到達(dá)其第i個(gè)后續(xù)基本塊的到達(dá)概率,ε為設(shè)定的懲罰項(xiàng);
22、s32:將當(dāng)前普通基本塊在所有分支路徑上的塊得分求均值后,再將得到的均值與距離最短的非分支路徑上的塊得分求均值,將最終得到的均值作為當(dāng)前普通基本塊相對(duì)于當(dāng)前目標(biāo)基本塊的塊得分。
23、進(jìn)一步地,步驟s2中各基本塊對(duì)應(yīng)的塊距離的獲取方法為:
24、令每一個(gè)基本塊作為當(dāng)前基本塊執(zhí)行以下操作:獲取當(dāng)前基本塊到達(dá)各個(gè)目標(biāo)基本塊的到達(dá)概率,將各個(gè)到達(dá)概率的倒數(shù)的平均值作為當(dāng)前基本塊對(duì)應(yīng)的塊距離;其中,若當(dāng)前基本塊為目標(biāo)基本塊,則當(dāng)前基本塊到達(dá)自身所屬的目標(biāo)基本塊的概率為1。
25、進(jìn)一步地,在循環(huán)執(zhí)行步驟s8~s12的過程中,如果任一測(cè)試用例輸入待測(cè)代碼后,待測(cè)代碼出現(xiàn)了崩潰,表明當(dāng)前測(cè)試用例觸發(fā)了待測(cè)代碼中的漏洞;同時(shí),待測(cè)代碼出現(xiàn)崩潰后,自動(dòng)重啟待測(cè)代碼繼續(xù)循環(huán)執(zhí)行步驟s8~s10。
26、進(jìn)一步地,步驟s7中的漏洞特征庫的構(gòu)建方法為:
27、在公開數(shù)據(jù)中收集與被測(cè)服務(wù)軟件相關(guān)的漏洞特征;
28、讀取被測(cè)服務(wù)軟件的源碼,手動(dòng)提取漏洞特征;
29、將收集得到的漏洞特征和手動(dòng)提取的漏洞特征構(gòu)建為漏洞特征庫。
30、進(jìn)一步地,步驟s7中插入的設(shè)定代碼片段為能夠檢測(cè)出關(guān)鍵位置處的關(guān)鍵變量是否發(fā)生預(yù)期變化的代碼;其中,關(guān)鍵變量為與漏洞相關(guān)且能夠觸發(fā)漏洞的變量,關(guān)鍵位置為關(guān)鍵變量所在的基本塊。
31、進(jìn)一步地,步驟s9中的分?jǐn)?shù)a的權(quán)重高于分?jǐn)?shù)b的權(quán)重。
32、有益效果:
33、1、本發(fā)明提供一種基于得分矩陣的高效模糊測(cè)試方法,僅對(duì)塊得分大于0的普通基本塊進(jìn)行插樁操作,相當(dāng)于通過剪枝的方式刪除到達(dá)概率為0的分支,這可以防止本發(fā)明的模糊測(cè)試生成新的不相關(guān)測(cè)試用例輸入;由此可見,本發(fā)明通過這種優(yōu)化方式避免本發(fā)明的模糊測(cè)試工具朝著不相關(guān)代碼的路徑進(jìn)行探索;同時(shí),本發(fā)明種子池中的測(cè)試用例均可觸發(fā)可到達(dá)目標(biāo)基本塊的新路徑或觸發(fā)待測(cè)試代碼中的漏洞,則本發(fā)明根據(jù)種子池中各測(cè)試用例對(duì)應(yīng)的最終得分和變異概率選擇出一個(gè)測(cè)試用例來進(jìn)行變異,并根據(jù)變異后的測(cè)試用例繼續(xù)對(duì)待測(cè)代碼進(jìn)行漏洞測(cè)試,能夠使得測(cè)試用例盡可能走高分路徑到達(dá)目標(biāo)基本快,提高了對(duì)待測(cè)軟件的漏洞挖掘效率。
34、2、本發(fā)明提供一種基于得分矩陣的高效模糊測(cè)試方法,對(duì)于非分支路徑,選擇其中距離最短的非分支路徑執(zhí)行塊得分獲取操作,可以更好地反映到達(dá)目標(biāo)基本塊的進(jìn)度并得到基本塊到達(dá)概率矩陣。
35、3、本發(fā)明提供一種基于得分矩陣的高效模糊測(cè)試方法,認(rèn)為在塊得分分?jǐn)?shù)越高的基本塊上挖掘到的漏洞可能性更高,因此,本發(fā)明設(shè)計(jì)的得分運(yùn)算對(duì)大數(shù)不敏感,為無法到達(dá)目標(biāo)基本塊的某后續(xù)基本塊設(shè)定較重的懲罰項(xiàng),可有效引導(dǎo)本發(fā)明挖掘到更多元匹配目標(biāo)基本塊的基本塊,而不是某個(gè)后續(xù)基本塊概率更高的基本塊,從而更容易挖掘在目標(biāo)基本塊上挖掘出漏洞。