與Windows相比,Linux被認為具有更好的安全性和其他擴展性能。這些特性使得Linux在操作系統(tǒng)領域異軍突起,得到越來越多的重視。隨著Linux應用量的增加,其安全性也逐漸受到了公眾甚或黑客的關注。那么,Linux是否真的如其支持廠商們所宣稱的那樣安全呢?
Linux內核精短、穩(wěn)定性高、可擴展性好、硬件需求低、免費、網(wǎng)絡功能豐富、適用于多種cpu等特性,使之在操作系統(tǒng)領域異軍突起。其獨特的魅力使它不僅在pc機上占據(jù)一定的份額,而且越來越多地被使用在各種嵌入式設備中,并被當作專業(yè)的路由器,防火墻,或者高端的服務器OS來使用。各種類型的Linux發(fā)行版本也如雨后春筍般冒了出來,國內更是掀起了Linux的使用熱潮,很多政府部門因安全需要也被要求使用Linux.正是因為Linux被越來越多地使用,其安全性也漸漸受到了公眾的關注,當然,也更多地受到了黑客的關注。通常,我們討論Linux系統(tǒng)安全都是從Linux安全配置的角度或者Linux的安全特性等方面來討論的,而這一次我們轉換一下視角,從Linux系統(tǒng)中存在的漏洞與這些漏洞產(chǎn)生的影響來討論Linux的安全性。
首先來說明一下這次我們討論Linux系統(tǒng)安全的范圍,其實通常我們所說的Linux是指GNU/Linux系統(tǒng),Linux是系統(tǒng)中使用的操作系統(tǒng)內核。這一次我們重點從Linux系統(tǒng)內核中存在的幾類非常有特點的漏洞來討論Linux系統(tǒng)的安全性。
權限提升類漏洞
一般來說,利用系統(tǒng)上一些程序的邏輯缺陷或緩沖區(qū)溢出的手段,攻擊者很容易在本地獲得Linux服務器上管理員權限r(nóng)oot;在一些遠程的情況下,攻擊者會利用一些以root身份執(zhí)行的有缺陷的系統(tǒng)守護進程來取得root權限,或利用有缺陷的服務進程漏洞來取得普通用戶權限用以遠程登錄服務器。目前很多Linux服務器都用關閉各種不需要的服務和進程的方式來提升自身的安全性,但是只要這個服務器上運行著某些服務,攻擊者就可以找到權限提升的途徑。下面是一個比較新的導致權限提升的漏洞。
do_brk()邊界檢查不充分漏洞在2003年9月份被Linux內核開發(fā)人員發(fā)現(xiàn),并在9月底發(fā)布的Linux kernel 2.6.0-test6中對其進行了修補。但是Linux內核開發(fā)人員并沒有意識到此漏洞的威脅,所以沒有做任何通報,一些安全專家與黑客卻看到了此漏洞蘊涵的巨大威力。在2003年11月黑客利用rsync中一個未公開的堆溢出與此漏洞配合,成功地攻擊了多臺Debian與Gentoo Linux的服務器。
下面讓我們簡單描述一下該漏洞。該漏洞被發(fā)現(xiàn)于brk系統(tǒng)調用中。brk系統(tǒng)調用可以對用戶進程的堆的大小進行操作,使堆擴展或者縮小。而brk內部就是直接使用do_brk()函數(shù)來做具體的操作, do_brk()函數(shù)在調整進程堆的大小時既沒有對參數(shù)len進行任何檢查(不檢查大小也不檢查正負),也沒有對addr+len是否超過TASK_SIZE做檢查。這樣我們就可以向它提交任意大小的參數(shù)len,使用戶進程的大小任意改變以至可以超過TASK_SIZE的限制,使系統(tǒng)認為內核范圍的內存空間也是可以被用戶訪問的,這樣的話普通用戶就可以訪問到內核的內存區(qū)域。通過一定的操作,攻擊者就可以獲得管理員權限。這個漏洞極其危險,利用這個漏洞可以使攻擊者直接對內核區(qū)域操作,可以繞過很多Linux系統(tǒng)下的安全保護模塊。
此漏洞的發(fā)現(xiàn)提出了一種新的漏洞概念,即通過擴展用戶的內存空間到系統(tǒng)內核的內存空間來提升權限。當發(fā)現(xiàn)這種漏洞時,通過研究我們就認為內核中一定還會存在類似的漏洞,果然幾個月后黑客們又在Linux內核中發(fā)現(xiàn)與brk相似的漏洞。通過這次成功的預測,更證實了對這種新型的概念型漏洞進行研究很有助于安全人員在系統(tǒng)中發(fā)現(xiàn)新的漏洞。
拒絕服務類漏洞
拒絕服務攻擊是目前比較流行的攻擊方式,它并不取得服務器權限,而是使服務器崩潰或失去響應。對Linux的拒絕服務大多數(shù)都無須登錄即可對系統(tǒng)發(fā)起拒絕服務攻擊,使系統(tǒng)或相關的應用程序崩潰或失去響應能力,這種方式屬于利用系統(tǒng)本身漏洞或其守護進程缺陷及不正確設置進行攻擊。
另外一種情況,攻擊者登錄到Linux系統(tǒng)后,利用這類漏洞,也可以使系統(tǒng)本身或應用程序崩潰。這種漏洞主要由程序對意外情況的處理失誤引起,如寫臨時文件之前不檢查文件是否存在,盲目跟隨鏈接等。
下面,我們簡單描述一下Linux在處理intel IA386 CPU中的寄存器時發(fā)生錯誤而產(chǎn)生的拒絕服務漏洞。該漏洞是因為IA386多媒體指令使用的寄存器MXCSR的特性導致的。由于IA386 CPU規(guī)定MXCSR寄存器的高16位不能有任何位被置位,否則CPU就會報錯導致系統(tǒng)崩潰。為了保證系統(tǒng)正常運轉,在linux系統(tǒng)中有一段代碼專門對MXCSR的這個特性作處理,而這一段代碼在特定的情況下會出現(xiàn)錯誤,導致MXCSR中的高16位沒有被清零,使系統(tǒng)崩潰。如果攻擊者制造了這種“極限”的內存情況就會對系統(tǒng)產(chǎn)生DoS效果。
攻擊者通過調用get_fpxregs函數(shù)可以讀取多媒體寄存器至用戶空間,這樣用戶就可以取得MXCSR寄存器的值。調用set_fpxregs函數(shù)可以使用用戶空間提供的數(shù)據(jù)對MXCSR寄存器進行賦值。通過對MXCSR的高16位進行清0,就保證了IA386 CPU的這個特性。如果產(chǎn)生一種極限效果使程序跳過這一行,使MXCSR寄存器的高16位沒有被清0,一旦MXCSR寄存器的高16位有任何位被置位,系統(tǒng)就會立即崩潰!
因為利用這個漏洞攻擊者還需要登錄到系統(tǒng),這個漏洞也不能使攻擊者提升權限,只能達到DoS的效果,所以這個漏洞的危害還是比較小的。但是分析這個漏洞就沒有意義了嗎?其實由分析這個漏洞可以看出:Linux內核開發(fā)成員對這種內存拷貝時出現(xiàn)錯誤的情況沒有進行考慮,以至造成了這個漏洞,分析了解了這個漏洞后,在漏洞挖掘方面也出現(xiàn)了一種新的類型,使我們在以后的開發(fā)中可以盡量避免這種情況。
接下來讓我們看一種Linux內核算法上出現(xiàn)的漏洞。先來簡單介紹一下這個漏洞,當Linux系統(tǒng)接收到攻擊者經(jīng)過特殊構造的包后,會引起hash表產(chǎn)生沖突導致服務器資源被耗盡。這里所說的hash沖突就是指:許多數(shù)值經(jīng)過某種hash算法運算以后得出的值相同,并且這些值都被儲存在同一個hash槽內,這就使hash表變成了一個單向鏈表。而對此hash表的插入操作會從原來的復雜度O(n)變?yōu)镺(n*n)。這樣就會導致系統(tǒng)消耗巨大的cpu資源,從而產(chǎn)生了DoS攻擊效果。