蔡軍,鄒鵬,楊尚飛,何駿(.裝備學(xué)院復(fù)雜電子系統(tǒng)仿真實驗室,北京046;.海軍裝備研究院,北京006)
軟件漏洞分析中的脆弱點定位方法*
蔡軍1,鄒鵬1,楊尚飛2,何駿1
(1.裝備學(xué)院復(fù)雜電子系統(tǒng)仿真實驗室,北京101416;2.海軍裝備研究院,北京100161)
針對二進制程序漏洞成因復(fù)雜難以分析的問題,提出運用污點分析的軟件脆弱點定位方法,并實現(xiàn)了一個工具原型SwordChecker。以動態(tài)污點追蹤為基礎(chǔ),依據(jù)漏洞模式通過特征匹配來定位軟件中的脆弱點,運用二分查找定位影響脆弱點的敏感字節(jié)。實驗表明,使用SwordChecker能夠精確快速識別定位軟件中三種類型的脆弱點,已成功分析了多個已公開漏洞的成因,并已輔助挖掘出幾個未公開漏洞。
污點分析;脆弱點定位;二分查找
當今時代是信息時代,社會信息化是當今世界發(fā)展的潮流,信息系統(tǒng)已經(jīng)成為社會發(fā)展的重要戰(zhàn)略資源,信息系統(tǒng)的安全性也越來越重要。軟件安全是信息系統(tǒng)安全的重要組成部分,軟件漏洞則是安全問題的根源之一,層出不窮的軟件安全漏洞給國民經(jīng)濟和社會生活帶來了負面的影響。軟件漏洞檢測、分析及利用成為信息安全領(lǐng)域的一個研究熱點。
軟件漏洞是軟件生命周期中涉及安全的設(shè)計錯誤、編碼缺陷和運行故障[1]。將對軟件進行已公開漏洞的發(fā)現(xiàn)和未知漏洞的發(fā)掘的技術(shù)稱為軟件漏洞檢測技術(shù),將分析漏洞形成原因及利用價值的技術(shù)稱為漏洞分析技術(shù),將利用漏洞實施攻擊的技術(shù)稱為漏洞利用技術(shù)。當前研究較多的是自動化的軟件漏洞檢測技術(shù),涌現(xiàn)出以各種模糊器[2-6]為代表的大量的自動化的漏洞檢測工具,而對漏洞分析和漏洞利用的研究還處于起步階段,仍以手工分析為主,缺乏良好的自動化工具,蔡軍等的目標就是研究自動化的軟件漏洞分析技術(shù)。
脆弱點定位是軟件漏洞分析中的關(guān)鍵環(huán)節(jié),所謂脆弱點是指直接導(dǎo)致軟件漏洞產(chǎn)生的某條指令或某個函數(shù)。脆弱點受用戶輸入影響,一般情況下不影響軟件正常運行,但在注入特定輸入的情況下會導(dǎo)致軟件產(chǎn)生異常,形成漏洞。脆弱點與漏洞類型相關(guān),漏洞種類很多,每一種漏洞形成的具體原因都不同,其脆弱點類型也不同。蔡軍等主要研究輸入相關(guān)漏洞的脆弱點定位。
蔡軍等提出一種基于污點分析的軟件脆弱點定位方法,核心思想為:(1)以細粒度的動態(tài)在線污點追蹤作為脆弱點定位的基礎(chǔ);(2)基于已公開漏洞總結(jié)漏洞模式,基于漏洞模式建立規(guī)則,查找定位脆弱點;(3)基于二分查找算法定位影響脆弱點的敏感輸入字節(jié)。
雖然軟件開發(fā)人員尤其是通用軟件制造商對軟件安全越來越重視,也加大了軟件發(fā)布前的安全性測試力度,但是軟件漏洞依然或多或少地存在,幾乎不可能完全避免。
以各種模糊器為代表的軟件漏洞檢測工具通常只能發(fā)現(xiàn)導(dǎo)致軟件崩潰(或異常)的測試用例,但是崩潰的具體原因常常不得而知,需要進一步的分析。簡而言之,發(fā)現(xiàn)軟件崩潰只能算是找到了漏洞的半成品,只有分析清楚了崩潰的原因才算是真正發(fā)現(xiàn)了一個漏洞。目前的軟件漏洞分析以借助于調(diào)試器手工分析為主,缺少自動化的分析工具。由于軟件漏洞成因復(fù)雜,手工分析十分煩瑣,且需要研究人員具備極強的專業(yè)知識和豐富的經(jīng)驗。因此,有必要研究自動化的軟件漏洞分析技術(shù)來幫助研究人員分析漏洞成因。
對自動化的軟件漏洞分析的研究還不多。徐欣民[7]提出了一種基于靜態(tài)分析結(jié)合動態(tài)跟蹤調(diào)試的緩沖區(qū)溢出漏洞定位技術(shù),以一種基于函數(shù)調(diào)用的緩沖區(qū)溢出漏洞模型為基礎(chǔ),通過動態(tài)跟蹤調(diào)試捕獲溢出并與靜態(tài)反匯編結(jié)果比對來定位導(dǎo)致溢出的函數(shù)調(diào)用。楊濱誠等[8]提出了一種基于數(shù)據(jù)流分析和邊界檢查的緩沖區(qū)溢出定位技術(shù),通過數(shù)據(jù)流和別名分析識別可能受外部輸入影響的指針和數(shù)組,通過邊界檢查定位溢出。史勝利[9]提出了一種基于代碼插樁的緩沖區(qū)溢出漏洞定位技術(shù),通過代碼插樁捕獲信息,根據(jù)系統(tǒng)提供的異常信息,分析產(chǎn)生異常的指令,獲取破壞的內(nèi)存點,進而查找漏洞所在點。楊羨環(huán)[10]提出了一種基于函數(shù)調(diào)用序列的漏洞定位技術(shù),通過多次程序執(zhí)行和面向方面編程框架獲取函數(shù)調(diào)用序列,通過分析函數(shù)調(diào)用序列定位漏洞。以上幾種方法均只有一個籠統(tǒng)的思路,難以實現(xiàn)精確定位,只能分析緩沖區(qū)溢出漏洞,且未能分析真實應(yīng)用軟件的漏洞,自動化程度不高。
污點分析[11-15]是一種新興的程序分析技術(shù),其主要思想是將用戶輸入作為污點源,在程序執(zhí)行過程中追蹤污點源的傳播,所有直接或間接受污點源影響的變量都是被污染的變量,稱為污點數(shù)據(jù)。用污點分析來分析軟件漏洞的原理是:任何用戶可控的變量都是不安全的,當一個被污染的變量被用來執(zhí)行危險操作時就可能產(chǎn)生安全漏洞。
污點分析從是否需要運行軟件的角度可以分為兩種類型:靜態(tài)污點分析和動態(tài)污點分析。靜態(tài)污點分析工作在源代碼級,通過分析程序源代碼來推衍污點的傳播。動態(tài)污點分析則是在程序?qū)嶋H運行過程中追蹤污點的傳播。靜態(tài)污點分析的最大缺陷是依賴于源代碼,然而大多數(shù)時候源代碼是不可得到的,且靜態(tài)的污點分析由于缺乏運行時信息,誤報也很多。因此,動態(tài)的污點分析更加實用,但是其實現(xiàn)比較復(fù)雜,SwordChecker使用的是動態(tài)污點分析。
動態(tài)污點分析的實現(xiàn)主要有兩種方式,即通過硬件實現(xiàn)和通過軟件實現(xiàn)。硬件實現(xiàn)方式雖然效率較高,但是需要對硬件進行擴展,實現(xiàn)難度很大且成本高,因而并不常用。軟件實現(xiàn)方式一般通過動態(tài)二進制插樁來實現(xiàn)。動態(tài)二進制插樁是在程序執(zhí)行過程中,在程序?qū)嶋H執(zhí)行的某個基本執(zhí)行單元(指令、基本塊、函數(shù)等)前后插入分析代碼來獲取想要的運行時信息,通常借助于二進制插樁平臺來實現(xiàn)?,F(xiàn)有的二進制插樁平臺主要有三個:DynamoRIO[16],Valgrind[17]和Pin[18]。SwordChecker使用Pin來實現(xiàn)。
運用污點分析的脆弱點定位方法分為三個步驟:第一步是追蹤用戶輸入即污點源在程序執(zhí)行過程中的傳播,第二步是定位程序中的脆弱點,第三步是定位輸入中影響脆弱點的敏感字節(jié)。
3.1 Pin的二進制程序在線污點追蹤
Pin是Intel公司研發(fā)的一個動態(tài)二進制插樁平臺,它允許在可執(zhí)行程序的任意位置插入任意代碼,并且代碼在程序運行時動態(tài)添加??梢园裀in比作一個超級即時編譯器,這個超級編譯器的輸入不是字節(jié)碼而是一個可執(zhí)行程序。Pin攔截可執(zhí)行程序要執(zhí)行的第一條指令,并將以這條指令開始的一個直線代碼序列編譯成新的代碼在Pin虛擬機里執(zhí)行,新的代碼和原始代碼基本一致。遇到跳轉(zhuǎn)指令時,Pin重新接管程序,再編譯下一段要執(zhí)行的代碼??蓤?zhí)行程序要執(zhí)行的所有代碼都被編譯成了新的代碼在Pin虛擬機里執(zhí)行,原始代碼僅供參考,這樣Pin就向用戶提供了向目標程序注入它們自己代碼的機會。
Pin的結(jié)構(gòu)如圖1所示[19],可以看到Pin由虛擬機、代碼緩存器和插樁API三個部分構(gòu)成。插樁API是Pin提供給用戶的接口,用戶可以利用它們來編寫自己的插樁工具,稱為“Pintool”;代碼緩存器用來緩存由原始代碼編譯而來的新代碼,這樣可以避免重復(fù)編譯,提高效率;虛擬機用來執(zhí)行新代碼。虛擬機又由即時編譯器、仿真器和分派器構(gòu)成,三者在Pin控制應(yīng)用程序后通過互相協(xié)同來執(zhí)行程序,即時編譯器負責(zé)編譯原始代碼和插樁用戶代碼,分派器負責(zé)調(diào)度代碼的執(zhí)行,仿真器負責(zé)解釋那些不能由虛擬機直接執(zhí)行的指令,如系統(tǒng)調(diào)用。
圖1 Pin結(jié)構(gòu)圖Fig.1 Architecture of Pin
基于Pin的在線污點追蹤是借助Pin在程序運行過程插入分析代碼來實現(xiàn)污點追蹤邏輯。污點追蹤主要包含污點引入和污點傳播兩個過程。3.1.1污點引入
由于程序大部分時候都在執(zhí)行與輸入無關(guān)的指令,如加載動態(tài)鏈接庫、共享庫等,需要決定在程序執(zhí)行的什么地方來引入污點源,這就是污點引入。污點引入的時刻實際上是程序剛開始操作污點源的時刻。污點源的種類主要有三種,即文件、網(wǎng)絡(luò)數(shù)據(jù)包和命令行參數(shù)(常見于Linux系統(tǒng)),如使用Microsoft Word打開一個.doc文件,這個.doc文件就可以作為污點源。
使用Pin來實現(xiàn)污點引入的方法是通過Pin提供的插樁API來劫持程序執(zhí)行過程中的打開和讀取污點源的系統(tǒng)調(diào)用,插入污點引入代碼。如使用文件作為污點源,則需劫持open,read,readv等讀文件相關(guān)系統(tǒng)調(diào)用,如使用網(wǎng)絡(luò)數(shù)據(jù)包作為污點源,則需劫持socket,accept,recv等socket相關(guān)系統(tǒng)調(diào)用。SwordChecker當前主要支持文件作為污點源。
在使用文件作為污點源時,可以將整個文件設(shè)置為污點源,也可以將文件中的部分字節(jié)設(shè)置為污點源。SwordChecker允許用戶通過一系列參數(shù)來定制污點源。對于文件污點源,使用三個參數(shù):“-tf”,“-to”和“-ts”。“-tf”參數(shù)指示了需要被設(shè)置為污點的文件,“-to”參數(shù)指示了污點文件中第一個需要被設(shè)置為污點源的字節(jié)的偏移量,“-ts”參數(shù)指示了以偏移量為開始需要被設(shè)置為污點的字節(jié)數(shù)目。
3.1.2 污點傳播
污點傳播是在污點引入后,根據(jù)一定的傳播策略追蹤污點源被程序指令進行的復(fù)制和更改。污點數(shù)據(jù)被指派一個污點標簽,污點標簽根據(jù)指令的語義從原操作數(shù)傳播到目的操作數(shù)。污點傳播策略直接影響整個污點傳播過程的正確性。
在污點傳播時有兩個基本問題。一個問題是污點傳播粒度,指最小的污點傳播單元。選擇一個合適的污點傳播粒度很重要。如果粒度選擇太大,如大到一片連續(xù)的內(nèi)存塊,容易造成污點數(shù)據(jù)丟失或是不精確的污點傳播。相反,粒度選擇太小,如小到一個位(bit),則容易導(dǎo)致污點傳播過度擴散,且污點傳播的實現(xiàn)邏輯也會變得相當復(fù)雜。SwordChecker選取字節(jié)作為污點傳播粒度,因為大部分指令都以字節(jié)為基本單位進行運算,且在大部分計算機體系結(jié)構(gòu)中,最小的內(nèi)存尋址單元也是字節(jié)。相對于傳統(tǒng)的以四字節(jié)內(nèi)存單元為最小污點傳播單元的污點追蹤,SwordChecker實施的是更細粒度的污點追蹤。
另一個問題是污點標簽大小。每一個污點傳播單元都將被指派一個污點傳播標簽。最小的污點標簽大小可以是一個位。如,位為1代表這個污點單元被污染了,位為0代表未被污染。大的標簽雖然功能更多,因為它允許不同類型的數(shù)據(jù)被唯一標記,但是大的標簽需要更加復(fù)雜的傳播邏輯和更大的存儲空間。這一方面會顯著增加內(nèi)存消耗,另一方面會大幅降低污點追蹤速度。SwordChecker的目標是快速的在線污點追蹤,在不影響污點傳播精度的前提下越快越好,因此選擇一個位大小的標簽。
在二進制級別上,有兩類對象可被污染:內(nèi)存位置和寄存器。因此,SwordChecker在兩類數(shù)據(jù)結(jié)構(gòu)中存儲污點標簽。一個數(shù)據(jù)結(jié)構(gòu)是“mem_taint_map”,它為每個可尋址的內(nèi)存單元維持一個位作為標簽。另一個數(shù)據(jù)結(jié)構(gòu)是“reg_ taint_map”,它為每一個32位寄存器維持一個字節(jié)來存儲標簽,該字節(jié)的低四位存儲了寄存器的四位污點標簽。
關(guān)于污點傳播策略,SwordChecker主要考慮三類指令的污點傳播:(1)數(shù)據(jù)復(fù)制指令(如MOV,PUSH,POP等)。針對這類指令,復(fù)制源操作數(shù)的標簽到目的操作數(shù)。(2)數(shù)據(jù)運算指令(如ADD,SUB,AND,SHL等)。針對這類指令,將源操作數(shù)和目的操作數(shù)的標簽一起運算來更新目的操作數(shù)的標簽。(3)特殊指令。一些特殊指令可能會導(dǎo)致操作數(shù)的污點標簽被清除,如CPUID指令,它是intel IA32架構(gòu)下獲得CPU信息的匯編指令,可以得到CPU類型、型號、制造商信息、商標信息、序列號、緩存等一系列與CPU相關(guān)的東西。它使用eax作為輸入?yún)?shù),eax,ebx,ecx,edx作為輸出參數(shù),執(zhí)行該指令后,這幾個寄存器都將被立即數(shù)填充,而立即數(shù)不是污點數(shù)據(jù)。
3.2 漏洞模式的脆弱點定位
所謂漏洞模式是指不同類型漏洞的特征。漏洞類型不同,其脆弱點類型也不同。SwordChecker適用的漏洞類型主要為輸入相關(guān)漏洞,所謂輸入相關(guān)漏洞是指那些能夠由特定的輸入觸發(fā)的漏洞,這個輸入是由用戶提供的,可以是文件、網(wǎng)絡(luò)數(shù)據(jù)包,也可以是鍵盤輸入。輸入相關(guān)漏洞主要包括除0漏洞、整數(shù)溢出漏洞、緩沖區(qū)溢出漏洞等。SwordChecker根據(jù)漏洞模式建立規(guī)則,通過污點檢查來實現(xiàn)脆弱點的定位,即檢查是否有安全敏感操作操作了污點數(shù)據(jù)。
SwordChecker當前支持以下幾種類型的脆弱點定位。
3.2.1 除法指令
除法指令是除0漏洞的脆弱點。除0漏洞是指在做除法運算時除數(shù)為0導(dǎo)致軟件出現(xiàn)除0異常,這種漏洞經(jīng)常發(fā)生在一個非預(yù)期的值被提供給程序,然后用這個值來計算物理維度,如大小、長度、寬度和高度時。圖2是含有除0漏洞的一段簡單代碼,變量a和b的值從一個輸入文件中讀取,如果a>b且a-b=100,就會在代碼段第2行產(chǎn)生除0異常,因此這段代碼的第2行就是一個脆弱點(注意不是所有的除法操作都是脆弱點,只有受輸入影響的除法操作才是)。
圖2 含有除0漏洞的代碼片段Fig.2 Code fragment including a division by zero
要定位這一類脆弱點,只需借助于Pin的API“INS_AddInstrumentFunction”來實施指令級插樁,插入分析代碼,如果是div和idiv指令就檢查它們的除數(shù)是否被污染。如果除數(shù)存放在內(nèi)存中,則從mem_taint_map查找對應(yīng)的污點標簽看是否為1,如果除數(shù)存放在寄存器中,則檢查reg_taint_map。
3.2.2 內(nèi)存操作函數(shù)
內(nèi)存操作函數(shù)(如malloc,calloc,memcpy等)是整數(shù)溢出漏洞的脆弱點。整數(shù)溢出是指算術(shù)運算的結(jié)果超出了整型變量能夠表示的值的范圍(或大于最大值,或小于最小值)。并不是所有的整數(shù)溢出都會產(chǎn)生安全問題,只有當溢出值被用來作為安全敏感函數(shù)的參數(shù)時,才會產(chǎn)生漏洞。例如,將一個溢出值用來作為內(nèi)存分配函數(shù)malloc代表分配內(nèi)存大小的參數(shù)時,就會導(dǎo)致所分配的內(nèi)存小于實際所需的內(nèi)存,最終可能導(dǎo)致緩沖區(qū)溢出。
圖3是含有整數(shù)溢出漏洞的一段代碼,整數(shù)變量a和b的值也是由用戶輸入決定,而整數(shù)變量e的值則由a和b決定。顯然,如果沒有溢出檢查,變量e很可能會溢出。更進一步,如果一個溢出的e被用作內(nèi)存分配函數(shù)“malloc”的參數(shù)(第3行),就很有可能導(dǎo)致一個漏洞,因此這段代碼的第3行就是一個脆弱點。
圖3 含有整數(shù)溢出漏洞的代碼片段Fig.3 Code fragment including an integer overflow
要定位這一類脆弱點,只需借助于Pin的API“RTN_AddInstrumentFunction”來實施函數(shù)級插樁,插入分析代碼,檢查函數(shù)的有關(guān)參數(shù)是否為污點數(shù)據(jù)。以calloc函數(shù)為例,其原型為“void *calloc(size_t n,size_t size)”,其功能是在內(nèi)存的動態(tài)存儲區(qū)中分配n個長度為size的連續(xù)空間,函數(shù)返回一個指向分配起始地址的指針;如果分配不成功,返回NULL。由于n過大和size過大都可導(dǎo)致溢出,所以在分析代碼中需要檢查n和size是否被污染。
3.2.3 字符串操作函數(shù)
字符串操作函數(shù)(如strcpy,strcat,sprintf,vsprintf,gets等)是緩沖區(qū)溢出漏洞的脆弱點。緩沖區(qū)溢出可能是最眾所周知的一種漏洞。當一個程序試圖將比給定內(nèi)存塊更大的數(shù)據(jù)放入這塊內(nèi)存時就會發(fā)生緩沖區(qū)溢出,溢出會導(dǎo)致在分配內(nèi)存之外寫數(shù)據(jù),進而導(dǎo)致程序崩潰或執(zhí)行惡意代碼。雖然大部分軟件開發(fā)人員都知道緩沖區(qū)溢出,但這種漏洞并不好檢測。
造成緩沖區(qū)溢出的主要原因是不完整或不恰當?shù)膶τ脩糨斎氲臋z查。圖4是含有緩沖區(qū)溢出漏洞的一段代碼,字符串str的值是輸入文件的一行文本,在示例代碼的第5行,函數(shù)strcpy直接復(fù)制“str”的內(nèi)容到“buffer”,只要“str”的長度大于50,就會導(dǎo)致“buffer”溢出,因此這段代碼的第5行就是一個脆弱點。
圖4 含有緩沖區(qū)溢出漏洞的代碼片段Fig.4 Code fragment including a buffer overflow
要定位這一類脆弱點,也是借助于Pin的API“RTN_Add InstrumentFunction”來實施函數(shù)級插樁,插入分析代碼,檢查函數(shù)的有關(guān)參數(shù)是否為污點數(shù)據(jù)。以strcpy函數(shù)為例,其原型為“extern char*strcpy(char*dest,const char*src)”,其功能是把從src地址開始且含有NULL結(jié)束符的字符串復(fù)制到以dest開始的地址空間。在插入的分析代碼中需要檢查dest和size的地址以及它們指向的內(nèi)存地址是否被污染。
3.3 二分查找的敏感字節(jié)定位
上一步的目的是檢查程序是否存在脆弱點,實際上是將整個輸入文件都作為污點源來進行污點追蹤,然后檢查是否有安全敏感操作來操作污點數(shù)據(jù)。如果上一步檢測出有脆弱點存在,則接下來進一步定位輸入文件中影響脆弱點的敏感字節(jié)。例如,圖2中變量a和b的值影響第2行代碼中除法操作的除數(shù)值,則輸入文件中影響a和b的值的字節(jié)就是要定位的敏感字節(jié)。
SwordChecker使用二分查找算法來定位敏感字節(jié),算法通過shell腳本編程實現(xiàn)。算法流程如圖5所示,具體步驟如下:
Step1:獲取輸入文件大小Size,初始化文件偏移量Low=0,High=Size,Low代表下限,High代表上限,最終定位的敏感字節(jié)位置在Low與High之間(一般為4個字節(jié))。
圖5 敏感字節(jié)的二分查找定位算法Fig.5 Binary search algorithm for sensitive bytes localization
Step2:檢查是否滿足終止條件Low>High-3,如果滿足則輸出Low,High。
Step3:計算Low,High之間的中間位置Mid= (Low+High)/2,檢查敏感字節(jié)是在[Low,Mid]之間還是在[Mid,High]之間(分別將輸入文件的這兩個區(qū)間設(shè)為污點源,看是否有指定的脆弱點VName出現(xiàn)),如果敏感字節(jié)在[Low,Mid]之間,則High=Mid,如果敏感字節(jié)在[Mid,High]之間,則Low=Mid。
Step4:重復(fù)Step2,Step3。
實驗分為兩類,一是用SwordChecker來分析定位已公開漏洞的脆弱點,主要從國際上知名的公開漏洞庫中選取一些真實漏洞作為測試對象;二是用SwordChecker來輔助挖掘未公開漏洞(即0day漏洞),主要選取一些運行在Linux上的常用真實應(yīng)用軟件作為測試對象。所有實驗均在Ubuntu 12.04 32位系統(tǒng)上進行。
4.1 已公開漏洞脆弱點定位
首先,從國際上著名的公開漏洞庫Common Vulnerabilities and Exposures(CVE)[20],Open Source Vulnerability Database(OSVDB)[21],ExploitDatabase(EDB)[22]里選取了一些真實的軟件漏洞來對SwordChecker進行測試,實驗結(jié)果見表1。選取的每個漏洞都在EDB里有一個POC (Proof of Concept)文件可供下載,即選取的每個漏洞都可以由對應(yīng)的POC文件觸發(fā)。表1的第一列是漏洞在漏洞庫中的編號,如CVE-2014-1684指CVE中編號為2014-1684的漏洞,OSVDB-ID-88610指OSVDB中編號為88610的漏洞,EDB-ID-7812指EBD中編號為7812的漏洞。
表1 公開漏洞脆弱點定位Tab.1 Vulnerable spots localization of several open vulnerabilities
以O(shè)SVDB-ID-88610漏洞為例進行分析。該漏洞是多媒體播放器Totem Movie Player(一套在類Unix操作系統(tǒng)上運行的多媒體播放器,也是Ubuntu系統(tǒng)的預(yù)設(shè)影片播放器)上的一個除0漏洞,軟件版本號為3.4.3,漏洞現(xiàn)象如圖6所示,用該軟件(程序名為totem)打開POC文件poc1.avi時發(fā)生浮點數(shù)例外崩潰退出。
圖6 OSVDB-ID-88610漏洞現(xiàn)象Fig.6 Phenomenon of OSVDB-ID-88610
用SwordChecker對該漏洞進行分析的結(jié)果如圖7所示。該軟件有兩個脆弱點,一個是“div dword ptr[esp+0x1c]”指令(地址為0x952c8372),一個是“idiv ecx”指令(地址為0x8c594e12),這兩條指令的操作數(shù)都是污點數(shù)據(jù),直接導(dǎo)致漏洞產(chǎn)生的是idiv指令。SwordChecker進一步分析出影響這兩個脆弱點的敏感字節(jié)分別為POC文件的第17~20字節(jié)和第4423~4424字節(jié)。
從表1可以看出,CVE-2014-1684的脆弱點為div指令,敏感字節(jié)為第123~126字節(jié);CVE-2012-5470的脆弱點為memcpy和malloc函數(shù),敏感字節(jié)分別為第1~4和第84~87字節(jié);CVE-2007-4938的脆弱點為calloc,敏感字節(jié)為169~172,225~228;EDB-ID-7812的脆弱點為memcp,敏感字節(jié)為第13~16字節(jié)。另外,在實驗中還發(fā)現(xiàn)一個規(guī)律,敏感字節(jié)只占輸入文件的很小一部分(如CVE-2007-4938的POC文件大小為46 956 236B,但敏感字節(jié)只有8個),且一般位于文件的頭部,大體在前1000個字節(jié)以內(nèi)??稍谖募那?000個字節(jié)里運用二分查找算法定位。
圖7 OSVDB-ID-88610漏洞的分析結(jié)果Fig.7 Analysis result of OSVDB-ID-88610
4.2 脆弱點定位輔助0day漏洞挖掘
通過脆弱點定位不但能幫助分析已公開漏洞的成因,還能輔助挖掘0day漏洞,已經(jīng)用SwordChecker結(jié)合開源模糊測試工具zzuf[6]挖出了幾個0day漏洞,以swftools-0.9.2 png2swf整數(shù)溢出漏洞為例進行分析。種子輸入為一個正常的PNG文件input.png,其十六進制格式如圖8所示。
圖8 Input.png的十六進制格式Fig.8 Hexadecimal format of input.png
圖9 用zzuf對png2swf進行模糊測試Fig.9 Using zzuf fuzzing png2swf
圖10 New.png的十六進制格式Fig.10 Hexadecimal format of new.png
圖11 Swftools-0.9.2 png2swf漏洞現(xiàn)象Fig.11 Phenomenon of swftools-0.9.2 png2swf vulnerability
首先用SwordChecker定位到input.png的第十二個字節(jié)“0x0d”影響內(nèi)存分配函數(shù)malloc,接下來用zzuf通過集中對第十二個字節(jié)進行變異來實施模糊測試就發(fā)現(xiàn)了一個漏洞。如圖9所示,zzuf有三個參數(shù):s是隨機數(shù)種子,s為0∶1000是指種子從0到1000變化;r是變異率,r為1表示百分之百的變異;b是變異范圍,b為11表示第十二個字節(jié)(從0開始起算)。從圖9可以看到當s=4,r=1時檢測到了“memory exceeded”,用s= 4,r=1作為參數(shù)生成一個新的文件new.png(zzuf使用相同的參數(shù)生成的文件永遠相同)。如圖10所示,可以看到第十二個字節(jié)變成了“0x2d”。將new.png作為png2swf的輸入就觸發(fā)了漏洞,漏洞現(xiàn)象如圖11所示,可以看到發(fā)生了段錯誤。進一步用SwordChecker分析原因,得到的分析結(jié)果如圖12所示,可以確定該漏洞是由malloc參數(shù)過大(n=0x61676572,與new.png的第66~69個字節(jié)對應(yīng))引起的整數(shù)溢出漏洞。
圖12 Swftools-0.9.2 png2swf漏洞分析結(jié)果Fig.12 Analysis result of swftools-0.9.2 png2swf vulnerability
本文提出了一種基于污點分析的軟件脆弱點定位方法,該方法以動態(tài)污點追蹤為基礎(chǔ),基于漏洞模式建立檢查規(guī)則,通過污點檢查來定位脆弱點,通過二分查找來進一步定位輸入文件中影響脆弱點的敏感字節(jié)。實現(xiàn)了一個相應(yīng)的原型系統(tǒng)SwordChecker。實驗表明,SwordChecker不但能快速精確定位除0漏洞、整數(shù)溢出漏洞和緩沖區(qū)溢出漏洞的脆弱點,還能精確定位輸入文件中影響脆弱點的敏感字節(jié);不但能幫助分析漏洞的成因,還能輔助0day漏洞挖掘,已經(jīng)分析了多個公開漏洞的成因,并輔助挖掘了幾個0day漏洞。
SwordChecker當前適用于Linux下的32位二進制程序,目前主要支持文件處理程序,下一步計劃將其擴展到支持Windows系統(tǒng)和網(wǎng)絡(luò)處理程序。
References)
[1]吳世忠,郭濤,董國偉,等.軟件漏洞分析技術(shù)進展[J].清華大學(xué)學(xué)報(自然科學(xué)版),2012,52(10):1309-1319.WU Shizhong,GUO Tao,DONG Guowei,et al.Software vulnerability analyses:a road map[J].Journal of Tsinghua University(Science and Technology),2012,52(10):1309-1319.(in Chinese)
[2]Caca labs.Zzuf-Multi-purpose fuzzer[EB/OL].http:// caca.zoy.org/wiki/zzuf.
[3]A pure-python fully automated and unattended fuzzing framework[EB/OL].https://github.com/OpenRCE/sulley.
[4]Eddington M.Peach fuzzer[EB/OL].http://peachfuzzer.com/.
[5]Sogeti ESEC Lab.Fuzzgrind[EB/OL].http://eseclab.sogeti.com/pages/Fuzzgrind.
[6]FuzzBALL:Vine-based binary symbolic executi-on[EB/OL].https://github.com/bitblaze-fuzzball/fuzzball.
[7]徐欣民.一種緩沖區(qū)溢出漏洞自動挖掘及漏洞定位技術(shù)[D].武漢:華中科技大學(xué),2008.XU Xinmin.An automatic mining and positioning technology for buffer overflow vulnerabilities[D].Wuhan:Huazhong University of Science and Technology,2008.(in Chinese)
[8]楊濱誠,茅兵.輸入相關(guān)的緩沖區(qū)溢出檢測和定位[C]// 2010(第三屆)全國網(wǎng)絡(luò)與信息安全學(xué)術(shù)會議,2010: 103-108.YANG Bincheng,MAOBing.Detection and location of inputrelated buffer overflows[C]//Proceedings of 2010(3rd) National Conference on Computer Networks and Information Security,2010:103-108.(in Chinese)
[9]史勝利.基于代碼插裝的緩沖區(qū)溢出漏洞定位技術(shù)[J].計算機工程,2012,38(9):138-140.SHIShengli.Buffer overflow vulnerability location technology based on code instrumentation[J].Computer Engineering,2012,38(9):138-140.(in Chinese)
[10]楊羨環(huán).基于函數(shù)調(diào)用序列的漏洞定位方法研究[D].武漢:華中科技大學(xué),2013.YANG Xianhuan.Research of software-defect localization based on function calling sequence mining[D].Wuhan: Huazhong University of Science and Technology,2013.(in Chinese)
[11]Newsome J,Song D.Dynamic taint analysis for automatic detection,analysis,and signature generation of exploits on commodity software[C]//Proceedings of the Network and Distributed System Security Symposium,2005.
[12]Clause J,LiW C,Orso A.Dytan:a generic dynamic taint analysis framework[C]//Proceedings of the 2007 international symposium on Software testing and analysis.ACM,2007: 196-206.
[13]Kang M G,McCamant S,Poosankam P,etal.DTA++:dynamic taint analysis with targeted control-flow propagation[C]// Proceedings of the 18th Network and Distributed System Security Symposium,2011.
[14]Bosman E,Slowinska A,Bos H.Minemu:the world’s fastest taint tracker[C]//Proceedings of Recent Advances in Intrusion Detection.Springer Berlin Heidelberg,2011,6961: 1-20.
[15]Kemerlis V P,Portokalidis G,Jee K,et al.libdft:practical dynamic data flow tracking for commodity systems[C]// Proceedings of ACM SIGPLAN Notices,2012,47(7): 121-132.
[16]DynamoRIO[EB/OL].http://www.dynamorio.org/.
[17]Valgrind[EB/OL].http://valgrind.org/.
[18]Intel.Pin-a dynamic binary instrumentation tool[EB/OL].https://software.intel.com/en-us/articles/pin-a-dynamicbinaryinstrumentation-tool.
[19]Hazelwood K,Klauser A.A dynamic binary instrumentation engine for the ARM architecture[C]//Proceedings of the International Conference on Compilers,Architecture and Synthesis for Embedded Systems,2006:261-270.
[20]Common vulnerabilities and exposures[EB/OL].https:// cve.mitre.org/.
[21]Wikipedia.Open source vulnerability database[EB/OL].http://en.wikipedia.org/wiki/Open_Source_Vulnerability_ Database.
[22]Offensive Security[EB/OL].The Exploit Database.http:// www.exploit-db.com/.
Vulnerable spots localization methods for software vulnerability analysis
CAIJun1,ZOU Peng1,YANGShangfei2,HE Jun1
(1.Science and Technology on Complex Electronic System Simulation Laboratory,Academy of Equipment,Beijing 101416,China;2.Naval Academy of Armament,Beijing 100161,China)
Aiming at the difficulty in analysis of binary program vulnerabilities,an approach for software vulnerable spots localization based on taint analysis was proposed,and a corresponding tool named SwordChecker was implemented.This method is based on dynamic taint tracing.Software vulnerable spotswere localized by charactermatching according to vulnerability patterns,and sensitive byteswhich affected the vulnerable spots were localized by binary-search.Experiment results show that SwordChecker can accurately identify and localize three types of software vulnerable spots fast,has successfully analyzed the causes of multiple open vulnerabilities,and has assisted mining several undisclosed vulnerabilities.
taint analysis;vulnerable spots localization;binary-search
TP309
A
1001-2486(2015)05-141-08
10.11887/j.cn.201505022
http://journal.nudt.edu.cn
2014-12-31
國家863計劃資助項目(2012AA012902);“核高基”國家科技重大專項基金資助項目(2013ZX01045-004)
蔡軍(1982—),男,湖北天門人,博士研究生,E-mail:cjgfkd@163.com;鄒鵬(通信作者),男,教授,碩士,博士生導(dǎo)師,E-mail:zpeng@nudt.edu.cn