2014-09-13 29 views
1

我只是通過後面的緩衝區溢出攻擊的邏輯去和相關的保護機制提供內核版本以上的UNIX 2.6,以避免緩衝區溢出攻擊(地址隨機化和堆棧粉碎保護) 。可行性繞道地址隨機化和堆棧粉碎保護 - 緩衝區溢出攻擊

在每次我們繼續禁用地址隨機化(將內核地址隨機分配'0')和堆棧粉碎保護(包括編譯時的-fno-stack-protector)來分析緩衝區溢出攻擊時。

只是好奇去了解,是否有可用的,而無需做上述只是通過禁用,而它仍然執行提到的兩個活動的任何旁路保護機制。如果有這樣的機制,聽聽會不會很高興,你可以幫忙解決。

回答

0

我知道的避免緩衝區溢出的最好辦法就是要利用100%完全詳盡的單元測試檢查任何大小和類型的緩衝涉及的任何功能。當然,這並不總是現實的。

「窮舉」意味着所有可能的情況都被考慮在內,無論您的應用程序在您首次編寫代碼時是否會生成所有這些特定情況。

雖然有工具可以幫助你在那個舞臺上。有些自動化程度很高,會自動生成單元測試。我從來沒有嘗試過其中一種,所以我不能保證其中任何一種,但是如果你處於緊張時期,那可能會有所幫助。

的另一種方式,這在一定程度的工作原理是在其上運行代碼的靜態分析。 Code Coverity是我過去使用過的,但也有很多其他的。在大多數情況下,靜態分析只能抓到,你聲明在棧上的靜態緩存中的問題:

char buf[256]; 
... 
char a = buf[256]; // <- bug here, although not too bad 
buf[256] = a;  // <- bug here, could be bad, you're writing to the stack! 

現在... Unix下你有兩個問題緩衝區溢出。它會在大多數情況下讓你的系統崩潰。但是,如果黑客可以訪問你的代碼,他們可能會調用一個特定的系統函數(一個內核函數,要清楚)。在這種情況下,如果您的進程以高級用戶運行(即最壞的情況:root),則可能存在問題。那時黑客可能已經獲得了一些權限,可以在沒有授權的情況下做更多的事情。爲了消除這種風險,你有兩個主要的解決方案:

  1. 使用chroot環境;這可能很難建立,如果你是Linux新手,但適用於虛擬所有Unix系統
  2. 使用VirtualBox虛擬環境(或一些其它的虛擬系統,如QEMU);獲得這樣的環境設置通常很容易,但如果您想自動生成新的環境......有一個API,它可能很乏味。

有一個最後的方式,但是這可能會很慢。 CPU有一個MMU。您可以使用MMU來保護/取消保護內存,並確保每次讀取和寫入都發生在分配的緩衝區中(在堆棧中,幀緩衝區用於確保您位於正確的窗口內)。可以想象,對於每次寫入(可能還有很多次讀取),您會得到一箇中斷並且處理程序不會很小。調試具有許多緩衝區溢出的軟件是一個很好的工具/想法,但通常它不適用於生產。

不幸的是,這些選項在默認情況下都不是g ++套件的一部分。