緩沖區(qū)溢出攻擊的原理分析與防范課件_第1頁(yè)
緩沖區(qū)溢出攻擊的原理分析與防范課件_第2頁(yè)
緩沖區(qū)溢出攻擊的原理分析與防范課件_第3頁(yè)
緩沖區(qū)溢出攻擊的原理分析與防范課件_第4頁(yè)
緩沖區(qū)溢出攻擊的原理分析與防范課件_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、前言1.1本課題的研究意義1.2緩沖區(qū)溢出國(guó)內(nèi)外研究現(xiàn)狀2、緩沖區(qū)溢出原理概述2.1、緩沖區(qū)溢出的概念2.2、堆棧的定義2.3緩沖區(qū)溢出攻擊原理2.4緩沖區(qū)溢出攻擊方式2.4.1在程序的地址空間里安排適當(dāng)?shù)拇a的方法2.4.2控制程序轉(zhuǎn)移到攻擊代碼的方法2.5緩沖區(qū)溢出影響及危害3、緩沖區(qū)溢出的防御方法3.1、寫(xiě)正確的代碼的方法3.2、通過(guò)操作系統(tǒng)使得緩沖區(qū)不可執(zhí)行,從而阻止攻擊者植入攻擊代碼3.3、利用編譯器的數(shù)組邊界檢查來(lái)實(shí)現(xiàn)緩沖區(qū)的保護(hù)3.4、在程序指針失效前進(jìn)行完整性檢查4、總結(jié)與展望4.1全文總結(jié)4.2展望5、參考文獻(xiàn)

主要目錄緩沖區(qū)溢出攻擊的原理分析與防范本課題的研究意義隨著信息與網(wǎng)絡(luò)技術(shù)的發(fā)展,以及這些技術(shù)在軍事領(lǐng)域的不斷滲透,計(jì)算機(jī)網(wǎng)絡(luò)已成為連接未來(lái)信息化戰(zhàn)場(chǎng)的樞紐。對(duì)計(jì)算機(jī)的攻擊,能夠獲得大量寶貴的情報(bào)以及達(dá)到其它武器系統(tǒng)所不能及的效果。因此對(duì)以計(jì)算機(jī)為基礎(chǔ)的網(wǎng)絡(luò)攻擊與防護(hù)就自然成為軍事領(lǐng)域密切關(guān)注的問(wèn)題。近年來(lái),緩沖區(qū)溢出漏洞的廣泛性和破壞性受到國(guó)內(nèi)外信息安全研究領(lǐng)域的極切關(guān)注。從1988年CERT(計(jì)算機(jī)緊急響應(yīng)小組)成立以來(lái),統(tǒng)計(jì)到的安全威脅事件每年以指數(shù)增長(zhǎng)。緩沖區(qū)溢出攻擊作為網(wǎng)絡(luò)攻擊一種主要形式占所有系統(tǒng)攻擊總數(shù)的80%以上[1]。這種緩沖區(qū)溢出漏洞可以發(fā)生在不同的操作系統(tǒng)以及不同的應(yīng)用程序上。

緩沖區(qū)溢出攻擊是黑客攻擊的主要手段,給網(wǎng)絡(luò)信息安全帶來(lái)了越來(lái)越大的危害。已有的防御手段研究相對(duì)滯后,目前國(guó)內(nèi)外的研究大多集中在某個(gè)具體漏洞的利用與防范上,缺乏全面的研究。并且現(xiàn)有的緩沖區(qū)溢出防御手段也存在諸多不足之處。論文主要是對(duì)緩沖區(qū)溢出攻擊的原理分析與防范進(jìn)行深入研究。論文首先介紹了緩沖區(qū)和堆棧的基本概念,研究并總結(jié)了緩沖區(qū)溢出的原理和過(guò)程,并介紹了一些常用的攻擊方法。在此基礎(chǔ)上,論文研究并總結(jié)了目前防御緩沖區(qū)溢出攻擊的一些常用方法,主要從主客觀(guān)兩方面來(lái)討論。主觀(guān)方面,主要是要提高程序員編寫(xiě)代碼的質(zhì)量,形成良好的編程風(fēng)格;客觀(guān)方面,主要是從系統(tǒng)和軟件做一些相關(guān)的檢查和優(yōu)化。緩沖區(qū)溢出攻擊的原理分析與防范緩沖區(qū)溢出國(guó)內(nèi)外研究現(xiàn)狀緩沖區(qū)溢出攻擊作為一種主流的攻擊手法,早在20世紀(jì)80年代,國(guó)外就有人開(kāi)始討論溢出攻擊,例如1988年的Morris蠕蟲(chóng),利用的攻擊方法之一就是Fingerd的緩沖區(qū)溢出,這次蠕蟲(chóng)攻擊導(dǎo)致全球6000多臺(tái)機(jī)器被感染,損失巨大,由此,緩沖區(qū)溢出問(wèn)題逐漸得到人們的重視。1989年,Spafford提交了一份分析報(bào)告,描述了VAX機(jī)上的BSD版unix的Fingerd的緩沖區(qū)溢出程序的技術(shù)細(xì)節(jié),從而引起了一部分安全人士對(duì)這個(gè)研究領(lǐng)域的重視。1996年AlephOne詳細(xì)的描述了Linux系統(tǒng)中棧的結(jié)構(gòu)和如何利用基于棧的緩沖區(qū)溢出。1997年,Smith綜合以前的文章,提供了如何在各種Unix家庭中寫(xiě)緩沖區(qū)溢出Exploit更詳細(xì)的指導(dǎo)原則。1998年來(lái)自“CultoftheDeadcow”的Dildog詳細(xì)地介紹了如何利用Windows的溢出,他提出了利用棧指針的方法來(lái)完成跳轉(zhuǎn),返回固定的指向地址,不論是在出問(wèn)題的程序中還是在動(dòng)態(tài)鏈接庫(kù)中,該固定地址都包含了用來(lái)利用棧指針完成跳轉(zhuǎn)的匯編指令,這是緩沖區(qū)溢出利用一個(gè)重大的進(jìn)步。在國(guó)內(nèi),這方面技術(shù)的研究起步較晚,2000年左右,才有部分安全人士和黑客開(kāi)始研究這個(gè)領(lǐng)域,最早中聯(lián)綠盟的袁仁廣做過(guò)一些工作,他使用暴力探索的辦法來(lái)獲取kernel32.dll的基址,代碼量太多,也不夠準(zhǔn)確,2003年安全焦點(diǎn)峰會(huì)上Flashsky做了關(guān)于堆溢出的演講[3],總結(jié)了堆溢出漏洞利用的方法。2005年San寫(xiě)了關(guān)于如何溢出WindowsCE的文章[4],WindowsCE是PDA和手機(jī)上使用非常廣泛的嵌入式操作系統(tǒng),該文介紹了WindowsCE內(nèi)存管理,進(jìn)程等基礎(chǔ)知識(shí),初步討論了WindowsCE的緩沖區(qū)溢出問(wèn)題,只是對(duì)Shellcode的解碼效率不高。緩沖區(qū)溢出攻擊的原理分析與防范緩沖區(qū)溢出原理概述緩沖區(qū)溢出的概念緩沖區(qū)是內(nèi)存中存放數(shù)據(jù)的地方,一般來(lái)說(shuō),它是“包含相同數(shù)據(jù)類(lèi)型的實(shí)例的一個(gè)連續(xù)計(jì)算機(jī)內(nèi)存塊”[5],它保存了給定類(lèi)型的數(shù)據(jù)。在C和C++中,緩沖區(qū)通常是使用數(shù)組和諸如malloc()和new這樣的內(nèi)存分配例程來(lái)實(shí)現(xiàn)的。最常見(jiàn)的緩沖區(qū)種類(lèi)是簡(jiǎn)單的字符數(shù)組。緩沖區(qū)溢出是指當(dāng)計(jì)算機(jī)向緩沖區(qū)內(nèi)填充數(shù)據(jù)位數(shù)時(shí)超過(guò)了緩沖區(qū)本身的容量,使得溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上,理想的情況是程序檢查數(shù)據(jù)長(zhǎng)度并不允許輸入超過(guò)緩沖區(qū)長(zhǎng)度的字符,但是絕大多數(shù)程序都會(huì)假設(shè)數(shù)據(jù)長(zhǎng)度總是與所分配的儲(chǔ)存空間相匹配,這就為緩沖區(qū)溢出埋下隱患。操作系統(tǒng)所使用的緩沖區(qū)又被稱(chēng)為“堆?!?。在各個(gè)操作進(jìn)程之間,指令會(huì)被臨時(shí)儲(chǔ)存在“堆棧”當(dāng)中,“堆棧”也會(huì)出現(xiàn)緩沖區(qū)溢出。緩沖區(qū)溢出攻擊的原理分析與防范比如這樣或許你還不明白?緩沖區(qū)溢出攻擊的原理分析與防范堆棧的定義

堆棧是內(nèi)存中的一個(gè)連續(xù)的塊。一個(gè)叫堆棧指針的寄存器(SP)指向堆棧的棧頂,堆棧的底部是一個(gè)固定地址。堆棧有一個(gè)特點(diǎn)就是,后進(jìn)先出。也就是說(shuō),后放入的數(shù)據(jù)第一個(gè)取出。它支持兩個(gè)操作,PUSH和POP。PUSH是將數(shù)據(jù)放到棧的頂端,POP是將棧頂?shù)臄?shù)據(jù)取出。在高級(jí)語(yǔ)言中,程序函數(shù)調(diào)用和函數(shù)中的臨時(shí)變量都用到堆棧,參數(shù)的傳遞和返回值時(shí)也用到了堆棧,通常對(duì)局部變量的引用是通過(guò)給出它們對(duì)SP的偏移量來(lái)實(shí)現(xiàn)的。另外還有一個(gè)基址指針(FP,在Intel芯片中是BP),許多編譯器實(shí)際上是用它來(lái)引用本地變量和參數(shù)的。通常,參數(shù)的相對(duì)FP的偏移是正的,局部變量是負(fù)的。當(dāng)程序中發(fā)生函數(shù)調(diào)用時(shí),計(jì)算機(jī)做如下操作:首先把參數(shù)壓入堆棧;然后保存指令寄存器(IP)中的內(nèi)容,作為返回地址(RET);第三個(gè)放入堆棧的是基址寄存器(FP);然后把當(dāng)前的棧指針(SP)拷貝到FP,作為新的基地址;最后為本地變量留出一定空間,把SP減去適當(dāng)?shù)臄?shù)值。緩沖區(qū)溢出攻擊的原理分析與防范緩沖區(qū)溢出攻擊原理

緩沖區(qū)攻擊指的是一種常見(jiàn)且危害很大的系統(tǒng)攻擊手段,通過(guò)向程序的緩沖區(qū)寫(xiě)入超出其長(zhǎng)度的內(nèi)容,造成緩沖區(qū)的溢出,從而破壞程序的堆棧,使程序轉(zhuǎn)而執(zhí)行其他的指令,以達(dá)到攻擊的目的。當(dāng)正常的使用者操作程序的時(shí)候,所進(jìn)行的操作一般不會(huì)超出程序的運(yùn)行范圍,數(shù)據(jù)被添加到分配給該緩沖區(qū)的內(nèi)存塊之外,會(huì)發(fā)生緩沖區(qū)溢出,這時(shí)候就會(huì)出現(xiàn)數(shù)據(jù)泄漏或侵占了其它的數(shù)據(jù)空間。緩沖區(qū)溢出的攻擊原理就是越過(guò)緩沖區(qū)長(zhǎng)度界限向程序中輸入超出其常規(guī)長(zhǎng)度的內(nèi)容,造成緩沖區(qū)的溢出從而破壞程序的堆棧,使程序運(yùn)行出現(xiàn)特殊的問(wèn)題轉(zhuǎn)而執(zhí)行其它指令。一般來(lái)說(shuō),單單的緩沖區(qū)溢出,并不會(huì)產(chǎn)生安全問(wèn)題,如果將溢出送到能夠以root權(quán)限或其它超級(jí)權(quán)限運(yùn)行命令的區(qū)域去執(zhí)行某些代碼或者運(yùn)行一個(gè)shell的時(shí)候,該程序就是以超級(jí)用戶(hù)的權(quán)限控制了計(jì)算機(jī)。緩沖區(qū)溢出攻擊的原理分析與防范緩沖區(qū)溢出攻擊方式緩沖區(qū)溢出攻擊的目的在于擾亂具有某些特權(quán)運(yùn)行的程序的功能,這樣可以使得攻擊者取得程序的控制權(quán),如果該程序具有足夠的權(quán)限,那么整個(gè)主機(jī)就被控制了。一般而言,攻擊者攻擊root程序,然后執(zhí)行類(lèi)似“exec(sh)”的執(zhí)行代碼來(lái)獲得root權(quán)限的shell。為了達(dá)到這個(gè)目的,攻擊者必須達(dá)到如下的兩個(gè)目標(biāo):(1)在程序的地址空間里安排適當(dāng)?shù)拇a。(2)通過(guò)適當(dāng)?shù)某跏蓟拇嫫骱蛢?nèi)存,讓程序跳轉(zhuǎn)到入侵者安排的地址空間執(zhí)行。緩沖區(qū)溢出攻擊方式可以分為兩種,一種在程序的地址空間里安排適當(dāng)?shù)拇a的方法;另一種控制程序轉(zhuǎn)移到攻擊代碼的方法。論文簡(jiǎn)介這兩種攻擊的方式。緩沖區(qū)溢出攻擊的原理分析與防范在程序的地址空間里安排適當(dāng)?shù)拇a的方法有兩種在被攻擊程序地址空間里安排攻擊代碼的方法:(1)、植入法:攻擊者向被攻擊的程序輸入一個(gè)字符串,程序會(huì)把這個(gè)字符串放到緩沖區(qū)里。這個(gè)字符串包含的資料是可以在這個(gè)被攻擊的硬件平臺(tái)上運(yùn)行的指令序列。在這里,攻擊者用被攻擊程序的緩沖區(qū)來(lái)存放攻擊代碼。緩沖區(qū)可以設(shè)在任何地方:堆棧(stack,自動(dòng)變量)、堆(heap,動(dòng)態(tài)分配的內(nèi)存區(qū))和靜態(tài)資料區(qū)。(2)、利用已經(jīng)存在的代碼:有時(shí),攻擊者想要的代碼已經(jīng)在被攻擊的程序中了,攻擊者所要做的只是對(duì)代碼傳遞一些參數(shù)。比如,攻擊代碼要求執(zhí)行“exec(“/bin/sh”)”,而在libc庫(kù)中的代碼執(zhí)行“exec(arg)”,其中arg使一個(gè)指向一個(gè)字符串的指針參數(shù),那么攻擊者只要把傳入的參數(shù)指針改向指向”/bin/sh”。緩沖區(qū)溢出攻擊的原理分析與防范

攻擊方式圖示緩沖區(qū)溢出攻擊的原理分析與防范控制程序轉(zhuǎn)移到攻擊代碼的方法分類(lèi)的基準(zhǔn)是攻擊者所尋求的緩沖區(qū)溢出的程序空間類(lèi)型。原則上是可以任意的空間,實(shí)際上,許多的緩沖區(qū)溢出都是用暴力的方法來(lái)尋求改變程序指針的。這類(lèi)程序的不同之處就是程序空間的突破和內(nèi)存空間的定位不同。主要有以下三種:1、活動(dòng)紀(jì)錄(ActivationRecords):

每當(dāng)一個(gè)函數(shù)調(diào)用發(fā)生時(shí),調(diào)用者會(huì)在堆棧中留下一個(gè)活動(dòng)紀(jì)錄,它包含了函數(shù)結(jié)束時(shí)返回的地址。攻擊者通過(guò)溢出堆棧中的自動(dòng)變量,使返回地址指向攻擊代碼。通過(guò)改變程序的返回地址,當(dāng)函數(shù)調(diào)用結(jié)束時(shí),程序就跳轉(zhuǎn)到攻擊者設(shè)定的地址,而不是原先的地址。這類(lèi)的緩沖區(qū)溢出被稱(chēng)為堆棧溢出攻擊(StackSmashingAttack),是目前最常用的緩沖區(qū)溢出攻擊方式。2、函數(shù)指針(FunctionPointers):

函數(shù)指針可以用來(lái)定位任何地址空間。例如:“void(*foo)()”聲明了一個(gè)返回值為void的函數(shù)指針變量foo。所以攻擊者只需在任何空間內(nèi)的函數(shù)指針附近找到一個(gè)能夠溢出的緩沖區(qū),然后溢出這個(gè)緩沖區(qū)來(lái)改變函數(shù)指針。在某一時(shí)刻,當(dāng)程序通過(guò)函數(shù)指針調(diào)用函數(shù)時(shí),程序的流程就按攻擊者的意圖實(shí)現(xiàn)了。它的一個(gè)攻擊范例就是在Linux系統(tǒng)下的superprobe程序。緩沖區(qū)溢出攻擊的原理分析與防范長(zhǎng)跳轉(zhuǎn)緩沖區(qū)(Longjmpbuffers):在C語(yǔ)言中包含了一個(gè)簡(jiǎn)單的檢驗(yàn)/恢復(fù)系統(tǒng),稱(chēng)為setjmp/longjmp。意思是在檢驗(yàn)點(diǎn)設(shè)定“setjmp(buffer)”,用“l(fā)ongjmp(buffer)”來(lái)恢復(fù)檢驗(yàn)點(diǎn)。然而,如果攻擊者能夠進(jìn)入緩沖區(qū)的空間,那么“l(fā)ongjmp(buffer)”實(shí)際上是跳轉(zhuǎn)到攻擊者的代碼。象函數(shù)指針一樣,longjmp緩沖區(qū)能夠指向任何地方,所以攻擊者所要做的就是找到一個(gè)可供溢出的緩沖區(qū)。一個(gè)典型的例子就是Perl5.003的緩沖區(qū)溢出漏洞;攻擊者首先進(jìn)入用來(lái)恢復(fù)緩沖區(qū)溢出的的longjmp緩沖區(qū),然后誘導(dǎo)進(jìn)入恢復(fù)模式,這樣就使Perl的解釋器跳轉(zhuǎn)到攻擊代碼上了。緩沖區(qū)溢出攻擊的原理分析與防范緩沖區(qū)溢出影響及危害在幾乎所有計(jì)算機(jī)語(yǔ)言中,不管是新的語(yǔ)言還是舊的語(yǔ)言,使緩沖區(qū)溢出的任何嘗試通常都會(huì)被該語(yǔ)言本身自動(dòng)檢測(cè)并阻止(比如通過(guò)引發(fā)一個(gè)異?;蚋鶕?jù)需要給緩沖區(qū)添加更多空間),但是有兩種語(yǔ)言不是這樣:C和C++語(yǔ)言。C\C++語(yǔ)言由于其針靈活應(yīng)用的特性,通常允許讓額外的數(shù)據(jù)亂寫(xiě)到其余內(nèi)存的任何位置,而這種情況可能被利用從而導(dǎo)致意想不到的結(jié)果。而且,用C\C++編寫(xiě)正確的代碼來(lái)始終如一地處理緩沖區(qū)溢出則更為困難;很容易就會(huì)意外地導(dǎo)致緩沖區(qū)溢出。更重要的一點(diǎn)就是C\C++的應(yīng)用非常廣泛,例如,RedHatLinux7.1中86%的代碼行都是用C或C++編寫(xiě)的。因此,大量的代碼對(duì)這個(gè)問(wèn)題都是脆弱的,出現(xiàn)緩沖區(qū)溢出也就是常見(jiàn)的事情。緩沖區(qū)溢出漏洞很容易被蠕蟲(chóng)病毒利用造成了很大的危害,如2001年7月19日,CodeRed蠕蟲(chóng)爆發(fā),造成的損失估計(jì)超過(guò)20億美元[2],2001年9月18日,Nimda蠕蟲(chóng)被發(fā)現(xiàn),造成的損失更大,超過(guò)26億美元,2002年Slapper蠕蟲(chóng)出現(xiàn),2003年1月25日Slammer蠕蟲(chóng)爆發(fā),2004年5月1日,“震蕩波”被發(fā)現(xiàn),這幾個(gè)病毒對(duì)網(wǎng)絡(luò)安全造成的破壞之大是前所未有的。而以上病毒都利用了緩沖區(qū)溢出漏洞。怎么辦?緩沖區(qū)溢出攻擊的原理分析與防范

緩沖區(qū)溢出的防御方法緩沖區(qū)溢出攻擊占了遠(yuǎn)程網(wǎng)絡(luò)攻擊的絕大多數(shù),這種攻擊可以使得一個(gè)匿名的Internet用戶(hù)有機(jī)會(huì)獲得一臺(tái)主機(jī)的部分或全部的控制權(quán)。如果能有效地消除緩沖區(qū)溢出的漏洞,則很大一部分的安全威脅可以得到緩解。目前有4種基本的方法保護(hù)緩沖區(qū)免受緩沖區(qū)溢出的攻擊和影響。3.1、寫(xiě)正確的代碼的方法編寫(xiě)正確的代碼是一件非常有意義的工作,特別象編寫(xiě)C語(yǔ)言那種風(fēng)格自由而容易出錯(cuò)的程序,這種風(fēng)格是由于追求性能而忽視正確性的傳統(tǒng)引起的。盡管花了很長(zhǎng)的時(shí)間使得人們知道了如何編寫(xiě)安全的程序,具有安全漏洞的程序依舊出現(xiàn)。因此人們開(kāi)發(fā)了一些工具和技術(shù)來(lái)幫助經(jīng)驗(yàn)不足的程序員編寫(xiě)安全正確的程序。最簡(jiǎn)單的方法就是用grep來(lái)搜索源代碼中容易產(chǎn)生漏洞的庫(kù)的調(diào)用,比如對(duì)strcpy和sprintf的調(diào)用,這兩個(gè)函數(shù)都沒(méi)有檢查輸入?yún)?shù)的長(zhǎng)度。事實(shí)上,各個(gè)版本C的標(biāo)準(zhǔn)庫(kù)均有這樣的問(wèn)題存在。此外,人們還開(kāi)發(fā)了一些高級(jí)的查錯(cuò)工具,如faultinjection等。這些工具的目的在于通過(guò)人為隨機(jī)地產(chǎn)生一些緩沖區(qū)溢出來(lái)尋找代碼的安全漏洞。還有一些靜態(tài)分析工具用于偵測(cè)緩沖區(qū)溢出的存在。雖然這些工具幫助程序員開(kāi)發(fā)更安全的程序,但是由于C語(yǔ)言的特點(diǎn),這些工具不可能找出所有的緩沖區(qū)溢出漏洞。所以,偵錯(cuò)技術(shù)只能用來(lái)減少緩沖區(qū)溢出的可能,并不能完全地消除它的存在。緩沖區(qū)溢出攻擊的原理分析與防范通過(guò)操作系統(tǒng)使得緩沖區(qū)不可執(zhí)行,從而阻止攻擊者植入攻擊代碼通過(guò)使被攻擊程序的數(shù)據(jù)段地址空間不可執(zhí)行,從而使得攻擊者不可能執(zhí)行被植入被攻擊程序輸入緩沖區(qū)的代碼,這種技術(shù)被稱(chēng)為非執(zhí)行的緩沖區(qū)技術(shù)。在早期的Unix系統(tǒng)設(shè)計(jì)中,只允許程序代碼在代碼段中執(zhí)行。但是Unix和MSWindows系統(tǒng)由于要實(shí)現(xiàn)更好的性能和功能,往往在數(shù)據(jù)段中動(dòng)態(tài)地放入可執(zhí)行的代碼,這也是緩沖區(qū)溢出的根源。為了保持程序的兼容性,不可能使得所有程序的數(shù)據(jù)段不可執(zhí)行。但是可以設(shè)定堆棧數(shù)據(jù)段不可執(zhí)行,這樣就可以保證程序的兼容性。Linux和Solaris都發(fā)布了有關(guān)這方面的內(nèi)核補(bǔ)丁。因?yàn)閹缀鯖](méi)有任何合法的程序會(huì)在堆棧中存放代碼,這種做法幾乎不產(chǎn)生任何兼容性問(wèn)題,除了在Linux中的兩個(gè)特例,這時(shí)可執(zhí)行的代碼必須被放入堆棧中:⑴信號(hào)傳遞Linux通過(guò)向進(jìn)程堆棧釋放代碼然后引發(fā)中斷來(lái)執(zhí)行在堆棧中的代碼來(lái)實(shí)現(xiàn)向進(jìn)程發(fā)送Unix信號(hào)。非執(zhí)行緩沖區(qū)的補(bǔ)丁在發(fā)送信號(hào)的時(shí)候是允許緩沖區(qū)可執(zhí)行的。⑵GCC的在線(xiàn)重用研究發(fā)現(xiàn)gcc在堆棧區(qū)里放置了可執(zhí)行的代碼作為在線(xiàn)重用之用。然而,關(guān)閉這個(gè)功能并不產(chǎn)生任何問(wèn)題,只有部分功能似乎不能使用。非執(zhí)行堆棧的保護(hù)可以有效地對(duì)付把代碼植入自動(dòng)變量的緩沖區(qū)溢出攻擊,而對(duì)于其它形式的攻擊則沒(méi)有效果。通過(guò)引用一個(gè)駐留的程序的指針,就可以跳過(guò)這種保護(hù)措施。其它的攻擊可以采用把代碼植入堆或者靜態(tài)數(shù)據(jù)段中來(lái)跳過(guò)保護(hù)。這種方法有效地阻止了很多緩沖區(qū)溢出的攻擊,但是攻擊者并不一定要植入攻擊代碼來(lái)實(shí)現(xiàn)緩沖區(qū)溢出的攻擊,所以這種方法還是存在很多弱點(diǎn)的。緩沖區(qū)溢出攻擊的原理分析與防范利用編譯器的數(shù)組邊界檢查來(lái)實(shí)現(xiàn)緩沖區(qū)的保護(hù)數(shù)組邊界檢查能防止所有的緩沖區(qū)溢出的產(chǎn)生和攻擊。這是因?yàn)橹灰獢?shù)組不能被溢出,溢出攻擊也就無(wú)從談起。為了實(shí)現(xiàn)數(shù)組邊界檢查,則所有的對(duì)數(shù)組的讀寫(xiě)操作都應(yīng)當(dāng)被檢查以確保對(duì)數(shù)組的操作在正確的范圍內(nèi)。最直接的方法是檢查所有的數(shù)組操作,但是通常可以采用一些優(yōu)化的技術(shù)來(lái)減少檢查的次數(shù)。目前有以下的幾種檢查方法:(1)Jones&Kelly:C的數(shù)組邊界檢查

RichardJones和PaulKelly開(kāi)發(fā)了一個(gè)gcc的補(bǔ)丁,用來(lái)實(shí)現(xiàn)對(duì)C程序完全的數(shù)組邊界檢查。由于沒(méi)有改變指針的含義,所以被編譯的程序和其它的gcc模塊具有很好的兼容性。更進(jìn)一步的是,他們由此從沒(méi)有指針的表達(dá)式中導(dǎo)出了一個(gè)“基”指針,然后通過(guò)檢查這個(gè)基指針來(lái)偵測(cè)表達(dá)式的結(jié)果是否在容許的范圍之內(nèi)。當(dāng)然,這樣付出的性能上的代價(jià)是巨大的:對(duì)于一個(gè)頻繁使用指針的程序,比如向量乘法,將由于指針的頻繁使用而使速度比本來(lái)慢30倍。這個(gè)編譯器目前還很不成熟;一些復(fù)雜的程序還不能在這個(gè)上面編譯,執(zhí)行通過(guò)。緩沖區(qū)溢出攻擊的原理分析與防范

(2)CompaqC編譯器Compaq公司為AlphaCPU開(kāi)發(fā)的C編譯器支持有限度的邊界檢查(使用check_bounds參數(shù))。這些限制是:

只有顯式的數(shù)組引用才被檢查,比如“a[3]”會(huì)被檢查,而“*(a+3)”則不會(huì)。由于所有的C數(shù)組在傳送的時(shí)候是指針傳遞的,所以傳遞給函數(shù)的的數(shù)組不會(huì)被查。帶有危險(xiǎn)性的庫(kù)函數(shù)如strcpy不會(huì)在編譯的時(shí)候進(jìn)行邊界檢查,即便是指定了邊界檢查。由于在C語(yǔ)言中利用指針進(jìn)行數(shù)組操作和傳遞是如此的頻繁,因此這種局限性是非常嚴(yán)重的。通常這種邊界檢查用來(lái)程序的查錯(cuò),而且不能保證不發(fā)生緩沖區(qū)溢出的漏洞。(3)Purify:內(nèi)存存取檢查

Purify是C程序調(diào)試時(shí)查看內(nèi)存使用的工具。Purify使用“目標(biāo)代碼插入”技術(shù)來(lái)檢查所有的內(nèi)存存取。通過(guò)用Purify連接工具連接,可執(zhí)行代碼在執(zhí)行的時(shí)候數(shù)組的所有引用來(lái)保證其合法性。這樣帶來(lái)的性能上的損失要下降3-5倍。(4)類(lèi)型-安全語(yǔ)言所有的緩沖區(qū)溢出漏洞都源于C語(yǔ)言缺乏類(lèi)型安全。如果只有類(lèi)型-安全的操作才可以被允許執(zhí)行,這樣就不可能出現(xiàn)對(duì)變量的強(qiáng)制操作。如果作為新手,可以推薦使用具有類(lèi)型-安全的語(yǔ)言如Java。但是作為Java執(zhí)行平臺(tái)的Java虛擬機(jī)是C程序,因此通過(guò)攻擊JVM的一條途徑是使JVM的緩沖區(qū)溢出。這個(gè)方法使得緩沖區(qū)溢出不可能出現(xiàn),從而完全消除了緩沖區(qū)溢出的威脅,但是相對(duì)而言代價(jià)比較大。緩沖區(qū)溢出攻擊的原理分析與防范在程序指針失效前進(jìn)行完整性檢查

程序指針完整性檢查和邊界檢查有略微的不同,程序指針完整性檢查在程序指針被引用之前檢測(cè)到它的改變。因此,即使一個(gè)攻擊者成功地改變了程序的指針,由于系統(tǒng)事先檢測(cè)到了指針的改變,因此這個(gè)指針將不會(huì)被使用。與數(shù)組邊界檢查相比,這種方法不能解決所有的緩沖區(qū)溢出問(wèn)題;采用其它的緩沖區(qū)溢出攻擊方法就可以避免這種檢測(cè)。但是這種方法在性能上有很大的優(yōu)勢(shì),而且在兼容性也很好,而且目前為止,只有很少一部分使用非指針變量的攻擊能逃脫指針保護(hù)的檢測(cè)。

緩沖區(qū)溢出攻擊的原理分析與防范最普通的緩沖區(qū)溢出形式是攻擊活動(dòng)記錄然后在堆棧中植入代碼。這種類(lèi)型的攻擊在1996年中有很多記錄。而非執(zhí)行堆棧和堆棧保護(hù)的方法都可以有效防衛(wèi)這種攻擊。非執(zhí)行堆??梢苑佬l(wèi)所有把代碼植入堆棧的攻擊方法,堆棧保護(hù)可以防衛(wèi)所有改變活動(dòng)記錄的方法。這兩種方法相互兼容,可以同時(shí)防衛(wèi)多種可能的攻擊。雖然這些工具幫助程序員開(kāi)發(fā)更安全的程序,但是由于C語(yǔ)言的特點(diǎn),這些工具不可能找出所有的緩沖區(qū)溢出漏洞。所以,偵錯(cuò)技術(shù)只能用來(lái)減少緩沖區(qū)溢出的可能,并不能完全地消除它的存在。除非程序員能保證他的程序萬(wàn)無(wú)一失,否則還是要用到以下部分的內(nèi)容來(lái)保證程序的可靠性能。剩下的攻擊基本上可以用指針保護(hù)的方法來(lái)防衛(wèi),但是在某些特殊的場(chǎng)合需要用手工來(lái)實(shí)現(xiàn)指針

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論