緩沖區溢出

緩沖區溢出

危險的漏洞
緩沖區溢出(buffer overflow)指當計算機向緩沖區内填充數據位數時超過了緩沖區本身的容量,使得溢出的數據複蓋在合法數據上。緩沖區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用軟件中廣泛存在;利用緩沖區溢出攻擊,可以導緻程序運行失敗、系統宕機、重新啟動等後果;可以利用它執行非授權指令,取得系統特權,進而進行各種非法操作。
    中文名:緩沖區溢出 外文名:buffer overflow 所屬學科: 相關:緩沖區溢出攻擊 特點:非常普遍

簡介

緩沖區溢出攻擊有多種英文名稱:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它們指的都是同一種攻擊手段。第一個緩沖區溢出攻擊--Morris蠕蟲,發生在1988年,由羅伯特,莫裡斯(R ob。rtMorris)制造,它曾造成了全世界6000多台網絡服務器癱瘓。緩沖區溢出是指當計算機向緩沖區内填充數據位數時超過了緩沖區本身的容量,溢出的數據覆蓋在合法數據上。

概念

計算機程序一般都會使用到一些内存,這些内存或是程序内部使用,或是存放用戶的輸入數據,這樣的内存一般稱作緩沖區。溢出是指盛放的東西超出容器容量而溢出來了,在計算機程序中,就是數據使用到了被分配内存空間之外的内存空間。而緩沖區溢出,簡單的說就是計算機對接收的輸入數據沒有進行有效的檢測(理想的情況是程序檢查數據長度并不允許輸入超過緩沖區長度的字符),向緩沖區内填充數據時超過了緩沖區本身的容量,而導緻數據溢出到被分配空間之外的内存空間,使得溢出的數據複蓋了其他内存空間的數據。

實驗分析

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緩沖區中植入一段精心設計的代碼,可以使之以系統超級權限運行。

預防措施

緩沖區溢出是代碼中固有的漏洞,除了在開發階段要注意編寫正确的代碼之外,對于用戶而言,一般的防範措施為

1、關閉端口或服務。管理員應該知道自己的系統上安裝了什麼,并且哪些服務正在運行

2、安裝軟件廠商的補丁,漏洞一公布,大的廠商就會及時提供補丁

3、在防火牆上過濾特殊的流量,無法阻止内部人員的溢出攻擊

4、自己檢查關鍵的服務程序,看看是否有可怕的漏洞

5、以所需要的最小權限運行軟件

相關知識

地址空間裡安排适當的代碼的方法

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

植入法

攻擊者向被攻擊的程序輸入一個字符串,程序會把這個字符串放到緩沖區裡。這個字符串包含的資料是可以在這個被攻擊的硬件平台上運行的指令序列。在這裡,攻擊者用被攻擊程序的緩沖區來存放攻擊代碼。緩沖區可以設在任何地方:堆棧(stack,自動變量)、堆(heap,動态分配的内存區)和靜态資料區。

利用已經存在的代碼

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

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

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

分類的基準是攻擊者所尋求的緩沖區溢出的程序空間類型。原則上是可以任意的空間。實際上,許多的緩沖區溢出是用暴力的方法來尋求改變程序指針的。這類程序的不同之處就是程序空間的突破和内存空間的定位不同。主要有以下三種:

活動紀錄(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的解釋器跳轉到攻擊代碼上了。

代碼植入和流程控制技術的綜合分析

最簡單和常見的緩沖區溢出攻擊類型就是在一個字符串裡綜合了代碼植入和活動紀錄技術。攻擊者定位一個可供溢出的自動變量,然後向程序傳遞一個很大的字符串,在引發緩沖區溢出,改變活動紀錄的同時植入了代碼。這個是由Levy指出的攻擊的模闆。因為C在習慣上隻為用戶和參數開辟很小的緩沖區,因此這種漏洞攻擊的實例十分常見。

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

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

相關詞條

相關搜索

其它詞條