一種靜態(tài)分析輔助的符號執(zhí)行漏洞檢測方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及軟件漏洞的識別和檢測,特別涉及一種基于靜態(tài)程序分析、對待檢測軟件進(jìn)行符號執(zhí)行實施軟件漏洞識別和檢測的方法。
【背景技術(shù)】
[0002]軟件漏洞是一種程序錯誤,通過利用該錯誤,攻擊者可以潛在地違反受害者計算機系統(tǒng)的安全策略。隨著軟件規(guī)模的不斷增加與應(yīng)用范圍的不斷擴(kuò)大,軟件漏洞對人們生活與工作的危害也不斷增強。因此,如何高效地檢測并驗證軟件漏洞成為軟件開發(fā)與測試人員的關(guān)注焦點。符號執(zhí)行技術(shù)是常用的漏洞檢測技術(shù),可以遍歷整個目標(biāo)程序并為每條程序路徑產(chǎn)生一個測試樣例以驗證路徑的可達(dá)性及安全性。但是,符號執(zhí)行會在漏洞無關(guān)的路徑上浪費大量的計算時間和資源,限制了漏洞檢測的效率。而且,在計算時間或者資源有限的情況下,對漏洞無關(guān)路徑的探索也會降低漏洞檢測的精度,使漏報率增加。
[0003]為此,本發(fā)明提出了一種靜態(tài)分析輔助的符號執(zhí)行漏洞檢測方法。首先,對目標(biāo)程序進(jìn)行快速、高效的靜態(tài)分析,獲得漏洞相關(guān)的程序控制流信息;之后,使用獲得的控制流信息輔助符號執(zhí)行漏洞檢測以降低符號執(zhí)行漏洞檢測的時間與空間開銷,提高漏洞檢測的效率。本發(fā)明通過將靜態(tài)程序分析與符號執(zhí)行技術(shù)相結(jié)合,提高了漏洞檢測效率與精度,在時間和資源有限的情況下,能夠檢測到更多的漏洞。
【發(fā)明內(nèi)容】
[0004]本發(fā)明目的是,為了能夠高效快速地檢測并驗證軟件漏洞,提供了一種靜態(tài)分析輔助的符號執(zhí)行漏洞檢測方法。通過靜態(tài)分析快速獲得漏洞相關(guān)的控制流信息并對程序分支按照后續(xù)子程序中的漏洞相關(guān)路徑占總路徑的比例進(jìn)行打分;在之后符號執(zhí)行過程中,使用靜態(tài)分析得到的控制流信息將符號執(zhí)行過程約束在漏洞相關(guān)路徑上,并按照靜態(tài)分析得到的分支打分優(yōu)先分析漏洞相關(guān)路徑比例更高的程序分支。通過該方法減少浪費在漏洞無關(guān)路徑上的計算時間和資源,提高符號執(zhí)行漏洞檢測的效率,進(jìn)一步地,在時間和資源有限的情況下,檢測到更多的漏洞。
[0005]為實現(xiàn)上述目的,本發(fā)明采取如下技術(shù)方案:一種靜態(tài)分析輔助的符號執(zhí)行漏洞檢測方法,包括輕量級符號執(zhí)行、圖生成、靜態(tài)分析和符號執(zhí)行等階段;
[0006]I)輕量級符號執(zhí)行階段,使用KLEE符號執(zhí)行工具以簡單的符號化策略在很小的時間開銷下對目標(biāo)程序字節(jié)碼文件進(jìn)行符號執(zhí)行以獲得完成鏈接過程后的完整程序的字節(jié)碼;輕量級符號執(zhí)行過程使用符號執(zhí)行工具KLEE對目標(biāo)程序字節(jié)碼進(jìn)行符號執(zhí)行得到鏈接后的完整程序字節(jié)碼,符號化策略為:-sym-args I I 2,即I個長度為I個字節(jié)的符號作為程序輸入;
[0007]2)圖生成階段,在完整程序的字節(jié)碼的基礎(chǔ)上,通過使用LLVM 3.1工具集中的opt工具生成完整程序的函數(shù)調(diào)用圖與各個函數(shù)的控制流圖;生成的函數(shù)調(diào)用圖中包括兩類語句:函數(shù)描述語句與函數(shù)調(diào)用關(guān)系描述語句;函數(shù)描述語句中包括了函數(shù)調(diào)用圖中出現(xiàn)的所有函數(shù)的函數(shù)名與函數(shù)編號;函數(shù)調(diào)用關(guān)系描述語句則描述了所有函數(shù)之間的調(diào)用關(guān)系;函數(shù)的控制流圖中包含兩類語句:基本塊描述語句與基本塊間關(guān)系描述語句;基本塊描述語句描述了函數(shù)中每個基本塊的基本塊編號,基本塊標(biāo)簽和基本塊包含的指令,特別地,如果該基本塊的最后一條語句是條件分支指令,基本塊描述語句中還會包含跳轉(zhuǎn)到各個分支的條件取值;基本塊間關(guān)系描述語句則描述了所有基本塊之間的前驅(qū)與后繼關(guān)系;
[0008]3)靜態(tài)分析階段,以完整程序的函數(shù)調(diào)用圖、各個函數(shù)的控制流圖以及配置文件作為輸入,通過程序模塊預(yù)處理、敏感相關(guān)函數(shù)和敏感導(dǎo)向函數(shù)識別、有效跳轉(zhuǎn)收集與分支打分四個過程對程序進(jìn)行靜態(tài)分析,定位敏感函數(shù)位置,收集程序分支語句中能夠?qū)蛎舾胁僮鞯挠行D(zhuǎn)并以后續(xù)子程序中敏感操作相關(guān)路徑占總路徑的比例為標(biāo)準(zhǔn)對程序分支進(jìn)行打分,得到有效跳轉(zhuǎn)表與分支打分表;其中,函數(shù)識別過程包含兩個子過程:敏感相關(guān)函數(shù)識別與敏感導(dǎo)向函數(shù)識別;
[0009]4)符號執(zhí)行等階段,使用有效跳轉(zhuǎn)表與分支打分表輔助漏洞檢測符號執(zhí)行,輸入為目標(biāo)程序的字節(jié)碼文件、配置文件以及靜態(tài)分析階段得到的有效跳轉(zhuǎn)表和分支打分表;在具體實施中,符號執(zhí)行部分在KLEE符號執(zhí)行工具的基礎(chǔ)上在指令執(zhí)行過程中添加了靜態(tài)輔助方法并增加了基于后續(xù)子程序中敏感操作相關(guān)路徑比例的分支選擇過程;當(dāng)檢測到敏感操作時,使用約束求解器STP求解當(dāng)前執(zhí)行環(huán)境下敏感操作能否違反安全約束,如果有解,則表示該敏感操作是可利用的安全漏洞,返回對應(yīng)的測試樣例給用戶;
[0010]5)本方法的關(guān)鍵操作如下:
[0011](I)程序模塊預(yù)處理,通過分析目標(biāo)程序的函數(shù)調(diào)用圖和各個函數(shù)的控制流圖對靜態(tài)分析階段的程序模塊進(jìn)行預(yù)處理,為靜態(tài)分析中的后續(xù)過程提供分析的對象;
[0012](2)敏感相關(guān)函數(shù)識別,將所有包含敏感操作的函數(shù)標(biāo)記為敏感相關(guān)函數(shù),并將所有調(diào)用敏感相關(guān)函數(shù)的函數(shù)標(biāo)記為敏感相關(guān)函數(shù);
[0013](3)敏感導(dǎo)向函數(shù)識別,將所有在執(zhí)行完成返回后依然存在敏感操作或敏感相關(guān)函數(shù)調(diào)用操作的函數(shù)標(biāo)記為敏感導(dǎo)向函數(shù);
[0014](4)有效跳轉(zhuǎn)收集,在敏感相關(guān)且非敏感導(dǎo)向的函數(shù)中收集能夠?qū)蛎舾胁僮鞯姆种l件取值到有效跳轉(zhuǎn)表中;
[0015](5)分支打分,按照后續(xù)子程序中敏感操作相關(guān)路徑占總路徑的比例對程序中的每個分支進(jìn)行打分,將分?jǐn)?shù)記錄在分支打分表中;
[0016](6)漏洞檢測符號執(zhí)行,使用有效跳轉(zhuǎn)和分支打分輔助符號執(zhí)行,探索敏感操作相關(guān)路徑檢測敏感操作是否能夠違反安全約束,并優(yōu)先探索敏感操作相關(guān)路徑比例高的程序分支;
[0017]6)在符號執(zhí)行工具KLEE的基礎(chǔ)上修改了指令執(zhí)行部分,添加了基于敏感操作相關(guān)路徑比例的分支選擇部分;在指令執(zhí)行部分,通過有效跳轉(zhuǎn)表將符號執(zhí)行過程限制在敏感操作相關(guān)路徑范圍內(nèi),并對敏感操作按照配置文件中的安全約束進(jìn)行檢查,如果在執(zhí)行環(huán)境下敏感操作能夠違反安全約束,則表示該敏感操作是可利用的安全漏洞,返回對應(yīng)的測試樣例給用戶;在分支選擇部分,以分支打分表中各個分支的分?jǐn)?shù)為標(biāo)準(zhǔn),選擇敏感操作相關(guān)路徑比例最高的分支作為下一次符號執(zhí)行路徑探索的目標(biāo),進(jìn)一步加快探索敏感操作的速度。
[0018]程序模塊預(yù)處理流程:以完整程序的函數(shù)調(diào)用圖和控制流圖為輸入,預(yù)處理靜態(tài)分析中的程序模塊,靜態(tài)分析中后續(xù)的函數(shù)識別、有效跳轉(zhuǎn)收集和分支打分都是在程序模塊的基礎(chǔ)上分析得到的;使用程序模塊來表示當(dāng)前正在靜態(tài)分析的程序;程序模塊中包括如下數(shù)據(jù)結(jié)構(gòu):函數(shù)鏈表,以鏈表的形式存儲了該程序模塊中所有函數(shù)的指針;敏感相關(guān)函數(shù)鏈表,以鏈表的形式存儲了程序模塊中所有被標(biāo)記為敏感相關(guān)的函數(shù)的指針;敏感導(dǎo)向函數(shù)鏈表,以鏈表的形式存儲了程序模塊中所有被標(biāo)記為敏感導(dǎo)向的函數(shù)的指針;有效跳轉(zhuǎn)表,以集合的形式存儲了函數(shù)模塊中的有效跳轉(zhuǎn),集合中的元組〈funct1n, instruct1n, condit1n)表不指令 instruct1n 是函數(shù) funct1n 中的分支指令,且如果分支條件取值為condit1n就能夠?qū)蛎舾胁僮?;分支分?jǐn)?shù)表,以哈希表的形式存儲了程序模塊中分支的分?jǐn)?shù),表中元組〈funct1n, instruct1n, score〉表示指令instruct1n是函數(shù)funct1n中某個基本塊的起始指令且以該指令為起始指令的分支分?jǐn)?shù)為score ;目標(biāo)操作集合,以集合的形式存儲檢測過程中的目標(biāo)操作;敏感操作及安全約束表,以哈希表的形式存儲用戶定義的敏感操作和每個敏感操作對應(yīng)的安全約束,如果在所處的執(zhí)行環(huán)境下敏感操作能夠違反安全約束,則該敏感操作被認(rèn)為是可觸發(fā)的程序漏洞;對于程序模塊中的函數(shù),包含如下數(shù)據(jù)結(jié)構(gòu):函數(shù)名;函數(shù)編號;調(diào)用者函數(shù)鏈表,以鏈表的形式存儲所有調(diào)用該函數(shù)的函數(shù)指針;調(diào)用函數(shù)鏈表,以鏈表的形式存儲所有被該函數(shù)調(diào)用的函數(shù)的指針;基本塊鏈表,以鏈表的形式存儲該函數(shù)中基本塊的指針;函數(shù)中的基本塊,包含如下的數(shù)據(jù)結(jié)構(gòu):基本塊編號;基本塊標(biāo)簽;指令鏈表,以鏈表的形式存儲基本塊中的指令;前驅(qū)基本塊鏈表,以鏈表的形式存儲該基本塊所有前驅(qū)基本塊的指針;后繼基本塊鏈表,以鏈表的形式存儲該基本塊所有的后繼基本塊指針。
[0019]本發(fā)明的有益效果是,將靜態(tài)程序分析與符號執(zhí)行技術(shù)相結(jié)合,通過靜態(tài)程序分析,收集程序分支語句中能夠?qū)蛎舾胁僮飨嚓P(guān)路徑的條件取值,并依據(jù)后續(xù)程序中敏感操作相關(guān)路徑占總路徑的比例對程序分支進(jìn)行打分。后續(xù)的符號執(zhí)行過程在靜態(tài)分析結(jié)果的