《程序员》3月文章
申明。文章仅代表个人观点,与所在公司无任何联系。
-
概述
在安全编码实践一中我们谈到GS编译选项和缓存溢出。缓存溢出的直接后果就是可能导致恶意代码的远<wbr></wbr>程执行。GS选项存在自身的局限,例如,有若干方法可以绕过GS选项的保护。
在这篇文章里,我们会介绍另外一个非常重要的安全特性<wbr></wbr>:数据执行保护,即DEP-Data Execution Prevention,以及与之对应的NXCOMPAT选项。
在栈溢出程序例子中,我们看到,恶意代码是被存放在栈(stack)上的。类似的,如果是一个堆(heap)溢出的安全漏洞,恶意代码是被存放在堆上。无论堆还是栈<wbr></wbr>,都是数据页面。在数据页面上,通常情况下,是不应该执行代码的。
DEP,就是禁止应用程序和服务在非可执行的内存区(non-executable memory)上执行指令。
-
DEP和硬件支持
在探讨DEP的原理前,我们先区分两个容易引起混淆的概念:软件DEP(Software DEP)和硬件DEP(Hardware-enforced DEP)。
软件DEP,并不是真正意义上的DEP。简单的说,它的原理是检查异常处理是否安全(SEH-Safe Exception Handling)。它是完全通过软件支持的一种安全特性。在以后的安全编码实践中<wbr></wbr>我们会专门讨论SEH。
硬件DEP,则是需要CPU提供支持的,同软件DEP相比,硬件DEP提供的保护更为全面。以后我们提到的DEP,都是指硬件DEP。
在80x86体系结构中,操作系统的内存管理是通过页面(page)存储方式来实现的。虚拟内存空间的管理,如代码,数据堆栈<wbr></wbr>,都是通过页面方式来映射到真正的物理内存上。原理参见下图【1】。
图1:页面内存映射
在AMD64位CPU上,在页面表(page table)中的页面信息加了一个特殊的位,NX位(No eXecute)。
-
如果NX位为0,这个页面上可以执行指令。
-
如果NX位为1,这个页面上不允许执行指令。如果试图执行指令的话<wbr></wbr>,就会产生异常。
Intel在它的CPU上也提供了类似的支持,称为XD 位( eXecute Disable),其原理和AMD的NX是完全一样的。
操作系统对DEP的支持,就是将系统或应用程序的数据页面,标注上NX位。这样,一旦由于堆栈缓存溢出的安全漏洞,导致恶意代码试图在数<wbr></wbr>据页面上运行,CPU就会产生异常,导致程序终止,而不是去执行恶意指令。
Windows对DEP的支持是从Windows XP SP2,和Windows Server 2003开始的。用户可以通过Control Panel à System àAdvanced àPerformance来查看系统的DEP设置。
图2:DEP设置
-
使用NXCOMPAT选项
NXCOMPAT是一个链接(LINK)选项,从Visual Studio 2005起开始支持。在具体介绍NXCOMPAT选项前,我们先看下面一段代码:
// DEP.cpp: Demo of how DEP protects executing code from data page
//
#include "stdafx.h"
/* win32_exec - EXITFUNC=process CMD=calc.exe Size=164 Encoder=Pex http://metasploit.com */
unsigned char scode[] =
"\x2b\xc9\x83\xe9\xdd\xe8\xff<wbr></wbr>\xff\xff\xff\xc0\x5e\x81\x76<wbr></wbr>\x0e\xd2"
"\xbd\xf7\x35\x83\xee\xfc\xe2<wbr></wbr>\xf4\x2e\x55\xb3\x35\xd2\xbd<wbr></wbr>\x7c\x70"
"\xee\x36\x8b\x30\xaa\xbc\x18<wbr></wbr>\xbe\x9d\xa5\x7c\x6a\xf2\xbc<wbr></wbr>\x1c\x7c"
"\x59\x89\x7c\x34\x3c\x8c\x37<wbr></wbr>\xac\x7e\x39\x37\x41\xd5\x7c<wbr></wbr>\x3d\x38"
"\xd3\x7f\x1c\xc1\xe9\xe9\xd3<wbr></wbr>\x31\xa7\x58\x7c\x6a\xf6\xbc<wbr></wbr>\x1c\x53"
"\x59\xb1\xbc\xbe\x8d\xa1\xf6<wbr></wbr>\xde\x59\xa1\x7c\x34\x39\x34<wbr></wbr>\xab\x11"
"\xd6\x7e\xc6\xf5\xb6\x36\xb7<wbr></wbr>\x05\x57\x7d\x8f\x39\x59\xfd<wbr></wbr>\xfb\xbe"
"\xa2\xa1\x5a\xbe\xba\xb5\x1c<wbr></wbr>\x3c\x59\x3d\x47\x35\xd2\xbd<wbr></wbr>\x7c\x5d"
"\xee\xe2\xc6\xc3\xb2\xeb\x7e<wbr></wbr>\xcd\x51\x7d\x8c\x65\xba\xc3<wbr></wbr>\x2f\xd7"
"\xa1\xd5\x6f\xcb\x58\xb3\xa0<wbr></wbr>\xca\x35\xde\x96\x59\xb1\x93<wbr></wbr>\x92\x4d"
"\xb7\xbd\xf7\x35";
int _tmain(int argc, _TCHAR* argv[])
{
void (*pRunCalc)();
pRunCalc = (void (*) ()) (void *) scode;
pRunCalc();
return 0;
}
字符串sCode所包含的是一段shellcode,也就是一段汇编代码。这段shellcode的功能是运行calc.exe,即计算器程序。pRunCalc作为函数指针指向这段代码。整个程序的目的就是试图在数据页面上执<wbr></wbr>行代码。
在Visual Studio 2005环境,用Win32 Console Application类型,编译这个程序,生成DEP.exe。
在一台Windows Vista 32位OS,有DEP支持的 机器上,运行DEP.exe。sCode指向的shellcode被执行,弹出了计算器窗口。
为什么DEP没有起保护作用呢?这是因为出于应用程序兼容性的考虑,在Windows Vista 32位的缺省配置下,DEP只负责保护Windows的系统程序和服务,而不包括其它应用程序。
如果在连接选项上加上/NXCOMPAT,重新链接生成DEP.exe。执行DEP.exe则会出现
图3:DEP.exe异常中止
关闭这个对话框后,在任务条上会弹出如下提示:
图4:DEP触发提示
这就表明是由于DEP保护机制的触发,而导致DEP<wbr></wbr>.exe程序被终止。
如果用WinDBG调试的话,会发现,当DEP.exe试图运行s<wbr></wbr>hellcode的第一条指令的时候,出现了系统异常。
0:000:x86> g
(1764.b38): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
*** WARNING: Unable to verify checksum for DEP.exe
DEP!scode:
00000000`00417000 2bc9 sub ecx,ecx
0:000:x86> db 00417000 << 00417000就是sCode的地址
00000000`00417000 2b c9 83 e9 dd e8 ff ff-ff ff c0 5e 81 76 0e d2 +..........^.v..
00000000`00417010 bd f7 35 83 ee fc e2 f4-2e 55 b3 35 d2 bd 7c 70 ..5......U.5..|p
00000000`00417020 ee 36 8b 30 aa bc 18 be-9d a5 7c 6a f2 bc 1c 7c .6.0......|j...|
00000000`00417030 59 89 7c 34 3c 8c 37 ac-7e 39 37 41 d5 7c 3d 38 Y.|4<.7.~97A.|=8
00000000`00417040 d3 7f 1c c1 e9 e9 d3 31-a7 58 7c 6a f6 bc 1c 53 .......1.X|j...S
00000000`00417050 59 b1 bc be 8d a1 f6 de-59 a1 7c 34 39 34 ab 11 Y.......Y.|494..
00000000`00417060 d6 7e c6 f5 b6 36 b7 05-57 7d 8f 39 59 fd fb be .~...6..W}.9Y...
00000000`00417070 a2 a1 5a be ba b5 1c 3c-59 3d 47 35 d2 bd 7c 5d ..Z....<Y=G5..|]
我们看出,一旦使用的/NXCOMPAT选项,生成的程序在运行时候就会受到DEP机制的保护。
-
NXCOMPAT选项的内部实现
NXCOMPAT的实现,是通过在Windows PE文件头信息(PE Header)中设置IMAGE_DLLCHARACTERISTICS_NX<wbr></wbr>_COMPAT这个标志位。参见MSDN具体的定义信息如下【2】
typedef struct _IMAGE_OPTIONAL_HEADER {
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
… …
WORD DllCharacteristics;
… …
} IMAGE_OPTIONAL_HEADER,
*PIMAGE_OPTIONAL_HEADER;
DllCharacteristics
The DLL characteristics of the image. The following values are defined.
IMAGE_DLLCHARACTERISTICS_NX<wbr></wbr>_COMPAT
0x0100 The image is compatible with data execution prevention (DEP).
当IMAGE_DLLCHARACTERISTICS_NX<wbr></wbr>_COMPAT被设置时,就意味该程序选择在存在DEP支持的情况下,被DEP机制保护。
-
NXCOMPAT选项的局限
首先,并不是所有的CPU都提供了硬件DEP的支持。
其次,NXCOMPAT选项,或者是IMAGE_DLLCHARACTERISTICS_NX<wbr></wbr>_COMPAT的设置,只对Windows Vista系统有效。在以前的系统上,如Windows XPSP2,这个设置会被忽略。也就是说,应用程序并不能自己决定是否被DEP保护。
就性能而言,由于是CPU提供的硬件支持并触发异常,并不会有什么影响。
更大的考虑是兼容性。特别的,如果你的程序使用了ATL 7.1或更早的版本,由于ATL会在数据页面上产生执行代码(不要问我以前ATL为什么会这样设计。J),使用DEP保护运行时就会出现系统异常。
如果你的程序要使用第三方的插件DLL的话,而又事先无法确定第三方的DLL是否可以支持DEP的话,使用NXCOMPAT也可能会有问题。这是因为DEP的保护对象是进程一级。一个典型的例子是IE。IE需要支持第三方的IE Plugin插件。
使用Task Manager,选择Data Execution Protection列,可以看到在Windows Vista下,iexplorer.exe并没有被DEP保护。
图5:IE的DEP设置
同GS选项类似,也存在其它攻击方式可以绕过NXCOMPAT+DEP的保护机制,例如return-to-libc攻击。【3】
-
总结
DEP,也就是数据执行保护,可以有效降低堆或栈上的缓存溢出漏洞<wbr></wbr>的危害性。采用NXCOMPAT选项后,应用程序的运行被DEP 机制保护。在考虑兼容性的前提下,建议开发人员采用NXCOMPA<wbr></wbr>T链接选项。
-
参考文献
1)Page table:http://en.wikipedia.org/wiki<wbr></wbr>/Page_table
2)http://msdn2.microsoft.com/en<wbr></wbr>-us/library/ms680339(VS.85)<wbr></wbr>.aspx
3)Return-to-libc attack:http://en.wikipedia.org/wiki<wbr></wbr>/Return-to-libc_attack
4)Writing Secure Code for Windows Vista, Michael Howard, David LeBlanc.
分享到:
相关推荐
标题 "解决Delphi7数据执行保护" 涉及到的是在使用Delphi 7开发应用程序时遇到的一个常见问题,即Windows操作系统的数据执行保护(DEP,Data Execution Prevention)策略导致程序运行异常。DEP是一种安全特性,旨在...
数据执行保护(DEP,Data Execution Prevention)是微软在Windows操作系统中引入的一项安全特性,旨在增强系统的安全性,防止恶意代码通过数据缓冲区溢出等漏洞执行。IE8(Internet Explorer 8)作为一款较早的...
在使用Delphi 7开发应用程序时,有时会遇到一个常见的问题,即在尝试调用Web Service时,程序因为Windows的数据执行保护(Data Execution Prevention, DEP)机制而失败。DEP是Windows操作系统为了提高系统安全性而...
1. 打开“控制面板”中的“系统和安全”选项。 2. 进入“系统”,点击左侧面板的“高级系统设置”。 3. 在弹出的“系统属性”窗口中,点击“性能”区域的“设置”按钮。 4. 在“性能选项”窗口中,切换到“数据...
DEP(Data Exchange Platform,数据交换平台)是EAS的一部分,负责数据的交换和集成。供应链管理是EAS中的一个重要模块,它 涵盖了采购、生产、库存、物流等多个方面的业务流程。 在EAS中,DEP是一种基于脚本的数据...
Securable是一款专业的系统安全分析工具,主要功能是检测计算机CPU的数据执行保护(DEP)和虚拟化技术状态。该工具由Grisoft公司开发,旨在帮助用户了解自己的硬件是否支持这些先进的安全特性,以及它们是否已正确...
数据执行保护(DEP,Data Execution Prevention)是微软在Windows操作系统中引入的一项安全特性,旨在保护用户的计算机免受病毒和恶意软件的侵害。这个特性在Windows XP Service Pack 2及后续版本中开始启用,主要是...
- **优化的DEP**:这是Windows的一种策略,只对系统关键进程和部分选定的用户程序启用DEP,以平衡性能和安全性。 - **用户自定义**:高级用户可以使用“系统属性”>“高级”>“性能”>“设置”>“数据执行防护”来...
数据执行保护(Data Execution Prevention,简称DEP)是Windows操作系统中的一个重要安全特性,它旨在防止恶意软件通过执行存储在内存中的非执行区域的数据来攻击系统。DEP可以在硬件级别或软件级别实现,对于提高...
- 通过“我的电脑”>“属性”>“高级”>“性能”>“设置”>“数据执行保护”选项卡,选择“为除下列选定程序之外的所有程序和服务启用DEP”,然后将IE8的主程序`iexplore.exe`添加到例外列表中,保存设置后重启...
数据执行保护(Data Execution Prevention,简称DEP)是Windows操作系统中的一个重要安全特性,它旨在防止恶意软件通过执行存储在内存中的非执行数据来攻击系统。DEP能够监测并阻止那些试图执行非预期代码的行为,...
8. 安全性:讲解DEP平台的安全措施,如数据加密、权限管理以及防止攻击的方法。 9. 扩展与集成:探讨如何利用DEP平台的扩展能力,集成第三方服务或自定义模块。 10. 实战案例:通过实际项目案例,展示DEP平台在解决...
EAS二次开发中DEP在编辑或者列表界面写脚本时可调用的执行sql语句的方法。【本方法仅用于客户端代码中,如果是服务端代码,即对某实体进行DEP拓展,请参照官方出品DEP脚本指南】
DEP(Data Execution Prevention,数据执行防护)是Windows操作系统中的一项安全特性,旨在防止恶意代码在内存中的非执行区域执行,以提升系统安全性。DEP_hook(防杀进程DLL)通常指的是黑客或逆向工程师使用的技术...
DEP(Hardware Data Execution Prevention,硬件数据执行保护)是一种安全技术,用于防止恶意代码通过执行存储在内存中的非执行区域的数据来攻击系统。通常,操作系统会禁止从数据页执行代码,但DEP加强了这一机制,它...
首先,操作系统层面,如Windows Server 2008和Windows Vista,微软加强了内核安全,引入了用户账户控制(UAC)和数据执行防护(DEP)等技术,限制了恶意代码的执行可能性。同时,改进的防火墙和更新的防病毒机制提供...
6. 定期进行代码审计和安全测试,发现并修复潜在的漏洞。 总的来说,安全编码需要开发者具备深入的编程知识,了解潜在的安全风险,并且时刻保持警惕。通过学习和实践,我们可以编写出更安全、更可靠的软件,抵御...
数据执行保护(Data Execution Prevention,简称DEP)是Windows操作系统中的一个重要安全特性,它旨在防止恶意软件通过执行存储在内存中的非执行区域的数据来利用系统漏洞。本项目"DepMng.rar_dep"专注于如何利用...