目前有以下幾種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影響:1.
編寫正確的代碼:編寫正確的代碼是防止緩沖區溢出攻擊最直接最有效的方法,也是一件非常有意義的工作,特別是編寫像C語言那種具有容易出錯傾向的程序更顯得很有意義。然而,盡管花了很長的時間使得人們知道了如何編寫安全的程序組,但是具有安全漏洞的程序依舊出現。為此,人們又開發了一些工具和技術來幫助經驗不足的程序員編寫安全正確的程序代碼。最簡單的方法就是用grep來搜索源代碼中容易產生漏洞的庫的調用,然而依然有漏網之魚存在。為了應對這些問題,人們又開發了一些高級的查錯工具,如faultinjection等。這些工具的目的在于通過人為隨機地產生一些緩沖區溢出來尋找代碼的安全漏洞,還有一些靜態分析工具,用于偵測緩沖區溢出的存在。
非執行的緩沖區:通過使被攻擊程序的數據段地址空間不可執行,從而使得攻擊者不可能執行被植入被攻擊程序輸入緩沖區的代碼,這種技術被稱為非執行的緩沖區技術。事實上,很多舊的UNIX系統都是這樣設計的,但是近來的UNIX和Windows系統為實現更好的性能和功能,往往在數據段中動態地放入可執行的代碼,所以,為了保持程序的兼容性,不可能使得所有程序的數據段不可執行。針對這一問題,用戶可以設定堆棧數據段不可執行,這樣就可以最大限度地保證了程序的兼容性。Linux和Windows都發布了有關這方面的內核補丁,因為幾乎沒有任何合法的程序會在堆棧中存放代碼,這種做法幾乎不產生任何兼容性問題,但是在Linux中的兩個特例中,可執行的代碼必須被放入堆棧中,因此這個方法雖好,但還是不能完全地杜絕所有的緩沖區溢出漏洞的攻擊。
數組邊界檢查:數組邊界檢查能防止所有的緩沖區溢出的產生和攻擊。這是因為只要數組不能被溢出,也就是說,如果數據不允許超過長度,溢出攻擊也就無從談起。為了實現數組邊界檢查,就需要把所有對數組的讀寫操作都檢查一遍,以確保對數組的操作在正確的范圍。最直接的方法是檢查所有的數組操作,但是通常可以來用一些優化的技術來減少檢查的次數。
程序指針完整性檢查:程序指針完整性檢查和邊界檢查有略微的不同。與防止程序指針被改變不同,程序指針完整性檢查在程序指針被引用之前檢測到它的改變。因此,即便一個攻擊者成功地改變程序的指針,由于系統事先檢測到了指針的改變,因此這個指針將不會被使用。與數組邊界檢查相比,這種方法不能解決所有的緩沖區溢出問題;采用其他的緩沖區溢出方法就可以避免這種檢測。但是這種方法在性能上有很大的優勢,而且兼容性也很好。
回答所涉及的環境:聯想天逸510S、Windows 10。
目前有以下幾種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影響:1.
編寫正確的代碼:編寫正確的代碼是防止緩沖區溢出攻擊最直接最有效的方法,也是一件非常有意義的工作,特別是編寫像C語言那種具有容易出錯傾向的程序更顯得很有意義。然而,盡管花了很長的時間使得人們知道了如何編寫安全的程序組,但是具有安全漏洞的程序依舊出現。為此,人們又開發了一些工具和技術來幫助經驗不足的程序員編寫安全正確的程序代碼。最簡單的方法就是用grep來搜索源代碼中容易產生漏洞的庫的調用,然而依然有漏網之魚存在。為了應對這些問題,人們又開發了一些高級的查錯工具,如faultinjection等。這些工具的目的在于通過人為隨機地產生一些緩沖區溢出來尋找代碼的安全漏洞,還有一些靜態分析工具,用于偵測緩沖區溢出的存在。
非執行的緩沖區:通過使被攻擊程序的數據段地址空間不可執行,從而使得攻擊者不可能執行被植入被攻擊程序輸入緩沖區的代碼,這種技術被稱為非執行的緩沖區技術。事實上,很多舊的UNIX系統都是這樣設計的,但是近來的UNIX和Windows系統為實現更好的性能和功能,往往在數據段中動態地放入可執行的代碼,所以,為了保持程序的兼容性,不可能使得所有程序的數據段不可執行。針對這一問題,用戶可以設定堆棧數據段不可執行,這樣就可以最大限度地保證了程序的兼容性。Linux和Windows都發布了有關這方面的內核補丁,因為幾乎沒有任何合法的程序會在堆棧中存放代碼,這種做法幾乎不產生任何兼容性問題,但是在Linux中的兩個特例中,可執行的代碼必須被放入堆棧中,因此這個方法雖好,但還是不能完全地杜絕所有的緩沖區溢出漏洞的攻擊。
數組邊界檢查:數組邊界檢查能防止所有的緩沖區溢出的產生和攻擊。這是因為只要數組不能被溢出,也就是說,如果數據不允許超過長度,溢出攻擊也就無從談起。為了實現數組邊界檢查,就需要把所有對數組的讀寫操作都檢查一遍,以確保對數組的操作在正確的范圍。最直接的方法是檢查所有的數組操作,但是通常可以來用一些優化的技術來減少檢查的次數。
程序指針完整性檢查:程序指針完整性檢查和邊界檢查有略微的不同。與防止程序指針被改變不同,程序指針完整性檢查在程序指針被引用之前檢測到它的改變。因此,即便一個攻擊者成功地改變程序的指針,由于系統事先檢測到了指針的改變,因此這個指針將不會被使用。與數組邊界檢查相比,這種方法不能解決所有的緩沖區溢出問題;采用其他的緩沖區溢出方法就可以避免這種檢測。但是這種方法在性能上有很大的優勢,而且兼容性也很好。
回答所涉及的環境:聯想天逸510S、Windows 10。