DEP機制的保護原理
溢出攻擊的根源在于現代計算機對數據和代碼沒有明確區分這一先天缺陷,就目前來看重新去設計計算機體系結構基本上是不可能的,我們只能靠向前兼容的修補來減少溢出帶來的損害,DEP(數據執行保護,Data Execution Prevention)就是用來彌補計算機對數據和代碼混淆這一天然缺陷的。
DEP的基本原理是將數據所在內存頁標識為不可執行,當程序溢出成功轉入shellcode時,程序會嘗試在數據頁面上執行指令,此時CPU就會拋出異常,而不是去執行惡意指令。如圖1所示。
圖1 DEP工作原理
DEP 的主要作用是阻止數據頁(如默認的堆頁、各種堆棧頁以及內存池頁)執行代碼。微軟從Windows XP SP2開始提供這種技術支持,根據實現的機制不同可分為:軟件DEP(Software DEP)和硬件DEP(Hardware-enforced DEP)。
軟件DEP其實就是我們前面介紹的SafeSEH,它的目的是阻止利用S.E.H的攻擊,這種機制與CPU硬件無關,Windows利用軟件模擬實現DEP,對操作系統提供一定的保護。現在大家明白為什么在SafeSEH的校驗過程中會檢查異常處理函數是否位于非可執行頁上了吧。
硬件DEP才是真正意義的DEP,硬件DEP需要CPU的支持,AMD和Intel都為此做了設計,AMD稱之為No-Execute Page-Protection (NX),Intel稱之為Execute Disable Bit (XD) ,兩者功能及工作原理在本質上是相同的。
操作系統通過設置內存頁的NX/XD屬性標記,來指明不能從該內存執行代碼。為了實現這個功能,需要在內存的頁面表(Page Table)中加入一個特殊的標識位(NX/XD)來標識是否允許在該頁上執行指令。當該標識位設置為0里表示這個頁面允許執行指令,設置為1時表示該頁面不允許執行指令。
由于軟件DEP就是傳說中的SafeSEH,關于SafeSEH的突破前面我們已經介紹過,所以在這一節中我們只對硬件DEP進行討論和分析。
大家可以通過如下方法檢查CPU是否支持硬件DEP,右鍵單擊桌面上的"我的電腦"圖標,選擇"屬性",在打開的"系統屬性"窗口中點擊"高級"選項卡。在"高級"選項卡頁面中的"性能"下單擊"設置"打開"性能選項"頁。單擊"數據執行保護"選項卡,在該頁面中我們可確認自己計算機的CPU是否支持DEP。如果CPU不支持硬件DEP該頁面底部會有如下類似提示:"您的計算機的處理器不支持基于硬件的DEP。但是,Windows可以使用DEP軟件幫助保護免受某些類型的攻擊"。如圖2所示。
圖2 Windows 2003下DEP選項頁示例#p#
根據啟動參數的不同,DEP工作狀態可以分為四種。
(1)Optin:默認僅將DEP保護應用于Windows系統組件和服務,對于其他程序不予保護,但用戶可以通過應用程序兼容性工具(ACT,Application Compatibility Toolkit)為選定的程序啟用DEP,在Vista下邊經過/NXcompat選項編譯過的程序將自動應用DEP。這種模式可以被應用程序動態關閉,它多用于普通用戶版的操作系統,如Windows XP、Windows Vista、Windows7。
(2)Optout:為排除列表程序外的所有程序和服務啟用DEP,用戶可以手動在排除列表中指定不啟用DEP保護的程序和服務。這種模式可以被應用程序動態關閉,它多用于服務器版的操作系統,如 Windows 2003、Windows 2008。
(3)AlwaysOn:對所有進程啟用DEP 的保護,不存在排序列表,在這種模式下,DEP不可以被關閉,目前只有在64位的操作系統上才工作在AlwaysOn模式。
(4)AlwaysOff:對所有進程都禁用DEP,這種模式下,DEP也不能被動態開啟,這種模式一般只有在某種特定場合才使用,如DEP干擾到程序的正常運行。
我們可以通過切換圖.2中的復選框切換Optin和Optout兩種模式。還可以通過修改c:\boot.ini中的/noexecute啟動項的值來控制DEP的工作模式。如圖3所示,DEP在該操作系統上的工作模式為Optout。
圖3 Windows 2003下DEP默認啟動狀態
介紹完DEP的工作原理及狀態后,我們來看一個和DEP密切相關的程序鏈接選項:/NXCOMPAT。/NXCOMPAT是Visual Studio 2005及后續版本中引入一個鏈接選項,默認情況下是開啟的。在本書中使用的Visual Studio 2008 (VS 9.0)中,可以在通過菜單中的Project→project Properties→Configuration Properties→Linker→Advanced→Data Execution Prevention (DEP)中選擇是不是使用/NXCOMPAT編譯程序,如圖4所示。
圖4 VS 2008中設置/NXCOMPAT編譯選項
采用/NXCOMPAT編譯的程序會在文件的PE頭中設置IMAGE_DLLCHARACTERISTICS_ NX_COMPAT標識,該標識通過結構體IMAGE_OPTIONAL_HEADER中的DllCharacteristics變量進行體現,當DllCharacteristics設置為0x0100表示該程序采用了/NXCOMPAT編譯。關于結構體IMAGE_OPTIONAL_HEADER的詳細說明大家可以查閱MSDN相關資料,在這我們就不過多討論了。
經過/NXCOMPAT編譯的程序有什么好處呢?通過前面的介紹我們知道用戶版的操作系統中DEP一般工作在Optin狀態,此時DEP只保護系統核心進程,而對于普通的程序是沒有保護的。雖然用戶可以通過工具自行添加,但這無形中增高了安全的門檻,所以微軟推出了/NXCOMPAT編譯選項。經過/NXCOMPAT編譯的程序在Windows vista及后續版本的操作系統上會自動啟用DEP保護。
DEP針對溢出攻擊的本源,完善了內存管理機制。通過將內存頁設置為不可執行狀態,來阻止堆棧中shellcode的執行,這種釜底抽薪的機制給緩沖溢出帶來了前所未有的挑戰。這也是迄今為止在本書中我們遇到的最有力的保護機制,它能夠徹底阻止緩沖區溢出攻擊么?答案是否定的。#p#
如同前面介紹的安全機制一樣,DEP也有著自身的局限性。
首先,硬件DEP需要CPU的支持,但并不是所有的CPU都提供了硬件DEP的支持,在一些比較老的CPU上邊DEP是無法發揮作用的。
其次,由于兼容性的原因Windows不能對所有進程開啟DEP保護,否則可能會出現異常。例如一些第三方的插件DLL,由于無法確認其是否支持DEP,對涉及這些DLL的程序不敢貿然開啟DEP保護。再有就是使用ATL 7.1或者以前版本的程序需要在數據頁面上產生可以執行代碼,這種情況就不能開啟DEP保護,否則程序會出現異常。
再次,/NXCOMPAT編譯選項,或者是IMAGE_DLLCHARACTERISTICS_NX_COMPAT的設置,只對Windows Vista 以上的系統有效。在以前的系統上,如Windows XP SP3等,這個設置會被忽略。也就是說,即使采用了該鏈接選項的程序在一些操作系統上也不會自動啟用DEP保護。
最后,當DEP工作在最主要的兩種狀態Optin和Optout下時,DEP是可以被動態關閉和開啟的,這就說明操作系統提供了某些API函數來控制DEP的狀態。同樣很不幸的是早期的操作系統中對這些API函數的調用沒有任何限制,所有的進程都可以調用這些API函數,這就埋下了很大的安全隱患,也為我們突破DEP提供了一條道路。
本文節選自《0day安全:軟件漏洞分析技術(第2版)》一書。《0day安全:軟件漏洞分析技術(第2版)》一書已由電子工業出版社正式出版,本書由王清等編著。
內容簡介
本書分為5篇33章,系統、全面地介紹了Windows平臺緩沖區溢出漏洞的分析、檢測與防護。第一篇為漏洞exploit的基礎理論和初級技術,可以引領讀者迅速入門;第二篇在第一篇的基礎上,結合國內外相關研究者的前沿成果,對漏洞技術從攻、防兩個方面進行總結;第三篇站在安全測試者的角度,討論了幾類常用軟件的漏洞挖掘方法與思路;第四篇則填補了本類書籍在Windows內核安全及相關攻防知識這個神秘領域的技術空白;第五篇以大量的0 day案例分析,來幫助讀者理解前四篇的各類思想方法。
本書可作為網絡安全從業人員、黑客技術發燒友的參考指南,也可作為網絡安全專業的研究生或本科生的指導用書。
友情提示:
對于本書其他樣章以及較詳細的介紹,您可以訪問:http://book.51cto.com/art/201107/275126.htm