基于符號執(zhí)行路徑剪枝的緩沖區(qū)溢出漏洞自動檢測方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及一種基于符號執(zhí)行路徑剪枝的緩沖區(qū)溢出漏洞自動檢測方法,該方法 能夠運(yùn)用于漏洞檢測以及安全審計,代替人工自動驗(yàn)證靜態(tài)分析緩沖區(qū)溢出漏洞的結(jié)果等 方向,屬于軟件測試技術(shù)應(yīng)用領(lǐng)域。
【背景技術(shù)】
[0002] 軟件安全是使軟件在受到惡意攻擊的情形下仍能夠繼續(xù)保證功能性正確及確保 軟件被在授權(quán)范圍內(nèi)合法使用。然而由于軟件開發(fā)者開發(fā)軟件時的疏忽或者編程語言的局 限性,軟件中常常存在潛在的漏洞。這些漏洞能夠極大削弱軟件安全性,一旦被攻擊者利用 會造成非常嚴(yán)重的后果,緩沖區(qū)溢出漏洞是軟件漏洞中十分常見的一種。
[0003] 緩沖區(qū)溢出漏洞指的是通過往程序的緩沖區(qū)寫超出其長度的內(nèi)容,造成緩沖區(qū)的 溢出,從而破壞程序的堆棧,造成程序崩潰或使程序轉(zhuǎn)而執(zhí)行其它指令。緩沖區(qū)溢出攻擊可 以導(dǎo)致程序運(yùn)行失敗、系統(tǒng)關(guān)機(jī)、重新啟動,或者執(zhí)行攻擊者的指令,比如非法提升權(quán)限,可 能造成十分嚴(yán)重的后果。
[0004] 目前存在動態(tài)測試和靜態(tài)分析兩種手段來發(fā)現(xiàn)程序中的緩沖區(qū)溢出漏洞,動態(tài)測 試通過編寫測試用例運(yùn)行不同的程序路徑,分析是否能夠觸發(fā)潛在漏洞。動態(tài)分析的缺點(diǎn) 十分明顯,需要軟件測試人員設(shè)計精巧的測試用例,而測試用例一旦設(shè)計的不夠完善,會導(dǎo) 致漏洞無法被檢測到。靜態(tài)分析指的是不運(yùn)行程序,匹配事先設(shè)定的緩沖區(qū)溢出模型或者 特征,靜態(tài)漏洞測試轉(zhuǎn)換為特征匹配問題。由于漏洞可能發(fā)生在某條特定的路徑中,所以靜 態(tài)分析技術(shù)往往是路徑相關(guān)的,分析的結(jié)果可能會給出一條不完整的路徑片段。靜態(tài)分析 工具為了保證分析結(jié)果的準(zhǔn)確性而產(chǎn)生了大量的警報,這些警報絕大部分是冗余的,只包 含了小部分真正漏洞。真正在使用這些工具的過程中,需要安全審計人員手工檢查上述緩 沖區(qū)溢出警報,編寫測試用例覆蓋靜態(tài)分析產(chǎn)生的路徑,以分析該路徑是否存在緩沖區(qū)溢 出的可能,從而耗費(fèi)大量時間和精力。
[0005] 符號執(zhí)行技術(shù)是一種計算機(jī)以符號推倒的方式來模擬程序?qū)嶋H執(zhí)行的執(zhí)行,最早 提出于1976年,其基本思想是用符號代替實(shí)際輸入,在執(zhí)行過程中,遇到分支則復(fù)制已有 的環(huán)境信息,收集相關(guān)約束執(zhí)行到程序出口或發(fā)現(xiàn)錯誤時,根據(jù)收集到的約束條件求解,產(chǎn) 生測試用例。
【發(fā)明內(nèi)容】
[0006] 技術(shù)問題:本發(fā)明提出了一種基于符號執(zhí)行路徑剪枝的緩沖區(qū)溢出漏洞自動檢測 方法,首先通過漏洞特征匹配等靜態(tài)分析手段得到溢出漏洞疑似路徑,靜態(tài)分析高效方便 但是存在大量誤報,然后通過符號執(zhí)行驗(yàn)證靜態(tài)緩沖區(qū)溢出分析的漏洞疑似路徑,在執(zhí)行 過程中構(gòu)建緩沖區(qū)溢出漏洞模型驗(yàn)證該路徑是否存在對應(yīng)的測試用例能夠觸發(fā)以達(dá)到消 除誤報精化結(jié)果的目的。同時符號執(zhí)行存在狀態(tài)爆炸的問題,本發(fā)明也解決如何利用靜態(tài) 分析的結(jié)果引導(dǎo)符號執(zhí)行的方向,避免執(zhí)行無用路徑的執(zhí)行。
[0007] 技術(shù)方案:本發(fā)明提出的基于符號執(zhí)行路徑剪枝的緩沖區(qū)溢出漏洞自動檢測方法 結(jié)合了動態(tài)測試和靜態(tài)分析的特點(diǎn),解決了這兩種手段目前存在的不足,本方法主要分為 兩步:通過漏洞特征匹配等靜態(tài)分析手段得到溢出漏洞疑似路徑,這些路徑存在大量誤報, 然后使用狀態(tài)空間縮減,路徑剪枝的符號執(zhí)行技術(shù)驗(yàn)證靜態(tài)緩沖區(qū)溢出分析的漏洞疑似路 徑。符號執(zhí)行用于在測試過程中覆蓋盡可能多的程序路徑,通過引導(dǎo)符號執(zhí)行的過程,使其 只執(zhí)行潛在可能觸發(fā)緩沖區(qū)溢出漏洞的路徑,通過構(gòu)建緩沖區(qū)溢出模型來自動驗(yàn)證該路徑 是否安全。
[0008] 符號執(zhí)行技術(shù)的基本思想是用符號代替實(shí)際輸入,在執(zhí)行過程中,遇到分支則復(fù) 制已有的環(huán)境信息,收集相關(guān)約束執(zhí)行到程序出口或發(fā)現(xiàn)錯誤時,根據(jù)收集到的約束條件 求解,產(chǎn)生測試用例。傳統(tǒng)的符號執(zhí)行技術(shù)用于提高測試是程序的覆蓋度以及內(nèi)存相關(guān)的 漏洞檢測,我們將符號執(zhí)行導(dǎo)向某些特定的方向,并將漏洞疑似位置點(diǎn)處的漏洞溢出條件 加入整條路徑的約束條件中,在該程序位置點(diǎn)處進(jìn)行緩沖區(qū)溢出漏洞與路徑約束求解,可 通過對約束解的值的分析高效檢驗(yàn)緩沖區(qū)溢出漏洞是否會發(fā)生,重復(fù)上述步驟完成緩沖區(qū) 溢出漏洞的自動檢測。
[0009] 面向緩沖區(qū)溢出誤報檢測的路徑剪枝符號執(zhí)行方法基本步驟如下:
[0010] 步驟1 :程序源碼漏洞特征匹配
[0011] 掃描程序源代碼,匹配源代碼中緩沖區(qū)溢出漏洞,用可擴(kuò)展標(biāo)記語言存儲緩沖區(qū) 溢出漏洞疑似路徑,一條漏洞路徑由多個程序位置點(diǎn)組成,一個程序位置點(diǎn)由程序的行號 位置以及該位置所屬于的文件名所唯一標(biāo)識,漏洞路徑的起始點(diǎn)和結(jié)束點(diǎn)分別表示緩沖區(qū) 的內(nèi)存分配語句和緩沖區(qū)溢出語句,位于起始點(diǎn)和結(jié)束點(diǎn)的位置點(diǎn)代表該緩沖區(qū)相關(guān)的操 作語句;
[0012] 步驟2 :搜索基本塊路徑
[0013] 為待測試的程序或者系統(tǒng)構(gòu)建控制流圖,所謂控制流圖是一個有向圖,控制流圖 中每個節(jié)點(diǎn)代表一個基本塊,程序中的每個語句都對應(yīng)圖中的一個節(jié)點(diǎn),控制流在離開基 本塊之前不會跳轉(zhuǎn)或者停機(jī);
[0014] 將緩沖區(qū)溢出漏洞疑似路徑中的每一個程序位置點(diǎn)映射到控制流圖的基本塊,多 個程序位置點(diǎn)可能會映射到同一個控制流圖的基本塊,從而形成一條不完整的由基本塊組 成路徑;
[0015] 根據(jù)設(shè)定的路徑搜索策略獲取從程序入口至程序溢出點(diǎn)的一條完整基本塊路 徑;
[0016] 步驟3:抽取動態(tài)測試路徑
[0017] 上述的基本塊組成路徑不能夠用于引導(dǎo)符號執(zhí)行的分析過程,原因在于符號執(zhí)行 的過程是對符號執(zhí)行中間碼指令的解釋過程,每個指令都能映射到所屬于的基本塊,基本 塊內(nèi)部的指令不存在跳轉(zhuǎn)關(guān)系,基本塊之間則存在跳轉(zhuǎn)關(guān)系;只有在到達(dá)基本塊入口時,刪 除該入口指令才有可能阻止符號執(zhí)行進(jìn)入無用的基本塊,抽取基本塊路徑中每一個基本塊 的入口指令的信息即:指令對應(yīng)程序所在文件名稱以及行號,獲取以上信息重新生成一條 動態(tài)測試路徑;
[0018] 步驟4:符號執(zhí)行路徑剪枝
[0019] 將當(dāng)前準(zhǔn)備分析的系統(tǒng)或者程序編譯到符號執(zhí)行平臺,將動態(tài)測試路徑以及符號 執(zhí)行編譯指令作為輸入給符號執(zhí)行平臺,符號執(zhí)行的過程其實(shí)是對中間碼指令的逐條解釋 的過程,在執(zhí)行過程中,抽取指令的所屬于的程序源碼的文件以及行號信息,與動態(tài)測試路 徑中的配置信息相對比,跳過不必要執(zhí)行的中間碼,以達(dá)到路徑剪枝,加快執(zhí)行速度以及縮 減執(zhí)行狀態(tài)空間的目的;
[0020] 步驟5 :緩沖區(qū)溢出漏洞路徑誤報檢測
[0021] 檢查符號執(zhí)行的進(jìn)程是否到達(dá)緩沖區(qū)溢出漏洞的疑似點(diǎn),構(gòu)建緩沖區(qū)溢出漏洞約 束條件根據(jù)不同的操作設(shè)定不同的溢出條件;將溢出條件加入當(dāng)前路徑約束條件,進(jìn)行約 束求解,如果可解,則說明該路徑確實(shí)存在漏洞,屬于溢出路徑,如果不可解,則說明該路徑 是安全路徑;
[0022] 步驟6 :緩沖區(qū)溢出點(diǎn)判定
[0023] 重復(fù)以上若干步驟,直到所有的漏洞特征匹配到的路徑都已經(jīng)被驗(yàn)證,對溢出疑 似點(diǎn)進(jìn)行判定:使用如下判定準(zhǔn)則:一個緩沖區(qū)溢出疑似點(diǎn)對應(yīng)多條疑似路徑,如果緩沖 區(qū)溢出疑似點(diǎn)的路徑集合中有一條為漏洞路徑,那么該程序點(diǎn)確認(rèn)為溢出;如果緩沖區(qū)溢 出疑似點(diǎn)的路徑集合中的每一條都為安全路徑,那么該程序點(diǎn)確認(rèn)為誤報點(diǎn)。
[0024] 所述程序源碼漏洞特征匹配的方法,獲取的結(jié)果能