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