軟件工程專業(yè)緩沖區(qū)溢出的保護實踐_第1頁
軟件工程專業(yè)緩沖區(qū)溢出的保護實踐_第2頁
軟件工程專業(yè)緩沖區(qū)溢出的保護實踐_第3頁
軟件工程專業(yè)緩沖區(qū)溢出的保護實踐_第4頁
軟件工程專業(yè)緩沖區(qū)溢出的保護實踐_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、15/15*大學*學院信息安全產(chǎn)品開發(fā)實踐課程設計報告題 目 緩沖區(qū)溢出的愛護 學生姓名 學 號_ _ 年 級 指導老師 指導老師評閱意見: 指導老師評分: 提交時刻: 2007年12月 緩沖區(qū)溢出的愛護(軟件工程專業(yè))學生 學號 指導教師 摘要:1999 年 Bugtraq(一個討論安全缺陷的郵件列表)進行的一次非正式調(diào)查發(fā)覺,三分之二的參與者認為第一號的缺陷確實是緩沖區(qū)溢出。從 1997 年到 2007 年 3 月,CERT/CC 發(fā)出的半數(shù)安全警報都基于緩沖區(qū)缺陷。 面對如此大的威脅,我們需要明白什么是緩沖區(qū)溢出,如何防止它們,能夠采納哪些最新的自動化工具來防止它們以及什么緣故這些工具還

2、不足夠,還有如何在編寫程序的程序中防止它們。關鍵字:緩沖區(qū)溢出;溢出愛護;溢出防備 Detection Of Buffer Overflow Abstract: From an informal investigation on Bugtraq (a mail list which discuss a limitation on security) in 1999, we can find that two-parts participants thought that the No.1 limitation is buffer overflow. From 1997 to May, 2007

3、, almost half the secure warnings sent by CERT/CC were based on the limitation of buffer. Facing such a huge menace, we need to learn what is the buffer overflow, how to defend them, which kinds of the latest automatization tools we can used for avoid them , why these tools still not enough, and how

4、 to prevent them in programming.Keywords: Buffer Overflow,Overflow Detection, Overflow Defense 正文1 緒論1.1 立題背景緩沖區(qū)溢出是當前一些軟件存在的最常見的安全隱患之一,通過提供一個惡意的輸入黑客能夠改變進程的執(zhí)行流程,緩沖區(qū)溢出能夠威脅到整個進程,機器,甚至相關的系統(tǒng)領域。假如運行的進程是在權限比較高的用戶下面,比如administrator或者本地的系統(tǒng)帳戶(Local System Account),那么黑客破壞所導致的損失將會專門嚴峻而且將會面臨更廣泛的潛在危脅。最近時期爆發(fā)的一些眾所周

5、知的病毒像,紅色代碼病毒和震蕩波蠕蟲病毒,差不多上C/C+代碼里存在著緩沖區(qū)溢出的結(jié)果。1.2 研究內(nèi)容在幾乎所有計算機語言中,不管是新的語言依舊舊的語言,使緩沖區(qū)溢出的任何嘗試通常都會被該語言本身自動檢測并阻止(比如通過引發(fā)一個異?;蛞勒招枰o緩沖區(qū)添加更多空間)。然而有兩種語言不是如此:C 和 C+ 語言。C 和 C+ 語言通常只是讓額外的數(shù)據(jù)亂寫到其余內(nèi)存的任何位置,而這種情況可能被利用從而導致恐懼的結(jié)果。更糟糕的是,用 C 和 C+ 編寫正確的代碼來始終如一地處理緩沖區(qū)溢出則更為困難;專門容易就會意外地導致緩沖區(qū)溢出。除了 C 和 C+ 使用得 特不廣泛外,上述這些可能差不多上不相關的

6、事實;例如,Red Hat Linux 7.1 中 86% 的代碼行差不多上用 C 或 C + 編寫的。因此,大量的代碼對那個問題差不多上脆弱的,因為實現(xiàn)語言無法愛護代碼幸免那個問題。 在 C 和 C+ 語言本身中,那個問題是不容易解決的。該問題基于 C 語言的全然設計決定(特不是 C 語言中指針和數(shù)組的處理方式)。由于 C+ 是最兼容的 C 語言超集,它也具有相同的問題。存在一些能防止那個問題的 C/C+ 兼容版本,然而它們存在極其嚴峻的性能問題。而且一旦改變 C 語言來防止那個問題,它就不再是 C 語言了。許多語言(比如 Java 和 C#)在語法上類似 C,但它們實際上是不同的語言,將現(xiàn)

7、有 C 或 C+ 程序改為使用那些語言是一項艱巨的任務。有些語言存在同意緩沖區(qū)溢動身生的“轉(zhuǎn)義”子句。Ada 一般會檢測和防止緩沖區(qū)溢出(即針對如此的嘗試引發(fā)一個異常),然而不同的程序可能會禁用那個特性。C# 一般會檢測和防止緩沖區(qū)溢出,然而它同意程序員將某些例程定義為“不安全的”,而如此的代碼 可能 會導致緩沖區(qū)溢出。因此假如您使用那些轉(zhuǎn)義機制,就需要使用 C/C+ 程序所必須使用的相同種類的愛護機制。許多語言差不多上用 C 語言來實現(xiàn)的(至少部分是用 C 語言來實現(xiàn)的 ),同時用任何語言編寫的所有程序本質(zhì)上都依靠用 C 或 C+ 編寫的庫。因此,所有程序都會繼承那些問題,因此了解這些問題是

8、專門重要的。 2緩沖區(qū)溢出的概述 2.1 緩沖區(qū)溢出的起源內(nèi)存溢出差不多是軟件開發(fā)歷史上存在了近40年的“老大難”問題2.2緩沖區(qū)溢出如何工作計算機還有由程序共享, 隨機訪問內(nèi)存 (RAM)。 為了簡化, 內(nèi)存治理 Windows XP SP 2 有功能操縱當前正在使用哪段的 RAM。 假如啟動程序, 釋放內(nèi)存分配給程序。 該內(nèi)存被分為三段: 代碼段此處存儲程序特定執(zhí)行命令。 數(shù)據(jù)段此處程序特定數(shù)據(jù)存儲。 堆棧是數(shù)據(jù)段 (一部分)此處存儲所有與程序函數(shù)。 這包括參數(shù)、 緩沖區(qū)存儲本地變量以及, 最重要、 返回地址。 返回地址指定執(zhí)行函數(shù)后, 程序?qū)⒔又鴱?。作為是由用戶輸入該信息也注冊作為變?

9、 一切, 發(fā)送到堆棧用戶類型。 不通常, 此行為不提出問題。 然而, 假如因編程錯誤, 超過緩沖區(qū)限制堆棧成為容易操縱。 整個段被指定為本地變量例如, 假如攻擊者選擇適當項關于攻擊, 可能會覆蓋用指令。 此外, 后續(xù)返回地址可更改為指向惡意代碼。 因此, 程序不再正常, 但盲目執(zhí)行攻擊者的命令。內(nèi)存的底部 內(nèi)存的頂部 buffer1 sfp ret a b c 增長 . 堆棧的頂部 堆棧的底部 許多計算機處理器,包括所有 x86 處理器,都支持從高位地址向低位地址“倒”增長堆棧。因此,每當一個函數(shù)調(diào)用另一個函數(shù),更多的數(shù)據(jù)將被添加到左邊(低位地址),直至系統(tǒng)的堆??臻g耗盡。在那個例子中,當 m

10、ain() 調(diào)用 function1() 時,它將 c 的值壓入堆棧,然后壓入 b 的值,最后壓入 a 的值。之后它壓入 return (ret) 值,那個值在 function1() 完成時告訴 function1() 返回到 main() 中的何處。它還把所謂的“已保存的幀指針(saved frame pointer,sfp)”記錄到堆棧上;這并不是必須保存的內(nèi)容,此處我們不需要理解它。在任何情況下, function1() 在啟動以后,它會為 buffer1() 預留空間,這在圖 1 中顯示為具有一個低地址位置。 現(xiàn)在假設攻擊者發(fā)送了超過 buffer1() 所能處理的數(shù)據(jù)。接下來會發(fā)生

11、什么情況呢?因此,C 和 C+ 程序員可不能自動檢查那個問題,因此除非程序員明確地阻止它,否則下一個值將進入內(nèi)存中的“下一個”位置。那意味著攻擊者能夠改寫 sfp (即已保存的幀指針),然后改寫 ret (返回地址)。之后,當 function1() 完成時,它將“返回” 只是不是返回到 main() ,而是返回到攻擊者想要運行的任何代碼。 通常攻擊者會使用它想要運行的惡意代碼來使緩沖區(qū)溢出,然后攻擊者會更改返回值以指向它們已發(fā)送的惡意代碼。這意味著攻擊者本質(zhì)上能夠在一個操作中完成整個攻擊!Aleph On 的文章(請參閱 參考資料)詳細介紹了如此的攻擊代碼是如何創(chuàng)建的。例如,將一個 ASCI

12、I 0 字符壓入緩沖區(qū)通常是專門困難的,而該文介紹了攻擊者一般如何能夠解決那個問題。 除了 smashing-stack 和更改返回地址外,還存在利用緩沖區(qū)溢出缺陷的其他途徑。與改寫返回地址不同,攻擊者能夠 smashing-stack(使堆棧上的緩沖區(qū)溢出),然后改寫局部變量以利用緩沖區(qū)溢出缺陷。緩沖區(qū)全然就不必在堆棧上 它能夠是堆中動態(tài)分配的內(nèi)存(也稱為“malloc”或“new”區(qū)域),或者在某些靜態(tài)分配的內(nèi)存中(比如“global”或“static”內(nèi)存)。差不多上,假如攻擊者能夠溢出緩沖區(qū)的邊界,苦惱或許就會找上你了。 然而,最危險的緩沖區(qū)溢出攻擊確實是 stack-smashing

13、 攻擊,因為假如程序?qū)粽邔iT脆弱,攻擊者獲得整個機器的操縱權就特不容易 2.3緩沖區(qū)溢出分類 2.3.1在程序的地址空間里安排適當?shù)拇a 2.3.1.1殖入法 攻擊者用被攻擊程序的緩沖區(qū)來存放攻擊代碼。 攻擊者向被攻擊的程序輸入一個字符串,程序會把那個字符串放到緩沖區(qū)里。那個字符串包含的數(shù)據(jù)是能夠在那個被攻擊的硬件平臺上運行的指令序列。 2.3.1.2利用差不多存在的代碼 有時候,攻擊者想要的代碼差不多在被攻擊的程序中了,攻擊者所要做的只是對代碼傳遞一些參數(shù),然后使程序跳轉(zhuǎn)到指定目標。比如,在C語言中,攻擊代碼要求執(zhí)行“exec(/bin/sh)”,而在libc庫中的代碼執(zhí)行“exec(a

14、rg)”,其中arg是指向一個字符串的指針參數(shù),那么攻擊者只要把傳入的參數(shù)指針指向/bin/sh,就能夠調(diào)轉(zhuǎn)到libc庫中的相應的指令序列。 2.3.2操縱程序轉(zhuǎn)移到攻擊代碼這種方法旨在改變程序的執(zhí)行流程,使之跳轉(zhuǎn)到攻擊代碼。最差不多方法的確實是溢出一個沒有邊界檢查或者其他弱點的緩沖區(qū),如此就擾亂了程序的正常的執(zhí)行順序。通過溢出一個緩沖區(qū),攻擊者能夠用近乎暴力的方法改寫相鄰的程序空間而直接躍過了系統(tǒng)的檢查。 2.3.2.1激活紀錄(Activation Records) 每當一個函數(shù)調(diào)用發(fā)生時,調(diào)用者會在堆棧中留下一個激活紀錄,它包含了函數(shù)結(jié)束時返回的地址。攻擊者通過溢出這些自動變量,使那個返

15、回地址指向攻擊代碼。通過改變程序的返回地址,當函數(shù)調(diào)用結(jié)束時,程序就跳轉(zhuǎn)到攻擊者設定的地址,而不是原先的地址。這類的緩沖區(qū)溢出被稱為“stack smashing attack”,是目前常用的緩沖區(qū)溢出攻擊方式。 2.3.2C語言中,“void (* foo)()”聲明了一個返回值為void函數(shù)指針的變量foo。函數(shù)指針能夠用來定位任何地址空間,因此攻擊者只需在任何空間內(nèi)的函數(shù)指針附近找到一個能夠溢出的緩沖區(qū),然后溢出那個緩沖區(qū)來改變函數(shù)指針。在某一時刻,當程序通過函數(shù)指針調(diào)用函數(shù)時,程序的流程就按攻擊者的意圖實現(xiàn)了!它的一個攻擊范例確實是在Linux系統(tǒng)下的super probe程序。 2.

16、3.2在C語言中包含了一個簡單的檢驗/恢復系統(tǒng),稱為setjmp/longjmp。意思是在檢驗點設定“setjmp(buffer)”,用“l(fā)ongjmp(buffer)”來恢復檢驗點。然而,假如攻擊者能夠進入緩沖區(qū)的空間,那么“l(fā)ongjmp(buffer)”實際上是跳轉(zhuǎn)到攻擊者的代碼。象函數(shù)指針一樣,longjmp緩沖區(qū)能夠指向任何地點,因此攻擊者所要做的確實是找到一個可供溢出的緩沖區(qū)。一個典型的例子確實是Perl 5.003,攻擊者首先進入用來恢復緩沖區(qū)溢出的的longjmp緩沖區(qū),然后誘導進入恢復模式,如此就使Perl的解釋器跳轉(zhuǎn)到攻擊代碼上了! 3. 緩沖區(qū)溢出的愛護因此,要讓程序員

17、不犯常見錯誤是專門難的,而讓程序(以及程序員)改為使用另一種語言通常更為困難。那么為何不讓底層系統(tǒng)自動愛護程序幸免這些問題呢?最起碼,幸免 stack-smashing 攻擊是一件好事,因為 stack-smashing 攻擊是特不容易做到的。 一般來講,更改底層系統(tǒng)以幸免常見的安全問題是一個極好的方法,我們在本文后面也會遇到那個主題。事實證明存在許多可用的防備措施,而一些最受歡迎的措施可分組為以下類不: 3.1基于探測方法(canary)的防備。這包括 StackGuard(由 Immunix 所使用)、ProPolice(由 OpenBSD 所使用)和 Microsoft 的 /GS 選項

18、。 非執(zhí)行的堆棧防備。這包括 Solar Designer 的 non-exec 補?。ㄓ?OpenWall 所使用)和 exec shield(由 Red Hat/Fedora 所使用)。 其他方法。這包括 libsafe(由 Mandrake 所使用)和堆棧分割方法。 遺憾的是,迄今所見的所有方法都具有弱點,因此它們不是萬能藥,然而它們會提供一些關心。 3.2基于探測方法的防備 :研究人員 Crispen Cowan 創(chuàng)建了一個稱為 StackGuard 的有味方法。Stackguard 修改 C 編譯器(gcc),以便將一個“探測”值插入到返回地址的前面?!疤綔y儀”就像煤礦中的探測儀:它

19、在某個地點出故障時發(fā)出警告。在任何函數(shù)返回之前,它執(zhí)行檢查以確保探測值沒有改變。假如攻擊者改寫返回地址(作為 stack-smashing 攻擊的一部分),探測儀的值或許就會改變,系統(tǒng)內(nèi)就會相應地中止。這是一種有用的方法,只是要注意這種方法無法防止緩沖區(qū)溢出改寫其他值(攻擊者仍然能夠利用這些值來攻擊系統(tǒng))。人們也曾擴展這種方法來愛護其他值(比如堆上的值)。Stackguard(以及其他防備措施)由 Immunix 所使用。 IBM 的 stack-smashing 愛護程序(ssp,起初名為 ProPolice)是 StackGuard 的方法的一種變化形式。像 StackGuard 一樣,s

20、sp 使用一個修改過的編譯器在函數(shù)調(diào)用中插入一個探測儀以檢測堆棧溢出。然而,它給這種差不多的思路添加了一些有味的變化。 它對存儲局部變量的位置進行重新排序,并復制函數(shù)參數(shù)中的指針,以便它們也在任何數(shù)組之前。如此增強了ssp 的愛護能力;它意味著緩沖區(qū)溢出可不能修改指針值(否則能夠操縱指針的攻擊者就能使用指針來操縱程序保存數(shù)據(jù)的位置)。默認情況下,它可不能檢測所有函數(shù),而只是檢測確實需要愛護的函數(shù)(要緊是使用字符數(shù)組的函數(shù))。從理論上講,如此會略微削弱愛護能力,然而這種默認行為改進了性能,同時仍然能夠防止大多數(shù)問題??紤]到有用的因素,它們以獨立于體系結(jié)構(gòu)的方式使用 gcc 來實現(xiàn)它們的方法,從而

21、使其更易于運用。從 2003 年 5 月的公布版本開始,廣受贊譽的 OpenBSD(它重點關注安全性)在他們的整個發(fā)行套件中使用了 ssp(也稱為 ProPolice)。3.3非執(zhí)行的堆棧防備:另一種方法首先使得在堆棧上執(zhí)行代碼變得不可能。 遺憾的是,x86 處理器(最常見的處理器)的內(nèi)存愛護機制無法容易地支持這點;通常,假如一個內(nèi)存頁是可讀的,它確實是可執(zhí)行的。一個名叫 Solar Designer 的開發(fā)人員想出了一種內(nèi)核和處理器機制的聰慧組合,為 Linux 內(nèi)核創(chuàng)建了一個“非執(zhí)行的堆棧補丁”;有了那個補丁,堆棧上的程序就不再能夠像通常的那樣在 x86 上運行。 事實證明在有些情況下,可

22、執(zhí)行程序 需要在堆棧上;這包括信號處理和跳板代碼(trampoline)處理。trampoline 是有時由編譯器(比如 GNAT Ada 編譯器)生成的奇異結(jié)構(gòu),用以支持像嵌套子例程之類的結(jié)構(gòu)。Solar Designer 還解決了如何在防止攻擊的同時使這些專門情況不受阻礙的問題。 Linux 中實現(xiàn)那個目的的最初補丁在 1998 年被 Linus Torvalds 拒絕,這是因為一個有味的緣故。即使不能將代碼放到堆棧上,攻擊者也能夠利用緩沖區(qū)溢出來使程序“返回”某個現(xiàn)有的子例程(比如 C 庫中的某個子例程),從而進行攻擊。簡而言之,僅只是擁有非可執(zhí)行的堆棧是不足夠的。一段時刻之后,人們又想

23、出了一種防止該問題的新思路:將所有可執(zhí)行代碼轉(zhuǎn)移到一個稱為“ASCII 愛護(ASCII armor)”區(qū)域的內(nèi)存區(qū)。要理解這是如何工作的,就必須明白攻擊者通常不能使用一般的緩沖區(qū)溢出攻擊來插入 ASCII NUL 字符(0)那個事實。 這意味著攻擊者會發(fā)覺,要使一個程序返回包含 0 的地址是專門困難的。由于那個事實,將所有可執(zhí)行代碼轉(zhuǎn)移到包含 0 的地址就會使得攻擊該程序困難多了。具有那個屬性的最大連續(xù)內(nèi)存范圍是從 0 到 0 x01010100 的一組內(nèi)存地址,因此它們就被命名為 ASCII 愛護區(qū)域(還有具有此屬性的其他地址,但它們是分散的)。與非可執(zhí)行的堆棧相結(jié)合,這種方法就相當有價值

24、了:非可執(zhí)行的堆棧阻止攻擊者發(fā)送可執(zhí)行代碼,而 ASCII 愛護內(nèi)存使得攻擊者難于通過利用現(xiàn)有代碼來繞過非可執(zhí)行堆棧。如此將愛護程序代碼幸免堆棧、緩沖區(qū)和函數(shù)指針溢出,而且全都不需重新編譯。然而,ASCII 愛護內(nèi)存并不適用于所有程序;大程序也許無法裝入 ASCII 愛護內(nèi)存區(qū)域(因此這種愛護是不完美的),而且有時攻擊者 能夠?qū)?0 插入目的地址。 此外,有些實現(xiàn)不支持跳板代碼,因此可能必須對需要這種愛護的程序禁用該特性。Red Hat 的 Ingo Molnar 在他的“exec-shield”補丁中實現(xiàn)了這種思想,該補丁由 Fedora 核心(可從 Red Hat 獲得它的免費版本)所使用。最新版本的 OpenWall GNU/Linux (OWL)使用了 Solar Designer 提供的這種方法的實現(xiàn)(請參閱 參考資料 以獲得指向這些版本的鏈接)。 3.4其他方法還有其他許多方法。一種方法確實是使標準庫對攻擊更具抵抗力。Lucent Technologies 開發(fā)了 Libsafe,這是多個標準 C 庫函數(shù)的包裝,也確實是像 strcpy() 如此已知

溫馨提示

  • 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

提交評論