天天看點

記憶體溢出

記憶體溢出已經是軟體開發曆史上存在了近40年的“老大難”問題,象在“紅色代碼”病毒事件中表現的那樣,它已經成為黑客攻擊企業網絡的“罪魁禍首”。 如在一個域中輸入的資料超過了它的要求就會引發資料溢出問題,多餘的資料就可以作為指令在計算機上運作。據有關安全小組稱,作業系統中超過50%的安全漏洞都是由記憶體溢出引起的,其中大多數與微軟的技術有關。

為了便于了解,我們不妨打個比方。緩沖區溢出好比是将十磅的糖放進一個隻能裝五磅的容器裡。一旦該容器放滿了,餘下的部分就溢出在櫃台和地闆上,弄得一團糟。由于計算機程式的編寫者寫了一些編碼,但是這些編碼沒有對目的區域或緩沖區——五磅的容器——做适當的檢查,看它們是否夠大,能否完全裝入新的内容——十磅的糖,結果可能造成緩沖區溢出的産生。如果打算被放進新地方的資料不适合,溢得到處都是,該資料也會制造很多麻煩。但是,如果緩沖區僅僅溢出,這隻是一個問題。到此時為止,它還沒有破壞性。當糖溢出時,櫃台被蓋住。可以把糖擦掉或用吸塵器吸走,還櫃台本來面貌。與之相對的是,當緩沖區溢出時,過剩的資訊覆寫的是計算機記憶體中以前的内容。除非這些被覆寫的内容被儲存或能夠恢複,否則就會永遠丢失。

在丢失的資訊裡有能夠被程式調用的子程式的清單資訊,直到緩沖區溢出發生。另外,給那些子程式的資訊——參數——也丢失了。這意味着程式不能得到足夠的資訊從子程式傳回,以完成它的任務。就像一個人步行穿過沙漠。如果他依賴于他的足迹走回頭路,當沙暴來襲抹去了這些痕迹時,他将迷失在沙漠中。這個問題比程式僅僅迷失方向嚴重多了。入侵者用精心編寫的入侵代碼(一種惡意程式)使緩沖區溢出,然後告訴程式依據預設的方法處理緩沖區,并且執行。此時的程式已經完全被入侵者操縱了。

入侵者經常改編現有的應用程式運作不同的程式。例如,一個入侵者能啟動一個新的程式,發送秘密檔案(支票本記錄,密碼檔案,或财産清單)給入侵者的電子郵件。這就好像不僅僅是沙暴吹了腳印,而且後來者也會踩出新的腳印,将我們的迷路者領向不同的地方,他自己一無所知的地方。

緩沖區溢出的處理

你屋子裡的門和窗戶越少,入侵者進入的方式就越少……

由于緩沖區溢出是一個程式設計問題,是以隻能通過修複被破壞的程式的代碼而解決問題。如果你沒有源代碼,從上面“堆棧溢出攻擊”的原理可以看出,要防止此類攻擊,我們可以:

1、開放程式時仔細檢查溢出情況,不允許資料溢出緩沖區。由于程式設計和程式設計語言的原因,這非常困難,而且不适合大量已經在使用的程式;

2、使用檢查堆棧溢出的編譯器或者在程式中加入某些記号,以便程式運作時确認禁止黑客有意造成的溢出。問題是無法針對已有程式,對新程式來講,需要修改編譯器;

3、經常檢查你的作業系統和應用程式提供商的站點,一旦發現他們提供的更新檔程式,就馬上下載下傳并且應用在系統上,這是最好的方法。但是系統管理者總要比攻擊者慢一步,如果這個有問題的軟體是可選的,甚至是臨時的,把它從你的系統中删除。舉另外一個例子,你屋子裡的門和窗戶越少,入侵者進入的方式就越少。

繼續閱讀