1. 程式人生 > >如何防範Linux作業系統下緩衝區溢位攻擊

如何防範Linux作業系統下緩衝區溢位攻擊

雖然Linux病毒屈指可數,但是基於緩衝區溢位(Buffer Overflow)漏洞的攻擊還是讓眾多Linux使用者大吃一驚。所謂“世界上第一個Linux病毒”??reman,嚴格地說並不是真正的病毒,它實質上是一個古老的、在Linux/Unix(也包括Windows等系統)世界中早已存在的“緩衝區溢位”攻擊程式。reman只是一個非常普通的、自動化了的緩衝區溢位程式,但即便如此,也已經在Linux界引起很大的恐慌。

緩衝區溢位漏洞是一個困擾了安全專家30多年的難題。簡單來說,它是由於程式設計機制而導致的、在軟體中出現的記憶體錯誤。這樣的記憶體錯誤使得黑客可以執行一段惡意程式碼來破壞系統正常地執行,甚至獲得整個系統的控制權。

Linux系統特性

利用緩衝區溢位改寫相關記憶體的內容及函式的返回地址,從而改變程式碼的執行流程,僅能在一定許可權範圍內有效。因為程序的執行與當前使用者的登入許可權和身份有關,僅僅能夠製造緩衝區溢位是無法突破系統對當前使用者的許可權設定的。因此儘管可以利用緩衝區溢位使某一程式去執行其它被指定的程式碼,但被執行的程式碼只具有特定的許可權,還是無法完成超越許可權的任務。

但是,Linux(包括Unix)系統本身的一些特性卻可以被利用來衝破這種許可權的侷限性,使得能夠利用緩衝區溢位獲得更高的、甚至是完全的許可權。主要體現在如下兩方面:

1.Linux(包括Unix)系統通過設定某可執行檔案的屬性為SUID或SGID,允許其它使用者以該可執行檔案擁有者的使用者ID或使用者組ID來執行它。如果該可執行檔案的屬性是root,同時檔案屬性被設定為SUID,則該可執行檔案就存在可利用的緩衝區溢位漏洞,可以利用它以root的身份執行特定的、被另外安排的程式碼。既然能夠使得一個具有root許可權的程式碼得以執行,就能夠產生一個具有超級使用者root許可權的Shell,那麼掌握整個系統的控制權的危險就產生了。

2.Linux(包括Unix)中的許多守護程序都是以root許可權執行。如果這些程式存在可利用的緩衝區溢位,即可直接使它以root身份去執行另外安排的程式碼,而無須修改該程式的SUID或SGID屬性。這樣獲得系統的控制權將更加容易。

隨著現代網路技術的發展和網路應用的深入,計算機網路所提供的遠端登入機制、遠端呼叫及執行機制是必須的。這使得一個匿名的Internet使用者有機會利用緩衝區溢位漏洞來獲得某個系統的部分或全部控制權。實際上,以緩衝區溢位漏洞為攻擊手段的攻擊佔了遠端網路攻擊中的絕大多數,這給Linux系統帶來了極其嚴重的安全威脅。

途徑分析

通常情況下攻擊者會先攻擊root程式,然後利用緩衝區溢位時發生的記憶體錯誤來執行類似“exec(sh)”的程式碼,從而獲得root的一個Shell。為了獲得root許可權的Shell,攻擊者需要完成如下的工作:

1.在程式的地址空間內安排適當的特定程式碼。一般使用如下兩種方法在被攻擊的程式地址空間內安排攻擊程式碼。

2.通過適當地初始化暫存器和儲存器,使程式在發生緩衝區溢位時不能回到原來的執行處,而是跳轉到被安排的地址空間執行。

當攻擊者找到一種途徑可以變原程式的執行程式碼和流程時,攻擊的危險就產生了。

防範措施

Linux下的緩衝區溢位攻擊威脅既來自於軟體的編寫機制,也來自於Linux(和Unix)系統本身的特性。實際上,緩衝區溢位攻擊及各種計算機病毒猖獗的根本原因在於現代計算機系統都是採用馮?諾依曼“儲存程式”的工作原理。這一基本原理使得程式和資料都可以在記憶體中被繁殖、拷貝和執行。因此,要想有效地防範緩衝區溢位攻擊就應該從這兩個方面雙管其下。

確保程式碼正確安全

緩衝區溢位攻擊的根源在於編寫程式的機制。因此,防範緩衝區溢位漏洞首先應該確保在Linux系統上執行的程式(包括系統軟體和應用軟體)程式碼的正確性,避免程式中有不檢查變數、緩衝區大小及邊界等情況存在。比如,使用grep工具搜尋原始碼中容易產生漏洞的庫呼叫,檢測變數的大小、陣列的邊界、對指標變數進行保護,以及使用具有邊界、大小檢測功能的C編譯器等。

基於一定的安全策略設定系統

攻擊者攻擊某一個Linux系統,必須事先通過某些途徑對要攻擊的系統做必要的瞭解,如版本資訊等,然後再利用系統的某些設定直接或間接地獲取控制權。因此,防範緩衝區溢位攻擊的第二個方面就是對系統設定實施有效的安全策略。這些策略種類很多,由於篇幅有限只列舉幾個典型措施:

(1)在裝有Telnet服務的情況下,通過手工改寫“/etc/inetd.conf”檔案中的Telnet設定,使得遠端登入的使用者無法看到系統的提示資訊。具體方法是將Telnet設定改寫為:

telnet stream tcp nowait root /usr/sbin/tcpd/in.telnetd -h

末尾加上“-h”引數可以讓守護程序不顯示任何系統資訊,只顯示登入提示。

(2)改寫“rc.local”檔案。預設情況下,當登入Linux系統時系統執行rc.local檔案,顯示該Linux發行版本的名字、版本號、核心版本和伺服器名稱等資訊,這使得大量系統資訊被洩露。將“rc.local”檔案中顯示這些資訊的程式碼註釋掉,可以使系統不顯示這些資訊。

一種方法是在顯示這些資訊的程式碼行前加“#”:

……# echo "">/etc/issue# echo "$R">>/etc/issue# echo "Kernel $ (uname -r)on $a $(uname -m)">>/etc/issue## echo >>/etc/issue……

另一種方法是將儲存有系統資訊的檔案/etc/issue.net和issue刪除。這兩個檔案分別用於在遠端登入和本地登入時向用戶提供相關資訊。刪除這兩個檔案的同時,仍需要完成方法一中的註釋工作,否則,系統在啟動時將會自動重新生成這兩個檔案。

(3)禁止提供finger服務。在Linux系統中,使用finger命令可以顯示本地或遠端系統中目前已登入使用者的詳細資訊。禁止提供finger服務的有效方法是,通過修改該檔案屬性、許可權(改為600)使得只有root使用者才可以執行該命令。

(4)處理“inetd.conf”檔案。Linux系統通過inetd(超級伺服器)程式根據網路請求裝入網路程式。該程式通過“/etc/inetd.conf”檔案獲得inetd在監聽哪些網路埠,為每個埠啟動哪些特定服務等資訊。因此,該檔案同樣會洩露大量的敏感資訊。解決問題的方法是,通過將其許可權改為600只允許root使用者訪問,並通過改寫“/etc/inetd.conf”檔案將不需要的服務程式禁止掉,最後修改該檔案的屬性使其不能被修改。

總結

緩衝區溢位攻擊之所以能成為一種常見的攻擊手段,其原因在於緩衝區溢位漏洞太普遍,且易於實現攻擊,因此緩衝區溢位問題一直是個難題。

所幸的是,OpenBSD開發組為解決這一安全難題採用了三種新的有效策略。相信不久的將來,Linux使用者可以不再為緩衝區溢位攻擊而寢食難安了。

RAR檔案在Linux下用起來

要在Linux下處理.rar檔案,需要安裝RAR for Linux。該軟體可以從網上下載,但要記住,它不是免費的。大家可從http://www.onlinedown.net/sort/125_1.htm下載RAR for Linux 3.2.0,然後用下面的命令安裝:

# tar -xzpvf rarlinux-3.2.0.tar.gz

# cd rar

# make

安裝後就有了rar和unrar這兩個程式,rar是壓縮程式,unrar是解壓程式。它們的引數選項很多,這裡只做簡單介紹,依舊舉例說明一下其用法:

# rar a all *.mp3

這條命令是將所有.mp3的檔案壓縮成一個rar包,名為all.rar,該程式會將.rar 副檔名將自動附加到包名後。

# unrar e all.rar

這條命令是將all.rar中的所有檔案解壓出來。