亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Windows棧緩沖區(qū)溢出攻擊原理及其防范

        2017-10-28 21:43:30李云飛陳洪相
        軟件工程 2017年9期
        關(guān)鍵詞:堆棧安全漏洞內(nèi)存

        李云飛 陳洪相

        摘 要:計算機(jī)網(wǎng)絡(luò)安全漏洞和網(wǎng)絡(luò)攻擊伴隨著網(wǎng)絡(luò)的存在會隨時發(fā)生,棧緩沖區(qū)溢出漏洞攻擊是網(wǎng)絡(luò)攻擊中最常見的一種攻擊技術(shù)。文章剖析了Windows棧工作原理,以及棧溢出漏洞攻擊技術(shù)方法,針對常見的棧溢出漏洞攻擊提出了幾種防御措施,能預(yù)防大部分針對棧溢出漏洞的攻擊。

        關(guān)鍵詞:網(wǎng)絡(luò)安全;內(nèi)存;安全漏洞;堆棧;緩沖區(qū)溢出

        中圖分類號:TP309.1 文獻(xiàn)標(biāo)識碼:A

        Abstract:Computer network security vulnerabilities and cyber attacks may occur at any time on 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,which can prevent most stack overflow attacks.

        Keywords:network security;memory;security vulnerabilities;stack,buffer overflow

        1 引言(Introduction)

        緩沖區(qū)是已分配的一段大小確定的用于臨時存放數(shù)據(jù)的內(nèi)存存儲區(qū)。當(dāng)向一個已經(jīng)分配了確定內(nèi)存空間的緩沖區(qū)內(nèi)寫入超出該緩沖區(qū)處理能力的數(shù)據(jù)時,將發(fā)生緩沖區(qū)溢出[1]。

        近十年,以緩沖區(qū)溢出為類型的安全漏洞攻擊是最為常見的一種形式,在網(wǎng)絡(luò)與分布式系統(tǒng)安全中,50%以上的漏洞攻擊都是基于緩沖區(qū)溢出技術(shù)的,尤其在不進(jìn)行邊界檢查的C/C++程序中仍然是軟件可靠性和安全性的主要威脅之一[2]。

        利用緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運行失敗、重新啟動、執(zhí)行惡意代碼等后果。緩沖區(qū)溢出中最危險的是棧溢出,因為入侵者可以利用堆棧溢出,在函數(shù)返回時改變返回程序的地址,讓其跳轉(zhuǎn)到任意地址,更為嚴(yán)重的是,它可被利用來執(zhí)行非授權(quán)指令,甚至可以取得系統(tǒng)特權(quán),進(jìn)而進(jìn)行各種非法操作[3]。

        2 Windows棧緩沖區(qū)溢出原理(The principle of

        stack buffer overflow in Windows)

        2.1 Windows內(nèi)存程序結(jié)構(gòu)

        計算機(jī)運行時,必須首先把程序從外存裝載到內(nèi)存,然后由CPU從內(nèi)存中依次讀取執(zhí)行指令。正在運行的程序叫進(jìn)程,每個進(jìn)程都有自己的獨立內(nèi)存空間,它被分成幾個段(Segment),分別是代碼段(text)、數(shù)據(jù)段(data,bss)、堆(heap)、棧(stack)等,如圖1所示。用戶進(jìn)程的內(nèi)存空間,也是系統(tǒng)內(nèi)核分配給該進(jìn)程的虛擬內(nèi)存。內(nèi)存總是被進(jìn)程占用,但并不表示這個進(jìn)程占用了這么多的物理內(nèi)存,Windows將虛擬內(nèi)存地址映射到各進(jìn)程的物理內(nèi)存地址上,進(jìn)程內(nèi)存空間隨著程序的執(zhí)行會增大或者縮小[4]。

        堆和棧都是一種數(shù)據(jù)項按序排列的數(shù)據(jù)結(jié)構(gòu)。

        棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),是自動開辟空間,用來分配局部變量、類的引用(指向堆空間段),棧使用的是一級緩存,通常在被調(diào)用時處于存儲空間中,調(diào)用完畢立即釋放。

        堆是一種經(jīng)過排序的數(shù)據(jù)結(jié)構(gòu),每個結(jié)點都有一個值,可以被看成是一棵樹,堆的存取是隨意的,堆是存放在二級緩存中,生命周期由虛擬機(jī)的垃圾回收算法來決定。堆的特點是根結(jié)點的值最?。ɑ蜃畲螅腋Y(jié)點的兩個子樹也是一個堆。由于堆的這個特性,常用來實現(xiàn)優(yōu)先隊列。

        bss段(Block Started by Symbol segment)通常是指用來存放程序中未初始化的全局變量的一塊內(nèi)存區(qū)域,屬于靜態(tài)內(nèi)存分配,程序一開始就將其清零了。

        對于一個進(jìn)程的內(nèi)存空間而言,可以在邏輯上分成三個部分:代碼區(qū)、靜態(tài)數(shù)據(jù)區(qū)和動態(tài)數(shù)據(jù)區(qū)。動態(tài)數(shù)據(jù)區(qū)一般就是堆棧。進(jìn)程的每個線程都有私有的棧,所以每個線程雖然代碼一樣,但本地變量的數(shù)據(jù)都是互不干擾。全局變量和靜態(tài)變量分配在靜態(tài)數(shù)據(jù)區(qū),本地變量分配在動態(tài)數(shù)據(jù)區(qū),即堆棧中。程序通過堆棧的基地址和偏移量來訪問本地變量[5]。

        32位系統(tǒng)中經(jīng)典的內(nèi)存布局是:程序起始1GB地址為內(nèi)核空間,接下來是向下增長的??臻g和由0×40000000向上增長的內(nèi)存映射地址。而堆地址是從底部開始,去除ELF(Executable and Linking Format)、代碼段、數(shù)據(jù)段、常量段之后的地址并向上增長,這種布局導(dǎo)致了緩沖區(qū)容易遭受溢出攻擊[6]。

        2.2 Windows棧緩沖區(qū)溢出原理

        Windows程序的執(zhí)行流程由代碼段ECS和指令指針EIP控制,EIP始終指向下一條要執(zhí)行指令的地址。當(dāng)發(fā)生中斷或要調(diào)用子程序時,需要將當(dāng)前斷點信息入棧保存,然后轉(zhuǎn)去執(zhí)行中斷子程序,執(zhí)行完中斷子程序后返回指令將棧頂內(nèi)容出?;謴?fù)斷點ECS和EIP。

        這種控制流程看似簡單,只需將指令地址按序給ECS和EIP即可,但就是因為這簡單的控制而不容許有任何地址計算差錯。如果其他緩沖區(qū)溢出會導(dǎo)致多余的數(shù)據(jù)覆蓋其他有用內(nèi)存空間,其中如果將棧內(nèi)數(shù)據(jù)覆蓋就可能導(dǎo)致修改入棧保存的ECS和EIP,從而使得程序返回時跑飛。

        當(dāng)一個函數(shù)被調(diào)用時,函數(shù)參數(shù)、EIP、ECS(段間調(diào)用時)、EBP和函數(shù)局部變量會依次壓棧保存,如圖2所示。endprint

        定義變量和正常調(diào)用時如圖3(a)和圖3(b)所示,但當(dāng)把遠(yuǎn)大于10個字符的內(nèi)容(如字符"B")拷貝到為緩沖區(qū)分配的10個字符空間時,多于10個字符的內(nèi)容就會覆蓋掉EBP和ECS:EIP,如圖3(c),函數(shù)執(zhí)行完畢后返回的地址就已經(jīng)不是原來保存的正確地址了。

        如果溢出部分的數(shù)據(jù)量足夠大或經(jīng)過攻擊者的精心設(shè)計,就可能覆蓋返回地址,從而改變程序的執(zhí)行流程,將程序的返回地址修改成其想執(zhí)行的代碼地址,達(dá)到攻擊目的。

        出現(xiàn)緩沖區(qū)溢出的情況主要包括三種:

        (1)使用非類型安全的語言。緩沖區(qū)溢出主要出現(xiàn)在C和C++語言中,雖然C/C++語言可以允許程序員直接訪問內(nèi)存和CPU的寄存器,從而創(chuàng)建非常接近硬件運行的性能優(yōu)異、運行速度快程序,但C/C++語言不執(zhí)行數(shù)組邊界檢測和類型安全檢查,所以在進(jìn)行數(shù)組、字符串操作時容易造成緩沖區(qū)溢出[7]。

        (2)以不安全的方式訪問或操作緩沖區(qū)。如果應(yīng)用程序需要獲得數(shù)據(jù),當(dāng)用戶將數(shù)據(jù)復(fù)制到應(yīng)用程序所指定的緩沖區(qū)而未考慮目標(biāo)緩沖區(qū)的大小時,就可能造成緩沖區(qū)溢出。

        (3)編譯器將緩沖區(qū)放在內(nèi)存中關(guān)鍵數(shù)據(jù)結(jié)構(gòu)旁邊或鄰近的位置。

        3 Windows棧緩沖區(qū)溢出攻擊防范(The prevention

        methods of stack buffer overflow attacks

        Windows)

        在棧溢出的檢查與防范方面,許多軟硬件廠商已經(jīng)做了大量工作,如微軟在Visual Studio中增加編譯選項來檢測棧的溢出,在Windows系列操作系統(tǒng)中增加了SEHOP (Structured Exception Handling Overwrite Protection),阻止修改SEH增強(qiáng)系統(tǒng)的安全性,硬件方面,64位CPU引入了NX(No-eXecute)機(jī)制,在內(nèi)存中區(qū)分?jǐn)?shù)據(jù)區(qū)與代碼區(qū),當(dāng)攻擊者利用溢出使CPU跳轉(zhuǎn)到數(shù)據(jù)區(qū)去執(zhí)行時,就會異常終止等[8]。

        但對大量現(xiàn)有軟硬件資源,若要都升級或更新到最新的軟硬系統(tǒng)是一件很困難的事,而且不斷有繞過防御機(jī)制的新漏洞產(chǎn)生,攻擊方法也在不斷地發(fā)展變化。所以日常工作中的防御措施相當(dāng)必要,針對不同的攻擊原理和方法,也可以靈活采用各種技術(shù)進(jìn)行針對性的防御。

        緩沖區(qū)溢出攻擊防范是和整個系統(tǒng)的安全性分不開的。除了系統(tǒng)管理上采用諸如關(guān)閉危險的特權(quán)程序,及時下載系統(tǒng)或軟件的最新補(bǔ)丁,使用安全產(chǎn)品等措施之外,軟件開發(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)存結(jié)構(gòu)相比,GS編譯選項會增加四個字節(jié)的堆??臻g。

        如果是堆棧的局部變量發(fā)生緩存溢出的錯誤而導(dǎo)致返回地址被覆蓋的話,由于安全cookie所在的位置,它也一定會被覆蓋。GS編譯選項在函數(shù)的入口和出口添加了針對安全cookie操作的指令,如果發(fā)現(xiàn)安全cookie的值被改動就會轉(zhuǎn)入異常處理終止程序運行。

        如果堆棧上的安全cookie的值和security_cookie的值一致的話,那么函數(shù)正常退出,否則就會執(zhí)行錯誤處理程序。

        3.2 軟件開發(fā)過程防范

        發(fā)生棧緩沖區(qū)溢出的主要原因是軟件程序中使用了不規(guī)范的數(shù)據(jù)操作或惡意代碼攻擊,所以在軟件的編寫過程中注意規(guī)范的代碼審查,是杜絕緩沖區(qū)溢出的最直接因素。

        (1)規(guī)范代碼編寫規(guī)則

        C和C++開發(fā)工具不是為安全而設(shè)計的,屬于非類型安全語言,為了保證編程的靈活性,C/C++的一些庫函數(shù)(如strcpy(、gets()等))缺乏邊界檢測,如果調(diào)用時輸入的參數(shù)過長,就會導(dǎo)致緩沖區(qū)溢出。所以在使用C/C++開發(fā)工具編程時,都應(yīng)該有針對性地進(jìn)行安全性測試和代碼審查。

        ①數(shù)組邊界檢測。C語言不進(jìn)行數(shù)組邊界檢測,容易產(chǎn)生超長數(shù)據(jù)操作植入代碼,導(dǎo)致緩沖區(qū)溢出。當(dāng)在編譯時檢查所有的數(shù)組讀寫操作,確保對數(shù)組的操作都在有效范圍內(nèi)。

        目前的C程序編譯調(diào)試檢測提供了許多檢測工具,主要對存儲器存取檢測、數(shù)組邊界檢查。譬如Purify使用目標(biāo)插入代碼技術(shù)檢查可執(zhí)行代碼在執(zhí)行時數(shù)組的所有應(yīng)用來保障數(shù)組的合法使用,但程序的性能不可避免地要受到影響。

        但由于所有的C數(shù)組在傳送時是按指針傳送的,所以傳遞給調(diào)用函數(shù)的數(shù)組不會被檢查。例如庫函數(shù)strcpy()、strcat()、gets()等函數(shù),在編譯時不會進(jìn)行邊界檢查。

        ②指針完整性檢查。程序的指針完整性檢查在程序指針被引用之前檢查其是否被改變,即使攻擊者成功改變了程序指針,由于系統(tǒng)提前檢測到了該改變而不執(zhí)行該指針,所以該方法在防范緩沖區(qū)溢出方面性能比較好。

        程序指針完整性檢查是在函數(shù)返回地址或者其他的關(guān)鍵數(shù)據(jù)、指針之前插入防范值,或者存儲一個返回地址、關(guān)鍵數(shù)據(jù)或指針的備份,在函數(shù)返回時進(jìn)行比較。

        ③改進(jìn)C庫函數(shù)。C語言產(chǎn)生緩沖區(qū)溢出的根本是調(diào)用一些庫函數(shù)時不對數(shù)據(jù)進(jìn)行邊界檢測,比如strcpy()gets()、strcat()、scanf()、printf()等,所以在用到該類型的庫函數(shù)時,可以開發(fā)更安全的替代函數(shù)實現(xiàn)該部分功能,并對其進(jìn)行安全檢查調(diào)用,防范緩沖區(qū)溢出。

        (2)棧的不可執(zhí)行技術(shù)

        Windows系統(tǒng)為了實現(xiàn)更好的性能和功能,往往在數(shù)據(jù)段中動態(tài)地插入可執(zhí)行的代碼,這樣當(dāng)緩沖區(qū)發(fā)生數(shù)據(jù)溢出時就會覆蓋數(shù)據(jù)段,從而可能導(dǎo)致數(shù)據(jù)段中的可執(zhí)行代碼被修改。所以為了防止這種緩沖區(qū)溢出產(chǎn)生攻擊,可以使被攻擊程序的數(shù)據(jù)段地址空間不可執(zhí)行,從而使得攻擊者不可能執(zhí)行被植入攻擊程序的緩沖區(qū)代碼。endprint

        為了保持程序的兼容性不可能將所有程序的數(shù)據(jù)段設(shè)為不可執(zhí)行,但可以在必要的時候?qū)⒍褩?shù)據(jù)段設(shè)為不可執(zhí)行,因為幾乎沒有程序會在堆棧中存放代碼,所以這樣既可以最大限度地保證程序的兼容性,也可以有效地保證棧緩沖區(qū)溢出攻擊。

        (3)備份關(guān)鍵控制信息

        棧溢出攻擊程序最致命的攻擊就是將程序流程的EIP和ECS內(nèi)容修改,導(dǎo)致原程序流程不能正常執(zhí)行。如果在調(diào)用程序或入棧時,將斷點的EIP和ECS自動入棧的同時,用另外申請的靜態(tài)或動態(tài)數(shù)組將程序流的關(guān)鍵信息如EIP和ECS備份保存,當(dāng)出棧返回程序斷點時,用備份的信息和棧中的信息進(jìn)行比對,如果發(fā)現(xiàn)不一致則認(rèn)為棧內(nèi)容被修改,這時可以做出中斷檢測處理,防止進(jìn)入攻擊代碼。

        3.3 棧溢出檢測防范技術(shù)

        (1)漏洞特征檢測

        漏洞都有一定的觸發(fā)條件,其攻擊過程就是構(gòu)造外部輸入使之滿足觸發(fā)條件,針對棧溢出漏洞的攻擊觸發(fā)條件就是要注入超過系統(tǒng)邏輯計劃存儲的數(shù)據(jù)長度。根據(jù)漏洞的攻擊特性系統(tǒng)會建立一個特征信息庫并動態(tài)更新,當(dāng)程序執(zhí)行過程中系統(tǒng)會針對該信息庫進(jìn)行網(wǎng)絡(luò)流量檢測,當(dāng)發(fā)現(xiàn)有類似特征代碼就會及時采取有效措施或阻止,避免發(fā)生棧溢出漏洞攻擊。

        (2)攻擊特征檢測

        漏洞需要被攻擊者發(fā)現(xiàn)并利用才能被安全機(jī)構(gòu)通過特征進(jìn)行檢測,這需要觸發(fā)條件或可能經(jīng)過很長時間才能被發(fā)現(xiàn)。為了及時防御該類溢出攻擊,可以根據(jù)攻擊的特點進(jìn)行有針對性的防御。

        棧溢出注入數(shù)據(jù)的長度與內(nèi)容隨著漏洞的不同而有所差異,但攻擊者攻擊時所使用的跳轉(zhuǎn)地址卻是常用或者比較固定易用的一些地址。由于不同平臺下的shellcode一般都會重復(fù)利用。所以棧溢出攻擊手法會具有一定的特征,通過提取這些頻繁出現(xiàn)的特征對防御設(shè)備的攻擊特征庫及時更新,可以有效阻止棧溢出攻擊發(fā)生。

        (3)虛擬檢測技術(shù)

        防御設(shè)備最理想的情況是可以虛擬出一個除了數(shù)據(jù)不同其他均相同的虛擬機(jī),通過在虛擬系統(tǒng)中插入檢測點,檢測系統(tǒng)某一進(jìn)程完成后的現(xiàn)場跟蹤進(jìn)程的運行狀態(tài)。如果進(jìn)程的操作沒有異常,后臺再把操作重定向到真實的進(jìn)程去處理,把真實數(shù)據(jù)返回給用戶,否則可以阻止其對真實系統(tǒng)的訪問。

        4 結(jié)論(Conclusion)

        計算機(jī)網(wǎng)絡(luò)攻擊幾乎每時每刻都會發(fā)生,攻擊的方式變化多樣且會隨著防御技術(shù)的變化而不斷變化,所以對網(wǎng)絡(luò)攻擊的防御是個長期的持久戰(zhàn)。本文提出的攻擊原理和防御技術(shù)能有效地阻止大部分棧溢出攻擊,但攻擊技術(shù)在不斷地發(fā)展,我們還需要根據(jù)新的攻擊技術(shù)研究設(shè)計更有效的防御技術(shù)。

        參考文獻(xiàn)(References)

        [1] Nashimoto S,et al.Buffer overflow attack with multiple fault injection and a proven countermeasure[J].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 Preconditions[J].IEEE Transactions on Reliability,2016,65(4):1682-1699.

        [3] Wang X,et al.A Differential Approach to Undefined Behavior Detection[J].Acm Transactions on Computer Systems,2015,

        33(1):1.

        [4] 肖蕾,劉克江.一種微型嵌入式系統(tǒng)動態(tài)內(nèi)存分區(qū)管理機(jī)制的研究[J].軟件工程,2016,19(4):59-60.

        [5] 崔寶江,等.基于污點信息的函數(shù)內(nèi)存模糊測試技術(shù)研究[J].清華大學(xué)學(xué)報(自然科學(xué)版),2016(1):7-13.

        [6] 彭建山,等.基于指針時空分析的軟件異常可利用性判定[J].計算機(jī)應(yīng)用研究,2016,33(5):1504-1508.

        [7] 謝汶兵,等.基于備份控制流信息的緩沖區(qū)溢出監(jiān)測技術(shù)[J].計算機(jī)工程與應(yīng)用,2016,52(11):101-107.

        [8] Jaiswal S,Gupta D.Security engineering methods-in-depth analysis[J].International Journal of Information & Computer Security,2017,9(3):180.

        [9] Howard M,Lipner S.The security development lifecycle:SDL,a process for developing demonstrably more secure software[J].Datenschutz und Datensicherheit-DuD,2015,34(3):135-137.

        作者簡介:

        李云飛(1974-),男,博士,副教授.研究領(lǐng)域:信息安全,嵌入式系統(tǒng),模式識別.

        陳洪相(1974-),男,本科,高級教師.研究領(lǐng)域:計算機(jī)應(yīng)用,軟件開發(fā).endprint

        猜你喜歡
        堆棧安全漏洞內(nèi)存
        “春夏秋冬”的內(nèi)存
        安全漏洞太大亞馬遜、沃爾瑪和Target緊急下架這種玩具
        玩具世界(2018年6期)2018-08-31 02:36:26
        嵌入式軟件堆棧溢出的動態(tài)檢測方案設(shè)計*
        基于堆棧自編碼降維的武器裝備體系效能預(yù)測
        基于安全漏洞掃描的校園網(wǎng)告警系統(tǒng)的開發(fā)與設(shè)計
        安全漏洞Shellshock簡介
        河南科技(2014年11期)2014-02-27 14:16:49
        基于內(nèi)存的地理信息訪問技術(shù)
        一種用于分析MCS-51目標(biāo)碼堆棧深度的方法
        NSFOCUS 2010年2月之十大安全漏洞
        上網(wǎng)本為什么只有1GB?
        日韩精品一二区在线视频| 欧美日韩视频无码一区二区三| 国产成人亚洲不卡在线观看| 亚洲成AV人片无码不卡| 国产3p一区二区三区精品| 日韩欧美亚洲国产精品字幕久久久| 亚洲日本中文字幕高清在线| 国产夫妇肉麻对白| 亚洲欧美日本| 久久久久久久尹人综合网亚洲| 一区二区三区日韩毛片| 日韩 无码 偷拍 中文字幕| 亚洲男同志网站| 国产精品av在线一区二区三区| 国产一区二区视频在线看| 女人张开腿让男人桶爽| 欧美人与动人物姣配xxxx| 国产激情无码Av毛片久久| 精品婷婷国产综合久久| 丝袜美腿一区二区三区| 天堂网www在线资源| 国产人成在线成免费视频| 不卡av网站一区二区三区| 美女张开腿让男人桶爽| 国产成人无码精品久久99| 亚洲无人区乱码中文字幕| 久久天天躁夜夜躁狠狠85麻豆 | 欧美a级在线现免费观看| 看大陆男女真人草逼视频| 欧美群妇大交群| 欧美亚洲日本国产综合在线| 毛片在线啊啊| 一区二区三区四区亚洲免费 | 国偷自产一区二区免费视频| 国产免费AV片在线看| 高清成人在线视频播放| 中文字幕免费在线观看动作大片| 精品久久久久久中文字幕大豆网 | 亚洲视频一区二区三区免费| 国产极品美女高潮无套| 精品久久久久久中文字幕|