針對棧溢出攻擊的預防措施有以下這些:
地址空間隨機化:顧名思義,程序每次加載到的內存位置是隨機的,所以,即使可以利用棧溢出控制函數的返回地址,但是無法確定惡意代碼的位置,因此,可以有效地防范棧溢出攻擊。
不可執行棧:不可執行棧的基本原理是將數據所在的內存頁標記為不可執行的,當進程嘗試去執行數據頁面上的指令時,CPU就會拋出異常,而不是去執行。所以,當開啟了不可執行棧選項時,即使我們的惡意代碼已經插入到內存,但由于處在數據頁面,因此無法執行從而實現防御攻擊。
Stack Guard:具體是再緩沖區(如:棧)和控制信息(如 ebp等)間插入一個canary word。這樣,當緩沖區溢出時,再返回地址被覆蓋之前canary word會首先被覆蓋,通過檢測canary word的值是否被修改,就可以判斷是否發生了溢出,如果出現溢出則進行終止溢出的進程來進行防御。
使用模糊識別檢測:由于溢出類漏洞的填充數據對于攻擊本身是沒有意義的,即只是用來占位以達到數據長度的目的,這部分一般會被攻擊者以習慣模式填充(如多個字符重復多遍),而這部分數據在正常訪問情況下,是外部輸入中有意義的部分。另外輸入的shellcode和跳轉地址部分與正常的輸入一般情況下也有差別,基于這些差別可以建立起來模糊識別的模型,用于檢測對未知漏洞的攻擊。
使用基于虛擬技術的檢測技術:對于安全性要求很高、需要重點防護的系統,基于漏洞特征與攻擊特征的防御難免還有漏網之魚。就像Honey Pot系統可以用真實的系統做誘餌也可以虛擬一個誘餌系統一樣,防御設備也可以虛擬一個跟真實系統相近的系統,用于檢測對系統的訪問是否存在攻擊。