圖1 DEP工作原理

DEP 的主要作用是阻止數(shù)據(jù)頁(yè)(如默認(rèn)的堆頁(yè)、各種堆棧頁(yè)以及內(nèi)存池頁(yè))執(zhí)行代碼。微軟從Windows XP SP2開(kāi)始提供這種技術(shù)支持,根據(jù)實(shí)現(xiàn)的機(jī)制不同可分為:軟件DEP(Software DEP)和硬件DEP(Hardware-enforced DEP)。

軟件DEP其實(shí)就是我們前面介紹的SafeSEH,它的目的是阻止利用S.E.H的攻擊,這種機(jī)制與CPU硬件無(wú)關(guān),Windows利用軟件模擬實(shí)現(xiàn)DEP,對(duì)操作系統(tǒng)提供一定的保護(hù)?,F(xiàn)在大家明白為什么在SafeSEH的校驗(yàn)過(guò)程中會(huì)檢查異常處理函數(shù)是否位于非可執(zhí)行頁(yè)上了吧。

硬件DEP才是真正意義的DEP,硬件DEP需要CPU的支持,AMD和Intel都為此做了設(shè)計(jì),AMD稱之為No-Execute Page-Protection (NX),Intel稱之為Execute Disable Bit (XD) ,兩者功能及工作原理在本質(zhì)上是相同的。

操作系統(tǒng)通過(guò)設(shè)置內(nèi)存頁(yè)的NX/XD屬性標(biāo)記,來(lái)指明不能從該內(nèi)存執(zhí)行代碼。為了實(shí)現(xiàn)這個(gè)功能,需要在內(nèi)存的頁(yè)面表(Page Table)中加入一個(gè)特殊的標(biāo)識(shí)位(NX/XD)來(lái)標(biāo)識(shí)是否允許在該頁(yè)上執(zhí)行指令。當(dāng)該標(biāo)識(shí)位設(shè)置為0里表示這個(gè)頁(yè)面允許執(zhí)行指令,設(shè)置為1時(shí)表示該頁(yè)面不允許執(zhí)行指令。

由于軟件DEP就是傳說(shuō)中的SafeSEH,關(guān)于SafeSEH的突破前面我們已經(jīng)介紹過(guò),所以在這一節(jié)中我們只對(duì)硬件DEP進(jìn)行討論和分析。

大家可以通過(guò)如下方法檢查CPU是否支持硬件DEP,右鍵單擊桌面上的"我的電腦"圖標(biāo),選擇"屬性",在打開(kāi)的"系統(tǒng)屬性"窗口中點(diǎn)擊"高級(jí)"選項(xiàng)卡。在"高級(jí)"選項(xiàng)卡頁(yè)面中的"性能"下單擊"設(shè)置"打開(kāi)"性能選項(xiàng)"頁(yè)。單擊"數(shù)據(jù)執(zhí)行保護(hù)"選項(xiàng)卡,在該頁(yè)面中我們可確認(rèn)自己計(jì)算機(jī)的CPU是否支持DEP。如果CPU不支持硬件DEP該頁(yè)面底部會(huì)有如下類似提示:"您的計(jì)算機(jī)的處理器不支持基于硬件的DEP。但是,Windows可以使用DEP軟件幫助保護(hù)免受某些類型的攻擊"。如圖2所示。

圖2  Windows 2003下DEP選項(xiàng)頁(yè)示例

圖2 Windows 2003下DEP選項(xiàng)頁(yè)示例

根據(jù)啟動(dòng)參數(shù)的不同,DEP工作狀態(tài)可以分為四種。

(1)Optin:默認(rèn)僅將DEP保護(hù)應(yīng)用于Windows系統(tǒng)組件和服務(wù),對(duì)于其他程序不予保護(hù),但用戶可以通過(guò)應(yīng)用程序兼容性工具(ACT,Application Compatibility Toolkit)為選定的程序啟用DEP,在Vista下邊經(jīng)過(guò)/NXcompat選項(xiàng)編譯過(guò)的程序?qū)⒆詣?dòng)應(yīng)用DEP。這種模式可以被應(yīng)用程序動(dòng)態(tài)關(guān)閉,它多用于普通用戶版的操作系統(tǒng),如Windows XP、Windows Vista、Windows7。

(2)Optout:為排除列表程序外的所有程序和服務(wù)啟用DEP,用戶可以手動(dòng)在排除列表中指定不啟用DEP保護(hù)的程序和服務(wù)。這種模式可以被應(yīng)用程序動(dòng)態(tài)關(guān)閉,它多用于服務(wù)器版的操作系統(tǒng),如 Windows 2003、Windows 2008。

(3)AlwaysOn:對(duì)所有進(jìn)程啟用DEP 的保護(hù),不存在排序列表,在這種模式下,DEP不可以被關(guān)閉,目前只有在64位的操作系統(tǒng)上才工作在AlwaysOn模式。

(4)AlwaysOff:對(duì)所有進(jìn)程都禁用DEP,這種模式下,DEP也不能被動(dòng)態(tài)開(kāi)啟,這種模式一般只有在某種特定場(chǎng)合才使用,如DEP干擾到程序的正常運(yùn)行。

我們可以通過(guò)切換圖.2中的復(fù)選框切換Optin和Optout兩種模式。還可以通過(guò)修改c:boot.ini中的/noexecute啟動(dòng)項(xiàng)的值來(lái)控制DEP的工作模式。如圖3所示,DEP在該操作系統(tǒng)上的工作模式為Optout。

圖3  Windows 2003下DEP默認(rèn)啟動(dòng)狀態(tài)

圖3 Windows 2003下DEP默認(rèn)啟動(dòng)狀態(tài)

介紹完DEP的工作原理及狀態(tài)后,我們來(lái)看一個(gè)和DEP密切相關(guān)的程序鏈接選項(xiàng):/NXCOMPAT。/NXCOMPAT是Visual Studio 2005及后續(xù)版本中引入一個(gè)鏈接選項(xiàng),默認(rèn)情況下是開(kāi)啟的。在本書(shū)中使用的Visual Studio 2008 (VS 9.0)中,可以在通過(guò)菜單中的Project→project Properties→Configuration Properties→Linker→Advanced→Data Execution Prevention (DEP)中選擇是不是使用/NXCOMPAT編譯程序,如圖4所示。

圖4  VS 2008中設(shè)置/NXCOMPAT編譯選項(xiàng)

圖4 VS 2008中設(shè)置/NXCOMPAT編譯選項(xiàng)

采用/NXCOMPAT編譯的程序會(huì)在文件的PE頭中設(shè)置IMAGE_DLLCHARACTERISTICS_ NX_COMPAT標(biāo)識(shí),該標(biāo)識(shí)通過(guò)結(jié)構(gòu)體IMAGE_OPTIONAL_HEADER中的DllCharacteristics變量進(jìn)行體現(xiàn),當(dāng)DllCharacteristics設(shè)置為0x0100表示該程序采用了/NXCOMPAT編譯。關(guān)于結(jié)構(gòu)體IMAGE_OPTIONAL_HEADER的詳細(xì)說(shuō)明大家可以查閱MSDN相關(guān)資料,在這我們就不過(guò)多討論了。

經(jīng)過(guò)/NXCOMPAT編譯的程序有什么好處呢?通過(guò)前面的介紹我們知道用戶版的操作系統(tǒng)中DEP一般工作在Optin狀態(tài),此時(shí)DEP只保護(hù)系統(tǒng)核心進(jìn)程,而對(duì)于普通的程序是沒(méi)有保護(hù)的。雖然用戶可以通過(guò)工具自行添加,但這無(wú)形中增高了安全的門(mén)檻,所以微軟推出了/NXCOMPAT編譯選項(xiàng)。經(jīng)過(guò)/NXCOMPAT編譯的程序在Windows vista及后續(xù)版本的操作系統(tǒng)上會(huì)自動(dòng)啟用DEP保護(hù)。

DEP針對(duì)溢出攻擊的本源,完善了內(nèi)存管理機(jī)制。通過(guò)將內(nèi)存頁(yè)設(shè)置為不可執(zhí)行狀態(tài),來(lái)阻止堆棧中shellcode的執(zhí)行,這種釜底抽薪的機(jī)制給緩沖溢出帶來(lái)了前所未有的挑戰(zhàn)。這也是迄今為止在本書(shū)中我們遇到的最有力的保護(hù)機(jī)制,它能夠徹底阻止緩沖區(qū)溢出攻擊么?答案是否定的。

如同前面介紹的安全機(jī)制一樣,DEP也有著自身的局限性。

首先,硬件DEP需要CPU的支持,但并不是所有的CPU都提供了硬件DEP的支持,在一些比較老的CPU上邊DEP是無(wú)法發(fā)揮作用的。

其次,由于兼容性的原因Windows不能對(duì)所有進(jìn)程開(kāi)啟DEP保護(hù),否則可能會(huì)出現(xiàn)異常。例如一些第三方的插件DLL,由于無(wú)法確認(rèn)其是否支持DEP,對(duì)涉及這些DLL的程序不敢貿(mào)然開(kāi)啟DEP保護(hù)。再有就是使用ATL 7.1或者以前版本的程序需要在數(shù)據(jù)頁(yè)面上產(chǎn)生可以執(zhí)行代碼,這種情況就不能開(kāi)啟DEP保護(hù),否則程序會(huì)出現(xiàn)異常。

再次,/NXCOMPAT編譯選項(xiàng),或者是IMAGE_DLLCHARACTERISTICS_NX_COMPAT的設(shè)置,只對(duì)Windows Vista 以上的系統(tǒng)有效。在以前的系統(tǒng)上,如Windows XP SP3等,這個(gè)設(shè)置會(huì)被忽略。也就是說(shuō),即使采用了該鏈接選項(xiàng)的程序在一些操作系統(tǒng)上也不會(huì)自動(dòng)啟用DEP保護(hù)。

最后,當(dāng)DEP工作在最主要的兩種狀態(tài)Optin和Optout下時(shí),DEP是可以被動(dòng)態(tài)關(guān)閉和開(kāi)啟的,這就說(shuō)明操作系統(tǒng)提供了某些API函數(shù)來(lái)控制DEP的狀態(tài)。同樣很不幸的是早期的操作系統(tǒng)中對(duì)這些API函數(shù)的調(diào)用沒(méi)有任何限制,所有的進(jìn)程都可以調(diào)用這些API函數(shù),這就埋下了很大的安全隱患,也為我們突破DEP提供了一條道路。

分享到

zhenggaofeng

相關(guān)推薦