唐萍 張國強
摘 要: 為了提高漏洞挖掘效率,在軟件體系結(jié)構(gòu)的基礎(chǔ)上,結(jié)合符號執(zhí)行、污點分析和模糊測試中的優(yōu)點,設(shè)計并實現(xiàn)了基于軟件體系結(jié)構(gòu)分析的漏洞挖掘系統(tǒng)Fast Fuzzing。該系統(tǒng)主要由體系結(jié)構(gòu)分析、指令追蹤、符號執(zhí)行、污點分析和動態(tài)測試五個模塊組成,為提高系統(tǒng)效率,系統(tǒng)針對傳統(tǒng)技術(shù)方法進行了優(yōu)化處理。實驗結(jié)果表明Fast Fuzzing系統(tǒng)能夠有效發(fā)現(xiàn)IE8和IE10中的安全問題,成功觸發(fā)了IE8和IE10中的多個漏洞,適用于常用軟件的安全測試。
關(guān)鍵詞: 模糊測試; 體系結(jié)構(gòu)分析; 漏洞挖掘; 安全漏洞
中圖分類號: TN711?34; TM417 文獻標識碼: A 文章編號: 1004?373X(2016)09?0099?04
Abstract: To improve the efficiency of vulnerability mining, the vulnerability mining system Fast Fuzzing based on software architecture analysis was designed and implemented in combination with the advantages of symbolic execution, stain analysis and fuzzing test. This system is composed of architecture analysis, instruction tracing, symbolic execution, stain analysis and dynamic testing. To improve the system efficiency, the traditional technology method was optimized. The experimental results show that the Fast Fuzzing system can effectively detect the security problems in IE8 and IE10, successfully trigger multiple vulnerabilities in IE8 and IE10, which is suitable for the safety testing of common software.
Keywords: fuzzing test; architecture analysis; vulnerability mining; security vulnerability
0 引 言
由于軟件漏洞的高危害性,漏洞挖掘技術(shù)已成為計算機領(lǐng)域中的一個研究熱點[1]。一方面,軟件安全研究人員專注于各種流行軟件的安全性分析和測試,以發(fā)現(xiàn)這些軟件中的安全問題;另一方面,軟件開發(fā)商也積極投入到產(chǎn)品的安全檢測中,以提高軟件的安全性[2]。
近年來,在程序分析和編譯原理等領(lǐng)域的促進下,面向源代碼的漏洞挖掘技術(shù)取得了一定成果。然而,該技術(shù)仍然存在著許多不足之處:如出于商業(yè)利益和商業(yè)保護等原因,絕大多數(shù)的軟件開發(fā)商并不對外提供軟件的源代碼[3]。其次,源代碼層次的漏洞挖掘和分析并不能發(fā)現(xiàn)在程序編譯、程序鏈接過程中產(chǎn)生的漏洞問題。此外,軟件中引入的軟件體系結(jié)構(gòu)方法、對外接口的不規(guī)范調(diào)用,也有可能存在潛在的安全問題[4]。
1 系統(tǒng)需求與目標
現(xiàn)有的符號執(zhí)行技術(shù)主要面臨路徑爆炸、約束求解困難和效率比較低等問題,而本文的設(shè)計思想基于符號執(zhí)行技術(shù)和模糊測試技術(shù),同時與軟件體系結(jié)構(gòu)的方法相結(jié)合[5]。因此,本系統(tǒng)的設(shè)計目標主要包括如下幾點:
(1) 高效率。提高本系統(tǒng)的測試效率,使得系統(tǒng)能夠?qū)Υ郎y軟件進行自動化測試,分析軟件運行時的狀態(tài)信息,并且能夠準確記錄軟件的異常行為和崩潰信息。
(2) 高適用性。能夠?qū)νㄓ酶袷降臄?shù)據(jù)進行處理,并且通過反饋式生成測試用例,驅(qū)動測試過程的持續(xù)運行。
(3) 高代碼覆蓋率。能夠在動態(tài)測試時分析測試用例的代碼覆蓋率,盡可能生成不同路徑的測試用例,提高系統(tǒng)測試時的代碼覆蓋率。
2 系統(tǒng)架構(gòu)設(shè)計
為了提高漏洞挖掘的效率,本文在軟件體系結(jié)構(gòu)分析的基礎(chǔ)上,結(jié)合了符號執(zhí)行和污點分析技術(shù),設(shè)計和實現(xiàn)了針對二進制程序的漏洞挖掘系統(tǒng)Fast Fuzzing[6]。
Fast Fuzzing漏洞挖掘系統(tǒng)采用離線符號執(zhí)行和離線污點分析的方法,在PANDA平臺的基礎(chǔ)上實現(xiàn)了上述功能,同時利用STP求解器進行約束求解,生成新的測試用例。另外,還結(jié)合了污點分析結(jié)果,得到相關(guān)的污點信息,從而用于導向型測試用例的生成[7]。在進行動態(tài)測試時,F(xiàn)ast Fuzzing系統(tǒng)會計算每次測試用例的代碼覆蓋情況,從而在選擇新的測試用例進行測試時,優(yōu)先選擇能夠提高代碼覆蓋率的新測試用例。Fast Fuzzing系統(tǒng)架構(gòu)圖如圖1所示。Fast Fuzzing漏洞挖掘系統(tǒng)主要由指令追蹤模塊、體系結(jié)構(gòu)分析模塊、符號執(zhí)行模塊、污點分析模塊和測試模塊組成。
3 系統(tǒng)實現(xiàn)
3.1 指令追蹤模塊設(shè)計與實現(xiàn)
指令追蹤模塊的主要功能是,記錄測試程序執(zhí)行時每條指令的地址、上下文信息和內(nèi)存信息等。該模塊是在動態(tài)分析平臺 PANDA下實現(xiàn)的,其作為 PANDA平臺的一個工具模塊 panda_tools。指令追蹤模塊主要有如下三個模塊:
指令追蹤:程序執(zhí)行過程中能夠動態(tài)分析每條指令,記錄指令的具體信息和寄存器信息。指令追蹤功能主要通過注冊PANDA_CB_INSN_TRANSLATE和PANDA_CB_INSN_EXEC兩個回調(diào)函數(shù)實現(xiàn)。
內(nèi)存追蹤:程序執(zhí)行過程中對內(nèi)存的操作進行有針對性的記錄,包括內(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ù),分別實現(xiàn)對虛擬地址內(nèi)存的讀/寫操作和物理地址內(nèi)存的讀/寫操作的監(jiān)控。
函數(shù)追蹤:程序執(zhí)行過程中能夠記錄系統(tǒng)函數(shù)的調(diào)用,同時在提供符號表的情況下,能夠記錄指定函數(shù)的調(diào)用信息。系統(tǒng)通過 PANDA平臺對指令分析的過程,注 冊了兩個回調(diào)函數(shù)對其進行處理,類型為PANDA_CB_INSN_TRANSLATE的translate_call back函數(shù)和類型為PANDA_CB_INSN_EXEC的exec_callback函數(shù)。
3.2 體系結(jié)構(gòu)分析模塊設(shè)計與實現(xiàn)
體系結(jié)構(gòu)分析模塊的功能是對最基本的主程序和子程序進行靜態(tài)分析,通過對二進制程序進行基本塊劃分,記錄相關(guān)的基本塊信息,提取其中的函數(shù)調(diào)用關(guān)系,從而分析程序中的所有路徑,再根據(jù)靜態(tài)分析時的信息提取出相應路徑的約束關(guān)系,用于后續(xù)的符號執(zhí)行中[8]。
體系結(jié)構(gòu)分析模塊是在IDAPro靜態(tài)分析工具的基礎(chǔ)上實現(xiàn)的,之后通過模塊實現(xiàn)的插件對IDAPro反匯編結(jié)果進行深入的分析,對程序進行基本塊劃分和記錄,同時提取出其中的調(diào)用關(guān)系。該模塊的基本架構(gòu)如圖2所示。在體系結(jié)構(gòu)分析模塊中,主要包含基本代碼塊分析、函數(shù)調(diào)用分析和路徑分析三個部分。
3.3 符號執(zhí)行模塊設(shè)計與實現(xiàn)
符號執(zhí)行模塊通過分析指令追蹤時的記錄,結(jié)合體系結(jié)構(gòu)分析時的路徑關(guān)系,將輸入數(shù)據(jù)符號化表示,生成相應的約束關(guān)系;之后,在軌跡重放時,根據(jù)程序執(zhí)行時的上下文環(huán)境,更新路徑約束關(guān)系,并利用約束求解器進行求解,生成新的測試用例,對程序進行進一步的測試。本系統(tǒng)基于PANDA平臺構(gòu)建,其底層由QEMU模擬器構(gòu)建,采用TCG中間語言的方式對指令進行翻譯處理。本文在此基礎(chǔ)上,采用了離線符號執(zhí)行的方式,根據(jù)指令追蹤時的記錄,實現(xiàn)對中間代碼的符號化分析,從而提高符號執(zhí)行的效率。
符號執(zhí)行模塊首先在體系結(jié)構(gòu)分析模塊的基礎(chǔ)上,通過對目標軟件的靜態(tài)分析,生成軟件內(nèi)部的函數(shù)調(diào)用圖,進而推導出軟件中的路徑關(guān)系。該模塊的基本流程如圖3所示。
3.4 污點分析模塊設(shè)計與實現(xiàn)
污點分析模塊通過指令追蹤時對原始輸入數(shù)據(jù)的污點標記,分析相關(guān)內(nèi)存信息,記錄污點數(shù)據(jù)的傳播過程,獲得輸入數(shù)據(jù)與敏感內(nèi)存操作的關(guān)系,從而生成新的測試用例。
污點分析模塊是在PADNA平臺基礎(chǔ)上實現(xiàn)的,借助于指令追蹤模塊,對目標程序的執(zhí)行流程進行軌跡記錄,生成相應的軌跡記錄文件。軌跡記錄部分主要針對每條執(zhí)行過的指令,具體包括指令的地址、指令機器碼和指令運行時寄存器、內(nèi)存的相關(guān)信息。
3.5 動態(tài)測試模塊設(shè)計與實現(xiàn)
動態(tài)測試模塊是在Windows異常處理機制的基礎(chǔ)上,通過執(zhí)行目標程序捕獲運行時出現(xiàn)的異常信息判斷測試用例是否會引發(fā)程序崩潰,再進一步分析崩潰信息,判斷該問題是否是由于軟件自身的安全漏洞而引起的。同時,動態(tài)測試模塊的功能還在于能夠不斷生成新的測試用例,對目標程序進行持續(xù)的測試。本系統(tǒng)主要是在Windows異常處理平臺下實現(xiàn)了動態(tài)測試模塊,主要通過對未執(zhí)行代碼塊中插入軟件斷點追蹤指令的執(zhí)行過程,并且對程序運行時的異常情形進行監(jiān)控。
(1) 處理流程
動態(tài)測試模塊采用加載目標程序的方式對目標程序進程測試。同時,在創(chuàng)建目標程序的進程時,通過DLL注入的方式實現(xiàn)對異常信息的監(jiān)控和對代碼覆蓋率的檢測功能。其具體處理流程如圖4所示。在程序碰到異常情形時,首先通過注入的DLL判斷此處的異常是否是DLL注入時插入的指令造成的,如果是則恢復原先指令,記錄此時的狀態(tài)信息,以便分析代碼覆蓋率;否則的話,則認為是程序中存在的安全問題觸發(fā)了此類異常,記錄測試用例、此時的寄存器和上下文信息,以便進一步確認該安全問題是一個程序漏洞。
(2) 異常監(jiān)控
異常監(jiān)控部分主要包含追蹤路徑初始化、基本代碼塊斷點設(shè)置和異常處理函數(shù)設(shè)置這兩個功能,其具體實現(xiàn)是通過DLL注入的方式對目標程序的執(zhí)行進程進行監(jiān)控。
(3) 代碼覆蓋率檢測
在對基本代碼塊進行斷點設(shè)置時,根據(jù)BBL_INFO結(jié)構(gòu)中的isexecute字段判斷基本代碼塊是否執(zhí)行。對于已經(jīng)執(zhí)行的基本代碼塊,將其記錄在已測試基本代碼塊結(jié)構(gòu)中,然后在程序執(zhí)行完后,將記錄中的代碼塊與模塊中的所有代碼塊進行比對,算出該模塊中的基本代碼塊代碼覆蓋率。
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行更為全面的安全測試。
5 結(jié) 論
針對傳統(tǒng)模糊測試方法的不足,本文設(shè)計并實現(xiàn)了一種基于軟件體系結(jié)構(gòu)的漏洞挖掘工具,并且結(jié)合了混合符號執(zhí)行技術(shù)和細粒度污點分析技術(shù),通過對這兩方法的反饋信息進行深入分析,生成新的測試用例驅(qū)動測試流程,從而大大地提高了測試時代碼的覆蓋率和測試效率。
參考文獻
[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] 王鐵磊.面向二進制程序的漏洞挖掘關(guān)鍵技術(shù)研究[D].北京:北京大學,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.