APP下载

浅析DEP安全保护技术

2018-11-07

网络安全和信息化 2018年8期
关键词:进程内存代码

DEP的原理和功能

使用DEP机制有助于防止计算机受到病毒和其他恶意程序的攻击和破坏,DEP会让计算机分配一部分内存用来存储数据,分配另一部分内存供程序使用。DEP可以监控程序的运行,保证其可以安全使用内存,保护计算机避免黑客的侵袭。如果DEP发现有程序试图从存储数据的内存中执行指令,就会将其关闭并通知用户。

根据操作系统设计原理,系统程序或某些应用软件会被要求在特定的内存区域内运行,这个内存区域如果受到其他程序的破坏,会导致程序出错,甚至系统崩溃。而DEP技术可以有效地防止这类情况发生。如果启动了DEP保护机制,Windows就会自动关闭试图执行溢出操作的程序。

DEP在程序执行时,将可执行代码所占用的内存区域自动标记出来。支持DEP的CPU利用NX技术识别这些标记出来的区域。当DEP发现当前执行代码没有明确标记为可执行,就会禁止其执行。

这样,当病毒和其他利用溢出技术进行攻击的恶意程序自然无计可施。DEP之所以可以发挥作用,是因为几乎没有任何合法程序会在内存的堆栈段中存放执行代码,而缓冲区溢出后执行的代码又是放在堆栈段上的。DEP从实现的机制上看,分为软件DEP和硬件DEP。对于前者来说,主要用来阻止针对SEH(Structure Exception Handler,异常处理结构体)发起的攻击。

为了保证系统遇到这些错误时不至于崩溃,让其可以稳定的运行下去,Windows会对运行在其中的程序提供补救的机会来处理错误,这就是系统的异常处理机制。而黑客程序会通过改写SEH堆栈中的异常处理函数指针,并利用Windows存在各种漏洞来执行攻击行为。

从Windows XP SP2版本开始,微软提供了SEH验证机制,在程序调用异常处理函数前对要调用的异常处理函数进行有效性校验,当发现异常处理函数不可靠时将终止调用操作。这种软件DEP机制和CPU无关,Windows利用软件模拟实现DEP保护功能,对操作系统加以保护。硬件DEP才能称得上真正意义上的DEP保护机制,这需要CPU的支持,对于AMD的CPU来说,称为 NX(No-Execute Page-Protection)。对于Intel的CPU来说,称为XD(Execute Disable Bit)。

DEP的管理和配置

虽然名称不同,但是两者的工作原理和保护功能是一致的。Windows通过在对应的内存页中设置NX/XD属性标志来禁止从这些内存页中执行代码。其实现方法是在内存的页面表中针对特定的内存页加入一个特殊的NX/XD标志位,来指示是否允许在该内存页上执行指令。当该标识位设置为0时,表示允许在该页面执行代码,设置为1时则禁止在该页面中执行指令。在系统属性窗口中打开“高级”面板,在“性能”栏中点击“设置”按钮,在性能选项窗口中的“数据执行保护”面板(如图1)中可以查看该机的CPU是否支持硬件DEP。如果在窗口底部显示“您的计算机处理器支持基于硬件的DEP”内容,说明其支持DEP,否则的话,说明其不支持硬件DEP。

图1 查看DEP管理界面

即使不支持硬件DEP,Windows也可以使用软件DEP模式来保护某些类型的攻击。DEP针对溢出操作的源头,有力的强化了内存管理机制。通过将内存页设置为不可执行状态,来阻止堆栈中Shellcode程序的运行,称得上是最有力的缓冲溢出保护机制。

当然,我们在运行某些软件时,需要对其进行一番了解,最好使用与DEP兼容的版本。运行这类程序,就会受到DEP的保护。最好不要轻易运行与DEP不兼容的程序,尽量降低潜在的风险。对于自己完全信任的程序,可以视情况关闭DEP,对于外来的不可知的程序,最好打开DEP保护功能。在上述“数据执行保护”面板中选择“为除下列选定的程序之外的所有程序和服务启用DEP”项,点击“添加”按钮,将自己信任的程序导入进来,之后重启系统即可。

注意,DEP和防病毒软件或防火墙软件是不同,DEP并不是一种防病毒软件,不能阻止病毒等恶意程序潜入系统,也不具备杀软等安全软件具有的病毒检测和查杀功能,DEP是通过对程序进行监控,确定它们是否能够安全地使用系统内存的技术。因此DEP是一种操作系统底层的安全机制,通过这种安全机制,可以防御病毒、蠕虫等恶意程序利用缓冲区漏洞进行非法溢出操作,但是DEP并不会防御所有类型的病毒。

DEP的保护模式

根据启动参数的不同,DEP工作状态分为Optin、Optout、AlwaysOn、AlwaysOff等模式。对于Optin模式来说,默认仅将DEP保护应用于Windows系统组件和服务,对其他程序不进行保护。但用户可以通过应用程序兼容性工具,为选定的程序启用DEP保护功能,在开发者使用Visual Studio 2008等工具编译程序时,可以使用特定的链接选项,采用“/NXCOMPAT”参数执行编译处理,这样得到的程序将自动应用DEP保护机制。对于Optout模式来说,可以通过设置排除列表的方法,将不需要DEP保护的程序添加到排除列表中,其余的程序则启用DEP保护功能。

对于AlwaysOn模式来说,针对所有的进程启用DEP保护功能,在该模式下DEP不可以被关闭。只有在64位的操作系统上才可以使用AlwaysOn模式。对于AlwaysOff模式来说,对所有的进程都禁用DEP保护,在该模式下,DEP无法被动态开启,该模式只能在特定的场合下才可以使用,例如为了避免DEP干扰程序的正常运行等。例如,对于Windows XP来说,可以在其系统盘根目录下的“boot.ini”进行编辑,来切换DEP保护模式。在对应启动型后面追加“/noexecute=optout”或 者“/noexecute=Optin”语句,来采用Optin或者Optout模式。如果使用了“AlwaysOff”参数,表示禁用DEP。对于Windows 7等系统来说,可以执行“bcdedit.exe /set {curent} nx AlwaysOn”命令,开启DEP的AlwaysOn模式,在该命令中 使 用“Optin”、“Optout”、“AlwaysOff”等参数,可以激活对应的保护模式。

解决和DEP相关的故障

对于某些电脑来说,使用DEP保护机制可能会对某些程序或者整个系统的运行造成不利影响。例如,如果在开启IE时,频繁出现“已经关闭了此程序”的提示,导致IE无法顺利运行的话,就说明和DEP机制存在冲突的问题。

为此可以在开机时进入主板BIOS设置界面,在其中找到和DEP配置相关 的 项 目(例 如“Execute Disable Function”等),设置为“Disable”项,关闭硬件DEP保护功能,就可以解决问题。在没有DEP保护的情况下,必须为系统安装强悍的杀软来防御病毒、木马等恶意程序的威胁。当然,也可以管理员身份打开CMD窗口,在其中执行“bcdedit.exe /set {curent} nx AlwaysOff”命令来关闭DEP功能。

当然,最好按照上述方法,将IE添加到DEP中的排除列表中,不让DEP对IE进行管控,这样可以很好的解决该问题。在一般情况下,DEP会监控系统程序和服务,使其安全的使用内存。DEP会单独与CPU一起将某些内存区域标记为不可执行状态。如果某个程序试图从受保护的位置执行代码,DEP就会将其关闭并通知用户。即使其不是恶意代码,也会被DEP强制关闭。在DEP提供给用户的报告窗口中点击“单击此处”链接,在详细信息界面中可以显示出错程序的名称以及版本信息。用户可以据此来分析该程序的安全性,并根据需要将其添加到DEP排除列表中即可。

当然,如果该程序已经提供了升级版本,并支持DEP保护机制,最好的办法是对其升级,使其可以在DEP保护下正常运行。

小议DEP的局限性

DEP虽然拥有强大的保护功能,但也存在一些弱点,无法彻底阻止缓冲区溢出攻击。例如,对于硬件DEP保护机制来说,需要CPU的支持才行,但并非所有的CPU都提供硬件DEP支持,一些较老的CPU是不支持硬件DEP的。因为兼容性的原因,Windows有时无法对所有的进程都开启DEP保护功能。尤其对于一些第三方的DLL插件来说,可能不支持DEP,一旦开启了DEP,很可能造成进程运行异常。使用老版本的应用程序兼容性工具,需要在数据页面上产生可执行代码,这就无法开启DEP,否则很容易出现运行故障。

在编译程序时,即使使用了“/NXCOMPAT”参数,也只能对Vista以上的版本有效,对于XP等老系统来说,这样的设置会被忽略。当DEP运行在Optin或者Optout模式时,DEP是可以被动态关闭和开启的,因为操作系统内置了一些API函数,可以控制DEP的工作状态。如果一些恶意进程非法调用了这些API、函数,就可以关闭DEP保护功能,为系统带来了潜在的安全隐患。实际上,微软出于兼容性的需求,不能对所有的进程都开启DEP功能。当然,对于64位系统来说,采用AlwaysOn模式可以避免该问题。DEP保护的目标是进程,当某个进程加载的DLL模块中如果存在某个模块不支持DEP的话,该进程就不会贸然开启DEP,主要是为了避免异常的发生。

打开任务管理器,在“进程”面板中点击菜单“查看”→“选择列”项,选择“数据执行保护”项。在进程列表中的“数据执行保护”列中可以查看不同进程是否支持DEP的情况,只有显示“启用”字样,才表示对应的进程支持DEP。如果恶意程序攻击没有启用DEP保护功能的进程,就很容易溢出成功。DEP之所以可以防止非法溢出,关键在于当其检测到程序跳转到非可执行页执行指令话,就会抛出异常,执行异常处理程序。但是,如果恶意程序跳转到已经存在的某个系统函数中,因为该函数是存在于可执行页上的,DEP自然不会对其拦截。这样,恶意程序就可以在该执行页中找到其所需的指令,进而执行该指令,利用恶意程序自身提供的流程控制功能,可以执行完毕后自动返回。继续执行其他操作。

为了顺利运行,恶意程序甚至会直接调用相关的API函数,将DEP直接关闭。因为在Optout和AlwaysOn模式下,所有的进程默认开启DEP。恶意程序可能调用某个系统函数,将Shellcode所在的内存位置设置为可执行状态来避

开DEP对系统进行渗透。此外,恶意程序还会采取非法利用某个API函数来申请一段具有可执行属性的内存区域,将Shellcode代码复制到该区域来避开DEP控制。为降低攻击难度,恶意程序会在进程的内存空间中寻找一段具有可读可写可执行的内存区域,将Shellcode代码复制进来,对程序流程进行劫持,来非法执行Shellcode代码。

此外,恶意程序的伎俩还包括非法利用.Net文件,将Shellceode代码存放到.NET文件中的具有可执行属性的段中,当这些段被映射到内存后,自然具有了一定的可执行特性,恶意程序转入该区域后,就可以执行Shellcode代码了。和.NET文件类似,Jave applet文件也会被加载到浏览器内存空间,这些Jave applet空间所在的内存空间也具有了可执行属性,黑客只需将Shellcode代码放到Jave applet文件中,就可以避开DEP的管控。

猜你喜欢

进程内存代码
债券市场对外开放的进程与展望
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
改革开放进程中的国际收支统计
创世代码
创世代码
创世代码
创世代码
内存搭配DDR4、DDR3L还是DDR3?
社会进程中的新闻学探寻