駭客中級技術--緩衝區溢位攻擊(轉)

worldblog發表於2007-09-18
駭客中級技術--緩衝區溢位攻擊(轉)[@more@]

  緩衝區溢位是一種非常普遍、非常危險的漏洞,在各種作業系統、應用軟體中廣泛存在。利用緩衝區溢位攻擊,可以導致程式執行失敗、系統當機、重新啟動等後果。更為嚴重的是,可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。緩衝區溢位攻擊有多種英文名稱:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它們指的都是同一種攻擊手段。第一個緩衝區溢位攻擊--Morris蠕蟲,發生在十年前,它曾造成了全世界6000多臺網路伺服器癱瘓。

  本文將分析緩衝區溢位的原理;研究各種型別的緩衝區溢位漏洞和攻擊手段;最後,還將著重研究各種防禦手段,用來消除這些漏洞所造成的影響。

  一、 緩衝區溢位的原理

  透過往程式的緩衝區寫超出其長度的內容,造成緩衝區的溢位,從而破壞程式的堆疊,使程式轉而執行其它指令,以達到攻擊的目的。造成緩衝區溢位的原因是程式中沒有仔細檢查使用者輸入的引數。例如下面程式:

  void function(char *str) {

  char buffer[16];

  strcpy(buffer,str);

  }

  上面的strcpy()將直接吧str中的內容copy到buffer中。這樣只要str的長度大於16,就會造成buffer的溢位,使程式執行出錯。存在象strcpy這樣的問題的標準函式還有strcat(),sprintf(),vsprintf(),gets(),scanf()等。

  當然,隨便往緩衝區中填東西造成它溢位一般只會出現“分段錯誤”(Segmentation fault),而不能達到攻擊的目的。最常見的手段是透過製造緩衝區溢位使程式執行一個使用者shell,再透過shell執行其它命令。如果該程式屬於root且有suid許可權的話,攻擊者就獲得了一個有root許可權的shell,可以對系統進行任意操作了。

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

  在1998年Lincoln實驗室用來評估入侵檢測的的5種遠端攻擊中,有2種是緩衝區溢位。而在1998年CERT的13份建議中,有9份是是與緩衝區溢位有關的,在1999年,至少有半數的建議是和緩衝區溢位有關的。在Bugtraq的調查中,有2/3的被調查者認為緩衝區溢位漏洞是一個很嚴重的安全問題。

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

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

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

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

  2. 透過適當的初始化暫存器和記憶體,讓程式跳轉到入侵者安排的地址空間執行。

  根據這兩個目標來對緩衝區溢位攻擊進行分類。在二.1節,將描述攻擊程式碼是如何放入被攻擊程式的地址空間的。在二.2節,將介紹攻擊者如何使一個程式的緩衝區溢位,並且執行轉移到攻擊程式碼(這個就是“溢位”的由來)。在二.3節,將綜合前兩節所討論的程式碼安排和控制程式執行流程的技術。

  二.1 在程式的地址空間裡安排適當的程式碼的方法

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

  1、植入法:

  攻擊者向被攻擊的程式輸入一個字串,程式會把這個字串放到緩衝區裡。這個字串包含的資料是可以在這個被攻擊的硬體平臺上執行的指令序列。在這裡,攻擊者用被攻擊程式的緩衝區來存放攻擊程式碼。緩衝區可以設在任何地方:堆疊(stack,自動變數)、堆(heap,動態分配的記憶體區)和靜態資料區。

  2、利用已經存在的程式碼:

  有時,攻擊者想要的程式碼已經在被攻擊的程式中了,攻擊者所要做的只是對程式碼傳遞一些引數。比如,攻擊程式碼要求執行“exec (“/bin/sh”)”,而在libc庫中的程式碼執行“exec (arg)”,其中arg使一個指向一個字串的指標引數,那麼攻擊者只要把傳入的引數指標改向指向”/bin/sh”。

  二.2 控制程式轉移到攻擊程式碼的方法

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

  分類的基準是攻擊者所尋求的緩衝區溢位的程式空間型別。原則上是可以任意的空間。實際上,許多的緩衝區溢位是用暴力的方法來尋求改變程式指標的。這類程式的不同之處就是程式空間的突破和記憶體空間的定位不同。主要有以下三種: 1、活動紀錄(Activation Records):

  每當一個函式呼叫發生時,呼叫者會在堆疊中留下一個活動紀錄,它包含了函式結束時返回的地址。攻擊者透過溢位堆疊中的自動變數,使返回地址指向攻擊程式碼。透過改變程式的返回地址,當函式呼叫結束時,程式就跳轉到攻擊者設定的地址,而不是原先的地址。這類的緩衝區溢位被稱為堆疊溢位攻擊(Stack Smashing Attack),是目前最常用的緩衝區溢位攻擊方式。

  2、函式指標(Function Pointers):

  函式指標可以用來定位任何地址空間。例如:“void (* foo)()”宣告瞭一個返回值為void的函式指標變數foo。所以攻擊者只需在任何空間內的函式指標附近找到一個能夠溢位的緩衝區,然後溢位這個緩衝區來改變函式指標。在某一時刻,當程式透過函式指標呼叫函式時,程式的流程就按攻擊者的意圖實現了。它的一個攻擊範例就是在Linux系統下的superprobe程式。

  3、長跳轉緩衝區(Longjmp buffers):

  在C語言中包含了一個簡單的檢驗/恢復系統,稱為setjmp/longjmp。意思是在檢驗點設定“setjmp(buffer)”,用“longjmp(buffer)”來恢復檢驗點。然而,如果攻擊者能夠進入緩衝區的空間,那麼“longjmp(buffer)”實際上是跳轉到攻擊者的程式碼。象函式指標一樣,longjmp緩衝區能夠指向任何地方,所以攻擊者所要做的就是找到一個可供溢位的緩衝區。一個典型的例子就是Perl 5.003的緩衝區溢位漏洞;攻擊者首先進入用來恢復緩衝區溢位的的longjmp緩衝區,然後誘導進入恢復模式,這樣就使Perl的直譯器跳轉到攻擊程式碼上了。

  二.3程式碼植入和流程控制技術的綜合分析

  最簡單和常見的緩衝區溢位攻擊型別就是在一個字串裡綜合了程式碼植入和活動紀錄技術。攻擊者定位一個可供溢位的自動變數,然後向程式傳遞一個很大的字串,在引發緩衝區溢位,改變活動紀錄的同時植入了程式碼。這個是由Levy指出的攻擊的模板。因為C在習慣上只為使用者和引數開闢很小的緩衝區,因此這種漏洞攻擊的例項十分常見。

  程式碼植入和緩衝區溢位不一定要在在一次動作內完成。攻擊者可以在一個緩衝區內放置程式碼,這是不能溢位的緩衝區。然後,攻擊者透過溢位另外一個緩衝區來轉移程式的指標。這種方法一般用來解決可供溢位的緩衝區不夠大(不能放下全部的程式碼)的情況。

  如果攻擊者試圖使用已經常駐的程式碼而不是從外部植入程式碼,他們通常必須把程式碼作為引數呼叫。舉例來說,在libc(幾乎所有的C程式都要它來連線)中的部分程式碼段會執行“exec(something)”,其中somthing就是引數。攻擊者然後使用緩衝區溢位改變程式的引數,然後利用另一個緩衝區溢位使程式指標指向libc中的特定的程式碼段。

  三、 緩衝區溢位攻擊的實驗分析

  2000年1月,Cerberus 安全小組釋出了微軟的IIS 4/5存在的一個緩衝區溢位漏洞。攻擊該漏洞,可以使Web伺服器崩潰,甚至獲取超級許可權執行任意的程式碼。目前,微軟的IIS 4/5 是一種主流的Web伺服器程式;因而,該緩衝區溢位漏洞對於網站的安全構成了極大的威脅;它的描述如下:

  瀏覽器向IIS提出一個HTTP請求,在域名(或IP地址)後,加上一個檔名,該檔名以“.htr”做字尾。於是IIS認為客戶端正在請求一個“.htr”檔案,“.htr”擴充套件檔案被映像成ISAPI(Internet Service API)應用程式,IIS會復位向所有針對“.htr”資源的請求到 ISM.DLL程式 ,ISM.DLL 開啟這個檔案並執行之。

  瀏覽器提交的請求中包含的檔名儲存在區域性變數緩衝區中,若它很長,超過600個字元時,會導致區域性變數緩衝區溢位,覆蓋返回地址空間,使IIS崩潰。更進一步,在如圖1所示的2K緩衝區中植入一段精心設計的程式碼,可以使之以系統超級許可權執行。

  四、緩衝區溢位攻擊的防範方法

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

  目前有四種基本的方法保護緩衝區免受緩衝區溢位的攻擊和影響。在四.1中介紹了透過作業系統使得緩衝區不可執行,從而阻止攻擊者植入攻擊程式碼。在四.2中介紹了強制寫正確的程式碼的方法。在四.3中介紹了利用編譯器的邊界檢查來實現緩衝區的保護。這個方法使得緩衝區溢位不可能出現,從而完全消除了緩衝區溢位的威脅,但是相對而言

  

·上一篇:

·下一篇:
 
     最新更新
·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·


| | | | | | |

Copyright © 2004 - 2007 All Rights Reserved

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-969883/,如需轉載,請註明出處,否則將追究法律責任。

駭客中級技術--緩衝區溢位攻擊(轉)
請登入後發表評論 登入
全部評論

相關文章