孫 峰
(中國民航信息網(wǎng)絡(luò)股份有限公司 中國 北京 100010)
一種基于污點分析的緩沖區(qū)溢出檢測方法
孫 峰
(中國民航信息網(wǎng)絡(luò)股份有限公司 中國 北京 100010)
緩沖區(qū)溢出占據(jù)了目前網(wǎng)絡(luò)攻擊的90%以上,給信息安全造成了巨大的威脅。本文提出了一種針對基于污點分析的動態(tài)分析方法,該方法追蹤網(wǎng)絡(luò)數(shù)據(jù)在系統(tǒng)內(nèi)的傳播過程,并在網(wǎng)絡(luò)數(shù)據(jù)被非法使用的時候報警,能夠有效檢測到各類緩沖區(qū)溢出攻擊。
緩沖區(qū)溢出攻擊;網(wǎng)絡(luò)攻擊;信息安全
緩沖區(qū)溢出是目前最常見的軟件安全漏洞之一,接近90%的網(wǎng)絡(luò)攻擊都是通過緩沖區(qū)溢出漏洞達成的。通過精心構(gòu)造程序輸入,攻擊者可以通過緩沖區(qū)溢出覆蓋幾乎任何他想覆蓋的目標,并在這個過程中植入shellcode[1]。這樣,當應(yīng)用程序?qū)斎霐?shù)據(jù)進行處理的時候,其控制流將會被篡改,從而執(zhí)行攻擊者所期望執(zhí)行的惡意代碼。從1988年的Morris蠕蟲開始,直到2010年對伊朗核工業(yè)設(shè)施造成巨大破壞的“震網(wǎng)”病毒,一直到最近的危害更勝“震網(wǎng)”的“超級火焰”病毒,當中都利用了緩沖區(qū)溢出攻擊技術(shù)??梢?,緩沖區(qū)溢出是目前最重要的網(wǎng)絡(luò)安全威脅之一。
傳統(tǒng)的緩沖區(qū)溢出分為靜態(tài)分析和動態(tài)分析兩種方法。靜態(tài)分析能夠覆蓋更多的程序執(zhí)行路徑,具有更高的覆蓋率,但需要程序的源代碼,如Stack Guard[2];動態(tài)分析方法根據(jù)軟件的實際執(zhí)行來對緩沖區(qū)溢出進行檢測,更貼近軟件真實行為,但只能覆蓋單一的執(zhí)行路徑,如CRED[3]。因此,靜態(tài)分析和動態(tài)分析方法兩者各有所長,不能互相取代。本文提出了一種基于污點分析[4]的動態(tài)分析方法來檢測基于網(wǎng)絡(luò)的緩沖區(qū)溢出攻擊,它的基本思想是:首先通過將網(wǎng)絡(luò)數(shù)據(jù)打標標記為污點數(shù)據(jù),然后利用模擬器如QEMU[5]等跟蹤污點數(shù)據(jù)在系統(tǒng)內(nèi)的傳播過程。一旦污點數(shù)據(jù)被非法使用,則說明可能發(fā)生了緩沖區(qū)溢出攻擊,系統(tǒng)報警。
根據(jù)緩沖區(qū)溢出的不同,分為如下三種形式:棧溢出、堆溢出和BSS溢出。
1)棧溢出
棧是在函數(shù)調(diào)用的時候建立的,它包含以下信息:函數(shù)參數(shù)信息;函數(shù)返回地址信息;棧頂和棧底信息;局部變量的信息等。棧的生長方向是從內(nèi)存高地址向低地址生長的,其數(shù)據(jù)的壓入和彈出操作由PUSH和POP完成,并且遵循后進先出的原則。當函數(shù)被調(diào)用時,其函數(shù)參數(shù)、函數(shù)返回地址、棧幀信息和局部變量依次壓入到堆棧當中。這樣,通過向棧中壓入超長的數(shù)據(jù),就有可能改變函數(shù)的返回地址,從而使得函數(shù)在返回的時候執(zhí)行攻擊者所期望執(zhí)行的代碼。例如:假設(shè)函數(shù)存在某個數(shù)組參數(shù)s[20],則當執(zhí)行strcpy(s,attackstr)時,只要 attackstr的長度足夠長(>20),就會覆蓋函數(shù)返回地址IP。通過精心構(gòu)造attackstr字符串,就可以從而達到攻擊目的。
2)堆溢出
在C語言中,使用malloc()可以動態(tài)分配一段內(nèi)存,并向用戶返回一個內(nèi)存地址,而實際上這個地址前面通常還有8Bytes的內(nèi)部結(jié)構(gòu),用來記錄分配的塊長度以及一些標志,如圖1所示。
顯然,在malloc分配的用戶數(shù)據(jù)后面,緊接著的是本堆的數(shù)據(jù)(4B)和上一堆的字節(jié)數(shù)(4B)。這樣,當用戶輸入的數(shù)據(jù)超長,超過了malloc的參數(shù)指定的長度時,本堆的字節(jié)數(shù)和上一堆的字節(jié)數(shù)就可以被覆蓋,從而實現(xiàn)了堆溢出。
圖1 堆分配示意圖
3)BSS 溢出
BSS和靜態(tài)全局變量相關(guān)。例如,假設(shè)有如下定義:
static char buf1[10],buf2[12];
則buf1和but2兩個數(shù)組位于BSS段。如果buf1寫入的數(shù)據(jù)足夠長(>10),例如12個字節(jié),則會覆蓋buf2的內(nèi)容。利用這點,攻擊者可以通過改寫B(tài)SS中的指針或函數(shù)指針等方式,改變程序原先的執(zhí)行流程,使指針跳轉(zhuǎn)到特定的內(nèi)存地址并執(zhí)行攻擊者指定的操作。
從以上分析可以知道,對于緩沖區(qū)溢出攻擊,其發(fā)生的根本原因是類C語言不對緩沖區(qū)做邊界檢查,從而使得攻擊者可以通過輸入超長的數(shù)據(jù)(超過緩沖區(qū)的長度)來覆蓋某些內(nèi)存單元,進而達到控制程序流程的目的。
對于基于網(wǎng)絡(luò)攻擊的緩沖區(qū)溢出而言,根據(jù)上面的分析,攻擊者必須通過網(wǎng)絡(luò)從遠程將(超長)數(shù)據(jù)傳入到應(yīng)用程序的緩沖區(qū)以篡改程序的控制流。換句話說,當緩沖區(qū)溢出發(fā)生時,一定是攻擊者通過網(wǎng)絡(luò)傳入的攻擊數(shù)據(jù)被使用了。從這個結(jié)論出發(fā),如果能夠監(jiān)控應(yīng)用程序?qū)?shù)據(jù)的使用,一旦發(fā)現(xiàn)EIP寄存器或者JMP系列機器指令使用的是網(wǎng)絡(luò)數(shù)據(jù),則意味著很可能發(fā)生了緩沖區(qū)溢出攻擊(因為通常的緩沖區(qū)是數(shù)據(jù)而不是指令,因而不會被EIP寄存器或者JMP指令使用)。而為了監(jiān)控網(wǎng)絡(luò)數(shù)據(jù)的時候,可以采用污點分析的方法,將網(wǎng)絡(luò)數(shù)據(jù)打上污點標記,并利用硬件模擬器如QEMU等對機器指令的執(zhí)行進行模擬即可。整個系統(tǒng)的流程如圖2所示。
從圖2可以看到,基于污點分析的緩沖區(qū)溢出攻擊檢測有三個大的步驟:
1)標記污點數(shù)據(jù)。這是通過將網(wǎng)絡(luò)數(shù)據(jù)打上污點標記完成的。通過在QEMU內(nèi)部的“影子內(nèi)存”,將網(wǎng)絡(luò)傳入的數(shù)據(jù)打上污點標記。進行污點標記時,可以使用一個bit的影子內(nèi)存標記一個字節(jié)的網(wǎng)絡(luò)數(shù)據(jù),顯然,這種方式只能說明某個字節(jié)是否是網(wǎng)絡(luò)數(shù)據(jù)。如果需要記錄更多的信息,可以使用更多的bit來標記一個字節(jié)的網(wǎng)絡(luò)數(shù)據(jù)。
2)跟蹤污點傳播。QEMU硬件模擬器將采用軟件方式來模擬機器指令的執(zhí)行。這使得我們可以利用QEMU來跟蹤污點數(shù)據(jù)的傳播。其基本過程是:根據(jù)不同的機器指令,當源操作數(shù)是污點數(shù)據(jù)時,則目的操作數(shù)也應(yīng)該打上污點標記。例如:對于“MOV AX,DX”,若DX存儲的污點數(shù)據(jù),則AX也應(yīng)該打上污點標記標明為污點數(shù)據(jù)。這一部分需要根據(jù)機器指令的分類:算術(shù)指令、單操作數(shù)、雙操作數(shù)、三操作數(shù)指令等來實現(xiàn)不同的跟蹤。
圖2 基于污點分析的緩沖區(qū)溢出攻擊檢測
3)檢測溢出攻擊。當QEMU的指令模擬發(fā)現(xiàn)JMP指令的操作數(shù)是污點數(shù)據(jù),或者EIP寄存器內(nèi)部存儲的是污點數(shù)據(jù),則說明發(fā)生了緩沖區(qū)溢出攻擊。事實上,上述規(guī)則是最低限的普遍規(guī)則。根據(jù)不同的場景,檢測規(guī)則可以更加復(fù)雜。例如:可以檢測函數(shù)調(diào)用參數(shù),當某些函數(shù)調(diào)用參數(shù)是污點數(shù)據(jù)時,可能發(fā)生了其他類型的溢出攻擊等等。
緩沖區(qū)溢出是一種危害非常大的攻擊方式。針對基于網(wǎng)絡(luò)的緩沖區(qū)溢出攻擊特點:當攻擊發(fā)生時,一定使用了網(wǎng)絡(luò)傳入的、攻擊者精心設(shè)計的網(wǎng)絡(luò)數(shù)據(jù)流,本文提出了一種基于污點分析的緩沖區(qū)溢出檢測方法。它通過監(jiān)控網(wǎng)絡(luò)數(shù)據(jù)的傳入,并通過打標跟蹤網(wǎng)絡(luò)數(shù)據(jù)在系統(tǒng)內(nèi)的傳播和使用過程,實現(xiàn)了緩沖區(qū)溢出攻擊的檢測。實驗證明我們的方法是有效的。
[1]林志強,王逸,茅兵,等.SafeBird:一種動態(tài)和透明的運行時緩沖區(qū)溢出防御工具集[J].電子學(xué)報,2007,35(5):882-889.
[2]C.Cowan,C.Pu,D.Maier,et al.StackGuard:Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks[C].Proceedings of the 7th USENIX Security Symposium,1998.
[3]O.Ruwase,M.S.Lam.A Practical Dynamic Buffer Overflow Detector[C].Proceedings of the 11th Annual Network and Distributed System Security Symposium,2004.
[4]J.Newsome,D.Song.Dynamic Taint Analysis for Automatic Detection,Analysis,and Signature Generation of Exploits on Commodity Software[R].CMU-CS-04-140,2004.
[5]QEMU WiKi[EB/OL].[2012-07-24].http://wiki.qemu.org/Main_Page.
A Buffer Overflow Detection Method based on Taint Analysis
SUN Feng
(Travel Sky Technology Limited,Beijing,100010,China)
Buffer overflow is the one of the most often-seen attacks,and nearly 90%of the network attacks are cause by it.To address this issue,a dynamic analysis approach is introduced.The approach uses the taint analysis to track the propagation of network data flow,and throws an alarm when the abnormal use of network data is detected.Experimental results show that it can efficiently detect a variety of buffer overflow attacks.
Buffer overflow attack;Network attack;Information security
孫峰(1977—),男,吉林長春人,碩士研究生,就職于中國民航信息網(wǎng)絡(luò)股份有限公司,研究方向為軟件測試與信息安全。
尹雪梅]