DEP緩解技術(一)

Editor發表於2018-06-06

理解DEP緩解技術——第一部分


我們在之前的1,2,3,4個部落格中提到過DEP。這篇部落格將會回答以下問題:

1. 什麼是DEP?

2. 如何開啟DEP?

3. 不同DEP模式的風險有哪些?

這篇文章是DEP緩解技術的第一部分。

什麼是DEP?

DEP(也稱“資料執行保護”)是一種軟體+硬體的機制,用來阻止從未被顯式標記為可執行的記憶體頁執行程式碼。Windows XP SP2、Windows Server 2003 SP1及其之後的作業系統將會檢查CPU是否支援記憶體頁的“不可執行”或“執行禁用”位。


在Windows XP SP2之前,利用程式碼(exp)會在分配的記憶體頁執行,不需要檢查記憶體保護常量(Memory Protection Constants)。例如,如果使用指定分配許可權為PAGE_READWRITE 的VirtualAlloc ()函式分配了記憶體頁, 則仍然可以從該記憶體頁執行程式碼。從 windows XP SP2 和 windows Server 2003 SP1 開始, 如果 CPU 支援執行禁用 (XD) (針對Intel CPU)或不可執行 (NX)(針對AMD CPU) 位,則任何從被標記為PAGE_READWRITE(例)的記憶體頁執行程式碼的行為,都將觸發 STATUS_ACCESS_VIOLATION (0xC0000005) 訪問衝突異常。有關硬體強制 DEP 工作原理的詳細資訊, 請參閱以下文章: http://technet.microsoft.com/en-us/library/bb457155.aspx。


DEP 在64bit 版本的 Windows 上為64位程式 "always on(始終開啟)"狀態, 無法禁用。Windows DEP 策略可以在系統範圍內和程式層面進行管理, 下面將討論這兩種方法。這篇文章適用於在32位或64位版本的 Windows 上執行的32位程式。

DEP的健壯性?

DEP阻礙了想要成功利用安全漏洞的攻擊者。在某些情況下, 攻擊者可以使用如return-to-libc這樣的利用技術來繞過DEP。DEP本身通常不是一個強健的緩解方法。DEP 是微軟開發的緩解技術的重要組成部分,這些緩解技術有ASLR、 SeHOP、 SafeSEH和/GS等。這些緩解技術相輔相成,例如,DEP 的弱點往往被 ASLR 抵消, 反之亦然。DEP 和 ASLR 共同使用很難繞過。目前已知的繞過方法需要與特定的應用程式上下文結合起來看 (例如, IE7 and earlier bypass from Mark Dowd and Alex Sotirov)。

如何開啟DEP?

如果您的硬體支援 DEP, 並且您正在執行 Windows XP SP2 或較新的作業系統, 則您已經在某種程度上使用了DEP。硬體強制 DEP 可以配置為系統範圍 (適用於所有程式) 或為單個程式配置策略。在支援DEP的平臺上執行系統範圍的DEP 策略有四種不同的方法。

選擇啟用(Opt-In)。在此模式下DEP僅用於顯式選擇開啟DEP 的程式。這是客戶端作業系統 (如 windows XP 和 windows Vista) 的預設配置。

選擇不啟用(Opt-Out)。在這個模式下,DEP是每個程式的預設配置,不需要使用DEP的程式應該顯式標明。這是伺服器作業系統 (如 windows server 2003 和 windows server 2008) 的預設配置。

始終開啟(Always On)。無論程式是否與DEP相容,所有程式都啟用DEP。

始終關閉(Always Off)。所有程式都不啟用DEP

windows XP SP2 和 windows Server 2003 SP1

    這篇文章(https://technet.microsoft.com/en-us/library/cc700810.aspx)在解釋瞭如何使用 boot.ini 或 GUI 配置 windows XP SP2 和 windows Server 2003 SP1 上的記憶體保護設定。請注意, 配置 "系統範圍" DEP 策略需要管理員許可權。

windows Vista 和 windows Server 2008

    要在 Windows Vista 和伺服器2008上配置系統範圍的 DEP 策略, 請從高許可權的命令提示符處使用 bcdedit.exe 控制檯應用程式修改啟動配置資料庫。如何執行此操作的更多資訊: https://docs.microsoft.com/zh-cn/windows-hardware/drivers/devtest/boot-parameters-to-configure-dep-and-pae

DEP "始終開啟" 下的潛在的應用程式相容性問題

將 DEP 設定為始終為所有程式啟用, 可能會增加應用程式問題的風險,這一風險是因版本7.1 之前的 ATL 版本中的某些行為而導致的。舊版本的 ATL 在執行時生成了機器碼,然後試圖從未標記為可執行的記憶體頁執行此程式碼, 從而在開啟DEP時導致衝突。如果系統範圍的設定是 "選擇啟用", 則使用名為"ATL thunk emulation" 的程式來避免與ATL相關的 DEP 崩潰。如果 DEP "始終開啟", 則不使用 “ATL thunk emulation”。注意: 當DEP設定為"始終開啟" , 在開啟包含 VBA (Visual Basic應用程式) 的巨集 (可能導致 DEP 相關崩潰) 的文件時,Microsoft Office 應用程式存在已知的相容性問題。

如何判斷某個特定程式已經開啟或將要開啟 DEP?

判斷程式當前是否使用 DEP 的最簡單方法是使用"程式管理器"並將其配置為顯示程式DEP狀態 (檢視->選擇列->程式DEP狀態), 如下所示:

DEP緩解技術(一)

要確定程式使用 (或不使用) DEP 的原因, 需要進行更多的調查工作。下面是系統決定程式的 DEP 狀態的方法。在以後的文章中, 將對每個細節進行詳細的探討。

系統範圍的 DEP 策略設定為 "始終開啟"。對所有程式啟用 DEP。

系統範圍的 DEP 策略被設定為 "選擇啟用", 並通過應用程式相容性資料庫中的條目選擇是否為該程式開啟DEP。

系統範圍的 DEP 策略設定為 "選擇不啟用", 程式未顯式指定不啟用。

程式可執行檔案用/NXCOMPAT 連結器連結, 並在 Vista 或較新的作業系統上執行。

該程式在 "檔案執行選項" 登錄檔項中將 "ExecuteOptions" 登錄檔值設定為0, 並在 Windows Vista 或較新的作業系統上執行。

該程式在 Vista SP1、XP SP3 或 Windows Server 2008 上呼叫新的SetProcessDEPPolicy API

Windows XP SP2 & Windows Server 2003 SP1上的單個程式的DEP策略

Windows XP SP2和Windows Server 2003 SP1十分強調安全性。因此許多Windows預設程式通過應用程式相容性資料庫將DEP設定為“選擇開啟”。要了解哪些程式在 windows XP SP2 或 windows Server 2003 SP1 上 選擇啟用DEP, 您可以下載並安裝最新的應用程式相容性工具包(Application Compatibility Toolkit)並在該程式 "Windows 元件" 下檢視主系統資料庫。

如果在 "windows 元件" 類別中應用了相容性修補標誌 "AddProcessParametersFlags", 則所有 Windows XP SP2 應用程式被設定為”選擇開啟“。

DEP緩解技術(一)

Windows Server 2003 SP1 預設系統策略為 "選擇不開啟"。這意味著所有未顯式指定不開啟程式都將啟用 DEP。如果更改了系統範圍的策略, 則應用程式仍可以使用 EnableDEP 相容性修復程式啟用DEP, 如下所示:

DEP緩解技術(一)

這些相容性修復程式將PEB 的 ProcessParameters值設定為 0x00020000, 使windows XP SP2 和 windows Server 2003 SP1 可以選擇程式是否開啟 DEP 。我們在 windows XP SP2 和 windows Server 2003 SP1 中找到了305個程式, 這些程式通過主應用程式相容性資料庫 (%windir%\AppPatch\sysmain.sdb) 使用此特定的相容性修復程式將DEP設定為“選擇開啟”。我們在此附上這些程式的列表:點選下載。

Windows Vista、Windows Server 2008 和較新作業系統上的針對每個程式的DEP選項

Microsoft 已在較新的作業系統上為程式提供了選擇使用DEP的選項。


/NXCOMPAT 連結器

在 Vista 和較新的作業系統上, 預設情況下, /NXCOMPAT選項的程式將被設定為選擇開啟DEP。希望利用此緩解技術的第三方應用程式的開發人員可以通過Visual C++ 2003 或較新版本的連結器傳入 "/NXCOMPAT" 標誌來重新連結其應用程式。這將使連結器產生一個二進位制檔案, 它通過 Vista 和以後的作業系統支援的可選頭欄位支援 DEP。您可以通過dumpbin.exe(與Visual Studio一起)確定某個程式是否已連結到/NXCOMPAT連結器。


C:\Windows\System32>dumpbin /headers dllhost.exe
Microsoft (R) COFF/PE Dumper Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.
 
Dump of file dllhost.exe
 
PE signature found
 
File Type: EXECUTABLE IMAGE
 
FILE HEADER VALUES
            8664 machine (x64)
               5 number of sections
        4549BBFF time date stamp Thu Nov 02 05:35:59 2006
               0 file pointer to symbol table
               0 number of symbols
              F0 size of optional header
              22 characteristics
                   Executable
                   Application can handle large (>2GB) addresses
 
OPTIONAL HEADER VALUES
             20B magic # (PE32+)
            8.00 linker version
            1400 size of code
            1000 size of initialized data
               0 size of uninitialized data
            1818 entry point (0000000100001818)
            1000 base of code
       100000000 image base (0000000100000000 to 0000000100006FFF)
            1000 section alignment
             200 file alignment
            6.00 operating system version
            6.00 image version
            6.00 subsystem version
               0 Win32 version
            7000 size of image
             400 size of headers
            E1C5 checksum
               2 subsystem (Windows GUI)
            8140 DLL characteristics
                   Dynamic base
                   NX compatible
                   Terminal Server Aware

ExecuteOptions 登錄檔設定

windows Vista 和 windows Server 2008 還可以使用 ExecuteOptions登錄檔強制程式啟用 DEP。ExecuteOptions可以強制程式在不更改系統策略的情況下使用 DEP。使用 ExecuteOptions 登錄檔設定選擇開啟DEP的程式在其生存期內會是開啟DEP的 (DEP不能通過任何 API 呼叫關閉)。該方法與系統範圍的選擇開啟、選擇關閉方法相比,由於上文討論的 "ATL thunk emulation",在應用程式相容性方面有缺點:當通過 ExecuteOptions 登錄檔設定或/NXCOMPAT 連結器強制程式使用 DEP 時, 不使用"ATL thunk emulation "。最後, Windows 相容性資料庫儲存著已知的與 DEP 不相容的dll列表,當使用此登錄檔設定DEP時, Windows 中的相容性基礎結構無法為程式禁用DEP, 因此如果應用程式嘗試載入與 DEP 不相容的dll,會發生DEP相關崩潰。

Microsoft 鼓勵第三方組織獨立軟體開發者使用DEP(以及其他緩解技術)。最新版本的 Acrobat、Flash、QuickTime 和 Sun 的 Java (JRE 6 Update 12) 都支援 DEP。有關在為程式啟用 DEP 時如何避免 ATL 相關 DEP 崩潰的詳細資訊, 請參閱http://support.microsoft.com/kb/948468。


SetProcessDEPPolicy API

最後, 在我們的最新版本的 Windows 上提供了一種新的選擇開啟 DEP 的方法。Windows Vista SP1、Windows Server 2008 和 Windows XP SP3 使用了SetProcessDEPPolicy API , 允許應用程式以程式設計的方式在不使用/NXCOMPAT 或不用在 appcompat 資料庫或登錄檔中進行標記的情況下選擇開啟DEP。公開API不僅使開發人員可以更容易地選擇開啟 DEP, 而且在使用此API時, 會執行ATL thunk emulation,使用舊版本的ATL的程式不會因 DEP而崩潰。例如, IE8就利用了這一新功能。


在本系列的第二部分中, 我們將展示如何更改應用程式的 DEP 策略以減少實際攻擊。


原文連結:https://blogs.technet.microsoft.com/srd/2009/06/12/understanding-dep-as-a-mitigation-technology-part-1/

編譯:看雪翻譯小組 歡歌笑語

校對:看雪翻譯小組 fyb波

相關文章