查看: 3238|回复: 14
收起左侧

[技术原创] Microsoft's Enhanced Mitigation Experience Toolkit by Didier Stevens (全文翻译)

[复制链接]
星空下的吻
发表于 2011-6-15 13:06:31 | 显示全部楼层 |阅读模式
本帖最后由 星空下的吻 于 2011-6-15 13:08 编辑

  对想深入了解微软的EMET的朋友是一个很不错的参考资料.

  在阅读本文之前可以先看一下jeffrie的文章:http://bbs.kafan.cn/forum.php?mod=viewthread&tid=976536

  (jeffrie如果看到的话记得付广告费)

  微软的增强型减灾工具包是一个用来为那些不支持新型保护技术诸如DEP和ASLR的旧式应用程序增强保护的工具。如果你使用的应用程序并非利用DEP或者ASLR技术来减轻类似缓冲区溢出等威胁,你可以使用EMET强制这个应用程序开启DEP和ASLR。

EMET V2.0提供了六种减轻威胁的技术:
DEP(数据执行保护)
ASLR(地址空间布局随机化)
SEHOP(结构化异常处理覆写保护)
Export Address Table Access Filtering(导出地址表访问过滤)
NULL page Allocation(空页面分配)
Heap spray Allocation(堆喷射分配)

你可以通过使用EMET配置工具来为你的应用程序开启这些保护特性:

当你为一个特定的程序开启EMET的时候,EMET的有效DLL(即起作用的DLL)会注入到该应用程序的每一个实例.EMET包含32位(EMET.DLL)和64位的(EMET64.DLL)DLL.

当你安装EMET的时候,你可能会注意到安装过程需要Microsoft .NET Framework 2.0的支持,因为EMET是一个.net程序,所以这是必要的,但是这对于有效DLL不是必要的,因为它是个win32可执行文件.

EMET的配置被存放于注册表键HKLM\Software\Microsoft\EMET中.该位置表明你需要管理员权限来配置EMET,这将允许你在赋予你的用户最小的特权时,作为一个管理员来对你的用户进行设置.当你配置EMET的时候,你的最小特权用户帐户无法禁用你的配置.

数据执行保护(DEP)是一个在Windows XP SP2中介绍过的安全特性,它避免代码在仅被指定为数据的内存中被执行.Windows的应用程序可以指定内存(虚拟内存页面)作为数据或者代码的比例,但是X86微处理器却无差别的从数据内存或代码内存中执行代码,直到DEP的出现以及微处理器对DEP支持的到来.

在DEP开启的状态下,Windows操作系统通过生成一个异常来避免代码在数据内存中被执行.

DEP有效地减缓了一个被广泛利用的攻击方式所带来的威胁-攻击者可以向数据内存写入代码就像写入堆和栈一样(更准确的说是shellcode)并使它执行.但是DEP的存在使得代码无法从被标记为数据的虚拟内存页面中执行,因为这种操作将触发一个异常,并将会导致进程的终止.

如果当攻击发生的时候用户还有尚未保存的数据,那么这将不可避免的带来数据的丢失,除非应用程序提供了类似于Microsoft office一样的数据恢复特性.

当被注入有效DLL的进程启动时,EMET通过调用SetProcessDEPPolicy函数来启用常驻的DEP特性;它一旦被激活,就不会被调用的进程所禁止.


地址空间布局随机化(ASLR)是保护漏洞不被本地或远程利用的重要特性.当ASLR被启用时(在Windows vista被首先提出),可执行文件(EXE和DLL)在半随机化的地址中被加载到进程内存.

如果ASLR没有被启用,一个可执行文件加载进内存的基地址在编译时候就已经确定.

如果一个地址并非空闲的(即该地址处内存已经被分配),那么文件映像加载器将会在其他的地址中加载可执行文件.而且这个地址每一次都不相同.但是当一个可执行文件在编译时设置了ASLR的标志,文件映像加载器将不会尝试在基地址中加载可执行文件,即使该地址不在使用中.取而代之的,它将会使用半随机化的地址加载(当前的ASLR支持256种不同的可能性).这个半随机化的地址对于指定文件时是相同的,只有在Windows重新启动后才会被改变.

ASLR对于防御远程漏洞很重要(比如在网络服务端利用漏洞)因为攻击者的shellcode无法对攻击所需要的win32 api函数的地址进行硬编码(入口地址被随机化).

ASLR对防止本地漏洞被利用同样很重要,因为它阻止ROP代码正常工作.ROP是一项用来绕过DEP的技术:它并不将shellcode写入堆栈中(被DEP保护的数据部分),ROP利用在运行进程的可执行文件中找到的小部分字节代码的地址.ROP代码由访问ROP Gadget的调用组成,它们是攻击者生成的认为合适的一小片代码。因为ROP通过将ROP-gadgets的地址写入堆栈中但在可执行内存中执行工作,因此DEP将会允许该操作.但是如果攻击者无法找到ROP-gadgets,那么他们同样无法使用ROP来触发被DEP保护的漏洞位置.

ASLR同样还能防止攻击者找到ROP-gadgets:当ASLR被开启的时候,可执行文件将被载入随机的地址,因此攻击者无法预测ROP-gadgets加载到内存的什么地方去了.

这就是为什么使用ASLR辅助DEP显得那么重要的原因了.如果不配合ASLR单独使用DEP,那么ROP技术可以被用来触发漏洞.Adobe Reader有一个众所周知的漏洞利用时使用了ROP:Adobe Reader 9以及之后的版本都同时使用了DEP和ASLR来保护程序免受攻击,但是其中一些Adobe使用的第三方DLL并不支持ASLR.这个DLL即icucnv36.DLL,它总是加载进相同的地址,因此攻击者可以使用在该DLL中找到的ROP-gadgets,因为他们能够预测ROP-gadgets的地址.

当EMET配置为强制启用ASLR时,EMET通过强制icucnv36.DLL在随机化的地址中被加载的手段来保护Adobe Reader不受ROP的攻击.更严格的来说,EMET并非使用ASLR技术,而是强制已经加载入内存的DLL在它们的基地址处预分配一些内存.

当一个DLL已经被加载但是却不支持ASLR的时候,EMET的有效DLL会在这些DLL的基地址处分配一些虚拟内存以便载入.然后,当文件映像加载器加载该DLL的时候,它会注意到该基地址正在使用中,于是就在另一个位置中加载DLL.值得一提的是,EMET提供的保护方法甚至好于标准的ASLR,因为每一个进程实例都拥有不同的地址.EMET同样通过预分配指定的虚拟内存页面来防御堆喷射攻击.攻击者使用堆喷射技术(通常使用JavaScript或者Flash编程)来将攻击性的shellcode填入堆的内存中.

当漏洞被触发并且使得程序通过流式跳跃到一个位于堆内指定的地址处,在堆中指定地址被喷射的shellcode将被执行.地址0x41414141是一个典型的例子(这是AAAA的十六进制表示,它经常出现在缓存区溢出的例子中).


EMET通过在这些指定的地址处预分配虚拟内存页面来防止成功在指定位置(如0x41414141一样)插入shellcode的堆喷射攻击.这种预分配技术使得这部分的内存对于堆不再有效,因此没有shellcode能够被写入.被EMET保护的地址可以在注册表键值heap_pages中找到,并且当前的值为0x0a040a04;0x0a0a0a0a;0x0b0b0b0b;0x0c0c0c0c;0x0d0d0d0d;
0x0e0e0e0e;0x04040404;0x05050505;0x06060606;0x07070707;
0x08080808;0x09090909;0x14141414.

另一种减轻威胁的技术是空页面分配,微软将空指针解引用(使用地址0x00000000),称为一种理论上的攻击方式.尽管如此,EMET仍然通过在0地址处预分配内存来防止这种攻击,就类似在指定的地址处预分配内存一样.

唯一的区别就是EMET需要使用特别的方式在地址0x00000000处预分配内存,因为win32 API函数VirtualAllocEx不接受地址0x00000000作为有效的参数.取而代之的是,EMET将使用NtAllocateVirtualMemory函数,该函数可以被用来从0x00000000开始分配虚拟内存.


shellcode需要调用win32 API函数来进行一些不法的操作,因此这需要知道每一个用到的函数的地址(这些函数经常可以在kernel32.DLL和ntDLL.DLL中找到).静态的shellcode使用硬编码的地址:这意味着这个shellcode将只能够运行在特定的Windows版本上(不考虑ASLR),因为每一个Windows版本都有着不同的win32 API函数的地址.

而动态的shellcode则不使用硬编码的地址,它通过在每一个进程的固定地址处遍历函数表来获取需要的函数地址.动态的shellcode可以在不同的Windows版本上发挥作用,因为它并不依赖于硬编码的地址.

EMET通过检测函数表枚举行为(即导出地址表访问过滤)来阻止动态shellcode的攻击.当它检测到枚举行为的时候自动终止当前进程.从技术角度来看,它通过在函数表中大量的地址处设置硬件断点来检测枚举行为的起始位置(当硬件断点被触发的时候).当这些地址的数据被读取的时候(当shellcode枚举函数表的时候),一个断点异常将会被触发,然后EMET就会阻止shellcode的执行.


结构化异常处理覆写保护在Windows Vista SP1中首先被提出来.SEHOP将会在异常被分发到处理器之前通过检测SEH链的无效指针来阻止结构化异常处理的漏洞被触发.这些无效的指针对于覆写SEH记录存在着副作用.EMET为Windows vista SP1之前的Windows版本提供SEHOP技术的支持.

务必记住当EMET检测到恶意的行为时通常会立即终止进程.这将威胁遏制于触发的过程中,但是不可避免的带来了数据的丢失.假如这样的情形发生在Microsoft office的产品word上的时候,用户将失去所有未保存的工作,除非word的数据恢复特性可以通过自动保存来恢复大部分未保存的工作.

充分测试在EMET保护下的应用程序是非常重要的,因为并非所有的旧式应用程序能够在强制使用DEP或者ASLR的情况下正常工作.你必须在将应用程序分发给用户之前测试这些程序的兼容性,否则你会接收到更多的求助电话.如果你的应用程序在EMET的保护下无法正常运行了,你必须不断的尝试以找出EMET的哪一个保护特性是导致应用程序失败的罪魁祸首.

因为EMET是通过注册表进行配置的,所以你可以定义组策略对象(GPOs)来为你的用户组设置正确的键值,而不必为每一个用户单独配置.

EMET是一个有用的工具,它不仅可以保护那些旧式的应用程序,对于完全支持DEP和ASLR的程序也同样适用.特别是那些支持ASLR,但是使用时包括的DLL却不支持ASLR从而可能引发ROP攻击的程序-比如一些外壳扩展DLL.外壳扩展为Windows提供额外的功能,比如Windows Explorer的右键菜单.当你安装类似于Winzip这样的程序时,安装程序也将会安装一个外壳扩展,将Winzip的功能整合至Windows Explorer的右键菜单,使得其他所有的程序可以打开或保存项目.幸运的是,Winzip的外壳扩展DLL支持ASLR,因此它不会让使用Winzip的主程序遭受ROP攻击.但是并未所有的软件提供商都像Winzip这样有着安全意识,你肯定会找到一些软件安装的外壳扩展DLL不支持ASLR.而这些DLL将会使得利用它的主程序遭受ROP攻击-不仅仅是Windows Explorer,也有可能是类似于Adobe Reader的应用程序.

EMET的一个缺点就是当程序被EMET 终止的时候你不会获得任何通知.应用程序只是简单的终止,你没有获得任何类似于消息框的警告.因此可以预测来自用户的求助电话的增多是因为Adobe Reader崩溃了(只是举个例子而已).当用户打开一个恶意的PDF文件时,EMET会触发一个可疑的行为,并直接终止Adobe Reader.你必须意识到被EMET保护的程序的崩溃可能表明一个恶意攻击被成功阻止.

我建议你可以关注一下EMET,并使用它来保护你的应用程序,特别是那些恶意软件作者最喜欢的攻击目标,如Adobe Reader.即使你用的是Adobe Reader的最新版本,EMET仍然可以帮助你为它所调用的第三方DLL强制开启ASLR.icucnv36.DLL就是一个很好的例子.再者,如果你服务的组织机构没有使用最新版本的应用程序(无论出于什么原因),介绍EMET来增强用户电脑的保护无疑是一个绝妙的主意.

原文附件:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?快速注册

x

评分

参与人数 10魅力 +1 人气 +11 收起 理由
XMonster + 1 1111111
jefffire + 1 抱歉,求助请到求助区
帅就是帅 + 1 ~
mexth + 2 版区有你更精彩: )
bbs2811125 + 1 精品文章

查看全部评分

pastport
发表于 2011-6-15 13:10:51 | 显示全部楼层
2.1 又多几种  
不过系统设置那边还无法开到最大
有些软件兼容问题
现在都要手动常用软件
klinxun
发表于 2011-6-15 13:11:21 | 显示全部楼层
星空版翻译不错
星空下的吻
 楼主| 发表于 2011-6-15 13:13:24 | 显示全部楼层
pastport 发表于 2011-6-15 13:10
2.1 又多几种  
不过系统设置那边还无法开到最大
有些软件兼容问题

求详细链接
bukkake
发表于 2011-6-15 13:29:49 | 显示全部楼层
就看得懂喷射两个字
小樂
发表于 2011-6-15 20:13:35 | 显示全部楼层
翻譯得真好
智琛
发表于 2011-6-15 20:33:53 | 显示全部楼层
星空辛苦了
那个,啥翻译。。。
bbs2811125
发表于 2011-6-15 21:18:57 | 显示全部楼层
很有前途~做好软件的兼容性方面就好了,系统设置开到最大很多程序运行都有问题
-oAo-
发表于 2011-6-15 21:32:42 | 显示全部楼层
谢谢翻译
beiluoshimen
发表于 2011-6-15 21:36:46 | 显示全部楼层
楼主辛苦了。。搞那么多软件干吗呢,集成到MSE中好了。。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-2-6 11:59 , Processed in 0.139795 second(s), 18 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表