技術報告Windows棧緩沖區(qū)溢出攻擊原理及其防范_第1頁
技術報告Windows棧緩沖區(qū)溢出攻擊原理及其防范_第2頁
技術報告Windows棧緩沖區(qū)溢出攻擊原理及其防范_第3頁
技術報告Windows棧緩沖區(qū)溢出攻擊原理及其防范_第4頁
技術報告Windows棧緩沖區(qū)溢出攻擊原理及其防范_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、計劃類別 項目編號 項目技術報告課題名稱 項目主持人 承擔單位 題目:Windows棧緩沖區(qū)溢出攻擊原理及其防范計算機網(wǎng)絡安全漏洞和網(wǎng)絡攻擊伴隨著網(wǎng)絡的存在會隨時發(fā)生,棧緩沖區(qū)溢出漏洞攻擊是網(wǎng)絡攻擊中最常見的一種攻擊技術。文章剖析了Windows棧工作原理,以及棧溢出漏洞攻擊技術方法,針對常見的棧溢出漏洞攻擊提出了幾種防御措施,能預防大部分針對棧溢出漏洞的攻擊。關鍵詞:網(wǎng)絡安全;內(nèi)存;安全漏洞;堆棧;緩沖區(qū)溢出Abstract:Computer network security vulnerabilities and cyber attacks may occur at any time on

2、 the Internet,and the stack buffer overflow attack is the most common network attack technology.This paper analyzes the operating principle of the stack in Windows and the techniques of stack overflow attacks.Then,several prevention measures are proposed for common stack buffer overflow attacks,whic

3、h can prevent most stack overflow attacks.Keywords:network security;memory;security vulnerabilities;stack,buffer overflow1 引言(Introduction)緩沖區(qū)是已分配的一段大小確定的用于臨時存放數(shù)據(jù)的內(nèi)存存儲區(qū)。當向一個已經(jīng)分配了確定內(nèi)存空間的緩沖區(qū)內(nèi)寫入超出該緩沖區(qū)處理能力的數(shù)據(jù)時,將發(fā)生緩沖區(qū)溢出1。近十年,以緩沖區(qū)溢出為類型的安全漏洞攻擊是最為常見的一種形式,在網(wǎng)絡與分布式系統(tǒng)安全中,50%以上的漏洞攻擊都是基于緩沖區(qū)溢出技術的,尤其在不進行邊界檢查的C/C+程序

4、中仍然是軟件可靠性和安全性的主要威脅之一2。利用緩沖區(qū)溢出攻擊,可以導致程序運行失敗、重新啟動、執(zhí)行惡意代碼等后果。緩沖區(qū)溢出中最危險的是棧溢出,因為入侵者可以利用堆棧溢出,在函數(shù)返回時改變返回程序的地址,讓其跳轉到任意地址,更為嚴重的是,它可被利用來執(zhí)行非授權指令,甚至可以取得系統(tǒng)特權,進而進行各種非法操作3。2 Windows棧緩沖區(qū)溢出原理(The principle ofstack buffer overflow in Windows)2.1 Windows內(nèi)存程序結構計算機運行時,必須首先把程序從外存裝載到內(nèi)存,然后由CPU從內(nèi)存中依次讀取執(zhí)行指令。正在運行的程序叫進程,每個進程都有

5、自己的獨立內(nèi)存空間,它被分成幾個段(Segment),分別是代碼段(text)、數(shù)據(jù)段(data,bss)、堆(heap)、棧(stack)等,如圖1所示。用戶進程的內(nèi)存空間,也是系統(tǒng)內(nèi)核分配給該進程的虛擬內(nèi)存。內(nèi)存總是被進程占用,但并不表示這個進程占用了這么多的物理內(nèi)存,Windows將虛擬內(nèi)存地址映射到各進程的物理內(nèi)存地址上,進程內(nèi)存空間隨著程序的執(zhí)行會增大或者縮小4。堆和棧都是一種數(shù)據(jù)項按序排列的數(shù)據(jù)結構。棧是一種先進后出的數(shù)據(jù)結構,是自動開辟空間,用來分配局部變量、類的引用(指向堆空間段),棧使用的是一級緩存,通常在被調(diào)用時處于存儲空間中,調(diào)用完畢立即釋放。堆是一種經(jīng)過排序的數(shù)據(jù)結構,

6、每個結點都有一個值,可以被看成是一棵樹,堆的存取是隨意的,堆是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定。堆的特點是根結點的值最?。ɑ蜃畲螅腋Y點的兩個子樹也是一個堆。由于堆的這個特性,常用來實現(xiàn)優(yōu)先隊列。bss段(Block Started by Symbol segment)通常是指用來存放程序中未初始化的全局變量的一塊內(nèi)存區(qū)域,屬于靜態(tài)內(nèi)存分配,程序一開始就將其清零了。對于一個進程的內(nèi)存空間而言,可以在邏輯上分成三個部分:代碼區(qū)、靜態(tài)數(shù)據(jù)區(qū)和動態(tài)數(shù)據(jù)區(qū)。動態(tài)數(shù)據(jù)區(qū)一般就是堆棧。進程的每個線程都有私有的棧,所以每個線程雖然代碼一樣,但本地變量的數(shù)據(jù)都是互不干擾。全局變量和靜

7、態(tài)變量分配在靜態(tài)數(shù)據(jù)區(qū),本地變量分配在動態(tài)數(shù)據(jù)區(qū),即堆棧中。程序通過堆棧的基地址和偏移量來訪問本地變量5。32位系統(tǒng)中經(jīng)典的內(nèi)存布局是:程序起始1GB地址為內(nèi)核空間,接下來是向下增長的棧空間和由040000000向上增長的內(nèi)存映射地址。而堆地址是從底部開始,去除ELF(Executable and Linking Format)、代碼段、數(shù)據(jù)段、常量段之后的地址并向上增長,這種布局導致了緩沖區(qū)容易遭受溢出攻擊6。2.2 Windows棧緩沖區(qū)溢出原理Windows程序的執(zhí)行流程由代碼段ECS和指令指針EIP控制,EIP始終指向下一條要執(zhí)行指令的地址。當發(fā)生中斷或要調(diào)用子程序時,需要將當前斷點信

8、息入棧保存,然后轉去執(zhí)行中斷子程序,執(zhí)行完中斷子程序后返回指令將棧頂內(nèi)容出?;謴蛿帱cECS和EIP。這種控制流程看似簡單,只需將指令地址按序給ECS和EIP即可,但就是因為這簡單的控制而不容許有任何地址計算差錯。如果其他緩沖區(qū)溢出會導致多余的數(shù)據(jù)覆蓋其他有用內(nèi)存空間,其中如果將棧內(nèi)數(shù)據(jù)覆蓋就可能導致修改入棧保存的ECS和EIP,從而使得程序返回時跑飛。當一個函數(shù)被調(diào)用時,函數(shù)參數(shù)、EIP、ECS(段間調(diào)用時)、EBP和函數(shù)局部變量會依次壓棧保存,如圖2所示。endprint定義變量和正常調(diào)用時如圖3(a)和圖3(b)所示,但當把遠大于10個字符的內(nèi)容(如字符B)拷貝到為緩沖區(qū)分配的10個字符空

9、間時,多于10個字符的內(nèi)容就會覆蓋掉EBP和ECS:EIP,如圖3(c),函數(shù)執(zhí)行完畢后返回的地址就已經(jīng)不是原來保存的正確地址了。如果溢出部分的數(shù)據(jù)量足夠大或經(jīng)過攻擊者的精心設計,就可能覆蓋返回地址,從而改變程序的執(zhí)行流程,將程序的返回地址修改成其想執(zhí)行的代碼地址,達到攻擊目的。出現(xiàn)緩沖區(qū)溢出的情況主要包括三種:(1)使用非類型安全的語言。緩沖區(qū)溢出主要出現(xiàn)在C和C+語言中,雖然C/C+語言可以允許程序員直接訪問內(nèi)存和CPU的寄存器,從而創(chuàng)建非常接近硬件運行的性能優(yōu)異、運行速度快程序,但C/C+語言不執(zhí)行數(shù)組邊界檢測和類型安全檢查,所以在進行數(shù)組、字符串操作時容易造成緩沖區(qū)溢出7。(2)以不安

10、全的方式訪問或操作緩沖區(qū)。如果應用程序需要獲得數(shù)據(jù),當用戶將數(shù)據(jù)復制到應用程序所指定的緩沖區(qū)而未考慮目標緩沖區(qū)的大小時,就可能造成緩沖區(qū)溢出。(3)編譯器將緩沖區(qū)放在內(nèi)存中關鍵數(shù)據(jù)結構旁邊或鄰近的位置。3 Windows棧緩沖區(qū)溢出攻擊防范(The preventionmethods of stack buffer overflow attacksWindows)在棧溢出的檢查與防范方面,許多軟硬件廠商已經(jīng)做了大量工作,如微軟在Visual Studio中增加編譯選項來檢測棧的溢出,在Windows系列操作系統(tǒng)中增加了SEHOP (Structured Exception Handling O

11、verwrite Protection),阻止修改SEH增強系統(tǒng)的安全性,硬件方面,64位CPU引入了NX(No-eXecute)機制,在內(nèi)存中區(qū)分數(shù)據(jù)區(qū)與代碼區(qū),當攻擊者利用溢出使CPU跳轉到數(shù)據(jù)區(qū)去執(zhí)行時,就會異常終止等8。但對大量現(xiàn)有軟硬件資源,若要都升級或更新到最新的軟硬系統(tǒng)是一件很困難的事,而且不斷有繞過防御機制的新漏洞產(chǎn)生,攻擊方法也在不斷地發(fā)展變化。所以日常工作中的防御措施相當必要,針對不同的攻擊原理和方法,也可以靈活采用各種技術進行針對性的防御。緩沖區(qū)溢出攻擊防范是和整個系統(tǒng)的安全性分不開的。除了系統(tǒng)管理上采用諸如關閉危險的特權程序,及時下載系統(tǒng)或軟件的最新補丁,使用安全產(chǎn)品等

12、措施之外,軟件開發(fā)過程中的防范才是從根源上解決問題的渠道,常用的方法主要有幾種9。3.1 GS編譯選項Windows在Visual Studio 7.0(Visual Studio 2003)及以后版本中添加了一個針對函數(shù)的棧緩存溢出安全編譯選項GS,來增加棧溢出的難度。GS編譯選項的原理就是在堆棧上插入一個安全cookie,以測試堆棧上的返回地址是否被修改過。安全cookie為四個字節(jié),在堆棧上的位置如圖4和圖2的傳統(tǒng)內(nèi)存結構相比,GS編譯選項會增加四個字節(jié)的堆??臻g。如果是堆棧的局部變量發(fā)生緩存溢出的錯誤而導致返回地址被覆蓋的話,由于安全cookie所在的位置,它也一定會被覆蓋。GS編譯選

13、項在函數(shù)的入口和出口添加了針對安全cookie操作的指令,如果發(fā)現(xiàn)安全cookie的值被改動就會轉入異常處理終止程序運行。如果堆棧上的安全cookie的值和security_cookie的值一致的話,那么函數(shù)正常退出,否則就會執(zhí)行錯誤處理程序。3.2 軟件開發(fā)過程防范發(fā)生棧緩沖區(qū)溢出的主要原因是軟件程序中使用了不規(guī)范的數(shù)據(jù)操作或惡意代碼攻擊,所以在軟件的編寫過程中注意規(guī)范的代碼審查,是杜絕緩沖區(qū)溢出的最直接因素。(1)規(guī)范代碼編寫規(guī)則C和C+開發(fā)工具不是為安全而設計的,屬于非類型安全語言,為了保證編程的靈活性,C/C+的一些庫函數(shù)(如strcpy(、gets()等)缺乏邊界檢測,如果調(diào)用時輸入

14、的參數(shù)過長,就會導致緩沖區(qū)溢出。所以在使用C/C+開發(fā)工具編程時,都應該有針對性地進行安全性測試和代碼審查。數(shù)組邊界檢測。C語言不進行數(shù)組邊界檢測,容易產(chǎn)生超長數(shù)據(jù)操作植入代碼,導致緩沖區(qū)溢出。當在編譯時檢查所有的數(shù)組讀寫操作,確保對數(shù)組的操作都在有效范圍內(nèi)。目前的C程序編譯調(diào)試檢測提供了許多檢測工具,主要對存儲器存取檢測、數(shù)組邊界檢查。譬如Purify使用目標插入代碼技術檢查可執(zhí)行代碼在執(zhí)行時數(shù)組的所有應用來保障數(shù)組的合法使用,但程序的性能不可避免地要受到影響。但由于所有的C數(shù)組在傳送時是按指針傳送的,所以傳遞給調(diào)用函數(shù)的數(shù)組不會被檢查。例如庫函數(shù)strcpy()、strcat()、gets

15、()等函數(shù),在編譯時不會進行邊界檢查。指針完整性檢查。程序的指針完整性檢查在程序指針被引用之前檢查其是否被改變,即使攻擊者成功改變了程序指針,由于系統(tǒng)提前檢測到了該改變而不執(zhí)行該指針,所以該方法在防范緩沖區(qū)溢出方面性能比較好。程序指針完整性檢查是在函數(shù)返回地址或者其他的關鍵數(shù)據(jù)、指針之前插入防范值,或者存儲一個返回地址、關鍵數(shù)據(jù)或指針的備份,在函數(shù)返回時進行比較。改進C庫函數(shù)。C語言產(chǎn)生緩沖區(qū)溢出的根本是調(diào)用一些庫函數(shù)時不對數(shù)據(jù)進行邊界檢測,比如strcpy()gets()、strcat()、scanf()、printf()等,所以在用到該類型的庫函數(shù)時,可以開發(fā)更安全的替代函數(shù)實現(xiàn)該部分功能

16、,并對其進行安全檢查調(diào)用,防范緩沖區(qū)溢出。(2)棧的不可執(zhí)行技術Windows系統(tǒng)為了實現(xiàn)更好的性能和功能,往往在數(shù)據(jù)段中動態(tài)地插入可執(zhí)行的代碼,這樣當緩沖區(qū)發(fā)生數(shù)據(jù)溢出時就會覆蓋數(shù)據(jù)段,從而可能導致數(shù)據(jù)段中的可執(zhí)行代碼被修改。所以為了防止這種緩沖區(qū)溢出產(chǎn)生攻擊,可以使被攻擊程序的數(shù)據(jù)段地址空間不可執(zhí)行,從而使得攻擊者不可能執(zhí)行被植入攻擊程序的緩沖區(qū)代碼。endprint為了保持程序的兼容性不可能將所有程序的數(shù)據(jù)段設為不可執(zhí)行,但可以在必要的時候?qū)⒍褩?shù)據(jù)段設為不可執(zhí)行,因為幾乎沒有程序會在堆棧中存放代碼,所以這樣既可以最大限度地保證程序的兼容性,也可以有效地保證棧緩沖區(qū)溢出攻擊。(3)備份關

17、鍵控制信息棧溢出攻擊程序最致命的攻擊就是將程序流程的EIP和ECS內(nèi)容修改,導致原程序流程不能正常執(zhí)行。如果在調(diào)用程序或入棧時,將斷點的EIP和ECS自動入棧的同時,用另外申請的靜態(tài)或動態(tài)數(shù)組將程序流的關鍵信息如EIP和ECS備份保存,當出棧返回程序斷點時,用備份的信息和棧中的信息進行比對,如果發(fā)現(xiàn)不一致則認為棧內(nèi)容被修改,這時可以做出中斷檢測處理,防止進入攻擊代碼。3.3 棧溢出檢測防范技術(1)漏洞特征檢測漏洞都有一定的觸發(fā)條件,其攻擊過程就是構造外部輸入使之滿足觸發(fā)條件,針對棧溢出漏洞的攻擊觸發(fā)條件就是要注入超過系統(tǒng)邏輯計劃存儲的數(shù)據(jù)長度。根據(jù)漏洞的攻擊特性系統(tǒng)會建立一個特征信息庫并動態(tài)

18、更新,當程序執(zhí)行過程中系統(tǒng)會針對該信息庫進行網(wǎng)絡流量檢測,當發(fā)現(xiàn)有類似特征代碼就會及時采取有效措施或阻止,避免發(fā)生棧溢出漏洞攻擊。(2)攻擊特征檢測漏洞需要被攻擊者發(fā)現(xiàn)并利用才能被安全機構通過特征進行檢測,這需要觸發(fā)條件或可能經(jīng)過很長時間才能被發(fā)現(xiàn)。為了及時防御該類溢出攻擊,可以根據(jù)攻擊的特點進行有針對性的防御。棧溢出注入數(shù)據(jù)的長度與內(nèi)容隨著漏洞的不同而有所差異,但攻擊者攻擊時所使用的跳轉地址卻是常用或者比較固定易用的一些地址。由于不同平臺下的shellcode一般都會重復利用。所以棧溢出攻擊手法會具有一定的特征,通過提取這些頻繁出現(xiàn)的特征對防御設備的攻擊特征庫及時更新,可以有效阻止棧溢出攻擊

19、發(fā)生。(3)虛擬檢測技術防御設備最理想的情況是可以虛擬出一個除了數(shù)據(jù)不同其他均相同的虛擬機,通過在虛擬系統(tǒng)中插入檢測點,檢測系統(tǒng)某一進程完成后的現(xiàn)場跟蹤進程的運行狀態(tài)。如果進程的操作沒有異常,后臺再把操作重定向到真實的進程去處理,把真實數(shù)據(jù)返回給用戶,否則可以阻止其對真實系統(tǒng)的訪問。4 結論(Conclusion)計算機網(wǎng)絡攻擊幾乎每時每刻都會發(fā)生,攻擊的方式變化多樣且會隨著防御技術的變化而不斷變化,所以對網(wǎng)絡攻擊的防御是個長期的持久戰(zhàn)。本文提出的攻擊原理和防御技術能有效地阻止大部分棧溢出攻擊,但攻擊技術在不斷地發(fā)展,我們還需要根據(jù)新的攻擊技術研究設計更有效的防御技術。參考文獻(Referen

20、ces)1 Nashimoto S,et al.Buffer overflow attack with multiple fault injection and a proven countermeasureJ.Journal of Cryptographic Engineering,2016,7(1):1-12.2 Sui Y,et al.Eliminating Redundant Bounds Checks in Dynamic Buffer Overflow Detection Using Weakest PreconditionsJ.IEEE Transactions on Reliability,2016,65(4):168

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論