簡體   English   中英

可以使用哪些硬件或軟件解決方案來防止堆棧溢出?

[英]What hardware or software solutions can be used to prevent of stack overflows?

什么是防止堆棧溢出的硬件解決方案? 例如,當我們想要設計一個新的操作系統時,我們如何防止堆棧溢出?

謝謝

如果可以靜態地確認代碼不具有任何直接或間接遞歸,則靜態分析可以產生最壞情況的堆棧使用。 確保堆棧足夠大並且不會有任何堆棧溢出。 最大的困難是可能很難確定哪些函數指針可以調用哪些函數。 例如,如果一個函數指針可以指向foo1()或foo2(),另一個可以指向bar1()或bar2(),而foo1()調用第二個函數指針(因此到達bar1或bar2)則不會遞歸的可能性,但如果編譯器無法確定第二個指針只能指向bar1()或bar2(),它可能不知道。

如果可以確定應用程序是非遞歸的,並且如果靜態分析最壞情況調用圖並不比實際發生的情況差太多,則可以完全避免堆棧並靜態分配所有變量。 在某些情況下(特別是在沒有有效索引的架構上),與使用堆棧相比,這種方法可以顯着提高性能。

從安全角度來看,避免堆棧/緩沖區溢出攻擊的一種好方法是避免將實際程序計數器地址存儲在“正常”指針可以訪問的任何地方。 將程序計數器堆棧與參數/自動變量堆棧完全分開存儲,並且不直接存儲任何函數指針。 相反,每個“函數指針”都是具有相同簽名的函數表的索引,並在使用之前檢查索引以確保它在范圍內; 如果兩個或多個函數組具有不同的安全含義並且應該由完全不同的指針調用,則根據需要調整一個組的簽名以使其與另一個組不同(因此對第一組中的函數的調用不能是轉換為對第二個函數的調用)。

哈佛架構為堆棧溢出攻擊提供了一些保護。 哈佛架構計算機是否能夠免受任意代碼注入和執行攻擊?

但是,在操作系統級別,您可能需要考慮使用不可執行的堆棧

您可能會感到驚訝,但其中一個選項是無堆棧硬件架構 (實際或模擬)( 在此討論 )。 顯然,沒有堆棧 - 沒有堆棧溢出。

當堆棧處於預定閾值時,一些微控制器提供硬件陷阱。 這可以用於正常關閉,或者將堆棧分頁到外部RAM並重新啟動。 有一個類似的“下溢”陷阱來重新填充舊堆棧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM