孫 峰
(中國民航信息網絡股份有限公司 中國 北京 100010)
一種基于污點分析的緩沖區溢出檢測方法
孫 峰
(中國民航信息網絡股份有限公司 中國 北京 100010)
緩沖區溢出占據了目前網絡攻擊的90%以上,給信息安全造成了巨大的威脅。本文提出了一種針對基于污點分析的動態分析方法,該方法追蹤網絡數據在系統內的傳播過程,并在網絡數據被非法使用的時候報警,能夠有效檢測到各類緩沖區溢出攻擊。
緩沖區溢出攻擊;網絡攻擊;信息安全
緩沖區溢出是目前最常見的軟件安全漏洞之一,接近90%的網絡攻擊都是通過緩沖區溢出漏洞達成的。通過精心構造程序輸入,攻擊者可以通過緩沖區溢出覆蓋幾乎任何他想覆蓋的目標,并在這個過程中植入shellcode[1]。這樣,當應用程序對輸入數據進行處理的時候,其控制流將會被篡改,從而執行攻擊者所期望執行的惡意代碼。從1988年的Morris蠕蟲開始,直到2010年對伊朗核工業設施造成巨大破壞的“震網”病毒,一直到最近的危害更勝“震網”的“超級火焰”病毒,當中都利用了緩沖區溢出攻擊技術。可見,緩沖區溢出是目前最重要的網絡安全威脅之一。
傳統的緩沖區溢出分為靜態分析和動態分析兩種方法。靜態分析能夠覆蓋更多的程序執行路徑,具有更高的覆蓋率,但需要程序的源代碼,如Stack Guard[2];動態分析方法根據軟件的實際執行來對緩沖區溢出進行檢測,更貼近軟件真實行為,但只能覆蓋單一的執行路徑,如CRED[3]。因此,靜態分析和動態分析方法兩者各有所長,不能互相取代。本文提出了一種基于污點分析[4]的動態分析方法來檢測基于網絡的緩沖區溢出攻擊,它的基本思想是:首先通過將網絡數據打標標記為污點數據,然后利用模擬器如QEMU[5]等跟蹤污點數據在系統內的傳播過程。一旦污點數據被非法使用,則說明可能發生了緩沖區溢出攻擊,系統報警。
根據緩沖區溢出的不同,分為如下三種形式:棧溢出、堆溢出和BSS溢出。
1)棧溢出
棧是在函數調用的時候建立的,它包含以下信息:函數參數信息;函數返回地址信息;棧頂和棧底信息;局部變量的信息等。棧的生長方向是從內存高地址向低地址生長的,其數據的壓入和彈出操作由PUSH和POP完成,并且遵循后進先出的原則。當函數被調用時,其函數參數、函數返回地址、棧幀信息和局部變量依次壓入到堆棧當中。這樣,通過向棧中壓入超長的數據,就有可能改變函數的返回地址,從而使得函數在返回的時候執行攻擊者所期望執行的代碼。例如:假設函數存在某個數組參數s[20],則當執行strcpy(s,attackstr)時,只要 attackstr的長度足夠長(>20),就會覆蓋函數返回地址IP。通過精心構造attackstr字符串,就可以從而達到攻擊目的。
2)堆溢出
在C語言中,使用malloc()可以動態分配一段內存,并向用戶返回一個內存地址,而實際上這個地址前面通常還有8Bytes的內部結構,用來記錄分配的塊長度以及一些標志,如圖1所示。
顯然,在malloc分配的用戶數據后面,緊接著的是本堆的數據(4B)和上一堆的字節數(4B)。這樣,當用戶輸入的數據超長,超過了malloc的參數指定的長度時,本堆的字節數和上一堆的字節數就可以被覆蓋,從而實現了堆溢出。
圖1 堆分配示意圖
3)BSS 溢出
BSS和靜態全局變量相關。例如,假設有如下定義:
static char buf1[10],buf2[12];
則buf1和but2兩個數組位于BSS段。如果buf1寫入的數據足夠長(>10),例如12個字節,則會覆蓋buf2的內容。利用這點,攻擊者可以通過改寫BSS中的指針或函數指針等方式,改變程序原先的執行流程,使指針跳轉到特定的內存地址并執行攻擊者指定的操作。
從以上分析可以知道,對于緩沖區溢出攻擊,其發生的根本原因是類C語言不對緩沖區做邊界檢查,從而使得攻擊者可以通過輸入超長的數據(超過緩沖區的長度)來覆蓋某些內存單元,進而達到控制程序流程的目的。
對于基于網絡攻擊的緩沖區溢出而言,根據上面的分析,攻擊者必須通過網絡從遠程將(超長)數據傳入到應用程序的緩沖區以篡改程序的控制流。換句話說,當緩沖區溢出發生時,一定是攻擊者通過網絡傳入的攻擊數據被使用了。從這個結論出發,如果能夠監控應用程序對數據的使用,一旦發現EIP寄存器或者JMP系列機器指令使用的是網絡數據,則意味著很可能發生了緩沖區溢出攻擊(因為通常的緩沖區是數據而不是指令,因而不會被EIP寄存器或者JMP指令使用)。而為了監控網絡數據的時候,可以采用污點分析的方法,將網絡數據打上污點標記,并利用硬件模擬器如QEMU等對機器指令的執行進行模擬即可。整個系統的流程如圖2所示。
從圖2可以看到,基于污點分析的緩沖區溢出攻擊檢測有三個大的步驟:
1)標記污點數據。這是通過將網絡數據打上污點標記完成的。通過在QEMU內部的“影子內存”,將網絡傳入的數據打上污點標記。進行污點標記時,可以使用一個bit的影子內存標記一個字節的網絡數據,顯然,這種方式只能說明某個字節是否是網絡數據。如果需要記錄更多的信息,可以使用更多的bit來標記一個字節的網絡數據。
2)跟蹤污點傳播。QEMU硬件模擬器將采用軟件方式來模擬機器指令的執行。這使得我們可以利用QEMU來跟蹤污點數據的傳播。其基本過程是:根據不同的機器指令,當源操作數是污點數據時,則目的操作數也應該打上污點標記。例如:對于“MOV AX,DX”,若DX存儲的污點數據,則AX也應該打上污點標記標明為污點數據。這一部分需要根據機器指令的分類:算術指令、單操作數、雙操作數、三操作數指令等來實現不同的跟蹤。
圖2 基于污點分析的緩沖區溢出攻擊檢測
3)檢測溢出攻擊。當QEMU的指令模擬發現JMP指令的操作數是污點數據,或者EIP寄存器內部存儲的是污點數據,則說明發生了緩沖區溢出攻擊。事實上,上述規則是最低限的普遍規則。根據不同的場景,檢測規則可以更加復雜。例如:可以檢測函數調用參數,當某些函數調用參數是污點數據時,可能發生了其他類型的溢出攻擊等等。
緩沖區溢出是一種危害非常大的攻擊方式。針對基于網絡的緩沖區溢出攻擊特點:當攻擊發生時,一定使用了網絡傳入的、攻擊者精心設計的網絡數據流,本文提出了一種基于污點分析的緩沖區溢出檢測方法。它通過監控網絡數據的傳入,并通過打標跟蹤網絡數據在系統內的傳播和使用過程,實現了緩沖區溢出攻擊的檢測。實驗證明我們的方法是有效的。
[1]林志強,王逸,茅兵,等.SafeBird:一種動態和透明的運行時緩沖區溢出防御工具集[J].電子學報,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—),男,吉林長春人,碩士研究生,就職于中國民航信息網絡股份有限公司,研究方向為軟件測試與信息安全。
尹雪梅]