划重點!關於緩沖區溢出攻擊,這份防范策略一定要收好!


一、緩沖區溢出攻擊的基本概念

緩沖區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用軟件中廣泛存在。利用緩沖區溢出攻擊,可以導致程序運行失敗、系統宕機、重新啟動等后果。更為嚴重的是,可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。

緩沖區溢出攻擊有多種英文名稱: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多台網絡服務器癱瘓。

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

通過往程序的緩沖區寫超出其長度的內容,比如定義一個字符串變量,只允許他存儲最多15個字符串(IP地址的最大字符數),但用戶輸入的時候誤操作輸入了15個以上的字符,加上程序本身沒有去校驗用戶輸入的字符數量,而直接存儲到這個變量的內存地址空間,就造成緩沖區的溢出,從而破壞程序的堆棧,造成程序崩潰或使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。

 二、緩沖區溢出漏洞攻擊方式

 緩沖區溢出漏洞可以使任何一個有黑客技術的人取得機器的控制權甚至是最高權限。一般利用緩沖區溢出漏洞攻擊root程序,大都通過執行類似“exec(sh)”的執行代碼來獲得root 的shell。黑客要達到目的通常要完成兩個任務,就是在程序的地址空間里安排適當的代碼和通過適當的初始化寄存器和存儲器,讓程序跳轉到安排好的地址空間執行。

1)在程序的地址空間里安排適當的代碼

在程序的地址空間里安排適當的代碼往往是相對簡單的。如果要攻擊的代碼在所攻擊程序中已經存在了,那么就簡單地對代碼傳遞一些參數,然后使程序跳轉到目標中就可以完成了。攻擊代碼要求執行“exec(‘/bin/sh’)”,而在libc庫中的代碼執行“exec(arg)”,其中的“arg”是個指向字符串的指針參數,只要把傳入的參數指針修改指向“/bin/sh”,然后再跳轉到libc庫中的響應指令序列就可以了。當然,很多時候這個可能性是很小的,那么就得用一種叫“植入法”的方式來完成了。

當向要攻擊的程序里輸入一個字符串時,程序就會把這個字符串放到緩沖區里,這個字符串包含的數據是可以在這個所攻擊的目標的硬件平台上運行的指令序列。緩沖區可以設在:堆棧(自動變量)、堆(動態分配的)和靜態數據區(初始化或者未初始化的數據)等的任何地方。也可以不必為達到這個目的而溢出任何緩沖區,只要找到足夠的空間來放置這些攻擊代碼就夠了。

2)控制程序轉移到攻擊代碼的形式

緩沖區溢出漏洞攻擊都是在尋求改變程序的執行流程,使它跳轉到攻擊代碼,最為基本的就是溢出一個沒有檢查或者其他漏洞的緩沖區,這樣做就會擾亂程序的正常執行次序。通過溢出某緩沖區,可以改寫相近程序的空間而直接跳轉過系統對身份的驗證。原則上來講攻擊時所針對的緩沖區溢出的程序空間可為任意空間。但因不同地方的定位相異,所以也就帶出了多種轉移方式。

(1)Function Pointers(函數指針)

在程序中,“void (* foo) ( )”聲明了個返回值為“void” Function Pointers的變量“foo”。Function Pointers可以用來定位任意地址空間,攻擊時只需要在任意空間里的Function Pointers鄰近處找到一個能夠溢出的緩沖區,然后用溢出來改變Function Pointers。當程序通過Function Pointers調用函數,程序的流程就會實現。

(2)Activation Records(激活記錄)

當一個函數調用發生時,堆棧中會留駐一個Activation Records,它包含了函數結束時返回的地址。執行溢出這些自動變量,使這個返回的地址指向攻擊代碼,再通過改變程序的返回地址。當函數調用結束時,程序就會跳轉到事先所設定的地址,而不是原來的地址。這樣的溢出方式也是較常見的。

(3)植入綜合代碼和流程控制

常見的溢出緩沖區攻擊類是在一個字符串里綜合了代碼植入和Activation Records。攻擊時定位在一個可供溢出的自動變量,然后向程序傳遞一個很大的字符串,在引發緩沖區溢出改變Activation Records的同時植入代碼(權因C在習慣上只為用戶和參數開辟很小的緩沖區)。植入代碼和緩沖區溢出不一定要一次性完成,可以在一個緩沖區內放置代碼(這個時候並不能溢出緩沖區),然后通過溢出另一個緩沖區來轉移程序的指針。這樣的方法一般是用於可供溢出的緩沖區不能放入全部代碼時的。如果想使用已經駐留的代碼不需要再外部植入的時候,通常必須先把代碼做為參數。在libc(熟悉C的朋友應該知道,現在幾乎所有的C程序連接都是利用它來連接的)中的一部分代碼段會執行“exec(something)”,當中的something就是參數,使用緩沖區溢出改變程序的參數,然后利用另一個緩沖區溢出使程序指針指向libc中的特定的代碼段。

程序編寫的錯誤造成網絡的不安全性也應當受到重視,因為它的不安全性已被緩沖區溢出表現得淋漓盡致了。

三、緩沖區溢出攻擊的防范策略

緩沖區溢出攻擊的防范是和整個系統的安全性分不開的。如果整個網絡系統的安全設計很差,則遭受緩沖區溢出攻擊的機會也大大增加。針對緩沖區溢出,可以采取多種防范策略。

(1)系統管理上的防范策略

一要關閉不需要的特權程序。

二要及時給程序漏洞打補丁。

(2)軟件開發過程中的防范策略

發生緩沖區溢出的主要及各要素是:數組沒有邊界檢查而導致的緩沖區溢出;函數返回地址或函數指針被改變,使程序流程的改變成為可能;植入代碼被成功的執行等等。所以針對這些要素,從技術上可以采取一定的措施。

 1)強制寫正確的代碼的方法。

只要在所有拷貝數據的地方進行數據長度和有效性的檢查,確保目標緩沖旦中數據不越界並有效,則就可以避免緩沖區溢出,更不可能使程序跳轉到惡意代碼上。

 2)通過操作系統使得緩沖區不可執行,從而阻止攻擊者殖入攻擊代碼。

通過使被攻擊程序的數據段地址空間不可執行,從商使得攻擊者不可能執行被植入被攻擊程序輸入緩沖區的代碼,這種技術被稱為緩沖區不可執行技術。

3)改進C語言函數庫。

C語言中存在緩沖區溢出攻擊隱患的系統匾數有很多。例如gets(),sprintf(),strcpy(),strcat(),fscanf(),scanf(),vsprintf()等。可以開發出更安全的封裝了若干己知易受堆棧溢出攻擊的岸函數。

4)使堆棧向高地址方向增長。

使用的機器堆棧壓入數據時向高地址方向前進,那么無論緩沖區如何溢出,都不可能覆蓋低地址處的函數返回地址指針,也就避免了緩沖區溢出攻擊。但是這種方法仍然無法防范利用堆和靜態數據段的緩沖區進行溢出的攻擊。

5)在程序指針失效前進行完整性檢查。

原理是在每次在程序指針被引用之前先檢測該指針是否己被惡意改動過,如果發現被改動,程序就拒絕執行。

6)利用編譯器將靜態數據段中的函數地址指針存放地址和其他數據的存放地址分離。


如果你想更好的提升你的編程能力,學好C語言C++編程!彎道超車,快人一步!
C語言C++學習企鵝圈子】,分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!

編程學習書籍:

編程學習視頻:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM