緩沖區(qū)溢出攻擊是目前黑客最常用的攻擊手段之一,為了應(yīng)對(duì)不斷涌現(xiàn)的緩沖區(qū)溢出攻擊,我們研究了在linux系統(tǒng)下防范緩沖區(qū)溢出的方法,通過研究,總結(jié)了在Linux平臺(tái)下防范緩沖區(qū)溢出攻擊的安全策略,這些安全策略可以應(yīng)用于一般企業(yè)內(nèi)部服務(wù)器,包括web服務(wù)器、mail服務(wù)器、samba服務(wù)器、ftp服務(wù)器以及PRoxy服務(wù)器等。在實(shí)際使用中,我們發(fā)現(xiàn)通過這些安全策略的配置能夠?qū)彌_區(qū)溢出攻擊起到很好的防范措施。
在對(duì)計(jì)算機(jī)系統(tǒng)安全的研究中,有一種系統(tǒng)安全漏洞引起了我們的關(guān)注。一方面是由于這種安全漏洞的廣泛性--幾乎使所有的操作系統(tǒng)平臺(tái)都受到影響。另一方面,我們?yōu)楹诳突诖祟惏踩┒此帉懙墓舫绦虻碾[蔽性和強(qiáng)大威力所吸引。這就是緩沖區(qū)溢出技術(shù)。它可以使看似安全的,正在運(yùn)行常規(guī)服務(wù)(如 DNS、ftpd等)的主機(jī)在幾秒鐘內(nèi)失去控制權(quán)。緩沖區(qū)溢出攻擊是目前黑客最常用的攻擊手段。在當(dāng)前CERT和CIAC等發(fā)布的Internet安全事件報(bào)告中, 緩沖區(qū)溢出已成為常見的用語。緩沖區(qū)溢出攻擊的目的在于擾亂具有某些特權(quán)運(yùn)行的程序的功能。這樣可以讓攻擊者取得程序的控制權(quán),如果該程序具有足夠的權(quán)限,那么整個(gè)主機(jī)就被控制了。
為了應(yīng)對(duì)不斷涌現(xiàn)的緩沖區(qū)溢出攻擊,我們研究了在Linux系統(tǒng)下防范緩沖區(qū)溢出的方法,之所以選擇Linux平臺(tái),主要有兩方面的原因:(1)Linux是一個(gè)開放源碼的平臺(tái),有利于我們?cè)谘芯康倪^程中深入技術(shù)細(xì)節(jié),由于Linux及其上面的大量應(yīng)用都是基于開放源碼,有很多黑客在其上進(jìn)行了大量的工作,可以說Linux上的網(wǎng)絡(luò)攻擊水平代表了整個(gè)網(wǎng)絡(luò)攻擊的最高水平。(2)Linux是一個(gè)類Unix系統(tǒng),同時(shí)也是在Internet中大量使用的操作系統(tǒng)平臺(tái),選擇Linux作為研究緩沖區(qū)溢出技術(shù)的平臺(tái)是非常具有代表性的,在Linux平臺(tái)上取得的經(jīng)驗(yàn)可以非常容易地移植到其他Unix或者類Unix平臺(tái)上。
通過研究,我們總結(jié)了在Linux平臺(tái)下防范緩沖區(qū)溢出的安全策略,這些安全策略可以應(yīng)用于一般企業(yè)內(nèi)部服務(wù)器,包括web服務(wù)器、mail服務(wù)器、samba服務(wù)器、ftp服務(wù)器以及proxy服務(wù)器等。我們所總結(jié)的這些安全策略如下所示:
1. 不顯示系統(tǒng)提示信息
如果不想讓遠(yuǎn)程登錄的用戶看到系統(tǒng)的提示信息,可以改變"/etc/inetd.conf"文件中的telnet設(shè)置:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
在末尾加上"-h"參數(shù)可以讓daemon不顯示任何系統(tǒng)信息,只顯示登錄提示。當(dāng)然,只有在服務(wù)器上裝了telnet服務(wù)器才有這樣做的必要。
2. 處理"rc.local"文件
在默認(rèn)情況下,當(dāng)?shù)卿浹b有Linux系統(tǒng)的計(jì)算機(jī)時(shí),系統(tǒng)會(huì)告訴你Linux發(fā)行版的名字、版本號(hào)、內(nèi)核版本和服務(wù)器名稱。這泄露了太多的系統(tǒng)信息。出于安全的考慮,最好只顯示一個(gè)"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"文件是用戶從網(wǎng)絡(luò)登錄計(jì)算機(jī)時(shí)(例如:telnet、SSH)看到的登錄提示。同樣在"/etc"目錄下還有一個(gè)"issue"文件,是用戶從本地登錄時(shí)看到的提示。這兩個(gè)文件都是文本文件,可以根據(jù)需要改變。但是,如果想刪掉這兩個(gè)文件,必須向上面介紹的那樣把"/etc/rc.d/rc.local"腳本中的那些行注釋掉,否則每次重新啟動(dòng)的時(shí)候,系統(tǒng)又會(huì)重新創(chuàng)建這兩個(gè)文件。
3. 禁止提供finger 服務(wù)
在Linux系統(tǒng)下,使用finger命令可以顯示本地或遠(yuǎn)程系統(tǒng)中目前已登錄用戶的詳細(xì)信息,黑客可以利用這些信息,增大侵入系統(tǒng)的機(jī)會(huì)。為了系統(tǒng)的安全,最好禁止提供finger服務(wù),即從/usr/bin下刪除finger 命令。如果要保留 finger服務(wù),應(yīng)將finger文件換名,或修改其權(quán)限,使得只允許root用戶執(zhí)行finger命令。
4. 處理"inetd.conf"文件
inetd也叫作"超級(jí)服務(wù)器",其作用是根據(jù)網(wǎng)絡(luò)請(qǐng)求裝入網(wǎng)絡(luò)程序。"/etc/inetd.conf"文件告訴inetd監(jiān)聽哪些網(wǎng)絡(luò)端口,為每個(gè)端口啟動(dòng)哪個(gè)服務(wù)。把Linux系統(tǒng)放在任何網(wǎng)絡(luò)環(huán)境中,第一件要做的事就是了解一下服務(wù)器到底要提供哪些服務(wù)。不需要的那些服務(wù)應(yīng)該被禁止掉,最好卸載掉,這樣黑客就少了一些攻擊系統(tǒng)的機(jī)會(huì)。查看"/etc/inetd.conf"文件,了解一下inetd提供哪些服務(wù)。用加上注釋的方法(在一行的開頭加上#號(hào))禁止任何不需要的服務(wù),再給inetd進(jìn)程發(fā)一個(gè)SIGHUP信號(hào)。具體操作步驟如下:
(1)把文件"/etc/inetd.conf"的許可權(quán)限改成600,只允許root來讀寫該文件。 [root@snow]# chmod 600 /etc/inetd.conf
(2)確定"/etc/inetd.conf"文件所有者為root。
[root@snow]# stat /etc/inetd.conf
這個(gè)命令顯示出來的信息應(yīng)該是:
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),禁止所有不需要的服務(wù),如:ftp、telnet、 shell、login、exec、talk、ntalk、imap、pop-2、pop-3、finger、auth等。把不需要的服務(wù)關(guān)閉可以使系統(tǒng)的危險(xiǎn)性降低很多。
(4)改變了"inetd.conf"文件之后,要給inetd進(jìn)程發(fā)送一個(gè)SIGHUP信號(hào)(killall -HUP inetd)。
[root@snow /root]# killall -HUP inetd
(5)為了保證"inetd.conf"文件的安全,可以用chattr命令把它設(shè)成不可改變的。如下:
[root@snow]# chattr +i /etc/inetd.conf
這樣可以防止對(duì)"inetd.conf"文件的任何修改。一個(gè)有"i"屬性的文件是不能被改動(dòng)的(不能刪除或重命名,不能創(chuàng)建這個(gè)文件的鏈接,不能向這個(gè)文件里寫數(shù)據(jù))。唯一可以取消這個(gè)屬性的人只有root。如果要修改"inetd.conf"文件,首先要取消不可修改的屬性,如下:
[root@snow]# chattr -i /etc/inetd.conf
再改變了"inetd.conf"文件后,需要再把它的屬性改為不可改變的。
5. 啟動(dòng)系統(tǒng)的"rc"腳本
/etc/rc.d目錄下"rc"開頭的文件是用來啟動(dòng)系統(tǒng)的初始化文件的。rc系列文件與Ms- Dos系統(tǒng)下的autoexec.bat很類似。rc的意思是"runtime commands"。它們決定了init進(jìn)程要啟動(dòng)哪些服務(wù)。redhat系統(tǒng)下,這些腳本在/etc/rc.d/rc3.d(如果系統(tǒng)以x為默認(rèn)啟動(dòng)的話,就是/etc/rc.d/rc5.d)。要在啟動(dòng)時(shí)禁止某個(gè)服務(wù),只需要把大寫的S替換為小寫的s,同時(shí),redhat也提供一個(gè)工具來幫助你關(guān)閉服務(wù),輸入/usr/sbin/setup,然后選擇"system services",就可以定制系統(tǒng)啟動(dòng)時(shí)運(yùn)行哪些服務(wù)。另外一個(gè)選擇是chkconfig命令,很多l(xiāng)inux版本的系統(tǒng)都自帶這個(gè)工具。腳本名字中的數(shù)字是啟動(dòng)的順序,以大寫的K開頭的是用來殺死進(jìn)程的。 如將S50snmpd(SNMP簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議,遠(yuǎn)程用戶能從中獲得許多系統(tǒng)信息)改為s50snmpd,則系統(tǒng)啟動(dòng)時(shí)將不會(huì)啟動(dòng)這項(xiàng)服務(wù)。
用下列命令察看在關(guān)閉啟動(dòng)腳本之前有多少服務(wù)在運(yùn)行:
suneagle# ps -eaf|wc -l
有兩個(gè)非常有用的工具:ps -xau(輸出大量的有關(guān)系統(tǒng)運(yùn)行的信息)和netstat -vat(列出所有和網(wǎng)絡(luò)相關(guān)的信息)。運(yùn)行他們就可以知道系統(tǒng)在提供、運(yùn)行哪些服務(wù)。
6. 處理"services"文件
端口號(hào)和標(biāo)準(zhǔn)服務(wù)之間的對(duì)應(yīng)關(guān)系在RFC1700"Assigned Numbers"中有詳細(xì)的定義。"/etc/services"文件使得服務(wù)器和客戶端的程序能夠把服務(wù)的名字轉(zhuǎn)成端口號(hào),這張表在每一臺(tái)主機(jī)上都存在,其文件名是"/etc/services"。只有"root"用戶才有權(quán)限修改這個(gè)文件,而且在通常情況下這個(gè)文件是沒有必要修改的,因?yàn)檫@個(gè)文件中已經(jīng)包含了常用的服務(wù)所對(duì)應(yīng)的端口號(hào)。為了提高安全性,我們可以給這個(gè)文件加上保護(hù)以避免沒有經(jīng)過授權(quán)的刪除和改變。為了保護(hù)這個(gè)文件可以用下面的命令:
[root@snow]# chattr +i /etc/services
7. 改變"/etc/rc.d/init.d/"目錄下腳本文件的訪問許可
通過以下方式改變啟動(dòng)和停止daemon的腳本文件的權(quán)限。
[root@snow]# chmod -R 700 /etc/rc.d/init.d/*
這樣只有root可以讀、寫和執(zhí)行這一腳本,因?yàn)橐话阌脩舨恍枰滥_本文件的內(nèi)容。
8. 使系統(tǒng)對(duì)ping沒有反應(yīng)
防止系統(tǒng)對(duì)ping請(qǐng)求做出反應(yīng),對(duì)于網(wǎng)絡(luò)安全是很有好處的,因?yàn)闆]人能夠ping你的服務(wù)器并得到任何反應(yīng)。TCP/ip協(xié)議本身有很多的弱點(diǎn),黑客可以利用一些技術(shù),把傳輸正常數(shù)據(jù)包的通道用來偷偷地傳送數(shù)據(jù)。使你的系統(tǒng)對(duì)ping請(qǐng)求沒有反應(yīng),可以把這個(gè)危險(xiǎn)減到最小。使用下面的命令:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
運(yùn)行完這個(gè)命令后,系統(tǒng)對(duì)ping就沒有反應(yīng)了。可以把這一行加到"/etc/rc.d/rc.local"文件中去,這樣當(dāng)系統(tǒng)重新啟動(dòng)時(shí),該命令就會(huì)自動(dòng)運(yùn)行。
新聞熱點(diǎn)
疑難解答
圖片精選