書名: C和C++安全編碼(原書第2版)作者名: (美)Robert C.Seacord本章字數: 667字更新時間: 2020-10-30 17:56:46
2.6.6 棧溢出保護器
在4.1版本中,GCC引入了棧溢出保護(SSP)的功能,它實現了來自StackGuard的探測儀[Etoh 2000]。SSP也被稱為ProPolice,它是GCC的一個擴展,用以保護用C編寫的應用程序免遭大多數常見形式的棧緩沖區溢出的漏洞利用,它以GCC的中間語言翻譯器的形式實現。SSP提供了緩沖區溢出檢測和變量重排序技術來防止對指針的破壞。特別是,SSP對局部變量重排序,將緩沖區放到指針后面,并且將函數參數中的指針復制到局部變量緩沖區之前的區域,從而防止了對指針的破壞(這些指針可被用于進一步破壞任意內存位置)。
SSP特性通過GCC的命令行參數啟用,-fstack-protector和-fno-stack-protector選項可以為帶有易受攻擊的對象(如數組)的函數打開或關閉棧溢出保護。-fstack-protector-all和-fno-stack-protector-all選項可以打開或關閉對每一個函數的保護,而不僅僅局限于對具有字符數組的函數的保護。最后,使用-fstack-protector時,-Wstack-protector option選項對沒有獲得棧保護的函數發出警告。
SSP的工作原理是引入一個探測儀變量,以檢測對棧上的參數、返回地址和前面的幀指針的改變。SSP用如下步驟將代碼片段插入到合適的位置:在應用程序初始化期間,產生一個隨機數作為哨位值,以防止未授權用戶的窺探。遺憾的是,這個動作很容易耗盡系統的熵。
SSP還提供了一種更安全的棧結構,如圖2.18所示。
圖2.18 棧溢出保護(SSP)棧結構
此結構建立了以下限制:
·位置(A)沒有數組或指針變量。
·位置(B)有數組或包含數組的結構。
·位置(C)沒有數組。
將哨位放到包含數組的數據區(B)后面可以阻止對參數、返回地址、前幀指針(previous frame pointer)或局部變量(不包括其他數組)進行覆蓋的緩沖區溢出攻擊。例如,編譯器不能重新排列struct成員,所以如下類型的棧對象仍未得到保護。
1 struct S { 2 char buffer[40]; 3 void (*f)(struct S*); 4 };
- Visual Basic .NET程序設計(第3版)
- ASP.NET Web API:Build RESTful web applications and services on the .NET framework
- JavaScript高效圖形編程
- TypeScript Blueprints
- Drupal 8 Blueprints
- Java Web及其框架技術
- C語言程序設計
- Android NDK Beginner’s Guide
- Gradle for Android
- Scala Reactive Programming
- Vue.js應用測試
- Python Interviews
- JavaScript程序設計:基礎·PHP·XML
- Training Systems Using Python Statistical Modeling
- WebStorm Essentials