緩衝區溢位

緩衝區溢出(buffer overflow),在電腦學上是指針對程序設計缺陷,向程序輸入緩衝區寫入使之溢出的內容(通常是超過緩衝區能保存的最大數據量的數據),從而破壞程序運行、趁著中斷之際並取得程序乃至系統的控制權。

buffer overflow」的各地常用名稱
中國大陸緩衝區溢出
臺灣緩衝區溢位

緩衝區溢出原指當某個數據超過了處理程序回傳堆疊位址限制的範圍時,程序出現的異常操作。造成此現象的原因有:

  • 存在缺陷的程序設計
  • 尤其是C語言,不像其他一些高級語言會自動進行數組或者指針的堆疊區塊邊界檢查,增加溢出風險。
  • C語言中的C標準庫還具有一些非常危險的操作函數,使用不當也為溢出創造條件。
  • 不當的堆積操作可能造成迷途指針,可以透過特殊的堆排佈(heap feng shui)取得緩衝區的堆區塊(heap chunk),改變緩衝區邊界並創造堆溢出的條件。

黑客Unix的內核發現通過緩衝區溢出可以控制內核空間劫持控制流程獲得系統的最高等級權限,而成為攻擊手段之一。也有人發現相同的問題也會出現在Windows操作系統上,以致其成為黑客最為常用的攻擊手段,蠕蟲病毒利用操作系統高危漏洞進行的破壞與大規模傳播均是利用此技術。比較知名的蠕蟲病毒衝擊波蠕蟲,就基於Windows操作系統的緩衝區溢出漏洞。

例如一個用途是對SONY的掌上遊戲機PSP-3000的破解,通過特殊的溢出圖片,PSP可以運行非官方的程序與遊戲。同樣在諾基亞智能手機操作系統Symbian OS中發現漏洞用戶可以突破限制運行需要DRM權限或文件系統權限等系統權限的應用程序。

緩衝區溢出攻擊從理論上來講可以用於攻擊任何有相關缺陷的程序,包括對殺毒軟件防火牆等安全產品的攻擊以及對銀行程序的攻擊。在嵌入式設備系統上也可能被利用,例如PSP智能手機等。

在部分情況下,當一般程序(除了驅動和操作系統內核)發生此類問題時,C++運行時庫通常會終止程序的執行。

作業系統層級的保護

目前OpenBSDLinuxWindowsMac OS等作業系統都具有buffer overflow protection(緩衝區溢位保護/記憶體位置重新定向)功能[來源請求],Linux 提供了參數 CONFIG_CC_STACKPROTECTOR 來啟用 stack canary 的對內核進行保護[1],這類機制可以用於檢測堆疊緩衝區是否發溢出,其他的保護機制基於記憶體位址重新定向,如Linux在4.12版本預設啟用核心位址空間組態隨機載入(KASLR)[2],在某種程度上可以保護作業系統,但仍還是有辦法讓溢出的代碼到正確的位置上。其作用原理是:記憶體跟處理程序在memory中受到保護。內對外的access memory對象位置會被核心(排程器)隨機定向,使其無法正確溢出。

參見

參考文獻

  1. ^ Kernel Self-Protection. kernel.org. [2024-07-17]. (原始內容存檔於2024-07-17). 
  2. ^ Linux 4.12 To Enable KASLR By Default - Phoronix. [2017-12-25]. (原始內容存檔於2022-06-25). 

外部連結