最近,一種被稱為“緩存溢出(buffer overflow)”的設計缺陷,正在嚴重危害著系統的安全,成為比y2k更為頭痛的問題。一旦這個缺陷被別有用心的人發現,就會被利用作為非法入侵的一種手段,破壞電腦中的資料。據統計,通過緩存溢出進行的攻擊占所有系統攻擊總數的80%以上,最近各大網站所遭受的所謂分布式服務拒絕(ddos)式的攻擊也是一種利用緩存溢出原理的攻擊方式。
簡單地說,緩存溢出是指一種攻擊系統的手段,通過往程序的緩沖區中寫入超出其長度的內容造成溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,而達到攻擊的目的。分布式拒絕服務(ddos)的入侵者采用的是輸入很長的字串,將通訊欄等區域填到超過設計的容量,有些多余字串就會被電腦誤認為是執行密碼,使入侵者有機會進入電腦,而同時系統無法察覺。有報告指出,“緩存溢出”是過去十年發生的非常普遍的電腦安全問題,入侵者可以利用它完全控制電腦。
■ 緩存溢出黑客們的慣用伎倆
在unix系統中,通過緩存溢出來獲得root權限是目前使用得相當普遍的一種黑客技術。事實上這是一個黑客在系統本地已經擁有了一個基本賬號后的首選攻擊方式。它也被廣泛應用于遠程攻擊,通過對daemon進程的堆棧溢出來實現遠程獲得rootshell的技術,已經有很多實例。
在windows系統中,同樣存在著緩存溢出的問題。而且,隨著inte.net的普及,win系列平臺上的internet服務程序越來越多,低水平的win程序就成為你系統上的致命傷,因為它們同樣會發生遠程堆棧溢出。而且,由于win系統使用者和管理者普遍缺乏安全防范意識,一臺win系統上的堆棧溢出,如果被惡意利用,將導致整個機器被黑客所控制,進而可能導致整個局域網落入黑客之手。在微軟的產品iis server4.0中就被發現存在一種被稱為“非法htr請求”的缺陷。據微軟稱,此缺陷在特定情況下會導致任意代碼都可以在服務器端運行。黑客可以利用這一漏洞對iis服務器進行完全的控制,而實際上許多電子商務站點恰恰是基于這套系統的。
■ 黑客如何攪亂緩存
下面讓我們了解一下緩存溢出的原理。眾說周知,c語言不進行數組的邊界檢查,在許多運用c語言實現的應用程序中,都假定緩沖區的大小是足夠的,其容量肯定大于要拷貝的字符串的長度。然而事實并不總是這樣,當程序出錯或者惡意的用戶故意送入一過長的字符串時,便有許多意想不到的事情發生,超過的那部分字符將會覆蓋與數組相鄰的其他變量的空間,使變量出現不可預料的值。如果碰巧,數組與子程序的返回地址鄰近時,便有可能由于超出的一部分字符串覆蓋了子程序的返回地址,而使得子程序執行完畢返回時轉向了另一個無法預料的地址,使程序的執行流程發生了錯誤。甚至,由于應用程序訪問了不在進程地址空間范圍的地址,而使進程發生違例的故障。這種錯誤其實是編程中常犯的。
一個利用緩沖區溢出而企圖破壞或非法進入系統的程序通常由如下幾個部分組成:
1.準備一段可以調出一個shell的機器碼形成的字符串,在下面我們將它稱為shellcode。
2.申請一個緩沖區,并將機器碼填入緩沖區的低端。
3.估算機器碼在堆棧中可能的起始位置,并將這個位置寫入緩沖區的高端。這個起始的位置也是我們執行這一程序時需要反復調用的一個參數。
4.將這個緩沖區作為系統一個有緩沖區溢出錯誤程序的入口參數,并執行這個有錯誤的程序。
通過以上的分析和實例,我們可以看到緩存溢出對系統的安全帶來的巨大威脅。在unix系統中,使用一類精心編寫的程序,利用suid程序中存在的這種錯誤可以很輕易地取得系統的超級用戶的權限。當服務程序在端口提供服務時,緩沖區溢出程序可以輕易地將這個服務關閉,使得系統的服務在一定的時間內癱瘓,嚴重的可能使系統立刻宕機,從而變成一種拒絕服務的攻擊。這種錯誤不僅是程序員的錯誤,系統本身在實現的時候出現的這種錯誤更多。如今,緩沖區溢出的錯誤正源源不斷地從unix、windows、路由器、網關以及其他的網絡設備中被發現,并構成了對系統安全威脅數量最大、程度較大的一類。
原文轉自:http://www.anti-gravitydesign.com