萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 健康知識

Windows Vista 記憶體保護機制深度剖析:SafeSEH 如何阻堵堆疊溢出攻擊

Windows Vista 在記憶體安全防護上大幅強化,其中 SafeSEH(安全結構化例外處理) 是核心機制之一。本文結合 Vista 核心原始碼分析與實測心得,深入探討 SafeSEH 運作原理、為何在 XP SP2 形同虛設、Vista 如何發揮實效,以及現存限制。

什麼是 SafeSEH?

堆疊溢出長期是 Windows 安全核心問題,覆蓋 SEH(結構化例外處理器)指標是經典利用手法。SafeSEH 旨在偵測並阻止堆疊中 SEH 被惡意覆蓋。它並非 Vista 新技術——XP SP2 已引入,但因需 .NET 編譯器產生支援 SafeSEH 的映像檔,而 XP SP2 系統核心組件多為非 .NET 編譯,導致 SafeSEH 在 XP SP2 幾乎無效,攻擊者只需覆蓋 SEH 指向非資料區地址即可繞過。

Vista 為何讓 SafeSEH 發威?

Vista 系統核心庫與執行檔 99% 以上由 .NET 編譯器編譯,預設即產生支援 SafeSEH 的映像檔。進程載入的系統模組幾乎皆具 SafeSEH 保護,覆蓋 SEH 指標將被嚴格檢查,傳統堆疊溢出利用鏈徹底失效。

SafeSEH 實現流程

載入階段

  1. 載入映像檔時,定位並讀取合法 SEH 函數表地址(不支援 SafeSEH 則為 0)。
  2. 使用共享使用者記憶體中的隨機數加密該地址。
  3. 將加密後的 SEH 表地址、映像基址、大小、合法 SEH 函數個數,作為一筆記錄存入 ntdll 的載入模組資料記憶體中。

例外處理階段

  1. 根據堆疊中 SEH 地址,確認是否屬於某映像檔位址空間。
  2. 若屬於,讀取 ntdll 記錄中的加密地址、基址、大小、函數個數。
  3. 從共享使用者記憶體取得隨機數解密,獲得真實 SEH 表地址。
  4. 地址非 0 表示支援 SafeSEH:依函數個數逐一計算合法 SEH 位址與當前 SEH 比對,符合則執行,全不符則拒絕執行並跳出。
  5. 地址為 0 表示不支援 SafeSEH:僅檢查該記憶體是否屬於映像檔 .code 區段,是則允許執行(核心空間未載入使用者資料地址理論不可執行,或為誤導研究者設計)。

安全性評估與潛在繞過

若進程所有模組皆支援 SafeSEH,覆蓋 SEH 利用幾乎不可能。Vista 99% 系統庫支援,配合 ASLR(位址空間佈局隨機化)深層防禦。理論繞過需同時滿足:知曉並可修改共享隨機數與 ntdll 加密地址、知曉 ntdll 載入基址(每次啟動不同),條件極苛刻。

現存問題與展望

  • 第三方程式庫若非 .NET 編譯,易導致 SafeSEH 失效,ASLR 可部分緩解。
  • .NET 2003 僅對 C++ 原生應用預設啟用 SafeSEH,托管代碼運行時生成不支援;期待 .NET 2005 或更新工具鏈完善支援。
copyright © 萬盛學電腦網 all rights reserved