緩沖區是內存存儲區域,在數據從一個位置傳輸到另一個位置時臨時保存數據。當數據量超過內存緩沖區的存儲容量時,就會發生緩沖區溢出(或buffer overrun)。結果,試圖將數據寫入緩沖區的程序會覆蓋相鄰的內存位置。
例如,用于登錄憑據的緩沖區可能設計為期望 8 字節的用戶名和密碼輸入,因此如果交易涉及 10 字節的輸入(即比預期多 2 字節),程序可能會寫入多余的部分超過緩沖區邊界的數據。
緩沖區溢出會影響所有類型的軟件。它們通常是由于格式錯誤的輸入或未能為緩沖區分配足夠的空間造成的。如果事務覆蓋可執行代碼,它可能導致程序行為不可預測并生成不正確的結果、內存訪問錯誤或崩潰。
什么是緩沖區溢出攻擊
攻擊者通過覆蓋應用程序的內存來利用緩沖區溢出問題。這會改變程序的執行路徑,觸發破壞文件或暴露隱私信息的響應。例如,攻擊者可能會引入額外代碼,向應用程序發送新指令以獲得對 IT 系統的訪問權限。
如果攻擊者知道程序的內存布局,他們可以故意提供緩沖區無法存儲的輸入,并覆蓋包含可執行代碼的區域,將其替換為他們自己的代碼。例如,攻擊者可以覆蓋指針(指向內存中另一個區域的對象)并將其指向漏洞利用負載,從而獲得對程序的控制權。
緩沖區溢出攻擊的類型
基于堆棧的緩沖區溢出更為常見,并且利用僅在函數執行期間存在的堆棧內存。基于堆的攻擊更難實施,并且涉及淹沒分配給程序的內存空間,超出當前運行時操作使用的內存。
哪些編程語言更容易受到攻擊?
C 和 C++ 是兩種極易受到緩沖區溢出攻擊的語言,因為它們沒有內置的保護措施來防止覆蓋或訪問內存中的數據。Mac OSX、Windows 和 Linux 都使用用 C 和 C++ 編寫的代碼。PERL、Java、JavaScript 和 C# 等語言使用內置的安全機制來最大限度地減少緩沖區溢出的可能性。
如何防止緩沖區溢出
開發人員可以通過代碼中的安全措施或使用提供內置保護的語言來防止緩沖區溢出漏洞。
此外,現代操作系統具有運行時保護。三種常見的保護是:
- 地址空間隨機化 (ASLR) — 在數據區域的地址空間位置周圍隨機移動。通常,緩沖區溢出攻擊需要知道可執行代碼的位置,而隨機化地址空間使這幾乎不可能。
- 數據執行預防 — 將內存的某些區域標記為不可執行或可執行,從而阻止在不可執行區域運行代碼的攻擊。
- 結構化異常處理程序覆蓋保護 (SEHOP) — 有助于阻止惡意代碼攻擊結構化異常處理 (SEH),這是一個用于管理硬件和軟件異常的內置系統。因此,它可以防止攻擊者利用 SEH 覆蓋利用技術。在功能層面,SEH 覆蓋是通過使用基于堆棧的緩沖區溢出來覆蓋存儲在線程堆棧中的異常注冊記錄來實現的。
代碼和操作系統保護方面的安全措施還不夠。當組織發現緩沖區溢出漏洞時,它必須迅速做出反應,為受影響的軟件打補丁,并確保軟件的用戶可以訪問補丁。