史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 資訊系統安全備援防護技術文件
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2005-10-19, 12:48 AM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 緩衝區溢位:十年來攻擊和防衛的弱點

緩衝區溢位:十年來攻擊和防衛的弱點

摘要:

  在過去的十年中,以緩衝區溢位為檔案類型的安全漏洞占是最為一般的一種形式了。

更為嚴重的是,緩衝區溢位漏洞佔了遠端網路攻擊的絕大多數,這種攻擊可以使得一個匿名的Internet用戶有機會獲得一台主機的部分或全部的控制權!如果能有效地消除緩衝區溢位的漏洞,則很大一部分的安全威脅可以得到緩解。




在本文中,我們研究了各種檔案類型的緩衝區溢位漏洞和攻擊手段,同時我們也研究了各種的防禦手段,這些手段用來消除這些漏洞所造成的影響,其中包括我們自己的堆疊保護方法。然後我們要考慮如何在保證現有系統功能和效能不變的情況下,如何使用這些方法來消除這些安全漏洞。

  一、前言

  在過去的十年中,以緩衝區溢位為檔案類型的安全漏洞占是最為一般的一種形式了。



更為嚴重的是,緩衝區溢位漏洞佔了遠端網路攻擊的絕大多數,這種攻擊可以使得一個匿名的Internet用戶有機會獲得一台主機的部分或全部的控制權!由於這類攻擊使任何人都有可能取得主機的控制權,所以它代表了一類極其嚴重的安全威脅。

 緩衝區溢位攻擊之所以成為一種一般安全攻擊手段其原因在於緩衝區溢位漏洞太普通了,並且易於實現。而且,緩衝區溢位成為遠端攻擊的主要手段其原因在於緩衝區溢位漏洞給予了攻擊者他所想要的一切:殖入並且執行攻擊程式碼。被殖入的攻擊程式碼以一定的權限執行有緩衝區溢位漏洞的程序,從而得到被攻擊主機的控制權。

  比如,在1998年Lincoln實驗室用來評估入侵檢測的的5種遠端攻擊中,有3種是關於社會工程學的信任關係,2種是緩衝區溢位。而在1998年CERT的13份建議中,有9份是是與緩衝區溢位有關的,在1999年,至少有半數的建議是和緩衝區溢位有關的。




在Bugtraq的調查中,有2/3的被調查者認為緩衝區溢位漏洞是一個很嚴重的安全問題。

  緩衝區溢位漏洞和攻擊有很多種形式,我們會在第二部分對他們進行描述和分類。相應地防衛手段也隨者攻擊方法的不同而不同,我們會放在第三部分描述,它的內容包括針對每種攻擊檔案類型的有效的防衛手段。




我們還要要介紹堆疊保護方法,這種方法在解決緩衝區溢位的漏洞方面很有效果,並且沒有犧牲系統的相容性和效能。在第四部分,我們要討論各種防衛方法的綜合使用。最後在第五部分是我們的結論。

  二、緩衝區溢位的漏洞和攻擊

  緩衝區溢位攻擊的目的在於擾亂具有某些特權執行的程序的功能,這樣可以使得攻擊者取得程序的控制權,如果該程序具有足夠的權限,那麼整個主機就被控制了。一般而言,攻擊者攻擊root程序,然後執行類似「exec(sh)」的執行程式碼來獲得root的shell,但不一直是這樣的。為了達到這個目的,攻擊者必須達到如下的兩個目標:

  1. 在程序的位址空間裡安排適當的程式碼。

  2. 通過適當地啟始化暫存器和儲存於器,讓程序跳轉到我們安排的位址空間執行。

  我們根據這兩個目標來對緩衝區溢位攻擊進行分類。在2.1部分,我們將描述攻擊程式碼是如何放入被攻擊程序的位址空間的(這個就是「緩衝區」名字的的由來)。




在2.2部分,我們介紹攻擊者如何使一個程序的緩衝區溢位,並且執行轉移到攻擊程式碼(這個就是「溢位」的由來)。在2.3部分,我們介紹綜合在2.1和2.2部分所討論的程式碼安排和控制程序執行流程的技術。

  2.1 在程序的位址空間裡安排適當的程式碼的方法

  有兩種在被攻擊程序位址空間裡安排攻擊程式碼的方法:

  殖入法:

  攻擊者向被攻擊的程序輸入一個字元串,程序會把這個字元串放到緩衝區裡。這個字元串包含的資料是可以在這個被攻擊的硬體平台上執行的指令序列。在這裡攻擊者用被攻擊程序的緩衝區來存放攻擊程式碼。具體的方式有以下兩種差別:

  1. 攻擊者不必為達到此目的而溢位任何緩衝區,可以找到足夠的空間來放置攻擊程式碼

  2. 緩衝區可以設在任何地方:堆疊(自動變數)、堆(動態分配的)和靜態資料區(啟始化或者未啟始化的資料)

  利用已經存在的程式碼:

  有時候,攻擊者想要的程式碼已經在被攻擊的程序中了,攻擊者所要做的只是對程式碼傳送一些參數,然後使程序跳轉到我們的目標。比如,攻擊程式碼要求執行「exe("/bin/sh")」,而在libc庫中的程式碼執行「exec(arg)」,其中arg使一個指向一個字元串的游標參數,那麼攻擊者只要把傳入的參數游標改向指向"/bin/sh",然後調轉到libc庫中的相應的指令序列。

  2.2 控制程序轉移到攻擊程式碼的方法

  所有的這些方法都是在尋求改變程序的執行流程,使之跳轉到攻擊程式碼。最基本的就是溢位一個沒有邊界檢查或者其他弱點的緩衝區,這樣就擾亂了程序的正常的執行順序。通過溢位一個緩衝區,攻擊者可以用近乎暴力的方法改寫相鄰的程序空間而直接跳過了系統的檢查。

  這裡分類的基準是攻擊者所尋求的緩衝區溢位的程序空間檔案類型。



原則上是可以任意的空間。比如,最初的Morris Worm使用了fingerd程序的緩衝區溢位,擾亂fingerd要執行的文件的名字。實際上,許多的緩衝區溢位是用暴力的方法來尋求改變程序游標的。





這類程序的不同的地方就是程序空間的突破和記憶體空間的定位不同。

  啟動紀錄(Activation Records):

  每當一個函數使用發生時,使用者會在堆疊中留下一個啟動紀錄,它包含了函數結束時返回的位址。攻擊者通過溢位這些自動變數,使這個返回位址指向攻擊程式碼。




通過改變程序的返回位址,當函數使用結束時,程序就跳轉到攻擊者設定的位址,而不是原先的位址。這類的緩衝區溢位被稱為「stack smashing attack」,使目前常用的緩衝區溢位攻擊方式。

  函數游標(Function Pointers):

  「void (* foo)()」宣告了一個返回值為void函數游標的變數foo。函數游標可以用來定位任何位址空間,所以攻擊者只需在任何空間內的函數游標附近找到一個能夠溢位的緩衝區,然後溢位這個緩衝區來改變函數游標。





在某一時刻,當程序通過函數游標使用函數時,程序的流程就按攻擊者的意圖實現了!它的一個攻擊範例就是在Linux系統下的superprobe程序。

  長跳轉緩衝區(Longjmp buffers):

  在C語言中包含了一個簡單的檢驗/恢復系統,稱為setjmp/longjmp。意思是在檢驗點設定「setjmp(buffer)」,用「longjmp(buffer)」來恢復檢驗點。然而,如果攻擊者能夠進入緩衝區的空間,那麼「longjmp(buffer)」實際上是跳轉到攻擊者的程式碼。




像函數游標一樣,longjmp緩衝區能夠指向任何地方,所以攻擊者所要做的就是找到一個可供溢位的緩衝區。一個典型的例子就是Perl 5.003,攻擊者首先進入用來恢復緩衝區溢位的的longjmp緩衝區,然後誘導進入恢復模式,這樣就使Perl的解釋器跳轉到攻擊程式碼上了!

  2.3 綜合程式碼殖入和流程控制技術

  現在我們研究綜合程式碼殖入和流程控制的技術。

  最簡單和一般的緩衝區溢位攻擊檔案類型就是在一個字元串裡綜合了程式碼殖入和啟動紀錄。攻擊者定位一個可供溢位的自動變數,然後向程序傳送一個很大的字元串,在引發緩衝區溢位改變啟動紀錄的同時殖入了程式碼。


這個是由Levy指出的攻擊的範本。因為C在習慣上只為用戶和參數開闢很小的緩衝區,因此這種漏洞攻擊的實例不在少數。

  程式碼殖入和緩衝區溢位不一定要在在一次動作內完成。攻擊者可以在一個緩衝區內放置程式碼,這是不能溢位緩衝區。
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
舊 2005-10-19, 12:49 AM   #2 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

然後,攻擊者通過溢位另外一個緩衝區來轉移程序的游標。這種方法一般用來解決可供溢位的緩衝區不夠大(不能放下全部的程式碼)的情況。

  如果攻擊者試圖使用已經常駐的程式碼而不是從外部殖入程式碼,他們通常有必須把程式碼作為參數化。



舉例來說,在libc(幾乎所有的C程序都要它來連接)中的部分程式碼段會執行「exec(something)」,其中somthing就是參數。攻擊者然後使用緩衝區溢位改變程序的參數,然後利用另一個緩衝區溢位使程序游標指向libc中的特定的程式碼段。

三. 緩衝區溢位的保護方法

  目前有四種基本的方法保護緩衝區免受緩衝區溢位的攻擊和影響。在3.1中介紹了強制寫正確的程式碼的方法。在3.2中介紹了通過操作系統使得緩衝區不可執行,從而阻止攻擊者殖入攻擊程式碼。



這種方法有效地阻止了很多緩衝區溢位的攻擊,但是攻擊者並不一定要殖入攻擊程式碼來實現緩衝區溢位的攻擊(參見2.1節),所以這種方法還是存在很弱點的。



在3.3中,我們介紹了利用編譯器的邊界檢查來實現緩衝區的保護。這個方法使得緩衝區溢位不可能出現,從而完全消除了緩衝區溢位的威脅,但是相對而言代價比較大。在3.4中我們介紹一種間接的方法,這個方法在程序游標失效繼續行完整性檢查。




這樣雖然這種方法不能使得所有的緩衝區溢位失效,但它的的確確阻止了絕大多數的緩衝區溢位攻擊,而能夠逃脫這種方法保護的緩衝區溢位也很難實現。然後在3.5,我們要分析這種保護方法的相容性和效能優勢(與陣列邊界檢查)。

  3.1 編寫正確的程式碼

  編寫正確的程式碼是一件非常有意義但耗時的工作,特別象編寫C語言那種具有容易出現錯誤傾向的程序(如:字元串的零結尾),這種風格是由於追求效能而忽視正確性的傳統引起的。



儘管花了很長的時間使得人們知道了如何編寫安全的程序,具有安全漏洞的程序依舊出現。因此人們開發了一些工具和技術來說明 經驗不足的程序員編寫安全正確的程序。

  最簡單的方法就是用grep來搜尋來源碼中容易產生漏洞的庫的使用,比如對strcpy和sprintf的使用,這兩個函數都沒有檢查輸入參數的長度。事實上,各個版本C的標準庫均有這樣的問題存在。

  為了尋找一些一般的諸如緩衝區溢位和操作系統競爭條件等漏洞,程式碼檢查小組檢查了很多的程式碼。然而依然有漏網之魚存在。



儘管採用了strncpy和snprintf這些替代函數來防止緩衝區溢位的發生,但是由於編寫程式碼的問題,仍舊會有這種情況發生。比如lprm程序就是最好的例子,雖然它通過了程式碼的安全檢查,但仍然有緩衝區溢位的問題存在。

  為了對付這些問題,人們開發了一些進階的查錯工具,如fault injection等。這些工具的目的在於通過人為隨機地產生一些緩衝區溢位來尋找程式碼的安全漏洞。還有一些靜態分析工具用於偵測緩衝區溢位的存在。

  雖然這些工具說明 程序員開發更安全的程序,但是由於C語言的特點,這些工具不可能找出所有的緩衝區溢位漏洞。



所以,偵錯技術只能用來減少緩衝區溢位的可能,並不能完全地消除它的存在。除非程序員能保證他的程序萬無一失,否則還是要用到以下3.2到3.4部分的內容來保證程序的可靠效能。

  3.2 非執行的緩衝區

  通過使被攻擊程序的資料段位址空間不可執行,從而使得攻擊者不可能執行被殖入被攻擊程序輸入緩衝區的程式碼,這種技術被稱為非執行的緩衝區技術。事實上,很多老的Unix系統都是這樣設計的,但是近來的Unix和MS Windows系統由於實現更好的效能和功能,往往在在資料段中動態地放入可執行的程式碼。



所以為了保持程序的相容性不可能使得所有程式的資料段不可執行。

  但是我們可以設定堆疊資料段不可執行,這樣就可以最大限度地保證了程序的相容性。Linux和Solaris都發怖了有關這方面的內核修正檔。



因為幾乎沒有任何合法的程序會在堆疊中存放程式碼,這種做法幾乎不產生任何相容性問題,除了在Linux中的兩個特例,這時可執行的程式碼必須被放入堆疊中:

  信號傳送:

  Linux通過向工作堆疊解壓縮程式碼然後引發中斷來執行在堆疊中的程式碼來實現向工作傳送Unix信號。



非執行緩衝區的修正檔在傳送信號的時候是允許緩衝區可執行的。

  GCC的在線重用:

  研究發現gcc在堆疊區裡放置了可執行的程式碼作為在線重用之用。



然而,關閉這個功能並不產生任何問題,只有部分功能似乎不能使用。

  非執行堆疊的保護可以有效地對付把程式碼殖入自動變數的緩衝區溢位攻擊,而對於其他形式的攻擊則沒有效果(參見2.1)。


通過引用一個駐停留的程序的游標,就可以跳過這種保護措施。其他的攻擊可以採用把程式碼殖入堆或者靜態資料段中來跳過保護。

  3.3 陣列邊界檢查

  殖入程式碼引起緩衝區溢位是一個方面,擾亂程序的執行流程是另一個方面。不像非執行緩衝區保護,陣列邊界檢查完全放置了緩衝區溢位的產生和攻擊。



這樣,只要陣列不能被溢位,溢位攻擊也就無從談起。

為了實現陣列邊界檢查,則所有的對陣列的讀寫操作都應當被檢查以確保對陣列的操作在正確的範圍內。最直接的方法是檢查所有的陣列操作,但是通常可以採用一些最佳化的技術來減少檢查的次數。目前有以下的幾種檢查方法:

  3.3.1 Compaq C 編譯器

  Compaq公司為Alpha CPU開發的C編譯器(在Tru64的Unix平台上是cc,在Alpha Linux平台上是ccc)支持有限度的邊界檢查(使用-check_bounds參數)。這些限制是:

  只有顯示的陣列引用才被檢查,比如「a[3]」會被檢查,而「*(a+3)」則不會。

  由於所有的C陣列在傳送的時候是游標傳送的,所以傳送給函數的的陣列不會被檢查。

  帶有危險性的庫函數如strcpy不會在編譯的時候進行邊界檢查,即便是指定了邊界檢查。

  由於在C語言中利用游標進行陣列操作和傳送是如此的頻繁,因此這種局限性是非常嚴重的。通常這種邊界檢查用來程序的查錯,而且不能保證不發生緩衝區溢位的漏洞。

3.3.2 Jones & Kelly: C的陣列邊界檢查

  Richard Jones和Paul Kelly開發了一個gcc的修正檔,用來實現對C程序完全的陣列邊界檢查。由於沒有改變游標的含義,所以被編譯的程序和其他的gcc模組具有很好的相容性。




更進一步的是,他們由此從沒有游標的陳述式中匯出了一個「基」游標,然後通過檢查這個基游標來偵測陳述式的結果是否在容許的範圍之內。

  當然,這樣付出的效能上的代價是巨大的:對於一個頻繁使用游標的程序如向量乘法,將由於游標的頻繁使用而使速度比本來慢30倍。

  這個編譯器目前還很不成熟;一些複雜的程序(如elm)還不能在這個上面編譯,執行通過。然而在它的一個更新版本之下,它至少能編譯執行ssh軟體的加密檔案包。其實現的效能要下降12倍。

  3.3.3 Purify:儲存於器存取檢查

  Purify是C程序偵錯時檢視儲存於器使用的工具而不是專用的安全工具。Purify使用「目標程式碼插入」技術來檢查所有的儲存於器存取。



通過用Purify連接工具連接,可執行程式碼在執行的時候陣列的所有引用來保證其合法性。這樣帶來的效能上的損失要下降3-5倍。

  3.3.4 檔案類型-安全語言

  所有的緩衝區溢位漏洞都源於C語言缺乏檔案類型安全。如果只有檔案類型-安全的操作才可以被允許執行,這樣就不可能出現對變數的強制操作。如果作為新手,可以推薦使用具有檔案類型-安全的語言如Java和ML。

  但是作為Java執行平台的Java虛擬機是C程序,因此通過攻擊JVM的一條途徑是使JVM的緩衝區溢位。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
舊 2005-10-19, 12:52 AM   #3 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

因此在系統中採用緩衝區溢位防衛技術來使用強制檔案類型-安全的語言可以收到意想不到的效果。

  3.4 程序游標完整性檢查

  程序游標完整性檢查和邊界檢查由略微的不同。與防止程序游標被改變不同,程序游標完整性檢查在程序游標被引用之前檢測到它的改變。



因此,即便一個攻擊者成功地改變了程序的游標,由於系統事先檢測到了游標的改變,因此這個游標將不會被使用。

  與陣列邊界檢查相比,這種方法不能解決所有的緩衝區溢位問題;採用其他的緩衝區溢位方法就可以避免這種檢測。


但是這種方法在效能上有很大的優勢,而且在相容性也很好。

  程序完整性檢查大體上有三個研究方向。在3.4.1中會介紹Snarskii為FreeBSD開發了一套設定的能通過監測cpu堆疊來確定緩衝區溢位的libc。



在3.4.2中會介紹我們自己的堆疊保護方法所開發的一個編譯器,它能夠在函數使用的時候自動產生完整性檢測程式碼。



最後在3.4.3,我們介紹正在開發中的游標保護方法,這種方法類似於堆疊保護,它提供對所有程式游標的完整性的保護。

  3.4.1 手寫的堆疊監測

  Snarskii為FreeBSD開發了一套設定的能通過監測cpu堆疊來確定緩衝區溢位的libc。這個套用完全用手動式彙編寫的,而且只保護libc中的當前有效紀錄函數。



這個套用達到了設計要求,對於關於libc庫函數的攻擊具有很好的防衛,但是不能防衛其它方式的攻擊。

  3.4.2 堆疊保護:編譯器產生的有效紀錄完整性檢測

  堆疊保護是一種提供程序游標完整性檢查的編譯器技術,通過檢查函數活動紀錄中的返回位址來實現。



堆疊保護作為gcc的一個小的修正檔,在每個函數中,加入了函數建立和銷毀的程式碼。


加入的函數建立程式碼實際上在堆疊中函數返回位址後面加了一些附加的字元。而在函數返回時,首先檢查這個附加的字元是否被改動過。如果發生過緩衝區溢位的攻擊,那麼這種攻擊很容易在函數返回前被檢測到。

  但是,如果攻擊者預見到這些附加字元的存在,並且能在溢位程序中同樣地製造他們,那麼他就能成功地跳過堆疊保護的檢測。通常,我們有如下的兩種方案對付這種欺騙:

  終止符號:

  利用在C語言中的終止符號如0(null),CR,LF,-1(EOF)等不能在常用的字元串函數中使用,因為這些函數一旦遇到這些終止符號,就結束函數程序了。

  隨機符號:

  利用一個在函數使用時產生的一個32位的隨機數來實現保密,使得攻擊者不可能猜測到附加字元的內容。而且,每次使用,附加字元的內容都在改變,也無法預測。

  通過檢查堆疊的完整性的堆疊保護法是從Synthetix方法演變來的。Synthetix方法通過使用准不變數來確保特定變數的正確性。


這些特定的變數的改變是程序實現能預知的,而且只能在滿足一定的條件才能可以改變。


這種變數我們稱為準變數。Synthetix開發了一些工具用來保護這些變數。

  攻擊者通過緩衝區溢位而產生的改變可以被系統當做非法的動作。在某些極端的情況下,這些准不變數有可能被非法改變,這是就需要堆疊保護來提供更完善的保護了。

  實驗的資料表明,堆疊保護對於各種系統的緩衝區溢位攻擊都有很好的保護作用,並能保持較好的相容性和系統效能。隨後,我們用堆疊保護的方法重新構造了一個完整的Linux系統(Red Hat 5.1)。



然後我們用XFree86-3.3.2-5和lsof的漏洞對此進行了攻擊,結果表明,這個系統有效地抵禦了這些攻擊。這些分析表明,堆疊保護能有效抵禦現在的和將來的關於堆疊的攻擊。

  堆疊保護版本的Red Hat Linux 5.1已經在各種系統上執行了多年,包括個人的筆記型電腦和工作組文件伺服器。


從我們的Web伺服器上可以得到這個版本,而且在我們的郵件列表裡已經有了55個成員。


出了僅有的一次例外,這個系統和本來的系統工作完全一樣,這表明堆疊保護並不對系統的相容性構成很大的影響。

  我們已經用各種效能測試來評測堆疊保護的效能。Mircobenchmarks的結果表明在函數的使用,堆疊保護中增加了系統的

  預先配置。而在網路的測試中(需要用到堆疊保護的地方),則表明這種預先配置不是很大。

  我們的第一個測試對象是SSH,它提供了極強的加密和認證,用來替代Berkeley的r系列指令。SSH使用了軟體加密,因此系統的佔用的帶寬不大,我們用網路間複製一個大的文件來測試帶寬:

  scp bigsource localhost:bigdest

  測試結果表明:堆疊保護幾乎不影響SSH的網路吞吐效能。

  第二個測試使用了Apache Web伺服器。


如果這種伺服器存在關於堆疊的攻擊,那麼攻擊者就可以輕易地取得Web伺服器的控制權,允許攻擊者閱讀隱秘的內容和肆意篡改主頁的內容。同時,Web伺服器也是對效能和帶寬要求較高的一個伺服器設備。

  我們用WebStone對帶有和不帶堆疊保護的Apache Web伺服器進行了測試。

  和SSH一樣,他們的效能幾乎沒有區別。在客戶數目較少的情況下,帶有保護的伺服器效能比不帶保護的略微好些,在客戶端數目多的時候,不帶保護的效能好些。





在最壞的情況下,帶保護的伺服器比不帶保護的要差8%的連接效能,而在平均延時上保持優勢。像以前一樣,我們把這些歸結為噪聲的影響。因此,我們的結論是:堆疊保護對Web伺服器系統效能沒有重大的影響。

 3.4.3 游標保護:編譯器產生程序游標完整性檢查

  在堆疊保護設計的時候,衝擊堆疊構成了緩衝區溢位攻擊的一般的一種形式。有人推測存在一種範本來構成這些攻擊(在1996年的時候)。


從此,很多簡單的漏洞被發現,實施和修正檔了,很多攻擊者開始用在第二部分中描述的更一般的方法實施緩衝區溢位攻擊。

  游標保護是堆疊保護針對這種情況的一個推廣。


通過在所有的程式碼游標之後放置附加字元來檢驗游標在被使用之前的合法性。如果檢驗失敗,會發出報警信號和結束程序的執行,就如同在堆疊保護中的行為一樣。這種方案有兩點需要注意:

  附加字元的定位:

  附加字元的空間是在被保護的變數被分配的時候分配的,同時在被保護字元啟始化程序中被啟始化。這樣就帶來了問題;為了保持相容性,我們不想改變被保護變數的大小,因此我們不能簡單地在變數的結構定義中加入附加字。


還有,對各種檔案類型也有不同附加字元數目。

  檢查附加字元:

  每次程序游標被引用的時候都要檢查附加字元的完整性。



這個也存在問題;因為「從存取器讀」在編譯器中沒有語義;編譯器更關心游標的使用,而各種的最佳化算法傾向於從儲存於器中讀入變數。

  還有隨著不同檔案類型的變數,讀入的方法也各自不同。

  我們已經開發了游標保護的一個原型(還是關於gcc的),通過附加字元來保護靜態分配的函數游標,但不適用於結構和陣列檔案類型。這個計劃還遠沒有完成。


一旦這個項目完成了,那麼用它和堆疊保護構成的可執行程式碼將不會受到緩衝區溢位的攻擊了。

  目前為止,只有很少一部分使用非游標變數的攻擊能逃脫游標保護的檢測。但是,可以通過在編譯器上強制對某一變數加入附加字元來實現檢測,這時需要程序員自己手動式加入相應的保護了。

  3.5 相容性和效能的考慮

  程序游標完整性檢查與邊界檢查相比,並不能防止所有的緩衝區溢位問題。然而在執行的效能和相容性上具有相當的優勢:

  效能:

  邊界檢查必須在每個陣列元素操作時完成一次檢查。相比之下,程序游標檢查只在被引用的時候實現檢查。無論在C還是在C++中,這種花在程序游標引用上的預先配置始終比陣列的游標引用小。

  套用效能:

  邊界檢查最難實現之處在於在C語言中,很能確定陣列的邊界。這是由於在C中,陣列的概念和通用游標的混用造成的。由於一個游標是一個獨立的對象,沒有與特定的邊界條件關聯,只有一個系統的機器字來儲存於它,而標幟邊界訊息的資料卻沒有存放。



因此需要特殊的方法來恢復這些訊息;陣列的引用將不在是一個簡單的游標,而是一個對緩衝區描述的游標組。

  與現有程式碼的相容性:

  一些邊界檢查方法為了與現有的程式碼保持相容而在系統的效能上得到了損失。而另一些則用別的方法達到目的。這樣就打破的傳統的C的轉換規則,轉而產生了一類新的C編譯器,只能編譯C的一個子集,有的還不能使用游標或者需要別的改變。

  四 有效的組合

  在這裡我們研究、比較在第二部分描述的各種漏洞攻擊和在第三部分描述的防衛方法,以此來確定何種組合能完全消除緩衝區溢位問題。


但是我們沒有把邊界檢查計算在內,因為它能有效地防止所有的緩衝區溢位,但是所需的預先配置也是驚人的。

  最普通的緩衝區溢位形式是攻擊活動紀錄然後在堆疊中殖入程式碼。這種檔案類型的攻擊在1996年中有很多紀錄。而非執行堆疊和堆疊保護的方法都可以有效防衛這種攻擊。


非執行堆疊可以防衛所有把程式碼殖入堆疊的攻擊方法,堆疊保護可以防衛所有改變活動紀錄的方法。這兩種方法相互相容,可以同時防衛多種可能的攻擊。

  剩下的攻擊基本上可以用游標保護的方法來防衛,但是在某些特殊的場合需要用手動式來實現游標保護。全自動的游標保護需要對每個變數加入附加字元,這樣使得游標邊界檢查在某些情況下具有優勢。

  最為有趣的是,第一個緩衝區溢位漏洞--Morris蠕蟲使用了現今所有方法都無法有效防衛的方法,但是卻很少有人用到,也許是這種方法過於複雜的緣故吧。

  五. 結論

  在本文中,我們詳細描述和分析了緩衝區溢位的攻擊和防衛方法。


由於這種攻擊是目前一般的攻擊手段,所以進行這個方面的研究工作是有意義和成效的。

研究的結果表明,堆疊保護方法和非執行緩衝區方法對於當前絕大多數的攻擊都能有效地防禦,游標保護的方法可以對剩下的攻擊進行有效的防禦。最後宣告的是對於Morris蠕蟲的攻擊,迄今還沒有有效的防禦手段。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
向 psac 送花的會員:
kidd817036 (2010-07-15)
感謝您發表一篇好文章
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 08:15 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1