我们已在近期多篇博客(1, 2, 3, 4)中提及DEP技术。本篇将解答:
- 什么是DEP?
- 如何启用DEP?
- 不同DEP模式的启用风险?
这是关于DEP缓解技术系列文章的第一部分。
什么是DEP?
DEP(数据执行保护)是通过硬件+软件协同防止执行非可执行内存页代码的解决方案。自Windows XP SP2和Windows Server 2003 SP1起,操作系统会检测CPU是否支持内存页的"非执行"(Intel XD/AMD NX)位保护。
在Windows XP SP2之前,利用程序可从仅分配为PAGE_READWRITE的内存页执行代码。新版本系统中,若CPU支持XD/NX位,对此类内存页的执行尝试会触发STATUS_ACCESS_VIOLATION(0xC0000005)异常。64位进程在64位Windows上强制启用DEP且不可禁用。
DEP的防御强度
DEP虽能增加攻击难度,但可通过return-to-libc等技术绕过。其防御效果需与ASLR、SeHOP、SafeSEH、/GS等技术协同——例如DEP的弱点常被ASLR弥补,二者联用极难绕过(已知绕过方法仅限特定应用场景如IE7)。
如何启用DEP?
支持DEP的硬件运行Windows XP SP2及以上系统时已默认启用。硬件DEP支持四种系统级策略:
- Opt-In:仅对显式启用的进程生效(XP/Vista默认)
- Opt-Out:对除显式禁用外的所有进程生效(Server 2003/2008默认)
- Always On:强制所有进程启用(可能引发兼容性问题)
- Always Off:全局禁用
系统配置方法
- XP SP2/Server 2003 SP1:通过boot.ini或GUI配置(需管理员权限)
- Vista/Server 2008:使用bcdedit.exe修改启动配置数据库
兼容性问题
“Always On"模式可能导致:
- ATL 7.1之前版本因动态生成代码引发DEP崩溃(Opt-In模式下通过"ATL thunk模拟"规避)
- Office打开含VBA宏的文档时可能崩溃
进程DEP状态检测
使用Process Explorer查看进程DEP状态(View->Select Columns->Process DEP status)。进程启用DEP的判定逻辑包括:
- 系统策略设为AlwaysOn
- 应用兼容数据库标记为Opt-In
- 系统策略为OptOut且未显式禁用
- 可执行文件通过/NXCOMPAT链接器选项编译(Vista+)
- 注册表Image File Execution Options中设置ExecuteOptions=0(Vista+)
- 进程调用SetProcessDEPPolicy API(Vista SP1/XPSP3/Server 2008)
进程级DEP策略实现
XP SP2/Server 2003 SP1
通过应用兼容数据库(sysmain.sdb)启用,使用"AddProcessParametersFlags"或"EnableDEP"兼容性修复标记。例如Windows组件进程默认启用:
Vista/Server 2008+新增方式
-
/NXCOMPAT链接选项:使用Visual Studio 2003+链接器编译时添加该标记
1
dumpbin /headers dllhost.exe
输出中含"NX compatible"即生效
-
ExecuteOptions注册表项:强制进程启用DEP(禁用ATL thunk模拟)
-
SetProcessDEPPolicy API:新系统版本支持动态启用(保留ATL thunk模拟能力)
开发者建议
建议ISV采用DEP等缓解技术。当前Acrobat/Flash/QuickTime/JRE 6 Update 12等均已支持。ATL相关DEP崩溃解决方案见KB948468。
(第二部分将演示如何通过调整DEP策略防御实际攻击)
本文内容"按原样"提供,不具任何保证
[原始附件:AddProcessParametersFlags - XPSP2.txt]