|
谈Safeseh如何保护VISTA用户内存安全(1) 最近开始折腾Vista,上个月在SST的BIOS沙龙SP2上讲过一点自己研究的心得加上收集到的一点资料混合起来的东西。会后几个朋友要资料,说实话,第一是VISTA在内存安全保护方面的改进是比较大的,涉及面比较广,而VISTA的研究也是才刚刚开始,关于VISTA的研究资料也是非常的少,每个改进都需要自己慢慢的去分析对比和研究。第二就是VISTA的安全越来越需要安全环境特别是编译器方面的配合,VISTA本身的库代码几乎全部是用.net编译器编译的,我使用的.net 2003也缺乏一些VISTA下支持的安全特性(估计MS有新的针对VISTA的开发环境),而且以前对.net的研究几乎没有,现在才开始找些.net的书来补习。第三就是目前我的工作也比较繁杂,研究VISTA的安全保护机制只是因为某一项工作的需要,并非是这项工作的主题,而我这个人又比较懒散,觉得只是分析机制,缺乏新创意的东西懒得动笔写。但是现在觉得好久没有写点东西出来了,又答应过一些朋友要发布的,想想还是慢慢凑一些东西出来吧,只是关于VISTA的研究是长期的工作,靠一人之力只能有一点研究就写一点吧。所以学当年小四的学习笔记形式写写,因为当然其中错误与偏漏之处难免,只能姑称之漫谈。
什么是Safeseh
以前堆栈溢出在的WINDOWS系统中一直都是安全问题的核心,其中覆盖seh的技术早为人熟知。Safeseh是一项保护和检测和防止堆栈中的seh被覆盖而导致利用的技术。
Safeseh是VISTA的新技术吗?
Safeseh并不是VISTA的新技术,Safeseh是XP sp2就已经引入的技术。但是由于Safeseh需要.net的编译器编译的image才支持,而xp sp2系统自身所带的库和执行程序都是非.net的编译器编译的,所以使得Safeseh在xp sp2上只能成为聋子的耳朵,xp sp2下,堆栈溢出只要覆盖seh的地址就能轻松饶过所有的保护机制。因此在xp sp2时代,关于Safeseh的研究从来不被重视,甚至对他的机理研究都存在很多错误,认为Safeseh只是屏蔽了数据段的地址,只要是库函数空间地址就是被许可的,一些Safeseh的操作被误解读成函数地址保护的操作。
为什么VISTA下Safeseh才开始发威VISTA自身带的系统库。
程序99%以上是用.net的编译器编译的,.net的编译器默认编译时候就会在IMAGE里产生对Safeseh的支持。因此VISTA下的应用加载的系统库几乎全是带有Safeseh支持的IMAGE,堆栈溢出发生时覆盖这些支持Safeseh模块的SEH都能被检查出来,使得覆盖堆栈中的SEH地址的技术不再可用。
Safeseh的实现过程
Safeseh本身的原理很简单,就是在编译器生成二进制IMAGE的时候,把所有合法的SEH函数的地址解析出来,在IMAGE里生成一张合法的SEH函数表,用于异常处理时候进行严格的匹配检查。基本过程如下(XP SP2和VISTA一样):
加载过程:加载IMAGE时,定位和读出合法SEH函数表的地址(如果该IMAGE是不支持Safeseh的,则这个SEH函数表的地址为0),使用shareuser内存中的一个随机数加密。
将加密的SEH函数表的加密地址,IMAGE的开始地址,IMAGE的长度,合法SEH函数的个数 作为一条记录放入ntdll的加载模块数据内存中。
|