緩衝區溢位攻擊:定義、型別及如何避免


什麼是緩衝區溢位?

當向緩衝區寫入的資料量超過其容量時,就會發生緩衝區溢位。多餘的資料會被寫入到相鄰的記憶體中,覆蓋該位置的內容,並導致程式結果不可預測。緩衝區溢位發生在資料寫入時沒有進行充分的驗證(沒有邊界檢查)的情況下。它被視為軟體中的一個缺陷或漏洞。

透過在資料集的初始部分引入專門設計用來導致緩衝區溢位的程式碼,攻擊者可以利用緩衝區溢位問題,然後將剩餘的資料寫入溢位緩衝區相鄰的記憶體地址。

溢位的資料可能包含可執行程式碼,允許攻擊者執行更大、更復雜的程式或獲得系統訪問許可權。

緩衝區溢位是攻擊者可能利用的最致命的漏洞之一,部分原因在於它們難以檢測和修復,尤其是在包含數百萬行程式碼的軟體中。即使是這些錯誤的修復也複雜且容易出錯。因此,消除此類問題幾乎是不可能的。

即使許多程式設計師意識到程式中緩衝區溢位的風險,但在新舊軟體中仍然存在許多與緩衝區溢位相關的危害,無論已經實施了多少補丁。

緩衝區到底是什麼?

緩衝區,也稱為資料緩衝區,是用於臨時儲存資料的物理記憶體儲存區域。同時,它正在從一個位置傳輸到另一個位置。這些緩衝區通常儲存在 RAM 中。計算機經常使用緩衝區來提高效能;大多數當前的硬碟驅動器都使用緩衝區來更快地檢索資料,並且許多線上服務也這樣做。例如,緩衝區被廣泛用於防止網際網路影片流中斷。當影片流式傳輸時,影片播放器首先下載並存儲大約 20% 的影片到緩衝區中,然後從該緩衝區進行流式傳輸。連線速度的微小下降或短暫的服務中斷不會影響影片流的效能。

緩衝區用於儲存特定數量的資訊。除非使用緩衝區的程式具有內建指令在傳送過多資料時丟棄資料,否則緩衝區相鄰記憶體中的資料將被覆蓋。

攻擊者可以利用緩衝區溢位來破壞軟體。緩衝區溢位攻擊儘管已被充分理解,但仍然是一個嚴重的安全問題,困擾著網路安全團隊。由於 SSL 軟體中的緩衝區溢位漏洞,2014 年一個稱為“心臟出血”的威脅使數億人面臨攻擊。

緩衝區溢位攻擊的型別

緩衝區溢位攻擊有多種形式。用於利用緩衝區溢位漏洞的作業系統 (OS) 和程式語言有所不同。目標始終是透過操縱計算機的記憶體來顛覆或控制程式執行。

緩衝區溢位根據緩衝區在程序記憶體中的位置進行分類。基於堆疊或基於堆的溢位最為常見。兩者都儲存在裝置的隨機存取記憶體中。

以下是緩衝區溢位攻擊的示例。

基於堆疊的緩衝區溢位

它通常被稱為**堆疊緩衝區溢位**,一種緩衝區溢位攻擊。堆疊以後進先出結構儲存資料。它是一個連續的記憶體空間,用於排列與函式呼叫相關的資料,例如函式引數、函式區域性變數和管理資訊,如幀和指令指標。

堆疊通常為空,直到目標軟體請求使用者輸入,例如登入名或密碼。然後,程式在將使用者的輸入放在其頂部之前,將返回記憶體地址寫入堆疊。當處理堆疊時,使用者的輸入被傳輸到程式設定的返回地址。

另一方面,堆疊具有固定的大小。程式碼開發人員必須為堆疊預留一定數量的空間。如果使用者的輸入長度超過堆疊中指定的空間量,並且軟體未驗證輸入是否適合,則堆疊將溢位。這本身並不是一個重大問題,但當與惡意輸入結合時,它就成為一個主要的安全性漏洞。

基於堆的緩衝區溢位攻擊

堆是用於儲存和管理動態資料的記憶體結構。當請求的記憶體量過大以至於無法放入堆疊或記憶體旨在跨函式呼叫使用時,程式設計師通常使用堆來分配在編譯時大小未知的記憶體。基於堆的攻擊會淹沒程式或程序的記憶體區域。基於堆的漏洞,例如今年早些時候發現的 Google Chrome 零日漏洞,比堆疊攻擊更難以利用。

整數溢位攻擊

在整數長度限制內,當某些限制被超過時,結果可能是錯誤或不準確的結果。當整數用於算術運算,並且輸出值大於整數的最大大小時,就會發生整數溢位攻擊。例如,需要 8 位 RAM 來儲存數字 192。如果該過程將 64 加到此數字,則結果 256 將無法放入分配的記憶體中,因為它需要 9 位。

格式字串攻擊

透過利用字串格式化庫操作(如 printf 和 sprintf)來訪問和修改其他記憶體位置,攻擊者可以影響應用程式的執行方式。

Unicode 溢位攻擊

這些漏洞利用了以下事實:以 Unicode 格式儲存字串比以 ASCII 字元儲存字串需要更多的記憶體。它們可以用來攻擊僅接受 ASCII 字元作為輸入的程式。

緩衝區溢位 - 如何避免它們

可以透過在開發程式碼中包含安全功能、採用具有內建保護的程式語言以及徹底測試程式碼以發現和糾正錯誤來避免緩衝區溢位。

  • 避免使用未進行邊界檢查的標準庫函式(如 gets、scanf 和 strcpy)是防止緩衝區溢位最常用的方法之一。另一種常見的防止緩衝區溢位的方法是在執行時實現邊界檢查。這確保自動將推送到緩衝區的資料保持在正確的邊界內。

  • 現代作業系統現在包括執行時保護,這為防止緩衝區溢位增加了額外的防禦層。這包括標準安全措施,例如 -

  • **地址空間佈局隨機化 (ASLR)** - 緩衝區溢位攻擊通常需要知道可執行程式碼位於何處。這就是地址空間佈局隨機化 (ASLR) 的作用。ASLR 將資料區域隨機移動到隨機地址空間,使溢位攻擊幾乎不可能。

  • **資料執行保護** - 此方法將記憶體部分標記為可執行或不可執行,從而防止攻擊在不可執行區域執行程式碼。

  • **結構化異常處理 (SEHOP) 的覆蓋保護** - 攻擊者可能會嘗試覆蓋結構化異常處理 (SEH),這是一種用於管理硬體和軟體異常的內建機制。他們透過使用基於堆疊的溢位攻擊覆蓋儲存在程式堆疊上的異常註冊記錄來做到這一點。SEHOP 防止惡意程式攻擊 SEH 並利用其覆蓋利用機制。

圍繞開發程式碼和作業系統的安全措施不足以保護組織的系統。當檢測到緩衝區溢位漏洞時,務必儘快修復軟體並將其提供給所有使用者。

更新於: 2022年5月30日

3K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告