一、前言
在過去的十年中,以緩沖區溢出為類型的安全漏洞占是最為常見的一種形式了。更為嚴重的是,緩沖區溢出漏洞占了遠程網絡攻擊的絕大多數,這種攻擊可以使得一個匿名的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庫中的相應的指令序列。 |