Windows Vista 在記憶體安全防護上大幅強化,其中 SafeSEH(安全結構化例外處理) 是核心機制之一。本文結合 Vista 核心原始碼分析與實測心得,深入探討 SafeSEH 運作原理、為何在 XP SP2 形同虛設、Vista 如何發揮實效,以及現存限制。
堆疊溢出長期是 Windows 安全核心問題,覆蓋 SEH(結構化例外處理器)指標是經典利用手法。SafeSEH 旨在偵測並阻止堆疊中 SEH 被惡意覆蓋。它並非 Vista 新技術——XP SP2 已引入,但因需 .NET 編譯器產生支援 SafeSEH 的映像檔,而 XP SP2 系統核心組件多為非 .NET 編譯,導致 SafeSEH 在 XP SP2 幾乎無效,攻擊者只需覆蓋 SEH 指向非資料區地址即可繞過。
Vista 系統核心庫與執行檔 99% 以上由 .NET 編譯器編譯,預設即產生支援 SafeSEH 的映像檔。進程載入的系統模組幾乎皆具 SafeSEH 保護,覆蓋 SEH 指標將被嚴格檢查,傳統堆疊溢出利用鏈徹底失效。
若進程所有模組皆支援 SafeSEH,覆蓋 SEH 利用幾乎不可能。Vista 99% 系統庫支援,配合 ASLR(位址空間佈局隨機化)深層防禦。理論繞過需同時滿足:知曉並可修改共享隨機數與 ntdll 加密地址、知曉 ntdll 載入基址(每次啟動不同),條件極苛刻。