緩存溢出
緩存溢出
緩存溢出(Buffer overflow),是指在存在緩存溢出安全漏洞的計算機中,攻擊者可以用超出常規長度的字元數來填滿一個域,通常是內存區地址。在某些情況下,這些過量的字元能夠作為“可執行”代碼來運行。從而使得攻擊者可以不受安全措施的約束來控制被攻擊的計算機。
緩存溢出(或譯為緩衝溢出)為黑客最為常用的攻擊手段之一,蠕蟲病毒對操作系統高危漏洞的溢出高速與大規模傳播均是利用此技術。
緩存溢出攻擊從理論上來講可以用於攻擊任何有缺陷不完美的程序,包括對殺毒軟體、防火牆等安全產品的攻擊以及對銀行程序的攻擊。
在unix系統中,通過緩存溢出來獲得root許可權是目前使用得相當普遍的一種黑客技術。事實上這是一個黑客在系統本地已經擁有了一個基本賬號后的首選攻擊方式。它也被廣泛應用於遠程攻擊,通過對daemon進程的堆棧溢出來實現遠程獲得rootshell的技術,已經有很多實例。
在windows系統中,同樣存在著緩存溢出的問題。而且,隨著internet的普及,win系列平台上的internet服務程序越來越多,低水平的win程序就成為你系統上的致命傷,因為它們同樣會發生遠程堆棧溢出。而且,由於win系統使用者和管理者普遍缺乏安全防範意識,一台win系統上的堆棧溢出,如果被惡意利用,將導致整個機器被黑客所控制,進而可能導致整個區域網落入黑客之手。微軟的流行產品iis server4.0中就被發現存在一種被稱為“非法htr請求”的缺陷。據微軟稱,此缺陷在特定情況下會導致任意代碼都可以在伺服器端運行。但用發現這一漏洞的internet安全公司eeye的ceo firas bushnaq的話說,這只是冰山一角而已。bushnaq說,黑客可以利用這一漏洞對iis伺服器進行完全的控制,而實際上許多電子商務站點恰恰是基於這套系統的。
下面讓我們了解一下緩存溢出的原理。眾說周知,c語言不進行數組的邊界檢查,在許多運用c語言實現的應用程序中,都假定緩衝區的大小是足夠的,其容量肯定大於要拷貝的字元串的長度。然而事實並不總是這樣,當程序出錯或者惡意的用戶故意送入一過長的字元串時,便有許多意想不到的事情發生,超過的那部分字元將會覆蓋與數組相鄰的其他變數的空間,使變數出現不可預料的值。如果碰巧,數組與子程序的返回地址鄰近時,便有可能由於超出的一部分字元串覆蓋了子程序的返回地址,而使得子程序執行完畢返回時轉向了另一個無法預料的地址,使程序的執行流程發生了錯誤。甚至,由於應用程序訪問了不在進程地址空間範圍的地址,而使進程發生違例的故障。這種錯誤其實是編程中常犯的。
一個利用緩衝區溢出而企圖破壞或非法進入系統的程序通常由如下幾個部分組成:
1. 準備一段可以調出一個shell的機器碼形成的字元串,在下面我們將它稱為shellcode。
2. 申請一個緩衝區,並將機器碼填入緩衝區的低端。
3. 估算機器碼在堆棧中可能的起始位置,並將這個位置寫入緩衝區的高端。這個起始的位置也是我們執行這一程序時需要反覆調用的一個參數。
4. 將這個緩衝區作為系統一個有緩衝區溢出錯誤程序的入口參數,並執行這個有錯誤的程序。
通過以上的分析和實例,我們可以看到緩存溢出對系統的安全帶來的巨大威脅。在unix系統中,使用一類精心編寫的程序,利用suid程序中存在的這種錯誤可以很輕易地取得系統的超級用戶的許可權。當服務程序在埠提供服務時,緩衝區溢出程序可以輕易地將這個服務關閉,使得系統的服務在一定的時間內癱瘓,嚴重的可能使系統立刻宕機,從而變成一種拒絕服務的攻擊。這種錯誤不僅是程序員的錯誤,系統本身在實現的時候出現的這種錯誤更多。如今,緩衝區溢出的錯誤正源源不斷地從unix、windows、路由器、網關以及其他的網路設備中被發現,並構成了對系統安全威脅數量最大、程度較大的一類。
緩衝區溢出是代碼中固有的漏洞,除了在開發階段要注意編寫正確的代碼之外,對於用戶而言,一般的防範錯誤為
–關閉埠或服務。管理員應該知道自己的系統上安裝了什麼,並且哪些服務正在運行
–安裝軟體廠商的補丁,漏洞一公布,大的廠商就會及時提供補丁
–在防火牆上過濾特殊的流量,無法阻止內部人員的溢出攻擊
–自己檢查關鍵的服務程序,看看是否有可怕的漏洞
-以所需要的最小許可權運行軟體