使用DEP機(jī)制有助于防止計(jì)算機(jī)受到病毒和其他惡意程序的攻擊和破壞,DEP會(huì)讓計(jì)算機(jī)分配一部分內(nèi)存用來存儲(chǔ)數(shù)據(jù),分配另一部分內(nèi)存供程序使用。DEP可以監(jiān)控程序的運(yùn)行,保證其可以安全使用內(nèi)存,保護(hù)計(jì)算機(jī)避免黑客的侵襲。如果DEP發(fā)現(xiàn)有程序試圖從存儲(chǔ)數(shù)據(jù)的內(nèi)存中執(zhí)行指令,就會(huì)將其關(guān)閉并通知用戶。
根據(jù)操作系統(tǒng)設(shè)計(jì)原理,系統(tǒng)程序或某些應(yīng)用軟件會(huì)被要求在特定的內(nèi)存區(qū)域內(nèi)運(yùn)行,這個(gè)內(nèi)存區(qū)域如果受到其他程序的破壞,會(huì)導(dǎo)致程序出錯(cuò),甚至系統(tǒng)崩潰。而DEP技術(shù)可以有效地防止這類情況發(fā)生。如果啟動(dòng)了DEP保護(hù)機(jī)制,Windows就會(huì)自動(dòng)關(guān)閉試圖執(zhí)行溢出操作的程序。
DEP在程序執(zhí)行時(shí),將可執(zhí)行代碼所占用的內(nèi)存區(qū)域自動(dòng)標(biāo)記出來。支持DEP的CPU利用NX技術(shù)識(shí)別這些標(biāo)記出來的區(qū)域。當(dāng)DEP發(fā)現(xiàn)當(dāng)前執(zhí)行代碼沒有明確標(biāo)記為可執(zhí)行,就會(huì)禁止其執(zhí)行。
這樣,當(dāng)病毒和其他利用溢出技術(shù)進(jìn)行攻擊的惡意程序自然無計(jì)可施。DEP之所以可以發(fā)揮作用,是因?yàn)閹缀鯖]有任何合法程序會(huì)在內(nèi)存的堆棧段中存放執(zhí)行代碼,而緩沖區(qū)溢出后執(zhí)行的代碼又是放在堆棧段上的。DEP從實(shí)現(xiàn)的機(jī)制上看,分為軟件DEP和硬件DEP。對(duì)于前者來說,主要用來阻止針對(duì)SEH(Structure Exception Handler,異常處理結(jié)構(gòu)體)發(fā)起的攻擊。
為了保證系統(tǒng)遇到這些錯(cuò)誤時(shí)不至于崩潰,讓其可以穩(wěn)定的運(yùn)行下去,Windows會(huì)對(duì)運(yùn)行在其中的程序提供補(bǔ)救的機(jī)會(huì)來處理錯(cuò)誤,這就是系統(tǒng)的異常處理機(jī)制。而黑客程序會(huì)通過改寫SEH堆棧中的異常處理函數(shù)指針,并利用Windows存在各種漏洞來執(zhí)行攻擊行為。
從Windows XP SP2版本開始,微軟提供了SEH驗(yàn)證機(jī)制,在程序調(diào)用異常處理函數(shù)前對(duì)要調(diào)用的異常處理函數(shù)進(jìn)行有效性校驗(yàn),當(dāng)發(fā)現(xiàn)異常處理函數(shù)不可靠時(shí)將終止調(diào)用操作。這種軟件DEP機(jī)制和CPU無關(guān),Windows利用軟件模擬實(shí)現(xiàn)DEP保護(hù)功能,對(duì)操作系統(tǒng)加以保護(hù)。硬件DEP才能稱得上真正意義上的DEP保護(hù)機(jī)制,這需要CPU的支持,對(duì)于AMD的CPU來說,稱為 NX(No-Execute Page-Protection)。對(duì)于Intel的CPU來說,稱為XD(Execute Disable Bit)。
雖然名稱不同,但是兩者的工作原理和保護(hù)功能是一致的。Windows通過在對(duì)應(yīng)的內(nèi)存頁中設(shè)置NX/XD屬性標(biāo)志來禁止從這些內(nèi)存頁中執(zhí)行代碼。其實(shí)現(xiàn)方法是在內(nèi)存的頁面表中針對(duì)特定的內(nèi)存頁加入一個(gè)特殊的NX/XD標(biāo)志位,來指示是否允許在該內(nèi)存頁上執(zhí)行指令。當(dāng)該標(biāo)識(shí)位設(shè)置為0時(shí),表示允許在該頁面執(zhí)行代碼,設(shè)置為1時(shí)則禁止在該頁面中執(zhí)行指令。在系統(tǒng)屬性窗口中打開“高級(jí)”面板,在“性能”欄中點(diǎn)擊“設(shè)置”按鈕,在性能選項(xiàng)窗口中的“數(shù)據(jù)執(zhí)行保護(hù)”面板(如圖1)中可以查看該機(jī)的CPU是否支持硬件DEP。如果在窗口底部顯示“您的計(jì)算機(jī)處理器支持基于硬件的DEP”內(nèi)容,說明其支持DEP,否則的話,說明其不支持硬件DEP。
圖1 查看DEP管理界面
即使不支持硬件DEP,Windows也可以使用軟件DEP模式來保護(hù)某些類型的攻擊。DEP針對(duì)溢出操作的源頭,有力的強(qiáng)化了內(nèi)存管理機(jī)制。通過將內(nèi)存頁設(shè)置為不可執(zhí)行狀態(tài),來阻止堆棧中Shellcode程序的運(yùn)行,稱得上是最有力的緩沖溢出保護(hù)機(jī)制。
當(dāng)然,我們在運(yùn)行某些軟件時(shí),需要對(duì)其進(jìn)行一番了解,最好使用與DEP兼容的版本。運(yùn)行這類程序,就會(huì)受到DEP的保護(hù)。最好不要輕易運(yùn)行與DEP不兼容的程序,盡量降低潛在的風(fēng)險(xiǎn)。對(duì)于自己完全信任的程序,可以視情況關(guān)閉DEP,對(duì)于外來的不可知的程序,最好打開DEP保護(hù)功能。在上述“數(shù)據(jù)執(zhí)行保護(hù)”面板中選擇“為除下列選定的程序之外的所有程序和服務(wù)啟用DEP”項(xiàng),點(diǎn)擊“添加”按鈕,將自己信任的程序?qū)脒M(jìn)來,之后重啟系統(tǒng)即可。
注意,DEP和防病毒軟件或防火墻軟件是不同,DEP并不是一種防病毒軟件,不能阻止病毒等惡意程序潛入系統(tǒng),也不具備殺軟等安全軟件具有的病毒檢測和查殺功能,DEP是通過對(duì)程序進(jìn)行監(jiān)控,確定它們是否能夠安全地使用系統(tǒng)內(nèi)存的技術(shù)。因此DEP是一種操作系統(tǒng)底層的安全機(jī)制,通過這種安全機(jī)制,可以防御病毒、蠕蟲等惡意程序利用緩沖區(qū)漏洞進(jìn)行非法溢出操作,但是DEP并不會(huì)防御所有類型的病毒。
根據(jù)啟動(dòng)參數(shù)的不同,DEP工作狀態(tài)分為Optin、Optout、AlwaysOn、AlwaysOff等模式。對(duì)于Optin模式來說,默認(rèn)僅將DEP保護(hù)應(yīng)用于Windows系統(tǒng)組件和服務(wù),對(duì)其他程序不進(jìn)行保護(hù)。但用戶可以通過應(yīng)用程序兼容性工具,為選定的程序啟用DEP保護(hù)功能,在開發(fā)者使用Visual Studio 2008等工具編譯程序時(shí),可以使用特定的鏈接選項(xiàng),采用“/NXCOMPAT”參數(shù)執(zhí)行編譯處理,這樣得到的程序?qū)⒆詣?dòng)應(yīng)用DEP保護(hù)機(jī)制。對(duì)于Optout模式來說,可以通過設(shè)置排除列表的方法,將不需要DEP保護(hù)的程序添加到排除列表中,其余的程序則啟用DEP保護(hù)功能。
對(duì)于AlwaysOn模式來說,針對(duì)所有的進(jìn)程啟用DEP保護(hù)功能,在該模式下DEP不可以被關(guān)閉。只有在64位的操作系統(tǒng)上才可以使用AlwaysOn模式。對(duì)于AlwaysOff模式來說,對(duì)所有的進(jìn)程都禁用DEP保護(hù),在該模式下,DEP無法被動(dòng)態(tài)開啟,該模式只能在特定的場合下才可以使用,例如為了避免DEP干擾程序的正常運(yùn)行等。例如,對(duì)于Windows XP來說,可以在其系統(tǒng)盤根目錄下的“boot.ini”進(jìn)行編輯,來切換DEP保護(hù)模式。在對(duì)應(yīng)啟動(dòng)型后面追加“/noexecute=optout”或 者“/noexecute=Optin”語句,來采用Optin或者Optout模式。如果使用了“AlwaysOff”參數(shù),表示禁用DEP。對(duì)于Windows 7等系統(tǒng)來說,可以執(zhí)行“bcdedit.exe /set {curent} nx AlwaysOn”命令,開啟DEP的AlwaysOn模式,在該命令中 使 用“Optin”、“Optout”、“AlwaysOff”等參數(shù),可以激活對(duì)應(yīng)的保護(hù)模式。
對(duì)于某些電腦來說,使用DEP保護(hù)機(jī)制可能會(huì)對(duì)某些程序或者整個(gè)系統(tǒng)的運(yùn)行造成不利影響。例如,如果在開啟IE時(shí),頻繁出現(xiàn)“已經(jīng)關(guān)閉了此程序”的提示,導(dǎo)致IE無法順利運(yùn)行的話,就說明和DEP機(jī)制存在沖突的問題。
為此可以在開機(jī)時(shí)進(jìn)入主板BIOS設(shè)置界面,在其中找到和DEP配置相關(guān) 的 項(xiàng) 目(例 如“Execute Disable Function”等),設(shè)置為“Disable”項(xiàng),關(guān)閉硬件DEP保護(hù)功能,就可以解決問題。在沒有DEP保護(hù)的情況下,必須為系統(tǒng)安裝強(qiáng)悍的殺軟來防御病毒、木馬等惡意程序的威脅。當(dāng)然,也可以管理員身份打開CMD窗口,在其中執(zhí)行“bcdedit.exe /set {curent} nx AlwaysOff”命令來關(guān)閉DEP功能。
當(dāng)然,最好按照上述方法,將IE添加到DEP中的排除列表中,不讓DEP對(duì)IE進(jìn)行管控,這樣可以很好的解決該問題。在一般情況下,DEP會(huì)監(jiān)控系統(tǒng)程序和服務(wù),使其安全的使用內(nèi)存。DEP會(huì)單獨(dú)與CPU一起將某些內(nèi)存區(qū)域標(biāo)記為不可執(zhí)行狀態(tài)。如果某個(gè)程序試圖從受保護(hù)的位置執(zhí)行代碼,DEP就會(huì)將其關(guān)閉并通知用戶。即使其不是惡意代碼,也會(huì)被DEP強(qiáng)制關(guān)閉。在DEP提供給用戶的報(bào)告窗口中點(diǎn)擊“單擊此處”鏈接,在詳細(xì)信息界面中可以顯示出錯(cuò)程序的名稱以及版本信息。用戶可以據(jù)此來分析該程序的安全性,并根據(jù)需要將其添加到DEP排除列表中即可。
當(dāng)然,如果該程序已經(jīng)提供了升級(jí)版本,并支持DEP保護(hù)機(jī)制,最好的辦法是對(duì)其升級(jí),使其可以在DEP保護(hù)下正常運(yùn)行。
DEP雖然擁有強(qiáng)大的保護(hù)功能,但也存在一些弱點(diǎn),無法徹底阻止緩沖區(qū)溢出攻擊。例如,對(duì)于硬件DEP保護(hù)機(jī)制來說,需要CPU的支持才行,但并非所有的CPU都提供硬件DEP支持,一些較老的CPU是不支持硬件DEP的。因?yàn)榧嫒菪缘脑?,Windows有時(shí)無法對(duì)所有的進(jìn)程都開啟DEP保護(hù)功能。尤其對(duì)于一些第三方的DLL插件來說,可能不支持DEP,一旦開啟了DEP,很可能造成進(jìn)程運(yùn)行異常。使用老版本的應(yīng)用程序兼容性工具,需要在數(shù)據(jù)頁面上產(chǎn)生可執(zhí)行代碼,這就無法開啟DEP,否則很容易出現(xiàn)運(yùn)行故障。
在編譯程序時(shí),即使使用了“/NXCOMPAT”參數(shù),也只能對(duì)Vista以上的版本有效,對(duì)于XP等老系統(tǒng)來說,這樣的設(shè)置會(huì)被忽略。當(dāng)DEP運(yùn)行在Optin或者Optout模式時(shí),DEP是可以被動(dòng)態(tài)關(guān)閉和開啟的,因?yàn)椴僮飨到y(tǒng)內(nèi)置了一些API函數(shù),可以控制DEP的工作狀態(tài)。如果一些惡意進(jìn)程非法調(diào)用了這些API、函數(shù),就可以關(guān)閉DEP保護(hù)功能,為系統(tǒng)帶來了潛在的安全隱患。實(shí)際上,微軟出于兼容性的需求,不能對(duì)所有的進(jìn)程都開啟DEP功能。當(dāng)然,對(duì)于64位系統(tǒng)來說,采用AlwaysOn模式可以避免該問題。DEP保護(hù)的目標(biāo)是進(jìn)程,當(dāng)某個(gè)進(jìn)程加載的DLL模塊中如果存在某個(gè)模塊不支持DEP的話,該進(jìn)程就不會(huì)貿(mào)然開啟DEP,主要是為了避免異常的發(fā)生。
打開任務(wù)管理器,在“進(jìn)程”面板中點(diǎn)擊菜單“查看”→“選擇列”項(xiàng),選擇“數(shù)據(jù)執(zhí)行保護(hù)”項(xiàng)。在進(jìn)程列表中的“數(shù)據(jù)執(zhí)行保護(hù)”列中可以查看不同進(jìn)程是否支持DEP的情況,只有顯示“啟用”字樣,才表示對(duì)應(yīng)的進(jìn)程支持DEP。如果惡意程序攻擊沒有啟用DEP保護(hù)功能的進(jìn)程,就很容易溢出成功。DEP之所以可以防止非法溢出,關(guān)鍵在于當(dāng)其檢測到程序跳轉(zhuǎn)到非可執(zhí)行頁執(zhí)行指令話,就會(huì)拋出異常,執(zhí)行異常處理程序。但是,如果惡意程序跳轉(zhuǎn)到已經(jīng)存在的某個(gè)系統(tǒng)函數(shù)中,因?yàn)樵摵瘮?shù)是存在于可執(zhí)行頁上的,DEP自然不會(huì)對(duì)其攔截。這樣,惡意程序就可以在該執(zhí)行頁中找到其所需的指令,進(jìn)而執(zhí)行該指令,利用惡意程序自身提供的流程控制功能,可以執(zhí)行完畢后自動(dòng)返回。繼續(xù)執(zhí)行其他操作。
為了順利運(yùn)行,惡意程序甚至?xí)苯诱{(diào)用相關(guān)的API函數(shù),將DEP直接關(guān)閉。因?yàn)樵贠ptout和AlwaysOn模式下,所有的進(jìn)程默認(rèn)開啟DEP。惡意程序可能調(diào)用某個(gè)系統(tǒng)函數(shù),將Shellcode所在的內(nèi)存位置設(shè)置為可執(zhí)行狀態(tài)來避
開DEP對(duì)系統(tǒng)進(jìn)行滲透。此外,惡意程序還會(huì)采取非法利用某個(gè)API函數(shù)來申請一段具有可執(zhí)行屬性的內(nèi)存區(qū)域,將Shellcode代碼復(fù)制到該區(qū)域來避開DEP控制。為降低攻擊難度,惡意程序會(huì)在進(jìn)程的內(nèi)存空間中尋找一段具有可讀可寫可執(zhí)行的內(nèi)存區(qū)域,將Shellcode代碼復(fù)制進(jìn)來,對(duì)程序流程進(jìn)行劫持,來非法執(zhí)行Shellcode代碼。
此外,惡意程序的伎倆還包括非法利用.Net文件,將Shellceode代碼存放到.NET文件中的具有可執(zhí)行屬性的段中,當(dāng)這些段被映射到內(nèi)存后,自然具有了一定的可執(zhí)行特性,惡意程序轉(zhuǎn)入該區(qū)域后,就可以執(zhí)行Shellcode代碼了。和.NET文件類似,Jave applet文件也會(huì)被加載到瀏覽器內(nèi)存空間,這些Jave applet空間所在的內(nèi)存空間也具有了可執(zhí)行屬性,黑客只需將Shellcode代碼放到Jave applet文件中,就可以避開DEP的管控。