?

基于動態污點分析的棧溢出Crash判定技術

2018-04-19 07:37露平
計算機工程 2018年4期
關鍵詞:污點漏洞內存

,, , ,露平,

(四川大學 電子信息學院,成都 610065)

0 概述

隨著信息化時代的到來,互聯網的運用越來越廣泛,尤其是計算機軟件已經成為世界經濟、科技、軍事和社會發展的重要引擎,與此同時軟件的安全問題也日益突出[1]。軟件漏洞是安全問題的主要根源之一。近年來軟件漏洞數量呈現明顯上升趨勢,軟件漏洞能夠引發惡性的Web攻擊事件侵害公民權益,傳播廣泛的計算機病毒造成重大經濟損失,實施高級可持續性攻擊引發國家安全事件等[2]。因此,對軟件漏洞的分析已經成為計算機領域的重要研究熱點及難點。

當程序發生崩潰(Crash)時,安全研究人員需要進一步判定崩潰是由程序的內部邏輯錯誤引起還是由外部輸入數據引起。如果是由外部輸入引起,那么這很可能是一個嚴重的崩潰,甚至是一個可利用的漏洞[3]。因此,分析Crash的可利用性,即判定Crash是否能夠被攻擊者所利用以及被利用后的危害程度是否足夠嚴重。分析崩潰的可利用性等級不僅為軟件異常分析提供重要依據,還能夠有效提高漏洞挖掘速度。無論對于攻擊者還是防御者,這都是一項十分重要并且緊迫的工作。隨著計算機軟件的廣泛應用,如何快速有效地分析評估Crash的可利用性已經成為當前漏洞挖掘與分析的關鍵問題之一。

本文介紹目前用于Crash分析領域的3種常見方法,利用動態二進制插樁工具Pin在Windows平臺實現一種基于動態污點分析技術的Crash可利用性自動化判定框架,并對若干已知漏洞的應用程序進行實驗驗證,與!exploitable工具的分析結果進行對比。

1 Crash可利用性分析方法

目前用于Crash可利用性分析的常見方法主要有3種,靜態分析以Microsoft發布的!exploitable工具[4]為代表,靜態分析與動態分析結合以二進制分析框架BitBlaze[5]為代表,動態分析以漏洞利用自動生成框架CRAX[6]為代表。

1.1 調用堆棧分析

2009年微軟安全工程中心基于微軟在Windows Vista開發過程中使用Fuzzing的經驗創建了!exploitable工具,用于自動崩潰分析和安全風險評估。該工具通過比較調用堆棧對應的散列值分類崩潰,進而分析崩潰上下文的語義信息定義可利用性級別。它只依賴于Crash dump,而不是導致崩潰的輸入[7]。程序發生崩潰時,WinDbg加載MSEC.dll,使用!exploitable命令分析Crash是否可利用,首先整理所有崩潰并創建哈希值來確定崩潰的唯一性,其次查看崩潰類型并判定崩潰是否可以被惡意利用,然后分配崩潰可利用性等級:Exploitable(可利用),Probably Exploitable(可能可利用),Probably Not Exploitable(可能不可利用) or Unknown(未知)。

!exploitable工具易用性強,效率較高,可以極大地幫助安全研究人員節省分析崩潰的時間和精力。但是該工具具有較高的假陽性率,并且只能給出Windows平臺下準確的崩潰判斷,對于其他第三方軟件和一些邏輯復雜的崩潰,例如堆溢出、UAF等,準確率非常低[8]。

1.2 執行跟蹤

BitBlaze是UC Berkely開發的基于二進制信息的分析平臺,該平臺主要用于確定崩潰時哪些寄存器和內存地址來自攻擊者控制的輸入文件,并且切片Null指針查看起始位置來快速排除可利用性。該平臺支持精確的分析,結合了靜態和動態分析技術以及程序驗證技術以滿足普遍需求,有助于快速確定由基于文件變異的Fuzzing生成的特定崩潰是否可利用,以及確定崩潰產生的根本原因。

分析程序崩潰的根本原因,目前主要通過手動或使用調試器完成,使用BitBlaze可以簡化和加快進程,并且提供可重復性。BitBlaze運行在GuestOS的更底層,對目標程序有較好的透明性,但該平臺局部開源且不便于擴展,對于污點的設置同樣缺乏靈活性[9]。

1.3 端到端

2012年IEEE會議提出了基于AEG方法改進的漏洞利用自動化框架CRAX。它是一個基于S2E的符號執行平臺。為了生成控制流劫持攻擊,檢測符號EIP及其他基于連續的寄存器和指針,提出了一種搜索最大連續符號內存用于有效載荷注入的系統方法。

CRAX解決了沒有源代碼的大型軟件系統的漏洞利用自動生成,并且可以粗粒度地確定崩潰優先級。然而CRAX未開源且耗時較AEG長,因為它進行的是整個系統的符號執行而AEG只是在應用程序級別,只能通過減少在concolic執行期間的約束數量進行時間優化。

2 相關技術

動態污點分析技術是指將非信任來源的數據進行標記,并追蹤其在程序執行過程中的傳遞,從而達到獲取關鍵位置與輸入數據關聯信息的分析方法[10]。動態污點分析能夠準確地獲取程序的執行過程,有效地提高污點分析的精度,錯誤率較低,應用性較強。動態污點分析的主要過程包括3個階段,如圖1所示[11]。

圖1 動態污點分析過程

各階段的作用如下:

1)污點標記(污染源識別):正確識別污染的來源并進行標記。如果對象的值來源不可信,那么將該對象標記為污染的。

2)污點傳播:根據正確的污點傳播規則,將污點數據隨著程序的運行進行污點的標記及傳遞(或移除)。

3)安全策略檢測攻擊:通過制定合理的規則與策略,確定或者檢測出程序運行中存在的各種漏洞利用攻擊,如緩沖區溢出等[11]。

動態污點傳播分析一般采用虛擬執行或者動態二進制插樁方式對污點數據進行記錄和跟蹤維護[11]。動態二進制插樁是指在不影響程序正常執行結果的前提下,根據用戶需要在程序動態執行過程中插入額外的分析代碼以監控程序執行過程[12]。隨著動態二進制插樁平臺的出現,動態污點分析的實現和應用變得越加廣泛。本文提出的Crash可利用性自動化分析框架,進行動態污點分析的前提就是需要對目標程序進行動態二進制插樁。選用動態二進制插樁平臺Pin作為原型系統,在此基礎上結合動態污點分析技術實現對Crash的可利用性判定。

Pin是Intel公司提供的二進制程序插樁工具,支持IA-32、Intel(R) 64和IA64架構上的Windows和Linux可執行程序,具有易用、高效、可移植性以及健壯性等特點[13]。Pin采用動態編譯的方法插入探測代碼,并配合使用函數內聯、寄存器重分配、指令調度等優化方法,使得基于Pin開發的動態二進制插樁工具具有較高的運行效率[14]。Pin工具內部含有即時編譯器、虛擬機和代碼緩存,插樁工具通過插樁接口函數與Pin進行交互[14],其整體架構如圖2所示。

圖2 Pin平臺框架

使用Pin進行動態污點分析能夠有效地實現自動化。Pin的指令級插樁主要通過函數INS_AddInstrumentFunction來實現,它會自動在每執行一條新指令時調用回調函數INS_InsertCall,并且在不影響原代碼正常執行的同時將分析代碼插入原代碼序列中,進而生成一個新的代碼序列并自動切換代碼的控制權,使得整個分析過程自動化且高效進行[15]。使用Pin對目標程序進行二進制插樁的具體步驟如下:

1)調用PIN_Init()初始化Pin環境。

2)調用INS_AddInstrumentFunction(),分別聲明指令級插樁函數Instruction和鏡像級插樁函數ModLoad。其中,函數Instruction中定義了一個或多個回調函數INS_InsertCall,在每執行一條新指令時均要調用INS_InsertCall函數執行對當前指令的分析代碼;函數ModLoad則對整個輸入文件進行鏡像級插樁。

3)調用PIN_AddFiniFunction()聲明程序退出函數Fini,該函數用于在程序運行結束時輸出最終的崩潰可利用性判斷結果。

4)調用PIN_StartProgram()啟動程序。

本文以動態二進制分析平臺Pin為基礎,利用動態插樁技術和動態污點分析技術,實現了Crash的可利用性自動化判定框架。該框架暫不考慮保護機制的影響,如DEP、ALSR等。其整體架構如圖3所示。

圖3 框架整體結構

3 系統設計與實現

利用該框架進行Crash可利用性分析的具體流程如下:

1)調用污點標記模塊,將來自于不可信數據源的輸入數據標記為污染源。

2)調用Pin對目標程序Crash樣本進行二進制指令級插樁。

3)調用污點跟蹤模塊跟蹤每一條內存/寄存器操作指令,判斷其是否引起污點傳播,并對被污染的內存和寄存器進行標記,同時修改污點數據列表。

4)調用Crash可利用性判定模塊,對能夠改變程序控制流的call、jmp、ret指令判斷其目的地址/操作數是否已被標記,同時對進行讀寫內存操作的mov指令判斷其操作的內存地址是否可控以及是否操作污點數據,由此給出判定結果。

3.1 污點標記模塊

污點標記是進行污點傳播分析的前提,其標記方法和結果將極大程度地影響污點傳播處理和污點信息存儲的效率[11]。污點標記模塊主要有2個功能:1)將目標程序的輸入數據作為污染源并為其全部添加污點標記;2)對于污點跟蹤模塊中的污點傳播,如果有污點數據污染了內存/寄存器,則為其添加污點標記,如果已被污染的內存/寄存器被非污點數據覆蓋則移除其污點標記。定義2個污點數據列表:addressTainted和regsTainted,分別用于存放被污染的內存地址和寄存器。該模塊工作流程如圖4所示。

圖4 污點標記模塊工作流程

3.2 污點跟蹤模塊

通過污點標記模塊將不可信輸入數據全部標記為污染源后目標程序開始執行。此時調用污點跟蹤模塊對程序進行指令級插樁,從而分析程序執行過程中污點的傳播情況。分析時需要對每條指令做出如下判斷:1)這條指令是否是內存/寄存器操作指令;2)如果是,這條指令是否引起了污點傳播。該模塊工作流程如圖5所示。

圖5 污點跟蹤模塊工作流程

3.3 Crash可利用性判定模塊

Crash可利用性判定模塊工作流程如圖6所示。

圖6 Crash可利用性判定模塊工作流程

一般情況下程序的代碼段是不可重寫的,攻擊者只能通過修改程序的輸入數據(如跳轉指令的目的地址、格式化字符串函數的參數等),來控制程序的執行流從而進行攻擊操作[16]。此過程中涉及到2類危險指令的操作,分別是跳轉指令和讀寫內存指令,該模塊通過檢測在程序崩潰點之前是否出現過這2類危險指令而給出Crash可利用性的判斷結果:Unknown(未知)和Exploitable(可利用),其中,Exploitable分為Normal(默認)和High。

根據上述2類危險指令,Crash可利用性判定規則如下:

1)跳轉指令:主要是指call、jmp及ret,它們能夠改變程序的控制流。程序正常運行時一般不會出現污點數據被用作跳轉指令的目的地址的情況,因此當call、jmp或ret指令的目的地址是一個被污染的內存地址或寄存器時,表明攻擊者很可能已經通過輸入數據改寫了這些目的地址,并嘗試獲取程序控制流來運行惡意的shellcode或繞過安全檢查等。

(1)call/jmp 指令:判斷call、jmp指令的目的地址是否是污點數據。對于call/jmp指令,其操作數可能是一個內存地址也可能是一個寄存器,分別進行如下判斷:①對于call/jmp[MEM]指令,如果[MEM]已被污染則該崩潰“可利用”,特別地,對于[MEM]為[reg_base+offset],如果reg或reg所指向的內存單元已被污染,則該崩潰“可利用”;②對于call/jmp REG指令,如果REG或者REG所指向的內存單元[addr]已被污染,則該崩潰“可利用”。

(2)ret指令:判斷ret指令的目的地址是否是污點數據并確定污點目的地址中的可控字節數。ret指令沒有操作數但會跳轉到某個返回地址。首先從esp中獲取ret指令的返回地址,然后進行如下判斷:①如果返回地址所指向的內存單元已被污染,則該崩潰“可利用”;②如果返回地址本身已被污染(如緩沖區溢出漏洞會覆蓋返回地址),則該崩潰“可利用”,此時還需要判斷該污點目的地址的可控字節數,如果崩潰點之前有跳轉指令,其目的地址是污點數據且4個字節全部可控,那么通過這條跳轉指令就能得到對一個4 GB(232 Byte)內存空間的控制權,這表明該崩潰具有極高的可利用性,因為攻擊者能夠在其中插入任意的shellcode進行攻擊。

2)讀寫內存指令:指通過寄存器對內存單元進行讀寫數據操作。攻擊者通常會將危險輸入數據寫入某塊內存單元從而間接地獲取控制流,該過程不可避免地會進行讀寫內存指令。如果讀取的內存地址可控,或者對被污染的內存單元或寄存器進行了寫操作甚至寫入的內容是污點數據,那么這條讀/寫內存指令就極有可能被攻擊者所利用,例如用于覆蓋SEH(結構化異常處理)[17]等。

(1)讀內存指令:判斷mov REG,[MEM]指令中MEM是否可控。讀內存指令中[MEM]的表示形式可能是[reg_base + reg_index*scale + offset],如果reg_base或reg_index已被污染,進而獲取ebp的內存地址,如果ebp的內存地址也被污染,則該崩潰“可利用”。因為如果[MEM]的reg_base和reg_index中任意一個被污染,則內存地址可控,也就意味著攻擊者能夠通過讀內存指令將某個指定地址中的值寫入REG中,從而觸發讀內存異?;蛞鸪绦虮罎⑸踔劣糜诟采wSEH,此時進一步判斷ebp的內存地址是否被污染,如果是則表明棧中的SEH可能已被修改,則該崩潰“可利用”。

(2)寫內存指令:判斷mov[MEM],REG指令中REG是否是污點數據,MEM是否可控。寫內存指令中[MEM]的表示形式可能是[reg_base + reg_index*scale + offset],如果reg_base或reg_index已被污染,進而獲取ebp的內存地址,如果ebp的內存地址也被污染則該崩潰“可利用”。因為如果[MEM]的reg_base和reg_index中任意一個被污染,則內存地址可控,若此時REG也是污點數據,這就意味著攻擊者能夠通過寫內存指令將任意數值通過REG寫入某個指定地址的值中,從而觸發讀內存異?;蛞鸪绦虮罎⑸踔劣糜诟采wSEH,此時進一步判斷ebp的內存地址是否被污染,如果是則表明棧中的SEH可能已被修改,則該崩潰“可利用”。

4 實驗結果分析

本文的實驗對象為存在已知漏洞的CoolPlayer、Word等多個應用程序,實驗環境如表1所列,實驗結果如表2所列。其中,*表示標注為!exploitable工具的測試結果。以1號實驗為例,當CoolPlayer Portable 2.19.1試圖打開一個包含超過260 Byte的特定字符串的.m3u文件時,則會觸發棧溢出漏洞。構建引發該軟件崩潰的輸入數據如圖7所示。

表1 測試環境參數

表2 實驗結果對比

圖7 污染源文件

使用該框架和!exploitable工具分別進行崩潰可利用性判定的結果如圖8所示。

圖8 測試結果對比

該框架不僅能夠準確定位到發生崩潰的指令,還能檢測到引發崩潰的ret指令的返回地址被覆蓋為用戶輸入數據,且根據返回地址中的可控字節數對該崩潰可利用性的高低進行進一步判定,準確度較!exploitable工具更高。

對表2的實驗結果分析如下:

1)該框架能夠準確定位到發生Crash的指令,并進一步判定可利用性高低,針對棧溢出類型漏洞的崩潰可利用性判定,相比!exploitable工具準確率較高。

2)當測試程序小巧且污染源文件較小時,該框架分析速度較快。但對于Word等較大程序,盡管污染源文件很小,該框架分析速度也明顯下降。

3)針對堆溢出、UAF、格式化字符串以及邏輯關系復雜的崩潰,該框架暫時無法準確有效地判定其可利用性。

4)動態污點分析針對數據流,并不能對控制流信息進行分析,往往難以發現與控制流相關的脆弱性,使得最終分析結果存在精度不高的問題。

5 方法比較

比較該框架與前文所提到的3種分析方法,如表3所示。

表3 對比分析

綜合上述分析可知,BitBlaze和CRAX這2種分析工具由于尚未完全開源,應用覆蓋范圍較窄,但對于程序崩潰可利用性判定研究具有重要的參考價值。目前主要利用!exploitable工具靜態分析Crash dump的方法初步判定Crash可利用性,然而該工具具有較高的假陽性率。本文提出的框架利用動態污點分析技術,便于擴展,針對棧溢出漏洞的可利用性判定準確率明顯高于!exploitable工具。

6 結束語

本文采用Windows下二進制插樁平臺Pin,提出了一種基于動態污點分析技術的Crash可利用性自動化判定框架。該框架能夠有效地檢測出可利用的崩潰并分配可利用性等級,準確分類棧溢出漏洞。但該框架主要存在2個問題:1)對于邏輯關系較為復雜的崩潰只能進行粗粒度的判斷,準確度較低;2)對于較大的程序或樣本,檢測時間開銷較大且收集的信息易重復,效率降低。

下一步將針對該框架的性能和效率進行優化,增加對程序指令的識別覆蓋面,完善Crash可利用性判斷規則,避免污染缺失的情況,提高判定準確性;通過對內存讀寫操作代碼的優化,提高運行效率;結合動態符號執行技術[18]分析異常指令后的多條路徑,提高路徑覆蓋率。

[1] 吳世忠,郭 濤,董國偉,等.軟件漏洞分析技術進展[J].清華大學學報(自然科學版),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] 葉永宏,武東英,陳 揚.一種基于細粒度污點分析的逆向平臺[J].計算機工程與應用,2012,48(28):90-96.

[10] 史大偉,袁天偉.一種粗細粒度結合的動態污點分析方法[J].計算機工程,2014,40(3):12-17.

[11] 宋 錚,王永劍,金 波,等.二進制程序動態污點分析技術研究綜述[J].信息網絡安全,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].鄭州:信息工程大學,2012.

[15] 孔德光,鄭 烇,帥建梅,等.基于污點分析的源代碼脆弱性檢測技術[J].小型微型計算機系統,2009,30(1):78-82.

[16] 黃 昭.一種改進的動態污點分析模型[D].武漢:華中科技大學,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.

猜你喜歡
污點漏洞內存
漏洞
基于代碼重寫的動態污點分析
筆記本內存已經在漲價了,但幅度不大,升級擴容無須等待
“春夏秋冬”的內存
污點
使用Lightroom污點去除工具清理照片中的瑕疵
三明:“兩票制”堵住加價漏洞
漏洞在哪兒
高鐵急救應補齊三漏洞
內存搭配DDR4、DDR3L還是DDR3?
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合