摘 要: 為了提高漏洞挖掘效率,在軟件體系結(jié)構(gòu)的基礎(chǔ)上,結(jié)合符號執(zhí)行、污點(diǎn)分析和模糊測試中的優(yōu)點(diǎn),設(shè)計并實(shí)現(xiàn)了基于軟件體系結(jié)構(gòu)分析的漏洞挖掘系統(tǒng)Fast Fuzzing。該系統(tǒng)主要由體系結(jié)構(gòu)分析、指令追蹤、符號執(zhí)行、污點(diǎn)分析和動態(tài)測試五個模塊組成,為提高系統(tǒng)效率,系統(tǒng)針對傳統(tǒng)技術(shù)方法進(jìn)行了優(yōu)化處理。實(shí)驗結(jié)果表明Fast Fuzzing系統(tǒng)能夠有效發(fā)現(xiàn)IE8和IE10中的安全問題,成功觸發(fā)了IE8和IE10中的多個漏洞,適用于常用軟件的安全測試。 

  關(guān)鍵詞: 模糊測試; 體系結(jié)構(gòu)分析; 漏洞挖掘; 安全漏洞 

  0 引 言 

  由于軟件漏洞的高危害性,漏洞挖掘技術(shù)已成為計算機(jī)領(lǐng)域中的一個研究熱點(diǎn)[1]。一方面,軟件安全研究人員專注于各種流行軟件的安全性分析和測試,以發(fā)現(xiàn)這些軟件中的安全問題;另一方面,軟件開發(fā)商也積極投入到產(chǎn)品的安全檢測中,以提高軟件的安全性[2]。 

  近年來,在程序分析和編譯原理等領(lǐng)域的促進(jìn)下,面向源代碼的漏洞挖掘技術(shù)取得了一定成果。然而,該技術(shù)仍然存在著許多不足之處:如出于商業(yè)利益和商業(yè)保護(hù)等原因,絕大多數(shù)的軟件開發(fā)商并不對外提供軟件的源代碼[3]。其次,源代碼層次的漏洞挖掘和分析并不能發(fā)現(xiàn)在程序編譯、程序鏈接過程中產(chǎn)生的漏洞問題。此外,軟件中引入的軟件體系結(jié)構(gòu)方法、對外接口的不規(guī)范調(diào)用,也有可能存在潛在的安全問題[4]。 

  1 系統(tǒng)需求與目標(biāo) 

  現(xiàn)有的符號執(zhí)行技術(shù)主要面臨路徑爆炸、約束求解困難和效率比較低等問題,而本文的設(shè)計思想基于符號執(zhí)行技術(shù)和模糊測試技術(shù),同時與軟件體系結(jié)構(gòu)的方法相結(jié)合[5]。因此,本系統(tǒng)的設(shè)計目標(biāo)主要包括如下幾點(diǎn): 

 。1) 高效率。提高本系統(tǒng)的測試效率,使得系統(tǒng)能夠?qū)Υ郎y軟件進(jìn)行自動化測試,分析軟件運(yùn)行時的狀態(tài)信息,并且能夠準(zhǔn)確記錄軟件的異常行為和崩潰信息。 

 。2) 高適用性。能夠?qū)νㄓ酶袷降臄?shù)據(jù)進(jìn)行處理,并且通過反饋式生成測試用例,驅(qū)動測試過程的持續(xù)運(yùn)行。 

 。3) 高代碼覆蓋率。能夠在動態(tài)測試時分析測試用例的代碼覆蓋率,盡可能生成不同路徑的測試用例,提高系統(tǒng)測試時的代碼覆蓋率。 

  2 系統(tǒng)架構(gòu)設(shè)計 

  為了提高漏洞挖掘的效率,本文在軟件體系結(jié)構(gòu)分析的基礎(chǔ)上,結(jié)合了符號執(zhí)行和污點(diǎn)分析技術(shù),設(shè)計和實(shí)現(xiàn)了針對二進(jìn)制程序的漏洞挖掘系統(tǒng)Fast Fuzzing[6]。 

  Fast Fuzzing漏洞挖掘系統(tǒng)采用離線符號執(zhí)行和離線污點(diǎn)分析的方法,在PANDA平臺的基礎(chǔ)上實(shí)現(xiàn)了上述功能,同時利用STP求解器進(jìn)行約束求解,生成新的測試用例。另外,還結(jié)合了污點(diǎn)分析結(jié)果,得到相關(guān)的污點(diǎn)信息,從而用于導(dǎo)向型測試用例的生成[7]。在進(jìn)行動態(tài)測試時,F(xiàn)ast Fuzzing系統(tǒng)會計算每次測試用例的代碼覆蓋情況,從而在選擇新的測試用例進(jìn)行測試時,優(yōu)先選擇能夠提高代碼覆蓋率的新測試用例。Fast Fuzzing系統(tǒng)架構(gòu)圖如圖1所示。Fast Fuzzing漏洞挖掘系統(tǒng)主要由指令追蹤模塊、體系結(jié)構(gòu)分析模塊、符號執(zhí)行模塊、污點(diǎn)分析模塊和測試模塊組成。 

  3 系統(tǒng)實(shí)現(xiàn) 

  3.1 指令追蹤模塊設(shè)計與實(shí)現(xiàn) 

  指令追蹤模塊的主要功能是,記錄測試程序執(zhí)行時每條指令的地址、上下文信息和內(nèi)存信息等。該模塊是在動態(tài)分析平臺 PANDA下實(shí)現(xiàn)的,其作為 PANDA平臺的一個工具模塊 panda_tools。指令追蹤模塊主要有如下三個模塊: 

  指令追蹤:程序執(zhí)行過程中能夠動態(tài)分析每條指令,記錄指令的具體信息和寄存器信息。指令追蹤功能主要通過注冊PANDA_CB_INSN_TRANSLATE和PANDA_CB_INSN_EXEC兩個回調(diào)函數(shù)實(shí)現(xiàn)。   內(nèi)存追蹤:程序執(zhí)行過程中對內(nèi)存的操作進(jìn)行有針對性的記錄,包括內(nèi)存的申請、內(nèi)存的讀/寫、內(nèi)存塊大小和數(shù)據(jù)信息等。內(nèi)存追蹤方法與指令追蹤類似,通過注冊 [PANDA_CB_VIRT_MEM_READ,PANDA_CB_VIRT_][MEM_WRITE,]PANDA_CB_PHYS_MEM_READ和PANDA_CB_PHYS_MEM_WRITE四個類型的回調(diào)函數(shù),分別實(shí)現(xiàn)對虛擬地址內(nèi)存的讀/寫操作和物理地址內(nèi)存的讀/寫操作的監(jiān)控。 

  函數(shù)追蹤:程序執(zhí)行過程中能夠記錄系統(tǒng)函數(shù)的調(diào)用,同時在提供符號表的情況下,能夠記錄指定函數(shù)的調(diào)用信息。系統(tǒng)通過 PANDA平臺對指令分析的過程,注 冊了兩個回調(diào)函數(shù)對其進(jìn)行處理,類型為PANDA_CB_INSN_TRANSLATE的translate_call back函數(shù)和類型為PANDA_CB_INSN_EXEC的exec_callback函數(shù)。 

  3.2 體系結(jié)構(gòu)分析模塊設(shè)計與實(shí)現(xiàn) 

  體系結(jié)構(gòu)分析模塊的功能是對最基本的主程序和子程序進(jìn)行靜態(tài)分析,通過對二進(jìn)制程序進(jìn)行基本塊劃分,記錄相關(guān)的基本塊信息,提取其中的函數(shù)調(diào)用關(guān)系,從而分析程序中的所有路徑,再根據(jù)靜態(tài)分析時的信息提取出相應(yīng)路徑的約束關(guān)系,用于后續(xù)的符號執(zhí)行中[8]。 

  體系結(jié)構(gòu)分析模塊是在IDAPro靜態(tài)分析工具的基礎(chǔ)上實(shí)現(xiàn)的,之后通過模塊實(shí)現(xiàn)的插件對IDAPro反匯編結(jié)果進(jìn)行深入的分析,對程序進(jìn)行基本塊劃分和記錄,同時提取出其中的調(diào)用關(guān)系。該模塊的基本架構(gòu)如圖2所示。在體系結(jié)構(gòu)分析模塊中,主要包含基本代碼塊分析、函數(shù)調(diào)用分析和路徑分析三個部分。 

  3.3 符號執(zhí)行模塊設(shè)計與實(shí)現(xiàn) 

  符號執(zhí)行模塊通過分析指令追蹤時的記錄,結(jié)合體系結(jié)構(gòu)分析時的路徑關(guān)系,將輸入數(shù)據(jù)符號化表示,生成相應(yīng)的約束關(guān)系;之后,在軌跡重放時,根據(jù)程序執(zhí)行時的上下文環(huán)境,更新路徑約束關(guān)系,并利用約束求解器進(jìn)行求解,生成新的測試用例,對程序進(jìn)行進(jìn)一步的測試。本系統(tǒng)基于PANDA平臺構(gòu)建,其底層由QEMU模擬器構(gòu)建,采用TCG中間語言的方式對指令進(jìn)行翻譯處理。本文在此基礎(chǔ)上,采用了離線符號執(zhí)行的方式,根據(jù)指令追蹤時的記錄,實(shí)現(xiàn)對中間代碼的符號化分析,從而提高符號執(zhí)行的效率。 

  符號執(zhí)行模塊首先在體系結(jié)構(gòu)分析模塊的基礎(chǔ)上,通過對目標(biāo)軟件的靜態(tài)分析,生成軟件內(nèi)部的函數(shù)調(diào)用圖,進(jìn)而推導(dǎo)出軟件中的路徑關(guān)系。該模塊的基本流程如圖3所示。 

  3.4 污點(diǎn)分析模塊設(shè)計與實(shí)現(xiàn) 

  污點(diǎn)分析模塊通過指令追蹤時對原始輸入數(shù)據(jù)的污點(diǎn)標(biāo)記,分析相關(guān)內(nèi)存信息,記錄污點(diǎn)數(shù)據(jù)的傳播過程,獲得輸入數(shù)據(jù)與敏感內(nèi)存操作的關(guān)系,從而生成新的測試用例。 

  污點(diǎn)分析模塊是在PADNA平臺基礎(chǔ)上實(shí)現(xiàn)的,借助于指令追蹤模塊,對目標(biāo)程序的執(zhí)行流程進(jìn)行軌跡記錄,生成相應(yīng)的軌跡記錄文件。軌跡記錄部分主要針對每條執(zhí)行過的指令,具體包括指令的地址、指令機(jī)器碼和指令運(yùn)行時寄存器、內(nèi)存的相關(guān)信息。 

  3.5 動態(tài)測試模塊設(shè)計與實(shí)現(xiàn) 

  動態(tài)測試模塊是在Windows異常處理機(jī)制的基礎(chǔ)上,通過執(zhí)行目標(biāo)程序捕獲運(yùn)行時出現(xiàn)的異常信息判斷測試用例是否會引發(fā)程序崩潰,再進(jìn)一步分析崩潰信息,判斷該問題是否是由于軟件自身的安全漏洞而引起的。同時,動態(tài)測試模塊的功能還在于能夠不斷生成新的測試用例,對目標(biāo)程序進(jìn)行持續(xù)的測試。本系統(tǒng)主要是在Windows異常處理平臺下實(shí)現(xiàn)了動態(tài)測試模塊,主要通過對未執(zhí)行代碼塊中插入軟件斷點(diǎn)追蹤指令的執(zhí)行過程,并且對程序運(yùn)行時的異常情形進(jìn)行監(jiān)控。 

 。1) 處理流程 

  動態(tài)測試模塊采用加載目標(biāo)程序的方式對目標(biāo)程序進(jìn)程測試。同時,在創(chuàng)建目標(biāo)程序的進(jìn)程時,通過DLL注入的方式實(shí)現(xiàn)對異常信息的監(jiān)控和對代碼覆蓋率的檢測功能。其具體處理流程如圖4所示。在程序碰到異常情形時,首先通過注入的DLL判斷此處的異常是否是DLL注入時插入的指令造成的,如果是則恢復(fù)原先指令,記錄此時的狀態(tài)信息,以便分析代碼覆蓋率;否則的話,則認(rèn)為是程序中存在的安全問題觸發(fā)了此類異常,記錄測試用例、此時的寄存器和上下文信息,以便進(jìn)一步確認(rèn)該安全問題是一個程序漏洞。 

 。2) 異常監(jiān)控 

  異常監(jiān)控部分主要包含追蹤路徑初始化、基本代碼塊斷點(diǎn)設(shè)置和異常處理函數(shù)設(shè)置這兩個功能,其具體實(shí)現(xiàn)是通過DLL注入的方式對目標(biāo)程序的執(zhí)行進(jìn)程進(jìn)行監(jiān)控。 

  (3) 代碼覆蓋率檢測 

  在對基本代碼塊進(jìn)行斷點(diǎn)設(shè)置時,根據(jù)BBL_INFO結(jié)構(gòu)中的isexecute字段判斷基本代碼塊是否執(zhí)行。對于已經(jīng)執(zhí)行的基本代碼塊,將其記錄在已測試基本代碼塊結(jié)構(gòu)中,然后在程序執(zhí)行完后,將記錄中的代碼塊與模塊中的所有代碼塊進(jìn)行比對,算出該模塊中的基本代碼塊代碼覆蓋率。 

  4 系統(tǒng)測試與分析 

  4.1 功能測試 

 。1) 測試方法 

  針對IE10,初始測試用例大小為21 824 B,指令記錄文件大小為53 323 MB, 共生成了625 369個測試用例,發(fā)現(xiàn)了24個異常。針對IE8,初始測試用例大小為21 824 B,指令記錄文件大小為23 954 MB,共生成了405 712個測試用例,發(fā)現(xiàn)異常數(shù)為31個。通過上述異常分析可以看到,IE8中的異常2和IE10中的異常2信息基本一致,都屬于訪問不可訪問內(nèi)存錯誤,而其他異常信息也屬于此類錯誤。為測試Fast Fuzzing系統(tǒng)的代碼覆蓋率情況,本測試中對比分析FileFuzz工具對IE8軟件的測試代碼覆蓋率情況,結(jié)果如表3所示。 

  通過上述結(jié)果的對比,可以發(fā)現(xiàn)Fast Fuzzing相對于傳統(tǒng)的模糊測試工具而言,其在測試時覆蓋的代碼面更廣,能夠?qū)浖M(jìn)行更為全面的安全測試。 

  5 結(jié) 論 

  針對傳統(tǒng)模糊測試方法的不足,本文設(shè)計并實(shí)現(xiàn)了一種基于軟件體系結(jié)構(gòu)的漏洞挖掘工具,并且結(jié)合了混合符號執(zhí)行技術(shù)和細(xì)粒度污點(diǎn)分析技術(shù),通過對這兩方法的反饋信息進(jìn)行深入分析,生成新的測試用例驅(qū)動測試流程,從而大大地提高了測試時代碼的覆蓋率和測試效率。   

      參考文獻(xiàn) 

  [1] 楊世德,梁光明,余凱.基于ARM嵌入式系統(tǒng)底層漏洞挖掘技術(shù)研究[J].現(xiàn)代電子技術(shù),2015,38(18):94?96. 

  [2] 蒲石,陳周國,祝世雄.震網(wǎng)病毒分析與防范[J].信息網(wǎng)絡(luò)安全,2012(2):40?43. 

  [3] 王鐵磊.面向二進(jìn)制程序的漏洞挖掘關(guān)鍵技術(shù)研究[D].北京:北京大學(xué),2011. 

  [4] 陳寶國.美國國家網(wǎng)絡(luò)安全戰(zhàn)略解析[J].信息網(wǎng)絡(luò)安全,2010(1):66?68. 

  [5] BRUMLEY D, POOSANKAM P, SONG D, et al. Automatic patch?based exploit generation is possible: techniques and implications [C]// Proceedings of 2008 IEEE Symposium on Security and Privacy. [S.l.]: IEEE, 2008: 143?157. 

  [6] BALAKRISHNAN G, REPS T, MELSKI D, et al. What you see is not what you execute [J]. ACM transactions on programming languages and systems, 2010, 32(6): 202?213. 

  [7] WANG T L, WEI T, GU G F, et al. TaintScope: a checksumaware directed fuzzing tool for automatic software vulnerability detection [C]// Proceedings of 2010 IEEE Symposium on Security and Privacy. Oakland: IEEE, 2010: 497?512. 

  [8] SONG D, BRUMLEY D, YIN H, et al. BitBlaze: a new approach to computer security via binary analysis [C]// Procee?dings of 2008 4th International Conference on Information Systems Security. Hyderabad: Springer, 2008: 1?25.