如何防范Linux下緩沖區(qū)溢出攻擊
緩沖區(qū)溢出漏洞是一個(gè)困擾了安全專家30多年的難題。簡(jiǎn)單來說,它是由于編程機(jī)制而導(dǎo)致的、在軟件中出現(xiàn)的內(nèi)存錯(cuò)誤。這樣的內(nèi)存錯(cuò)誤使得黑客可以運(yùn)行一段惡意代碼來破壞系統(tǒng)正常地運(yùn)行,甚至獲得整個(gè)系統(tǒng)的控制權(quán)。
Linux系統(tǒng)特性
利用緩沖區(qū)溢出改寫相關(guān)內(nèi)存的內(nèi)容及函數(shù)的返回地址,從而改變代碼的執(zhí)行流程,僅能在一定權(quán)限范圍內(nèi)有效。因?yàn)檫M(jìn)程的運(yùn)行與當(dāng)前用戶的登錄權(quán)限和身份有關(guān),僅僅能夠制造緩沖區(qū)溢出是無法突破系統(tǒng)對(duì)當(dāng)前用戶的權(quán)限設(shè)置的。因此盡管可以利用緩沖區(qū)溢出使某一程序去執(zhí)行其它被指定的代碼,但被執(zhí)行的代碼只具有特定的權(quán)限,還是無法完成超越權(quán)限的任務(wù)。
但是,Linux(包括Unix)系統(tǒng)本身的一些特性卻可以被利用來沖破這種權(quán)限的局限性,使得能夠利用緩沖區(qū)溢出獲得更高的、甚至是完全的權(quán)限。主要體現(xiàn)在如下兩方面:
1.Linux(包括Unix)系統(tǒng)通過設(shè)置某可執(zhí)行文件的屬性為SUID或SGID,允許其它用戶以該可執(zhí)行文件擁有者的用戶ID或用戶組ID來執(zhí)行它。如果該可執(zhí)行文件的屬性是root,同時(shí)文件屬性被設(shè)置為SUID,則該可執(zhí)行文件就存在可利用的緩沖區(qū)溢出漏洞,可以利用它以root的身份執(zhí)行特定的、被另外安排的代碼。既然能夠使得一個(gè)具有root權(quán)限的代碼得以執(zhí)行,就能夠產(chǎn)生一個(gè)具有超級(jí)用戶root權(quán)限的Shell,那么掌握整個(gè)系統(tǒng)的控制權(quán)的危險(xiǎn)就產(chǎn)生了。
2.Linux(包括Unix)中的許多守護(hù)進(jìn)程都是以root權(quán)限運(yùn)行。如果這些程序存在可利用的緩沖區(qū)溢出,即可直接使它以root身份去執(zhí)行另外安排的代碼,而無須修改該程序的SUID或SGID屬性。這樣獲得系統(tǒng)的控制權(quán)將更加容易。
隨著現(xiàn)代網(wǎng)絡(luò)技術(shù)的發(fā)展和網(wǎng)絡(luò)應(yīng)用的深入,計(jì)算機(jī)網(wǎng)絡(luò)所提供的遠(yuǎn)程登錄機(jī)制、遠(yuǎn)程調(diào)用及執(zhí)行機(jī)制是必須的。這使得一個(gè)匿名的Internet用戶有機(jī)會(huì)利用緩沖區(qū)溢出漏洞來獲得某個(gè)系統(tǒng)的部分或全部控制權(quán)。實(shí)際上,以緩沖區(qū)溢出漏洞為攻擊手段的攻擊占了遠(yuǎn)程網(wǎng)絡(luò)攻擊中的絕大多數(shù),這給Linux系統(tǒng)帶來了極其嚴(yán)重的安全威脅。
途徑分析
通常情況下攻擊者會(huì)先攻擊root程序,然后利用緩沖區(qū)溢出時(shí)發(fā)生的內(nèi)存錯(cuò)誤來執(zhí)行類似“exec(sh)”的代碼,從而獲得root的一個(gè)Shell。為了獲得root權(quán)限的Shell,攻擊者需要完成如下的工作:
1.在程序的地址空間內(nèi)安排適當(dāng)?shù)奶囟ùa。一般使用如下兩種方法在被攻擊的程序地址空間內(nèi)安排攻擊代碼。
2.通過適當(dāng)?shù)爻跏蓟拇嫫骱痛鎯?chǔ)器,使程序在發(fā)生緩沖區(qū)溢出時(shí)不能回到原來的執(zhí)行處,而是跳轉(zhuǎn)到被安排的地址空間執(zhí)行。
當(dāng)攻擊者找到一種途徑可以變?cè)绦虻膱?zhí)行代碼和流程時(shí),攻擊的危險(xiǎn)就產(chǎn)生了。
防范措施
Linux下的緩沖區(qū)溢出攻擊威脅既來自于軟件的編寫機(jī)制,也來自于Linux(和Unix)系統(tǒng)本身的特性。實(shí)際上,緩沖區(qū)溢出攻擊及各種計(jì)算機(jī)病毒猖獗的根本原因在于現(xiàn)代計(jì)算機(jī)系統(tǒng)都是采用馮?諾依曼“存儲(chǔ)程序”的工作原理。這一基本原理使得程序和數(shù)據(jù)都可以在內(nèi)存中被繁殖、拷貝和執(zhí)行。因此,要想有效地防范緩沖區(qū)溢出攻擊就應(yīng)該從這兩個(gè)方面雙管其下。
確保代碼正確安全
緩沖區(qū)溢出攻擊的根源在于編寫程序的機(jī)制。因此,防范緩沖區(qū)溢出漏洞首先應(yīng)該確保在Linux系統(tǒng)上運(yùn)行的程序(包括系統(tǒng)軟件和應(yīng)用軟件)代碼的正確性,避免程序中有不檢查變量、緩沖區(qū)大小及邊界等情況存在。比如,使用grep工具搜索源代碼中容易產(chǎn)生漏洞的庫(kù)調(diào)用,檢測(cè)變量的大小、數(shù)組的邊界、對(duì)指針變量進(jìn)行保護(hù),以及使用具有邊界、大小檢測(cè)功能的C編譯器等。
基于一定的安全策略設(shè)置系統(tǒng)
攻擊者攻擊某一個(gè)Linux系統(tǒng),必須事先通過某些途徑對(duì)要攻擊的系統(tǒng)做必要的了解,如版本信息等,然后再利用系統(tǒng)的某些設(shè)置直接或間接地獲取控制權(quán)。因此,防范緩沖區(qū)溢出攻擊的第二個(gè)方面就是對(duì)系統(tǒng)設(shè)置實(shí)施有效的安全策略。這些策略種類很多,由于篇幅有限只列舉幾個(gè)典型措施:
(1)在裝有Telnet服務(wù)的情況下,通過手工改寫“/etc/inetd.conf”文件中的Telnet設(shè)置,使得遠(yuǎn)程登錄的用戶無法看到系統(tǒng)的提示信息。具體方法是將Telnet設(shè)置改寫為:
telnet stream tcp nowait root /usr/sbin/tcpd/in.telnetd -h
末尾加上“-h”參數(shù)可以讓守護(hù)進(jìn)程不顯示任何系統(tǒng)信息,只顯示登錄提示。
(2)改寫“rc.local”文件。默認(rèn)情況下,當(dāng)?shù)卿汱inux系統(tǒng)時(shí)系統(tǒng)運(yùn)行rc.local文件,顯示該Lin
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解