劉露平, 方勇, 劉亮, 龍剛
(四川大學(xué) 電子信息學(xué)院,四川 成都 610065)
基于動態(tài)插樁的緩沖區(qū)溢出漏洞檢測技術(shù)研究
劉露平, 方勇, 劉亮, 龍剛
(四川大學(xué) 電子信息學(xué)院,四川 成都 610065)
緩沖區(qū)溢出漏洞是一類常見的軟件漏洞,其對計(jì)算機(jī)系統(tǒng)造成的危害非常大。本文針對這類漏洞提出一種基于二進(jìn)制文件動態(tài)插樁并根據(jù)程序運(yùn)行狀態(tài)來判定緩沖區(qū)溢出的檢測方法,并實(shí)現(xiàn)了基于該方法的檢測系統(tǒng)。通過分析緩沖區(qū)溢出的原理以及常見攻擊方法的特點(diǎn),提出了基于覆蓋返回地址、虛函數(shù)表、異常處理鏈表以及溢出后執(zhí)行特定API的緩沖區(qū)溢出檢測方法。實(shí)驗(yàn)表明該系統(tǒng)能有效檢測到緩沖區(qū)溢出并定位溢出點(diǎn)從而輔助對漏洞原理進(jìn)行分析。
緩沖區(qū)溢出;動態(tài)檢測;二進(jìn)制插樁;程序狀態(tài)
緩沖區(qū)溢出漏洞是一類常見的軟件安全性漏洞,廣泛存在于各種操作系統(tǒng)、應(yīng)用軟件中,利用緩沖區(qū)漏洞進(jìn)行攻擊給網(wǎng)絡(luò)安全帶來了極大的威脅,由于其具有非常大的危害性,許多研究人員對此進(jìn)行了深入的研究,并提出了各種針對緩沖區(qū)溢出的檢測方法。
現(xiàn)有針對緩沖區(qū)溢出的檢測和預(yù)警中,主要有以下幾種方法:
1)基于編譯器的運(yùn)行時檢查。如微軟在其編譯器VS7.0及以后版本中增加了GS編譯選項(xiàng),通過在堆棧中加一個cookie,當(dāng)函數(shù)返回時檢測該cookie值是否被改變從而判斷是否發(fā)生溢出。gcc編譯器的StackGuard插件則通過在棧上放探針來實(shí)現(xiàn)檢測[1]。
2)系統(tǒng)/硬件級別的檢測保護(hù)。在Windows XP SP2后,微軟開始提供了DEP(Data Execution Prevention)數(shù)據(jù)執(zhí)行保護(hù)技術(shù)[2],通過將堆和棧所屬內(nèi)存空間設(shè)置為不可執(zhí)行屬性,將數(shù)據(jù)和代碼分開,從而有效阻止惡意代碼的執(zhí)行。
3)動態(tài)污點(diǎn)傳播檢測技術(shù)。通過將軟件的外部輸入數(shù)據(jù)標(biāo)記為污點(diǎn)數(shù)據(jù),然后利用動態(tài)插樁技術(shù)追蹤記錄污點(diǎn)數(shù)據(jù)在程序中的傳播和擴(kuò)展流程,結(jié)合符號執(zhí)行等技術(shù)對程序引用污點(diǎn)數(shù)據(jù)的代碼進(jìn)行分析來判定是否發(fā)生緩沖區(qū)溢出[3-4]。
由于上述方法已被許多攻擊者研究透徹,針對各種檢測都有很多相應(yīng)的繞過方法,在實(shí)際運(yùn)用中并不能很好的阻止緩沖區(qū)溢出攻擊。因此,本文通過對緩沖區(qū)溢出漏洞原理及其利用過程的分析,利用動態(tài)二進(jìn)制插樁工具Pin來記錄程序執(zhí)行的整個過程,并結(jié)合緩沖區(qū)溢出特征來完成動態(tài)檢測。實(shí)驗(yàn)表明該方法能有效檢測和阻止緩沖區(qū)溢出漏洞攻擊。
1.1 緩沖區(qū)溢出漏洞簡介
緩沖區(qū)溢出漏洞是指當(dāng)程序拷貝數(shù)據(jù)到特定的緩沖區(qū)時,由于預(yù)留空間較小多余的數(shù)據(jù)溢出后覆蓋其他內(nèi)存單元的值,導(dǎo)致內(nèi)存破壞,程序發(fā)生崩潰。如果數(shù)據(jù)被經(jīng)過特定構(gòu)造,則通過溢出能劫持程序流程從而取得系統(tǒng)控制權(quán)。
緩沖區(qū)在系統(tǒng)中的表現(xiàn)形式多樣,常見的緩沖區(qū)溢出包括棧溢出和堆溢出兩種。在緩沖區(qū)漏洞利用中,一般會通過數(shù)據(jù)溢出后覆蓋函數(shù)返回地址,SEH(Structured Exception Handing)鏈表、以及函數(shù)虛表的方式來達(dá)到劫持程序流程的目的。
1.2 二進(jìn)制動態(tài)插樁平臺PIN
Pin是Intel公司開發(fā)的一個動態(tài)二進(jìn)制探測框架,支持Android、Linux、OSX以及Windows等平臺。具有易用、高效、可移植以及健壯性等特點(diǎn),通過插樁引擎,將用戶插入的分析代碼和目標(biāo)程序重新編譯成新的目標(biāo)文件后在虛擬機(jī)緩沖區(qū)中執(zhí)行,從而可以動態(tài)獲取程序運(yùn)行的中間信息[5]。圖1是Pin的整個框架:
圖1 PIN結(jié)構(gòu)架構(gòu)圖
用戶編寫的分析工具相當(dāng)于Pin的一個插件,統(tǒng)稱為Pintool。Pin提供了指令、函數(shù)和映像三種插樁模式。在進(jìn)行緩沖區(qū)溢出檢測時,通過策略選擇三種不同粒度的插樁方式,從而當(dāng)指令執(zhí)行時記錄的指令類型、操作數(shù)、相關(guān)寄存器等信息;函數(shù)調(diào)用時記錄下函數(shù)的參數(shù)、跳轉(zhuǎn)地址、返回值信息;而當(dāng)模塊加載時獲取到模塊名稱、以及庫函數(shù)等信息。此外通過pin提供的事件進(jìn)行插樁功能,可以在程序開始時插樁獲取到進(jìn)程的堆空間分布信息,在線程開始時插樁記錄下線程的初始化堆??臻g分布信息。
通過插樁獲取到程序運(yùn)行狀態(tài)信息后,結(jié)合緩沖區(qū)溢出的特征利用預(yù)先設(shè)定的規(guī)則來進(jìn)行分析判斷從而對緩沖區(qū)溢出漏洞攻擊進(jìn)行判定和預(yù)警[6]。
1.3 溢出檢測的實(shí)現(xiàn)
緩沖區(qū)溢出后一般會采取覆蓋函數(shù)返回地址、覆蓋SEH鏈表或者虛函數(shù)表的方式進(jìn)行利用。整個緩沖區(qū)溢出檢測步驟如下:
(1)異常事件和特定行為捕獲時機(jī)
Windows系統(tǒng)利用SEH機(jī)制處理異常時,在用戶態(tài)空間會調(diào)用ntdll.dll中的DispathcException這個函數(shù)進(jìn)行異常的分發(fā)處理,可以對這個函數(shù)進(jìn)行插樁來對程序異常進(jìn)行捕獲。另外溢出發(fā)生后執(zhí)行shellcode時一般會調(diào)用kernel32.dll中的LoadLibrary和GetProcAddress這兩個函數(shù)來獲取系統(tǒng)API的地址,因此對這兩個函數(shù)插樁可以捕獲到shellcode調(diào)用這兩個系統(tǒng)API時的動作。
(2)溢出檢測流程
程序在進(jìn)行調(diào)用時,通過Call指令將返回地址壓入堆棧,而程序結(jié)束時通過ret指令將返回地址出棧后賦值給EIP繼續(xù)執(zhí)行,一旦發(fā)生溢出,則函數(shù)返回地址將被改寫。因此方案中通過對CALL、RET指令插樁,并建立一個虛擬硬件堆棧,在執(zhí)行Call指令進(jìn)行函數(shù)調(diào)用時將返回地址壓入虛擬硬件堆棧,RET指令函數(shù)返回時從虛擬硬件堆棧中出棧返回地址并與真實(shí)堆棧的返回地址進(jìn)行比較,判定是否相等來進(jìn)行檢測判斷。
SEH鏈表中的每個節(jié)點(diǎn)都是一個異常注冊結(jié)構(gòu)體(EXCEPTION_REGISTRATION),其成員NextS.E.H Recorder指向下一個結(jié)構(gòu)體,而Exception handler指向異常處理函數(shù)【7】。而基于SEH的緩沖區(qū)溢出攻擊中,通常使溢出數(shù)據(jù)覆蓋異常注冊結(jié)構(gòu)體后觸發(fā)異常執(zhí)行shellcode。SEH鏈表在溢出發(fā)生后被覆蓋成如圖2所示的形式:
圖2 覆蓋異常處理鏈表示意圖
溢出發(fā)生后一般會將頂層異常注冊結(jié)構(gòu)體覆蓋,因此SEH鏈表的完整性將得到破壞。一個完整的SEH鏈表滿足以下特性:①整個鏈表節(jié)點(diǎn)全部位于堆棧中。②每個節(jié)點(diǎn)的異常處理函數(shù)指針不是位于堆棧中。③最后一個節(jié)點(diǎn)的指針為0xffffffff。因此可以在異常事件發(fā)生時對SEH鏈表的完整性進(jìn)行檢測來判斷是否發(fā)生溢出。
在多數(shù)堆溢出攻擊中,在漏洞觸發(fā)前會利用Heap Spay(堆噴射)或其他方式進(jìn)行內(nèi)存空間的布局,通過在堆空間重復(fù)布置包含大量NOP(空指令)和shellcode的數(shù)據(jù)庫,溢出發(fā)生后將虛函數(shù)表覆蓋成攻擊者事先布置好的堆棧內(nèi)存空間中[8]。因此可以對函數(shù)調(diào)用的Call指令進(jìn)行插樁,在樁代碼中獲取其跳轉(zhuǎn)目的地址檢測其是為堆??臻g來進(jìn)行判斷。
此外在溢出攻擊中,獲取控制權(quán)后一般會調(diào)用系統(tǒng)API來完成功能,通用代碼一般會調(diào)用LoadLibraryA和GetProcAddress等函數(shù)獲取其他API函數(shù)地址,正常情況下這個兩個函數(shù)的返回地址位于系統(tǒng)空間,而一旦在溢出發(fā)生后其返回地址位于堆棧等內(nèi)存空間。因此對這兩個函數(shù)進(jìn)行插樁,判斷其返回地址是否為堆棧空間來進(jìn)行檢測。根據(jù)以上分析,整個檢測流程如下圖3所示:
圖3 溢出檢測流程
(3)函數(shù)調(diào)用序列流程分析
程序的整個執(zhí)行流程都通過函數(shù)調(diào)用來實(shí)現(xiàn),而所有的函數(shù)調(diào)用都是基于Call指令來完成,因此通過插樁CALL指令,在插入的裝代碼中記錄程序的指令調(diào)用流程和函數(shù)傳遞的參數(shù)及返回值等信息來記錄程序的執(zhí)行流程。函數(shù)調(diào)用流程記錄過程如下圖4所示:
圖4 函數(shù)調(diào)用序列記錄流程
系統(tǒng)采用循環(huán)隊(duì)列的方式記錄程序調(diào)用流程,總共記錄了200次的函數(shù)調(diào)用,到溢出發(fā)生時,隊(duì)列中記錄的時溢出發(fā)生前最近的200次函數(shù)調(diào)用關(guān)系序列圖,溢出發(fā)生后系統(tǒng)將根據(jù)記錄信息生成函數(shù)調(diào)用流程關(guān)系圖。
為了驗(yàn)證系統(tǒng)的有效性,對IE、office、以及Adobe等軟件的多個漏洞樣本進(jìn)行了測試驗(yàn)證,下面就具體以CVE-2012-0158漏洞進(jìn)行說明。測試環(huán)境為Windows XP3、office2010[9]。
CVE-2012-0158是一個winword的溢出漏洞,winword的COMMCTL.OCX組件中由于邏輯錯誤導(dǎo)致溢出漏洞發(fā)生。圖5是將metasploit生成的樣本經(jīng)過該系統(tǒng)測試后得出的結(jié)果,測試結(jié)果與實(shí)際分析結(jié)果吻合。
圖5 系統(tǒng)分析結(jié)果
圖6 是系統(tǒng)記錄的溢出發(fā)生前的函數(shù)調(diào)用序列(這里只列出了4層,紅色標(biāo)記的一層為溢出發(fā)生所在的函數(shù)):
圖6 函數(shù)調(diào)用流程圖
表1是其他樣本測試結(jié)果,測試樣本均來自metasploit生成,限于篇幅這里只列出了一部分,測試發(fā)現(xiàn)系統(tǒng)沒有發(fā)現(xiàn)誤報(bào),能夠準(zhǔn)確檢測到緩沖區(qū)溢出并定位到溢出發(fā)生的位置。
表1 系統(tǒng)測試結(jié)果
實(shí)驗(yàn)表明該系統(tǒng)的檢測結(jié)果與漏洞實(shí)際分析結(jié)果符合,說明動態(tài)插樁技術(shù)結(jié)合漏洞利用特征來進(jìn)行緩沖區(qū)溢出漏洞檢測的正確性和有效性,從而快速對漏洞樣本進(jìn)行檢測并輔助進(jìn)行對漏洞原理分析。由于采用動態(tài)插樁會影響程序執(zhí)行效率,未來會插樁策略上進(jìn)一步優(yōu)化,以提高程序分析效率。
[1] 王清,張東輝,周浩.0da安全:軟件漏洞分析技術(shù)[M].北京:北京電子工業(yè)出版社,2011:267-274.
[2] Intel.Pin-A Dynamic Binary Instrumentation Tool[EB/OL]. (2012-07-13)[2014-11-28].https://software.intel.com/ en-us/articles/pintool/wbia09.pdf.
[3] 高迎春,周安民,Windows DEP數(shù)據(jù)執(zhí)行保護(hù)技術(shù)研究[J].信息安全與通信保密,2013(09):77-80.
[4] 代偉,劉智,劉益和.基于二進(jìn)制的動態(tài)污點(diǎn)分析[J].計(jì)算機(jī)應(yīng)用研究,2014(08):2498-2505.
[5] 諸葛建偉,陳麗波,田凡.基于類型的動態(tài)污點(diǎn)分析技術(shù)[J].清華大學(xué)學(xué)報(bào)(自然科學(xué)版),2012-10-23[10]:1321-1328.
[6] 陳丹.”二進(jìn)制審核”方式的緩沖區(qū)溢出漏洞挖掘[J].辦公自動化應(yīng)用,2014(09):43-45.
[7] 段鋼.加密與解密[M].北京:電子工業(yè)出版社,2008:306-311.
[8] 黃志軍,鄭濤.一種基于DBI的ROP攻擊檢測[J].計(jì)算機(jī)科學(xué),2012(09):120-124.
[9] 啟明星辰.CVE-2012-0158分析報(bào)告[EB/OL].(2012-04-28)[2014-11-28].http://http://www.venustech.com.cn/ NewsInfo/449/13620.Html.
Buffer Overflow Vulnerability Detection Technology based on Dynam ic Instrumentation
LIU Lu-ping,F(xiàn)ANG Yong,LIU Liang,LONG Gang
(College of Electronics and Information Engineering,Sichuan University,Chengdu Sichuan 610065,China)
Buffer overflow vulnerability,as a kind of common software vulnerability,would usually result in huge damage to computer system.In light of this,amethod based on dynamic binary instrumentation is to detect buffer overflow vulnerability in accordance with the running states of program,and a detection system based on thismethod is also implemented.Based on the analysis of buffer overflow principle and characteristics of common attack-methods,a detectionmethod based on the return address,virtual function table,exception handling linked-list and the carrying-out of specific APIafter overflow buffer is presented.Experiments indicate that this system can effectively detect buffer overflow and locate overflow point,so as to assist the analysis of vulnerability principle.
buffer overflow;dynamic detection;binary-level instrumentation;program status
TP393
A
1009-8054(2015)04-0080-03
劉露平(1988—),男,碩士研究生,主要研究方向:信息安全、網(wǎng)絡(luò)通信;
方 勇(1966—),男,博士,教授,主要研究方向:網(wǎng)絡(luò)與信息系統(tǒng)安全;
劉 亮(1982—),男,博士,講師,主要研究方向:網(wǎng)絡(luò)與信息系統(tǒng)安全;
龍 剛(1986—-),男,碩士,主要研究方向:信息安全、網(wǎng)絡(luò)通信?!?/p>
2014-11-27