緩沖區溢出攻擊是目前黑客最常用的攻擊手段之一,為了應對不斷湧現的緩沖區溢出攻擊,我們研究了在Linux系統下防范緩沖區溢出的方法,通過研究,總結了在Linux平台下防范緩沖區溢出攻擊的安全策略,這些安全策略可以應用於一般企業內部服務器,包括web服務器、mail服務器、samba服務器、FTP服務器以及proxy服務器等。在實際使用中,我們發現通過這些安全策略的配置能夠對緩沖區溢出攻擊起到很好的防范措施。
在對計算機系統安全的研究中,有一種系統安全漏洞引起了我們的關注。一方面是由於這種安全漏洞的廣泛性--幾乎使所有的操作系統平台都受到影響。另一方面,我們為黑客基於此類安全漏洞所編寫的攻擊程序的隱蔽性和強大威力所吸引。這就是緩沖區溢出技術。它可以使看似安全的,正在運行常規服務(如 DNS、ftpd等)的主機在幾秒鐘內失去控制權。緩沖區溢出攻擊是目前黑客最常用的攻擊手段。在當前CERT和CIAC等發布的Internet安全事件報告中, 緩沖區溢出已成為常見的用語。緩沖區溢出攻擊的目的在於擾亂具有某些特權運行的程序的功能。這樣可以讓攻擊者取得程序的控制權,如果該程序具有足夠的權限,那麼整個主機就被控制了。
為了應對不斷湧現的緩沖區溢出攻擊,我們研究了在Linux系統下防范緩沖區溢出的方法,之所以選擇Linux平台,主要有兩方面的原因:(1)Linux是一個開放源碼的平台,有利於我們在研究的過程中深入技術細節,由於Linux及其上面的大量應用都是基於開放源碼,有很多黑客在其上進行了大量的工作,可以說Linux上的網絡攻擊水平代表了整個網絡攻擊的最高水平。(2)Linux是一個類Unix系統,同時也是在Internet中大量使用的操作系統平台,選擇Linux作為研究緩沖區溢出技術的平台是非常具有代表性的,在Linux平台上取得的經驗可以非常容易地移植到其他Unix或者類Unix平台上。
通過研究,我們總結了在Linux平台下防范緩沖區溢出的安全策略,這些安全策略可以應用於一般企業內部服務器,包括web服務器、mail服務器、samba服務器、ftp服務器以及proxy服務器等。我們所總結的這些安全策略如下所示:
1. 不顯示系統提示信息
如果不想讓遠程登錄的用戶看到系統的提示信息,可以改變"/etc/inetd.conf"文件中的telnet設置:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
在末尾加上"-h"參數可以讓daemon不顯示任何系統信息,只顯示登錄提示。當然,只有在服務器上裝了telnet服務器才有這樣做的必要。
2. 處理"rc.local"文件
在默認情況下,當登錄裝有Linux系統的計算機時,系統會告訴你Linux發行版的名字、版本號、內核版本和服務器名稱。這洩露了太多的系統信息。出於安全的考慮,最好只顯示一個"Login:"的提示信息。處理方法如下:
(1)編輯"/etc/rc.d/rc.local"文件,在下面這些行的前面加上"#":
……
# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" > /etc/issue
#echo "$R" >> /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue
……
(2)刪除"/etc"目錄下的"issue.net"和"issue"文件:
[root@snow]# rm -f /etc/issue
[root@snow]# rm -f /etc/issue.net
"/etc/issue.net"文件是用戶從網絡登錄計算機時(例如:telnet、SSH)看到的登錄提示。同樣在"/etc"目錄下還有一個"issue"文件,是用戶從本地登錄時看到的提示。這兩個文件都是文本文件,可以根據需要改變。但是,如果想刪掉這兩個文件,必須向上面介紹的那樣把"/etc/rc.d/rc.local"腳本中的那些行注釋掉,否則每次重新啟動的時候,系統又會重新創建這兩個文件。
3. 禁止提供finger 服務
在Linux系統下,使用finger命令可以顯示本地或遠程系統中目前已登錄用戶的詳細信息,黑客可以利用這些信息,增大侵入系統的機會。為了系統的安全,最好禁止提供finger服務,即從/usr/bin下刪除finger 命令。如果要保留 finger服務,應將finger文件換名,或修改其權限,使得只允許root用戶執行finger命令。
4. 處理"inetd.conf"文件
inetd也叫作"超級服務器",其作用是根據網絡請求裝入網絡程序。"/etc/inetd.conf"文件告訴inetd監聽哪些網絡端口,為每個端口啟動哪個服務。把Linux系統放在任何網絡環境中,第一件要做的事就是了解一下服務器到底要提供哪些服務。不需要的那些服務應該被禁止掉,最好卸載掉,這樣黑客就少了一些攻擊系統的機會。查看"/etc/inetd.conf"文件,了解一下inetd提供哪些服務。用加上注釋的方法(在一行的開頭加上#號)禁止任何不需要的服務,再給inetd進程發一個SIGHUP信號。具體操作步驟如下:
(1)把文件"/etc/inetd.conf"的許可權限改成600,只允許root來讀寫該文件。 [root@snow]# chmod 600 /etc/inetd.conf
(2)確定"/etc/inetd.conf"文件所有者為root。
[root@snow]# stat /etc/inetd.conf
這個命令顯示出來的信息應該是:
File: "/etc/inetd.conf"
Size: 2869 Filetype: Regular File
Mode: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 8,6 Inode: 18219 Links: 1
Access: Fri Apr 12 14:28:11 2002(00000.00:10:44)
Modify: Wed Apr 10 11:20:22 2002(00002.06:12:16)
Change: Wed Apr 10 11:20:22 2002(00002.06:12:16)
(3)編輯 /etc/inetd.conf文件(vi /etc/inetd.conf),禁止所有不需要的服務,如:ftp、telnet、 shell、login、exec、talk、ntalk、imap、pop-2、pop-3、finger、auth等。把不需要的服務關閉可以使系統的危險性降低很多。
(4)改變了"inetd.conf"文件之後,要給inetd進程發送一個SIGHUP信號(killall -HUP inetd)。
[root@snow /root]# killall -HUP inetd
(5)為了保證"inetd.conf"文件的安全,可以用chattr命令把它設成不可改變的。如下:
[root@snow]# chattr +i /etc/inetd.conf
這樣可以防止對"inetd.conf"文件的任何修改。一個有"i"屬性的文件是不能被改動的(不能刪除或重命名,不能創建這個文件的鏈接,不能向這個文件裡寫數據)。唯一可以取消這個屬性的人只有root。如果要修改"inetd.conf"文件,首先要取消不可修改的屬性,如下:
[root@snow]# chattr -i /etc/inetd.conf
再改變了"inetd.conf"文件後,需要再把它的屬性改為不可改變的。
5. 啟動系統的"rc"腳本
/etc/rc.d目錄下"rc"開頭的文件是用來啟動系統的初始化文件的。rc系列文件與Ms- Dos系統下的autoexec.bat很類似。rc的意思是"runtime commands"。它們決定了init進程要啟動哪些服務。redhat系統下,這些腳本在/etc/rc.d/rc3.d(如果系統以x為默認啟動的話,就是/etc/rc.d/rc5.d)。要在啟動時禁止某個服務,只需要把大寫的S替換為小寫的s,同時,redhat也提供一個工具來幫助你關閉服務,輸入/usr/sbin/setup,然後選擇"system services",就可以定制系統啟動時運行哪些服務。另外一個選擇是chkconfig命令,很多linux版本的系統都自帶這個工具。腳本名字中的數字是啟動的順序,以大寫的K開頭的是用來殺死進程的。 如將S50snmpd(SNMP簡單網絡管理協議,遠程用戶能從中獲得許多系統信息)改為s50snmpd,則系統啟動時將不會啟動這項服務。
用下列命令察看在關閉啟動腳本之前有多少服務在運行:
suneagle# ps -eafwc -l
有兩個非常有用的工具:ps -xau(輸出大量的有關系統運行的信息)和netstat -vat(列出所有和網絡相關的信息)。運行他們就可以知道系統在提供、運行哪些服務。
6. 處理"services"文件
端口號和標准服務之間的對應關系在RFC1700"Assigned Numbers"中有詳細的定義。"/etc/services"文件使得服務器和客戶端的程序能夠把服務的名字轉成端口號,這張表在每一台主機上都存在,其文件名是"/etc/services"。只有"root"用戶才有權限修改這個文件,而且在通常情況下這個文件是沒有必要修改的,因為這個文件中已經包含了常用的服務所對應的端口號。為了提高安全性,我們可以給這個文件加上保護以避免沒有經過授權的刪除和改變。為了保護這個文件可以用下面的命令:
[root@snow]# chattr +i /etc/services
7. 改變"/etc/rc.d/init.d/"目錄下腳本文件的訪問許可
通過以下方式改變啟動和停止daemon的腳本文件的權限。
[root@snow]# chmod -R 700 /etc/rc.d/init.d/*
這樣只有root可以讀、寫和執行這一腳本,因為一般用戶不需要知道腳本文件的內容。
8. 使系統對ping沒有反應
防止系統對ping請求做出反應,對於網絡安全是很有好處的,因為沒人能夠ping你的服務器並得到任何反應。TCP/IP協議本身有很多的弱點,黑客可以利用一些技術,把傳輸正常數據包的通道用來偷偷地傳送數據。使你的系統對ping請求沒有反應,可以把這個危險減到最小。使用下面的命令:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
運行完這個命令後,系統對ping就沒有反應了。可以把這一行加到"/etc/rc.d/rc.local"文件中去,這樣當系統重新啟動時,該命令就會自動運行。
6. 處理"services"文件
端口號和標准服務之間的對應關系在RFC1700"Assigned Numbers"中有詳細的定義。"/etc/services"文件使得服務器和客戶端的程序能夠把服務的名字轉成端口號,這張表在每一台主機上都存在,其文件名是"/etc/services"。只有"root"用戶才有權限修改這個文件,而且在通常情況下這個文件是沒有必要修改的,因為這個文件中已經包含了常用的服務所對應的端口號。為了提高安全性,我們可以給這個文件加上保護以避免沒有經過授權的刪除和改變。為了保護這個文件可以用下面的命令:
[root@snow]# chattr +i /etc/services
7. 改變"/etc/rc.d/init.d/"目錄下腳本文件的訪問許可
通過以下方式改變啟動和停止daemon的腳本文件的權限。
[root@snow]# chmod -R 700 /etc/rc.d/init.d/*
這樣只有root可以讀、寫和執行這一腳本,因為一般用戶不需要知道腳本文件的內容。
8. 使系統對ping沒有反應
防止系統對ping請求做出反應,對於網絡安全是很有好處的,因為沒人能夠ping你的服務器並得到任何反應。TCP/IP協議本身有很多的弱點,黑客可以利用一些技術,把傳輸正常數據包的通道用來偷偷地傳送數據。使你的系統對ping請求沒有反應,可以把這個危險減到最小。使用下面的命令:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
運行完這個命令後,系統對ping就沒有反應了。可以把這一行加到"/etc/rc.d/rc.local"文件中去,這樣當系統重新啟動時,該命令就會自動運行。