这篇博客将会回答以下问题:
什么是DEP?
如何开启DEP?
不同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 策略设置为 "选择不启用", 进程未显式指定不启用。
进程可执行文件用/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 应用程序被设置为”选择开启“。
Windows Server 2003 SP1 默认系统策略为 "选择不开启"。这意味着所有未显式指定不开启进程都将启用 DEP。如果更改了系统范围的策略, 则应用程序仍可以使用 EnableDEP 兼容性修复程序启用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 策略以减少实际攻击。
来源:[翻译]DEP缓解技术(一)-『外文翻译』-看雪安全论坛
本文由看雪翻译小组 欢歌笑语 编译,fyb波校对
来源Microsoft's Technet
转载请注明来自看雪社区