· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [推荐] 江民安全专家永久免费 立即下载  RSA 2010
· [专题] 参与多核UTM调查 赢购物卡 谷歌遭攻击事件
· [IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 《拆弹部队》藏木马 看Xbox360与PS3背后秘密
· [热点] 报告:PDF漏洞远超微软 十款免费电子邮件程序

VISTA用户内存安全保护漫谈之safeseh

发布时间:2006.12.05 07:45     来源:安全焦点    作者:flashsky

0.前言

最近开始折腾VISTA,上个月在SST的BIOS沙龙SP2上讲过一点自己研究的心得加上收集到的一点资料混合起来的东西。会后几个朋友要资料,说实话,第一是vista在内存安全保护方面的改进是比较大的,涉及面比较广,而VISTA的研究也是才刚刚开始,关于vista的研究资料也是非常的少,每个改进都需要自己慢慢的去分析对比和研究.第二就是vista的安全越来越需要安全环境特别是编译器方面的配合,vista本身的库代码几乎全部是用.net编译器编译的,我使用的.net 2003也缺乏一些vista下支持的安全特性(估计MS有新的针对vista的开发环境),而且以前对.net的研究几乎没有,现在才开始找些.net的书来补习。第三就是目前我的工作也比较繁杂,研究vista的安全保护机制只是因为某一项工作的需要,并非是这项工作的主题,而我这个人又比较懒散,觉得只是分析机制,缺乏新创意的东西懒得动笔写。

但是现在觉得好久没有写点东西出来了,又答应过一些朋友要发布的,想想还是慢慢凑一些东西出来吧,只是关于VISTA的研究是长期的工作,靠一人之力只能有一点研究就写一点吧。所以学当年小四的学习笔记形式写写,因为当然其中错误与偏漏之处难免,只能姑称之漫谈。

1.什么是safeseh

以前堆栈溢出在的WINDOWS系统中一直都是安全问题的核心,其中覆盖seh的技术早为人熟知。safeseh是一项保护和检测和防止堆栈中的seh被覆盖而导致利用的技术

2.safeseh是vista的新技术吗?

safeseh并不是vista的新技术,safeseh是xp sp2就已经引入的技术。但是由于safeseh需要.net的编译器编译的image才支持,而xp sp2系统自身所带的库和执行程序都是非.net的编译器编译的,所以使得safeseh在xp sp2上只能成为聋子的耳朵,xp sp2下,堆栈溢出只要覆盖seh的地址就能轻松饶过所有的保护机制。因此在xp sp2时代,关于safeseh的研究从来不被重视,甚至对他的机理研究都存在很多错误,认为safeseh只是屏蔽了数据段的地址,只要是库函数空间地址就是被许可的,一些safeseh的操作被误解读成函数地址保护的操作。

3.为什么vista下safeseh才开始发威

vista自身带的系统库。程序99%以上是用.net的编译器编译的,.net的编译器默认编译时候就会在IMAGE里产生对safeseh的支持。因此vista下的应用加载的系统库几乎全是带有safeseh支持的IMAGE,堆栈溢出发生时覆盖这些支持safeseh模块的SEH都能被检查出来,使得覆盖堆栈中的SEH地址的技术不再可用。

4.safeseh的实现过程

safeseh本身的原理很简单,就是在编译器生成二进制IMAGE的时候,把所有合法的SEH函数的地址解析出来,在IMAGE里生成一张合法的SEH函数表,用于异常处理时候进行严格的匹配检查。基本过程如下(XP SP2和VISTA一样):

加载过程:

加载IMAGE时,定位和读出合法SEH函数表的地址(如果该IMAGE是不支持safeseh的,则这个SEH函数表的地址为0),使用shareuser内存中的一个随机数加密。

将加密的SEH函数表的加密地址,IMAGE的开始地址,IMAGE的长度,合法SEH函数的个数 作为一条记录放入ntdll的加载模块数据内存中。

异常处理过程:

* 根据堆栈中SEH的地址,确认是否属于一个IMAGE的地址空间。

> 如果属于

读取ntdll的加载模块数据内存对应的“SEH函数表的加密地址,IMAGE的开始地址,IMAGE的长度,合法SEH函数的个数"记录。

读出shareuser内存中的一个随机数,解密SEH函数表的加密地址,读出真实的SEH函数表地址。

* 如果该地址不为0,代表该IMAGE支持safeseh

根据合法SEH函数的个数,依次计算合法合法SEH函数的地址并和当前SEH地址进行比较,如果符合执行SEH函数,如果全不符合则不执行当前SEH指定的地址,跳出不执行。

* 如果该地址为0,代表该IMAGE不支持safeseh,只要该内存属于该IMAGE .code范围内的代码都可以执行。

> 如果不属于

检测该地址的内存特征。一般属于内核空间的未加载用户数据地址可以执行(但是其实等效于无法执行的,这块不可能加载用户数据,可能是MS为了迷惑一些研究者吧,看见代码能跳转到如0xcccccccc地址上,以为能饶过safeseh)。

5.vista下的safeseh的安全性

safeseh是非常强悍的,如果一个进程加载的所有模块都是支持safeseh的image,覆盖seh获得利用就根本不可能。至少VISTA下99%的系统库是支持safeseh的image。而xp sp2 99%的系统库是不支持safeseh的image,因此safeseh虽然是xp sp2就开始使用的技术,但应该算是在vista下才开始发挥作用的技术。

当然如果进程存在一个不支持safeseh的IMAGE就等于整个safeseh的机制失效,不过由于vista下支持进程空间随机技术,可以深层抵御这种情况下的seh覆盖利用。

当然一个思路是:是否可以通过覆盖shareuser内存中的随机数字和ntdll的SEH函数表的加密地址使得计算出来的SEH函数表的地址为0饶过safeseh的保护。不过这很困难:因为要达到这个目的除非存在下面的情况:

情况A. 知道shareuser内存中加密随机数,并能修改SEH加密地址,则需要知道ntdll加载的地址(随每次启动不同),且能通过漏洞获取shareuser内存中加密随机数,通过计算获得为0的加密地址再写入到SEH加密地址中

情况B. 知道SEH加密地址的数值,并能修改shareuser内存中加密随机数,则需要知道ntdll加载的地址(随每次启动不同),且能通过漏洞获取SEH加密地址的数字,通过计算获得为0的加密KEY,再写入到shareuser内存中

情况C. 需要知道ntdll加载的地址,并能够改写修改SEH加密地址和shareuser内存中加密随机数。

以上3种情况都需要特定的复合条件,很难具备。

6.可能的问题

依然存在着一些可能的问题。

第一就是支持safeseh需要.net的编译器支持,且程序所有加载的IMAGE都需要支持safeseh,否则容易导致失效,但依然有大量的第三方程序和库不是使用.net编译的。

第二就是我使用的.net 2003只对c++的windows应用的默认编译中就支持safeseh安全特性,在.net的应用编译中,对于运行时生成的托管代码,即使打开安全选项也不会支持一些安全特性,不知道.net 2005或者MS是否有最新的支持vista的.net出来。


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 充分利用Linux操作系统安全防护工具 (12-04) · 提高网络服务安全性 匿名FTP安全设定 (12-04)
· 就搭建起电脑安全防线给出的几点建议 (12-04) · 建立企业补丁管理策略 告别手工打补丁 (12-04)
· 面对黑客攻击 网络防火墙不是万能的 (12-04) · 安全看点 “视网膜密码”的前沿技术 (12-04)
· 从apnic获取电信 网通 铁通等ip的办法 (12-04) · 谁敢乱动 用Windows系统窃听器监视他 (12-04)
· 司坦神变种t和初始页变种djf (12-01) · 代理木马att和视频宝宝h (12-01)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
日系家电齐陷巨亏泥潭 转型能否翻盘?
·首家网媒网站人民网A股..
·京东当当老总对骂 不拼..
·专题:五一小假未到 家..
拒绝雷同 NEC携909e在华掀起硬朗风
·微软发布Windows Phone ..
·直播:2012中国绿色产业..
·2012MWC移动通信世界大..
直播:中国LED产业年会论坛
·专题:服务器教育行业案..
·专题:回顾2009 原装耗..
·专题:HP Photosmart Pl..
选择2012:零售业的网络翅膀
·赛门铁克互联网安全威胁..
·突破云障碍 掌控云端..
·2012天融信巡展..
访问人数过多,请稍候访问