,, , ,露平,
(四川大學(xué) 電子信息學(xué)院,成都 610065)
隨著信息化時(shí)代的到來(lái),互聯(lián)網(wǎng)的運(yùn)用越來(lái)越廣泛,尤其是計(jì)算機(jī)軟件已經(jīng)成為世界經(jīng)濟(jì)、科技、軍事和社會(huì)發(fā)展的重要引擎,與此同時(shí)軟件的安全問(wèn)題也日益突出[1]。軟件漏洞是安全問(wèn)題的主要根源之一。近年來(lái)軟件漏洞數(shù)量呈現(xiàn)明顯上升趨勢(shì),軟件漏洞能夠引發(fā)惡性的Web攻擊事件侵害公民權(quán)益,傳播廣泛的計(jì)算機(jī)病毒造成重大經(jīng)濟(jì)損失,實(shí)施高級(jí)可持續(xù)性攻擊引發(fā)國(guó)家安全事件等[2]。因此,對(duì)軟件漏洞的分析已經(jīng)成為計(jì)算機(jī)領(lǐng)域的重要研究熱點(diǎn)及難點(diǎn)。
當(dāng)程序發(fā)生崩潰(Crash)時(shí),安全研究人員需要進(jìn)一步判定崩潰是由程序的內(nèi)部邏輯錯(cuò)誤引起還是由外部輸入數(shù)據(jù)引起。如果是由外部輸入引起,那么這很可能是一個(gè)嚴(yán)重的崩潰,甚至是一個(gè)可利用的漏洞[3]。因此,分析Crash的可利用性,即判定Crash是否能夠被攻擊者所利用以及被利用后的危害程度是否足夠嚴(yán)重。分析崩潰的可利用性等級(jí)不僅為軟件異常分析提供重要依據(jù),還能夠有效提高漏洞挖掘速度。無(wú)論對(duì)于攻擊者還是防御者,這都是一項(xiàng)十分重要并且緊迫的工作。隨著計(jì)算機(jī)軟件的廣泛應(yīng)用,如何快速有效地分析評(píng)估Crash的可利用性已經(jīng)成為當(dāng)前漏洞挖掘與分析的關(guān)鍵問(wèn)題之一。
本文介紹目前用于Crash分析領(lǐng)域的3種常見(jiàn)方法,利用動(dòng)態(tài)二進(jìn)制插樁工具Pin在Windows平臺(tái)實(shí)現(xiàn)一種基于動(dòng)態(tài)污點(diǎn)分析技術(shù)的Crash可利用性自動(dòng)化判定框架,并對(duì)若干已知漏洞的應(yīng)用程序進(jìn)行實(shí)驗(yàn)驗(yàn)證,與!exploitable工具的分析結(jié)果進(jìn)行對(duì)比。
目前用于Crash可利用性分析的常見(jiàn)方法主要有3種,靜態(tài)分析以Microsoft發(fā)布的!exploitable工具[4]為代表,靜態(tài)分析與動(dòng)態(tài)分析結(jié)合以二進(jìn)制分析框架BitBlaze[5]為代表,動(dòng)態(tài)分析以漏洞利用自動(dòng)生成框架CRAX[6]為代表。
2009年微軟安全工程中心基于微軟在Windows Vista開(kāi)發(fā)過(guò)程中使用Fuzzing的經(jīng)驗(yàn)創(chuàng)建了!exploitable工具,用于自動(dòng)崩潰分析和安全風(fēng)險(xiǎn)評(píng)估。該工具通過(guò)比較調(diào)用堆棧對(duì)應(yīng)的散列值分類(lèi)崩潰,進(jìn)而分析崩潰上下文的語(yǔ)義信息定義可利用性級(jí)別。它只依賴(lài)于Crash dump,而不是導(dǎo)致崩潰的輸入[7]。程序發(fā)生崩潰時(shí),WinDbg加載MSEC.dll,使用!exploitable命令分析Crash是否可利用,首先整理所有崩潰并創(chuàng)建哈希值來(lái)確定崩潰的唯一性,其次查看崩潰類(lèi)型并判定崩潰是否可以被惡意利用,然后分配崩潰可利用性等級(jí):Exploitable(可利用),Probably Exploitable(可能可利用),Probably Not Exploitable(可能不可利用) or Unknown(未知)。
!exploitable工具易用性強(qiáng),效率較高,可以極大地幫助安全研究人員節(jié)省分析崩潰的時(shí)間和精力。但是該工具具有較高的假陽(yáng)性率,并且只能給出Windows平臺(tái)下準(zhǔn)確的崩潰判斷,對(duì)于其他第三方軟件和一些邏輯復(fù)雜的崩潰,例如堆溢出、UAF等,準(zhǔn)確率非常低[8]。
BitBlaze是UC Berkely開(kāi)發(fā)的基于二進(jìn)制信息的分析平臺(tái),該平臺(tái)主要用于確定崩潰時(shí)哪些寄存器和內(nèi)存地址來(lái)自攻擊者控制的輸入文件,并且切片Null指針查看起始位置來(lái)快速排除可利用性。該平臺(tái)支持精確的分析,結(jié)合了靜態(tài)和動(dòng)態(tài)分析技術(shù)以及程序驗(yàn)證技術(shù)以滿(mǎn)足普遍需求,有助于快速確定由基于文件變異的Fuzzing生成的特定崩潰是否可利用,以及確定崩潰產(chǎn)生的根本原因。
分析程序崩潰的根本原因,目前主要通過(guò)手動(dòng)或使用調(diào)試器完成,使用BitBlaze可以簡(jiǎn)化和加快進(jìn)程,并且提供可重復(fù)性。BitBlaze運(yùn)行在GuestOS的更底層,對(duì)目標(biāo)程序有較好的透明性,但該平臺(tái)局部開(kāi)源且不便于擴(kuò)展,對(duì)于污點(diǎn)的設(shè)置同樣缺乏靈活性[9]。
2012年IEEE會(huì)議提出了基于AEG方法改進(jìn)的漏洞利用自動(dòng)化框架CRAX。它是一個(gè)基于S2E的符號(hào)執(zhí)行平臺(tái)。為了生成控制流劫持攻擊,檢測(cè)符號(hào)EIP及其他基于連續(xù)的寄存器和指針,提出了一種搜索最大連續(xù)符號(hào)內(nèi)存用于有效載荷注入的系統(tǒng)方法。
CRAX解決了沒(méi)有源代碼的大型軟件系統(tǒng)的漏洞利用自動(dòng)生成,并且可以粗粒度地確定崩潰優(yōu)先級(jí)。然而CRAX未開(kāi)源且耗時(shí)較AEG長(zhǎng),因?yàn)樗M(jìn)行的是整個(gè)系統(tǒng)的符號(hào)執(zhí)行而AEG只是在應(yīng)用程序級(jí)別,只能通過(guò)減少在concolic執(zhí)行期間的約束數(shù)量進(jìn)行時(shí)間優(yōu)化。
動(dòng)態(tài)污點(diǎn)分析技術(shù)是指將非信任來(lái)源的數(shù)據(jù)進(jìn)行標(biāo)記,并追蹤其在程序執(zhí)行過(guò)程中的傳遞,從而達(dá)到獲取關(guān)鍵位置與輸入數(shù)據(jù)關(guān)聯(lián)信息的分析方法[10]。動(dòng)態(tài)污點(diǎn)分析能夠準(zhǔn)確地獲取程序的執(zhí)行過(guò)程,有效地提高污點(diǎn)分析的精度,錯(cuò)誤率較低,應(yīng)用性較強(qiáng)。動(dòng)態(tài)污點(diǎn)分析的主要過(guò)程包括3個(gè)階段,如圖1所示[11]。
圖1 動(dòng)態(tài)污點(diǎn)分析過(guò)程
各階段的作用如下:
1)污點(diǎn)標(biāo)記(污染源識(shí)別):正確識(shí)別污染的來(lái)源并進(jìn)行標(biāo)記。如果對(duì)象的值來(lái)源不可信,那么將該對(duì)象標(biāo)記為污染的。
2)污點(diǎn)傳播:根據(jù)正確的污點(diǎn)傳播規(guī)則,將污點(diǎn)數(shù)據(jù)隨著程序的運(yùn)行進(jìn)行污點(diǎn)的標(biāo)記及傳遞(或移除)。
3)安全策略檢測(cè)攻擊:通過(guò)制定合理的規(guī)則與策略,確定或者檢測(cè)出程序運(yùn)行中存在的各種漏洞利用攻擊,如緩沖區(qū)溢出等[11]。
動(dòng)態(tài)污點(diǎn)傳播分析一般采用虛擬執(zhí)行或者動(dòng)態(tài)二進(jìn)制插樁方式對(duì)污點(diǎn)數(shù)據(jù)進(jìn)行記錄和跟蹤維護(hù)[11]。動(dòng)態(tài)二進(jìn)制插樁是指在不影響程序正常執(zhí)行結(jié)果的前提下,根據(jù)用戶(hù)需要在程序動(dòng)態(tài)執(zhí)行過(guò)程中插入額外的分析代碼以監(jiān)控程序執(zhí)行過(guò)程[12]。隨著動(dòng)態(tài)二進(jìn)制插樁平臺(tái)的出現(xiàn),動(dòng)態(tài)污點(diǎn)分析的實(shí)現(xiàn)和應(yīng)用變得越加廣泛。本文提出的Crash可利用性自動(dòng)化分析框架,進(jìn)行動(dòng)態(tài)污點(diǎn)分析的前提就是需要對(duì)目標(biāo)程序進(jìn)行動(dòng)態(tài)二進(jìn)制插樁。選用動(dòng)態(tài)二進(jìn)制插樁平臺(tái)Pin作為原型系統(tǒng),在此基礎(chǔ)上結(jié)合動(dòng)態(tài)污點(diǎn)分析技術(shù)實(shí)現(xiàn)對(duì)Crash的可利用性判定。
Pin是Intel公司提供的二進(jìn)制程序插樁工具,支持IA-32、Intel(R) 64和IA64架構(gòu)上的Windows和Linux可執(zhí)行程序,具有易用、高效、可移植性以及健壯性等特點(diǎn)[13]。Pin采用動(dòng)態(tài)編譯的方法插入探測(cè)代碼,并配合使用函數(shù)內(nèi)聯(lián)、寄存器重分配、指令調(diào)度等優(yōu)化方法,使得基于Pin開(kāi)發(fā)的動(dòng)態(tài)二進(jìn)制插樁工具具有較高的運(yùn)行效率[14]。Pin工具內(nèi)部含有即時(shí)編譯器、虛擬機(jī)和代碼緩存,插樁工具通過(guò)插樁接口函數(shù)與Pin進(jìn)行交互[14],其整體架構(gòu)如圖2所示。
圖2 Pin平臺(tái)框架
使用Pin進(jìn)行動(dòng)態(tài)污點(diǎn)分析能夠有效地實(shí)現(xiàn)自動(dòng)化。Pin的指令級(jí)插樁主要通過(guò)函數(shù)INS_AddInstrumentFunction來(lái)實(shí)現(xiàn),它會(huì)自動(dòng)在每執(zhí)行一條新指令時(shí)調(diào)用回調(diào)函數(shù)INS_InsertCall,并且在不影響原代碼正常執(zhí)行的同時(shí)將分析代碼插入原代碼序列中,進(jìn)而生成一個(gè)新的代碼序列并自動(dòng)切換代碼的控制權(quán),使得整個(gè)分析過(guò)程自動(dòng)化且高效進(jìn)行[15]。使用Pin對(duì)目標(biāo)程序進(jìn)行二進(jìn)制插樁的具體步驟如下:
1)調(diào)用PIN_Init()初始化Pin環(huán)境。
2)調(diào)用INS_AddInstrumentFunction(),分別聲明指令級(jí)插樁函數(shù)Instruction和鏡像級(jí)插樁函數(shù)ModLoad。其中,函數(shù)Instruction中定義了一個(gè)或多個(gè)回調(diào)函數(shù)INS_InsertCall,在每執(zhí)行一條新指令時(shí)均要調(diào)用INS_InsertCall函數(shù)執(zhí)行對(duì)當(dāng)前指令的分析代碼;函數(shù)ModLoad則對(duì)整個(gè)輸入文件進(jìn)行鏡像級(jí)插樁。
3)調(diào)用PIN_AddFiniFunction()聲明程序退出函數(shù)Fini,該函數(shù)用于在程序運(yùn)行結(jié)束時(shí)輸出最終的崩潰可利用性判斷結(jié)果。
4)調(diào)用PIN_StartProgram()啟動(dòng)程序。
本文以動(dòng)態(tài)二進(jìn)制分析平臺(tái)Pin為基礎(chǔ),利用動(dòng)態(tài)插樁技術(shù)和動(dòng)態(tài)污點(diǎn)分析技術(shù),實(shí)現(xiàn)了Crash的可利用性自動(dòng)化判定框架。該框架暫不考慮保護(hù)機(jī)制的影響,如DEP、ALSR等。其整體架構(gòu)如圖3所示。
圖3 框架整體結(jié)構(gòu)
利用該框架進(jìn)行Crash可利用性分析的具體流程如下:
1)調(diào)用污點(diǎn)標(biāo)記模塊,將來(lái)自于不可信數(shù)據(jù)源的輸入數(shù)據(jù)標(biāo)記為污染源。
2)調(diào)用Pin對(duì)目標(biāo)程序Crash樣本進(jìn)行二進(jìn)制指令級(jí)插樁。
3)調(diào)用污點(diǎn)跟蹤模塊跟蹤每一條內(nèi)存/寄存器操作指令,判斷其是否引起污點(diǎn)傳播,并對(duì)被污染的內(nèi)存和寄存器進(jìn)行標(biāo)記,同時(shí)修改污點(diǎn)數(shù)據(jù)列表。
4)調(diào)用Crash可利用性判定模塊,對(duì)能夠改變程序控制流的call、jmp、ret指令判斷其目的地址/操作數(shù)是否已被標(biāo)記,同時(shí)對(duì)進(jìn)行讀寫(xiě)內(nèi)存操作的mov指令判斷其操作的內(nèi)存地址是否可控以及是否操作污點(diǎn)數(shù)據(jù),由此給出判定結(jié)果。
污點(diǎn)標(biāo)記是進(jìn)行污點(diǎn)傳播分析的前提,其標(biāo)記方法和結(jié)果將極大程度地影響污點(diǎn)傳播處理和污點(diǎn)信息存儲(chǔ)的效率[11]。污點(diǎn)標(biāo)記模塊主要有2個(gè)功能:1)將目標(biāo)程序的輸入數(shù)據(jù)作為污染源并為其全部添加污點(diǎn)標(biāo)記;2)對(duì)于污點(diǎn)跟蹤模塊中的污點(diǎn)傳播,如果有污點(diǎn)數(shù)據(jù)污染了內(nèi)存/寄存器,則為其添加污點(diǎn)標(biāo)記,如果已被污染的內(nèi)存/寄存器被非污點(diǎn)數(shù)據(jù)覆蓋則移除其污點(diǎn)標(biāo)記。定義2個(gè)污點(diǎn)數(shù)據(jù)列表:addressTainted和regsTainted,分別用于存放被污染的內(nèi)存地址和寄存器。該模塊工作流程如圖4所示。
圖4 污點(diǎn)標(biāo)記模塊工作流程
通過(guò)污點(diǎn)標(biāo)記模塊將不可信輸入數(shù)據(jù)全部標(biāo)記為污染源后目標(biāo)程序開(kāi)始執(zhí)行。此時(shí)調(diào)用污點(diǎn)跟蹤模塊對(duì)程序進(jìn)行指令級(jí)插樁,從而分析程序執(zhí)行過(guò)程中污點(diǎn)的傳播情況。分析時(shí)需要對(duì)每條指令做出如下判斷:1)這條指令是否是內(nèi)存/寄存器操作指令;2)如果是,這條指令是否引起了污點(diǎn)傳播。該模塊工作流程如圖5所示。
圖5 污點(diǎn)跟蹤模塊工作流程
Crash可利用性判定模塊工作流程如圖6所示。
圖6 Crash可利用性判定模塊工作流程
一般情況下程序的代碼段是不可重寫(xiě)的,攻擊者只能通過(guò)修改程序的輸入數(shù)據(jù)(如跳轉(zhuǎn)指令的目的地址、格式化字符串函數(shù)的參數(shù)等),來(lái)控制程序的執(zhí)行流從而進(jìn)行攻擊操作[16]。此過(guò)程中涉及到2類(lèi)危險(xiǎn)指令的操作,分別是跳轉(zhuǎn)指令和讀寫(xiě)內(nèi)存指令,該模塊通過(guò)檢測(cè)在程序崩潰點(diǎn)之前是否出現(xiàn)過(guò)這2類(lèi)危險(xiǎn)指令而給出Crash可利用性的判斷結(jié)果:Unknown(未知)和Exploitable(可利用),其中,Exploitable分為Normal(默認(rèn))和High。
根據(jù)上述2類(lèi)危險(xiǎn)指令,Crash可利用性判定規(guī)則如下:
1)跳轉(zhuǎn)指令:主要是指call、jmp及ret,它們能夠改變程序的控制流。程序正常運(yùn)行時(shí)一般不會(huì)出現(xiàn)污點(diǎn)數(shù)據(jù)被用作跳轉(zhuǎn)指令的目的地址的情況,因此當(dāng)call、jmp或ret指令的目的地址是一個(gè)被污染的內(nèi)存地址或寄存器時(shí),表明攻擊者很可能已經(jīng)通過(guò)輸入數(shù)據(jù)改寫(xiě)了這些目的地址,并嘗試獲取程序控制流來(lái)運(yùn)行惡意的shellcode或繞過(guò)安全檢查等。
(1)call/jmp 指令:判斷call、jmp指令的目的地址是否是污點(diǎn)數(shù)據(jù)。對(duì)于call/jmp指令,其操作數(shù)可能是一個(gè)內(nèi)存地址也可能是一個(gè)寄存器,分別進(jìn)行如下判斷:①對(duì)于call/jmp[MEM]指令,如果[MEM]已被污染則該崩潰“可利用”,特別地,對(duì)于[MEM]為[reg_base+offset],如果reg或reg所指向的內(nèi)存單元已被污染,則該崩潰“可利用”;②對(duì)于call/jmp REG指令,如果REG或者REG所指向的內(nèi)存單元[addr]已被污染,則該崩潰“可利用”。
(2)ret指令:判斷ret指令的目的地址是否是污點(diǎn)數(shù)據(jù)并確定污點(diǎn)目的地址中的可控字節(jié)數(shù)。ret指令沒(méi)有操作數(shù)但會(huì)跳轉(zhuǎn)到某個(gè)返回地址。首先從esp中獲取ret指令的返回地址,然后進(jìn)行如下判斷:①如果返回地址所指向的內(nèi)存單元已被污染,則該崩潰“可利用”;②如果返回地址本身已被污染(如緩沖區(qū)溢出漏洞會(huì)覆蓋返回地址),則該崩潰“可利用”,此時(shí)還需要判斷該污點(diǎn)目的地址的可控字節(jié)數(shù),如果崩潰點(diǎn)之前有跳轉(zhuǎn)指令,其目的地址是污點(diǎn)數(shù)據(jù)且4個(gè)字節(jié)全部可控,那么通過(guò)這條跳轉(zhuǎn)指令就能得到對(duì)一個(gè)4 GB(232 Byte)內(nèi)存空間的控制權(quán),這表明該崩潰具有極高的可利用性,因?yàn)楣粽吣軌蛟谄渲胁迦肴我獾膕hellcode進(jìn)行攻擊。
2)讀寫(xiě)內(nèi)存指令:指通過(guò)寄存器對(duì)內(nèi)存單元進(jìn)行讀寫(xiě)數(shù)據(jù)操作。攻擊者通常會(huì)將危險(xiǎn)輸入數(shù)據(jù)寫(xiě)入某塊內(nèi)存單元從而間接地獲取控制流,該過(guò)程不可避免地會(huì)進(jìn)行讀寫(xiě)內(nèi)存指令。如果讀取的內(nèi)存地址可控,或者對(duì)被污染的內(nèi)存單元或寄存器進(jìn)行了寫(xiě)操作甚至寫(xiě)入的內(nèi)容是污點(diǎn)數(shù)據(jù),那么這條讀/寫(xiě)內(nèi)存指令就極有可能被攻擊者所利用,例如用于覆蓋SEH(結(jié)構(gòu)化異常處理)[17]等。
(1)讀內(nèi)存指令:判斷mov REG,[MEM]指令中MEM是否可控。讀內(nèi)存指令中[MEM]的表示形式可能是[reg_base + reg_index*scale + offset],如果reg_base或reg_index已被污染,進(jìn)而獲取ebp的內(nèi)存地址,如果ebp的內(nèi)存地址也被污染,則該崩潰“可利用”。因?yàn)槿绻鸞MEM]的reg_base和reg_index中任意一個(gè)被污染,則內(nèi)存地址可控,也就意味著攻擊者能夠通過(guò)讀內(nèi)存指令將某個(gè)指定地址中的值寫(xiě)入REG中,從而觸發(fā)讀內(nèi)存異?;蛞鸪绦虮罎⑸踔劣糜诟采wSEH,此時(shí)進(jìn)一步判斷ebp的內(nèi)存地址是否被污染,如果是則表明棧中的SEH可能已被修改,則該崩潰“可利用”。
(2)寫(xiě)內(nèi)存指令:判斷mov[MEM],REG指令中REG是否是污點(diǎn)數(shù)據(jù),MEM是否可控。寫(xiě)內(nèi)存指令中[MEM]的表示形式可能是[reg_base + reg_index*scale + offset],如果reg_base或reg_index已被污染,進(jìn)而獲取ebp的內(nèi)存地址,如果ebp的內(nèi)存地址也被污染則該崩潰“可利用”。因?yàn)槿绻鸞MEM]的reg_base和reg_index中任意一個(gè)被污染,則內(nèi)存地址可控,若此時(shí)REG也是污點(diǎn)數(shù)據(jù),這就意味著攻擊者能夠通過(guò)寫(xiě)內(nèi)存指令將任意數(shù)值通過(guò)REG寫(xiě)入某個(gè)指定地址的值中,從而觸發(fā)讀內(nèi)存異?;蛞鸪绦虮罎⑸踔劣糜诟采wSEH,此時(shí)進(jìn)一步判斷ebp的內(nèi)存地址是否被污染,如果是則表明棧中的SEH可能已被修改,則該崩潰“可利用”。
本文的實(shí)驗(yàn)對(duì)象為存在已知漏洞的CoolPlayer、Word等多個(gè)應(yīng)用程序,實(shí)驗(yàn)環(huán)境如表1所列,實(shí)驗(yàn)結(jié)果如表2所列。其中,*表示標(biāo)注為!exploitable工具的測(cè)試結(jié)果。以1號(hào)實(shí)驗(yàn)為例,當(dāng)CoolPlayer Portable 2.19.1試圖打開(kāi)一個(gè)包含超過(guò)260 Byte的特定字符串的.m3u文件時(shí),則會(huì)觸發(fā)棧溢出漏洞。構(gòu)建引發(fā)該軟件崩潰的輸入數(shù)據(jù)如圖7所示。
表1 測(cè)試環(huán)境參數(shù)
表2 實(shí)驗(yàn)結(jié)果對(duì)比
圖7 污染源文件
使用該框架和!exploitable工具分別進(jìn)行崩潰可利用性判定的結(jié)果如圖8所示。
圖8 測(cè)試結(jié)果對(duì)比
該框架不僅能夠準(zhǔn)確定位到發(fā)生崩潰的指令,還能檢測(cè)到引發(fā)崩潰的ret指令的返回地址被覆蓋為用戶(hù)輸入數(shù)據(jù),且根據(jù)返回地址中的可控字節(jié)數(shù)對(duì)該崩潰可利用性的高低進(jìn)行進(jìn)一步判定,準(zhǔn)確度較!exploitable工具更高。
對(duì)表2的實(shí)驗(yàn)結(jié)果分析如下:
1)該框架能夠準(zhǔn)確定位到發(fā)生Crash的指令,并進(jìn)一步判定可利用性高低,針對(duì)棧溢出類(lèi)型漏洞的崩潰可利用性判定,相比!exploitable工具準(zhǔn)確率較高。
2)當(dāng)測(cè)試程序小巧且污染源文件較小時(shí),該框架分析速度較快。但對(duì)于Word等較大程序,盡管污染源文件很小,該框架分析速度也明顯下降。
3)針對(duì)堆溢出、UAF、格式化字符串以及邏輯關(guān)系復(fù)雜的崩潰,該框架暫時(shí)無(wú)法準(zhǔn)確有效地判定其可利用性。
4)動(dòng)態(tài)污點(diǎn)分析針對(duì)數(shù)據(jù)流,并不能對(duì)控制流信息進(jìn)行分析,往往難以發(fā)現(xiàn)與控制流相關(guān)的脆弱性,使得最終分析結(jié)果存在精度不高的問(wèn)題。
比較該框架與前文所提到的3種分析方法,如表3所示。
表3 對(duì)比分析
綜合上述分析可知,BitBlaze和CRAX這2種分析工具由于尚未完全開(kāi)源,應(yīng)用覆蓋范圍較窄,但對(duì)于程序崩潰可利用性判定研究具有重要的參考價(jià)值。目前主要利用!exploitable工具靜態(tài)分析Crash dump的方法初步判定Crash可利用性,然而該工具具有較高的假陽(yáng)性率。本文提出的框架利用動(dòng)態(tài)污點(diǎn)分析技術(shù),便于擴(kuò)展,針對(duì)棧溢出漏洞的可利用性判定準(zhǔn)確率明顯高于!exploitable工具。
本文采用Windows下二進(jìn)制插樁平臺(tái)Pin,提出了一種基于動(dòng)態(tài)污點(diǎn)分析技術(shù)的Crash可利用性自動(dòng)化判定框架。該框架能夠有效地檢測(cè)出可利用的崩潰并分配可利用性等級(jí),準(zhǔn)確分類(lèi)棧溢出漏洞。但該框架主要存在2個(gè)問(wèn)題:1)對(duì)于邏輯關(guān)系較為復(fù)雜的崩潰只能進(jìn)行粗粒度的判斷,準(zhǔn)確度較低;2)對(duì)于較大的程序或樣本,檢測(cè)時(shí)間開(kāi)銷(xiāo)較大且收集的信息易重復(fù),效率降低。
下一步將針對(duì)該框架的性能和效率進(jìn)行優(yōu)化,增加對(duì)程序指令的識(shí)別覆蓋面,完善Crash可利用性判斷規(guī)則,避免污染缺失的情況,提高判定準(zhǔn)確性;通過(guò)對(duì)內(nèi)存讀寫(xiě)操作代碼的優(yōu)化,提高運(yùn)行效率;結(jié)合動(dòng)態(tài)符號(hào)執(zhí)行技術(shù)[18]分析異常指令后的多條路徑,提高路徑覆蓋率。
[1] 吳世忠,郭 濤,董國(guó)偉,等.軟件漏洞分析技術(shù)進(jìn)展[J].清華大學(xué)學(xué)報(bào)(自然科學(xué)版),2012,52(10):1309-1319.
[2] MCGRAW G.Software security:building security in[M].Boston,USA:Addison-Wesley Professional,2006.
[3] KROHNHANSEN H.Program crash analysis:evaluation and application of current methods[EB/OL].[2017-06-05].https://www-esv.nhtsa.dot.gov/Proceedings/24/files/24ESV-000055.PDF.
[4] Microsoft.!exploitable crash analyzer——MSEC debugger extensions[EB/OL].[2017-06-05].http://msecdbg.codeplex.com.
[5] MILLER C,CABALLERO J,BERKELEY U,et al.Crash analysis with BitBlaze[J].Revista Mexicanade Sociología,2010,44(1):81-117.
[6] HUANG Shih-kun,HUANG Min-hsiang,HUANG Po-yen,et al.CRAX:software crash analysis for automatic exploit generation by modeling attacks as symbolic continua-tions[C]//Proceedings of the 6th International Conference on Software Security and Reliability.Washington D.C.,USA:IEEE Press,2012:78-87.
[7] WEINSTEIN D,SHIRK J.The history of the !exploitable crash analyzer[EB/OL].[2017-06-05].http://blogs.technet.com/b/srd/archive/2009/04/08/the-history-of-the-exploitable-Crash-analyzer.aspx.
[8] ZHANG Puhan,WU Jianxiong,XIN Wang,et al.Program crash analysis based on taint analysis[C]//Proceedings of the 9th International Conference on P2P,Parallel,Grid,Cloud and Internet Computing.Washington D.C.,USA:IEEE Press,2014:492-498.
[9] 葉永宏,武東英,陳 揚(yáng).一種基于細(xì)粒度污點(diǎn)分析的逆向平臺(tái)[J].計(jì)算機(jī)工程與應(yīng)用,2012,48(28):90-96.
[10] 史大偉,袁天偉.一種粗細(xì)粒度結(jié)合的動(dòng)態(tài)污點(diǎn)分析方法[J].計(jì)算機(jī)工程,2014,40(3):12-17.
[11] 宋 錚,王永劍,金 波,等.二進(jìn)制程序動(dòng)態(tài)污點(diǎn)分析技術(shù)研究綜述[J].信息網(wǎng)絡(luò)安全,2016(3):77-83.
[13] REDDI V J,JANAPA V,SETTLE A,et al.PIN:a binary instrumentation tool for computer architecture research and education[C]//Proceedings of Workshop on Computer Architecture Education.New York,USA:ACM Press,2004:1-7.
[14] 王 乾.基于動(dòng)態(tài)二進(jìn)制分析的關(guān)鍵函數(shù)定位技術(shù)研究[D].鄭州:信息工程大學(xué),2012.
[15] 孔德光,鄭 烇,帥建梅,等.基于污點(diǎn)分析的源代碼脆弱性檢測(cè)技術(shù)[J].小型微型計(jì)算機(jī)系統(tǒng),2009,30(1):78-82.
[16] 黃 昭.一種改進(jìn)的動(dòng)態(tài)污點(diǎn)分析模型[D].武漢:華中科技大學(xué),2011.
[17] WU Weimin,GUO Chaowei,HUANG Zhiwei,et al.Vulnerability exploitation technology of structured exception handling based on windows[J].Computer Engineering,2012,38(20):5-8.
[18] ZHANG Yufeng,CHEN Zhenbang,WANG Ji,et al.Regular property guided dynamic symbolic execution[C]//Proceedings of the 37th IEEE International Conference on Software Engineering.Washington D.C.,USA:IEEE Press,2015:643-653.