內存溢出錯誤怎么解決?
單的說就是程序對接受的輸入數據沒有進行有效的檢測導致錯誤,后果可能造成程序崩潰或者執行攻擊者的命令,詳細的資料可以看unsecret.org的漏洞利用欄目。
緩沖區溢出的概念
緩沖區溢出好比是將十磅的糖放進一個只能裝五磅的容器里……
堆棧溢出(又稱緩沖區溢出)攻擊是最常用的黑客技術之一。我們知道,UNIX本身以及其上的許多應用程序都是用C語言編寫的,C語言不檢查緩沖區的邊界。在某些情況下,如果用戶輸入的數據長度超過應用程序給定的緩沖區,就會覆蓋其他數據區。這稱作“堆棧溢出或緩沖溢出”。
一般情況下,覆蓋其他數據區的數據是沒有意義的,最多造成應用程序錯誤。但是,如果輸入的數據是經過“黑客”精心設計的,覆蓋堆棧的數據恰恰是黑客的入侵程序代碼,黑客就獲取了程序的控制權。如果該程序恰好是以root運行的,黑客就獲得了root權限,然后他就可以編譯黑客程序、留下入侵后門等,實施進一步地攻擊。按照這種原理進行的黑客入侵就叫做“堆棧溢出攻擊”。
為了便于理解,我們不妨打個比方。緩沖區溢出好比是將十磅的糖放進一個只能裝五磅的容器里。一旦該容器放滿了,余下的部分就溢出在柜臺和地板上,弄得一團糟。由于計算機程序的編寫者寫了一些編碼,但是這些編碼沒有對目的區域或緩沖區——五磅的容器——做適當的檢查,看它們是否夠大,能否完全裝入新的內容——十磅的糖,結果可能造成緩沖區溢出的產生。如果打算被放進新地方的數據不適合,溢得到處都是,該數據也會制造很多麻煩。但是,如果緩沖區僅僅溢出,這只是一個問題。到此時為止,它還沒有破壞性。當糖溢出時,柜臺被蓋住。可以把糖擦掉或用吸塵器吸走,還柜臺本來面貌。與之相對的是,當緩沖區溢出時,過剩的信息覆蓋的是計算機內存中以前的內容。除非這些被覆蓋的內容被保存或能夠恢復,否則就會永遠丟失。
在丟失的信息里有能夠被程序調用的子程序的列表信息,直到緩沖區溢出發生。另外,給那些子程序的信息——參數——也丟失了。這意味著程序不能得到足夠的信息從子程序返回,以完成它的任務。就像一個人步行穿過沙漠。如果他依賴于他的足跡走回頭路,當沙暴來襲抹去了這些痕跡時,他將迷失在沙漠中。這個問題比程序僅僅迷失方向嚴重多了。入侵者用精心編寫的入侵代碼(一種惡意程序)使緩沖區溢出,然后告訴程序依據預設的方法處理緩沖區,并且執行。此時的程序已經完全被入侵者操縱了。
入侵者經常改編現有的應用程序運行不同的程序。例如,一個入侵者能啟動一個新的程序,發送秘密文件(支票本記錄,口令文件,或財產清單)給入侵者的電子郵件。這就好像不僅僅是沙暴吹了腳印,而且后來者也會踩出新的腳印,將我們的迷路者領向不同的地方,他自己一無所知的地方。
緩沖區溢出的處理
你屋子里的門和窗戶越少,入侵者進入的方式就越少……
由于緩沖區溢出是一個編程問題,所以只能通過修復被破壞的程序的代碼而解決問題。如果你沒有源代碼,從上面“堆棧溢出攻擊”的原理可以看出,要防止此類攻擊,我們可以:
1、開放程序時仔細檢查溢出情況,不允許數據溢出緩沖區。由于編程和編程語言的原因,這非常困難,而且不適合大量已經在使用的程序;
2、使用檢查堆棧溢出的編譯器或者在程序中加入某些記號,以便程序運行時確認禁止黑客有意造成的溢出。問題是無法針對已有程序,對新程序來講,需要修改編譯器;
3、經常檢查你的操作系統和應用程序提供商的站點,一旦發現他們提供的補丁程序,就馬上下載并且應用在系統上,這是最好的方法。但是系統管理員總要比攻擊者慢一步,如果這個有問題的軟件是可選的,甚至是臨時的,把它從你的系統中刪除。舉另外一個例子,你屋子里的門和窗戶越少,入侵者進入的方式就越少。