緩存溢出

緩存溢出(Buffer overflow),是指在存在緩存溢出安全漏洞的計算機中,攻擊者可以用超出常規長度的字符數來填滿一個域,通常是內存區地址。在某些情況下,這些過量的字符能夠作爲“可執行”代碼來運行。從而使得攻擊者可以不受安全措施的約束來控制被攻擊的計算機。

1. 緩存溢出攻擊方式

1.1 破壞活動記錄

函數調用發生時,調用者會在棧中留下函數的活動記錄,包含當前被調函數的參數、返回地址、前棧指針、變量緩存區等值,它們在棧中的存放順序如圖所示。
在這裏插入圖片描述

由它們在棧中的存放順序可知,返回地址、棧指針與變量緩存區緊鄰,且返回地址指向函數結束後要執行的下一條指令。棧指針指向上一個函數的活動記錄,這樣攻擊者可以利用變量緩存區溢出來修改返回地址值和棧指針,從而改變程序的執行流。

1.2 破壞堆數據

程序運行時,用戶用C、C++內存操作庫函數如malloc、free等在堆內存空間分配存儲和釋放刪除用戶數據,對內存的使用情況如內存塊的大小、它前後指向的內存塊用一個鏈接類的數據結構予以記錄管理,管理數據同樣存放於堆中,且管理數據與用戶數據是相鄰的。這樣,攻擊者可以像破壞活動記錄一樣來溢出堆內存中分配的用戶數據空間,從而破壞管理數據。因爲堆內存數據中沒有指針信息,所以即使破壞了管理數據也不會改變程序的執行流,但它還是會使正常的堆操作出錯,導致不可預知的結果。

1.3 更改函數指針

指針在C、C++等程序語言中使用得非常頻繁,空指針可以指向任何對象的特性使得指針的使用更加靈活,但同時也需要人們對指針的使用更加謹慎小心,特別是空的函數指針,它可以使程序執行轉移到任何地方。攻擊者充分利用了指針的這些特性,千方百計地溢出與指針相鄰的變量、緩存區,從而修改函數指針指向達到轉移程序執行流的目的。

1.4 溢出固定緩存區

C標準庫函數中提供了一對長跳轉函數setjmp/longjmp來進行程序執行流的非局部跳轉,意思是在某一個檢查點設置setjmp(buffer),在程序執行過程中用longjmp(buffer)使程序執行流跳到先前設置的檢查點。它們跟函數指針有些相似,在給用戶提供了方便性的同時也帶來了安全隱患,攻擊者同樣只需找一個與longjmp(buffer)相鄰的緩存區並使它溢出,這樣就能跳轉到攻擊者要運行的代碼空間。典型的例子有Perl5.003的緩衝區溢出漏洞,攻擊者首先進入用來恢復緩衝區溢出的longjmp緩衝區,然後誘導進入恢復模式,這樣就使Perl的解釋器跳轉到攻擊代碼上了。

2. 防範緩衝區溢出

緩衝區溢出是代碼中固有的漏洞,除了在開發階段要注意編寫正確的代碼之外,對於用戶而言,一般的防範錯誤爲

  1. 關閉端口或服務。管理員應該知道自己的系統上安裝了什麼,並且哪些服務正在運行
  2. 安裝軟件廠商的補丁,漏洞一公佈,大的廠商就會及時提供補丁
  3. 在防火牆上過濾特殊的流量,無法阻止內部人員的溢出攻擊
  4. 自己檢查關鍵的服務程序,看看是否有可怕的漏洞
  5. 以所需要的最小權限運行軟件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章