看到技术文章很稀奇——张翼:跳出PC局限用手机授权防御木马

相对pc的了解,对手机的了解还比较“少”的黑客来说,使用手机授权确实提高啦一层安全性,只是手机的安全性如果pc的安全貌似比pc更弱。手机如果明文发送嗅探也不是没办法

Windows底层和反木马方面专家张翼指出,随着信息的公开,木马的生成越加容易,越加泛滥,尽管企业做出最大努力还是很难保证系统不被攻克。如果企业可以跳出在不安全的PC上的局限,通过手机作为可信物,相关操作比如登录以及密码修改需要短信回复确认,或将可以解决木马泛滥的问题。

以下是文字实录:

张翼:大家好!首先讲讲网游木马常用攻击技术。第二,讲讲从开发商的角度,以较低的成本实现防御网游木马的策略。首先是键盘记录,所谓的键盘记录是在在键盘输入的时候木马会把你的键盘输入的信息记录下来,网上流传最广、最通俗的方法就是安装全局消息钩子,从而窃取密码。原来消息钩子这种进入密码的方法用得比较多,但是从2006年起主动防御的流行这类方法会被行为监控拦截,比如卡巴斯基这种主动防御就防这个。后来逐步地有一些黑客发掘出以前使用的比较少的被厂商所忽视的一种方法,例如图片上举到的这些(图)。

前面几个安装全局消息钩子、GetKeyState、GetAsyncKeyState 、 DirtecX接口的方法是从用户态实现的。原始输出设备raw input用它来窃取密码,这也是属于用户态的。键盘过滤驱动以及挂钩键盘驱动的Dispatch例程等方法属于核心态实现的。 Ppt中后面提到的所谓的Inline Hook是广义的,就是我进行挂接的时候可以在Rin3上挂,也可以在Rin0下挂,我的hook可以挂在自己的游戏程序里面,从而获取密码,深入的话也可以深到话kbclass设备的回调函数。突破nPtotect保护也不难。

第二部分是内存读取。用户输入密码后,通常情况下密码没有经过处理的话,有一段时间用户输入的密码会以明文的形式存放在内存中,包括登录游戏后,游戏中人物装备等级等信息都可以从游戏进程的内存中读取。

第三是星号密码获取以及缓存密码,比如在QQ或 MSN上输入密码的时候,可以选择记录密码的情况。使用GetWindowText函数就可以获取常规的星号密码,当然对于具有密码属性的输入框在GetWindowText之前需要使用 SendMessage取消其密码属性。

下面讲到浏览器插件,主要用于获取IE相关的信息,也可以用来突破HTPS。

来看张图片,小区域精确截图(图),这种方法可以应对许多种网游的保护措施,先安装一个全局鼠标钩子,对你鼠标点击的时候,比如鼠标点击这边,事先算一下你的按纽的像素,把边长除以二,以鼠标点击的点为正方形的中心,从而以这个点截取一个正方形,面积最大的就是我们所要的密码信息。小区域精确截图的方法和图象识别,从而可以把图象信息直接转化为字符。如果说比较复杂,图象识别不了的话,黑客们常使用的方法就是发邮件,因为发邮件是可以以HTML的方式,从而可以把图片嵌在里面,黑客收到信的时候,看密码就一目了然。虽然是截取的图,但是也能很清楚地看到。

除了刚才讲的这些,下面还有应用得比较广的,例如封包截取或者协议分析,从协议的角度分析人物信息、用户名、密码。现在还是有一些比较厉害的人可以通过调试,逆向工程,结合ARP欺骗,对于非对称密钥加密的话,传统的破解方法比较困难。但是在局域网里面可以结合ARP欺骗、伪造,实现相应的效果。基本上现在的木马在对付非对称密钥加密的时候基本上是采用欺骗的方法。

还有一些其他技术,比如一些猥琐方法,谈技术含量比较低,但还是有效果。举一个例子,很久之前人家想到QQ密码,他自己写一个界面和QQ基本上差不多的,然后输入之后,再把真正的QQ进程运营起来。这是被人鄙视的方法,要钻空子的话还是比较多的。几年前盛大对安全很重视,那时候推出的盛大密宝,但它那种对于真正想窃取的人也是形同虚设,但是那个可能比较困难,或者还需要入侵它的服务器,把相应的算法搞清楚。这是比较困难的,但是用得比较多的,现在很容易实现的就比如这张图(图),我们后面讲的解决方案也会碰到类似的问题,对于盛大密宝使用的这些方法,我先简单地把盛大密宝的使用过程讲一下。

在输入用户名、密码后,它会又出现一个对话框,盛大密宝是以1分钟为间隔。以一分钟为单位,有一个函数,那个函数有两个变量,盛大密宝的序列号做了变量,还有一个变量就是和时间相关的。以一分钟为单位,会随机生成六位数,但是登录之后游戏里面就会随机抽取三位,请你输入盛大密宝,所谓盛大密宝就像U盘大小,中间有一个写字屏,以一分钟为单位,按照它的算法随机生成六位数,游戏的程序比如说请输入第一位、第三位、第四位,从六位数里面选三位数,让你输入第几,这是游戏随机的。以我们常人的角度看来就很安全,安全性很高。但是还是能被破解,原理就是这样(图)。

比如这里有两台机器,这台机器上面已经感染了能够破解密宝的高级木马,攻击者已获取初次登录及的用户名、密码。攻击者用已获得受害者的用户名密码登录。当受害者登录游戏时输入的用户名和密码已被木马程序换掉,登录另外一个无关帐户。为什么木马要在受害者登录时把他的帐号密码换成其他帐号呢,因为一个帐号不能同时登录。这样受害者输入自己的用户名、密码的时候其实已经变成另外一个人的帐号了。他进去之后会出现一个框,要求输入盛大密宝随机生成的6位数中的3位数。而且3位数的序号是给定的,比如第一位、第三位、第四位的六位数。从六位里面选三位位置是随机的。攻击者登录后出现密宝信息输入框,比如说请输入六位数里面的第四位、五位、六位。如图,攻击者只需在木马控制端里输入四、五、六,点完发送。此时木马端收到信息后就会把受害者的第一位、第三位、第四位提示信息换成四、五、六位。这样受害者就会输入盛大密宝随机生成的6位数第4、5、6位数字,这正是攻击者登录游戏所需要的信息。所以攻击者就实现了破解盛大密宝保护的效果。

因为黑客进入游戏之后防止他再重新进入,发现帐号正在使用,可以在我们的木马端做一些手脚,拦截封包两三分钟内让他上不了网,等他看看是否有一些有价值的装备或者游戏币,等处理完之后再让他上线。或者暴力一点,就是直接终止进程。也可以挂钩NtCreateProcess/Ex、NtCreateSetion,在一定时间内禁止次进程创建。

从内存读取的方法在木马里面也是使用得非常广泛的。在QQ稍微老一点的版本也是同样存在内存里面。现在有一些网上银行及游戏,他可能采用软键盘,我刚才说的对付软件盘通常有两种,一种是截图的方法,还有就是挂钩TextOut函数,取得软件中的字符,类似于金山词霸的技术,也就是是屏幕取词,用户点击点密码时已经被屏幕取词获得密码的字符信息。我这里讲的是一些主流的,还有针对特定的情况有一些比较猥琐的方法。

刚才是从攻击的角度进行分析的。现在开始讲怎样防御。考虑防御站的角度不同,比如游戏开发商是从自己写游戏的角度。从第三方安全软件开发商,比如瑞星、卡巴斯基,或者从使用者、网络管理员,比如网络管理员怎么样从边界防火墙角度怎样进行相应的配置。现在我讲的主要侧重于游戏开发者的角度。从游戏开发商的角度和第三方安装软件的防御角度还是有区别的。因为如果是游戏开发商的话,他做防御是要小型化,主要针对我自身的特性。不像安全软件可以做的很全面很庞大。从游戏开发商的角度是怎样做最少的事情取得自身游戏的安全性。

我们先从基于主机的角度谈一谈。我们刚才已经粗略地了解了网游木马的密码获取常用手段,对应地我们要将缓存密码加密,自定义窗口类对相应读取密码内容的窗口消息进行处理,从而使它用传统的方法获取不到密码。第二是防范按键记录,虽然这只是简简单单几个字,我是把涉及到的面讲一讲,同样是一个防范按键进入,可以做得很浅,但同样也可以做得很深。越深入底层公开的资料越少,操作的系统提供的现成接口比较少,需要自己做的比较多,所以难度系数增大,从而会写的人就比较少,安全性就提高了。但是随着防御越往底层做,虽然安全性提高了,但是稳定性也下降了。从理论上说,只要原理正确的,也是可以做到稳定的。但是因为这些东西是人开发的,由于水平、经验,尤其是开发时间的限制,没有那么多时间去测试,没有时间经过多种客户环境的考验,所以想推出一个非常底层的产品级的、比较稳定的,时间会比较漫长。现在防范键盘记录的一个比较底层的比较稳定的方法是挂kbclass中的KeyboardClassServiceCallback,兼容性也较好,兼容USB、 PS/2的。

原来QQ采用的是虚拟键盘,虚拟键盘其实也是一种成本较低效果较好的方法。但需要防御我刚才说那些密码窃取方法,比如挂钩TextOut的屏幕取词以及小区域精确截图。另外就是软键盘中按键的顺序要随机生成,还有就是软键盘在屏幕上出现的位置最好也要随机,如果大键盘位置固定的话还是很容易被盗取。还有就是最好不用字符,用比较复杂具有较强干扰性的图片,这样图象解析就比较困难,一般只能用截屏。我们现在已经知道的屏幕截取的方法通常是CreateDC和模拟鼠标按键PrintScreen键,所以只要挂钩相关函数就可以防止截取。从产品可用性的角度,在输入密码的一分钟之内对截屏功能禁用,这样对可用性也没有什么影响,而且避免了因交互式保护的烦琐带来的用户体验下降的弊端。

还有一种是在网吧里比较盛行的基于ARP欺骗窃取整个局域网内的游戏帐号信息。现在网吧基本上都是交换机的,基本上都是通过ARP欺骗的方法,就可以破取局域网里面其它机器的分包,如果能把网游的协议逆向分析出的话,就可以破解获取整个局域网里所有使用游戏用户的信息。对于网吧和局域网用户,防范ARP欺骗是很有必要的。

网游木马使用的各种密码窃取技术都会使用到相关的函数,从基于主机主动防御的角度,对相关函数挂钩实施行为监控即可防御相应密码防御技术,如 NtOpenProcess、NtReadVirtualMemory、NtUserSetWindowsHookEx、CreateDC等。其中挂钩NtOpenProcess/NtReadVirtualMemory用来防范木马程序读取游戏程序进程空间中的密码,NtUserSetWindowsHookEx用来防范安装全局钩子。另外还可以枚举设备栈,对键盘过滤驱动进行检查。通常安全软件中使用较多的是编写驱动程序挂钩SSDT,还有少部分inline hook。去年出现的比较多的安全软件的驱动漏洞不少是因为SSDT挂钩后的处理函数编写不完善,所以实现行为监控功能时我们自己的处理函数也要写得很健壮,防止漏洞的产生。

对于防御ARP欺骗,通常采取NDIS HOOK或者NDIS IMD技术,截取ARP包进行分析,丢弃伪造的欺骗包。另外实现还应建立一个可信的IP-MAC库,所谓的可信基就是在确保网络没有欺骗的情况下,确保其他机器尤其是网关的IP-MAC映射关系,先把它存起来,然后截取到ARP封包时与事先建立的可信IP-MAC关系进行比较判断。还有一个是比较简单的,就是用系统自带arp命令实现IP/MAC绑定的,但是对于Windows2000应该是没有用的,这点网上几乎没有披露,印象中只有flashsky以前提及过。因为Windows2000没有检查IP-MAC绑定是静态的还是动态的,虽然进行了绑定,但只要有ARP请求/应答包,WIindows系统还是会把伪造的IP-MAC对应关系添加到自身的ARP缓存表中。ARP的绑定功能在Windows2000里面形同虚设。所以通用有效的还是使用驱动利用NDIS HOOK/NDIS IMD技术拦截ARP包分析过滤。

有些情况下要获取游戏密码以及人物信息的话,最好到它的进程空间里面去,所以有很多木马就把自己的dll先注入到你的游戏进程里面。但是现在许多安全软件比如卡巴7、江民2008都采用的主动防御技术,而已防范常规的诸如CreateRemoteThread、SetThreadContext等注入技术。为了绕过主动防御以及实现自启动,某些木马利用了Windows一个简单的系统机制,就是目录的优先级,具体讲如果当没有写绝对路径只是相对路径,调用dll时,优先加载同目录下的,然后才是系统目录。比如在网游目录下释放一个 kernel32.dll,kernel32.dll所有Ring3程序都需要用到的吧,所以只要你的游戏程序隐形起来了,木马释放的 kernel32.dll也就注入到了游戏进程里面。所以防止其他程序在游戏目录中创建相关文件也是比较重要的。关于具体的实现技术可以采用文件过滤驱动,甚至是Ring3下的全局钩子。另外,Ppt中提到的辅助方案:“游戏主进程检查自身模块中除了自身dll模块以及已签名文件有没其他dll模块,有则强行卸载”,与刚才说的互补的,还是比较有效的。

还有就是保护自身程序不被修改,因为当安全软件越来越严格,可能盗号木马无路可走时就以修改你自身的程序实现密码窃取以及自启动,所以对游戏自身

原文地址:http://tech.qq.com/a/20080318/000411.htm

看到技术文章很稀奇——郑歆炜:企业网络安全维护要减少人的因素

最弱的环节始终是安全要考虑的问题,从整体考虑设计网络结构架构和制定人员制度规范。

 运维和安全可能是两个分开的话题

运维标准化,安全结构化分层化争取更多的安全事件响应时间

游戏领域安全专家郑歆炜指出,如果企业网络安全完全依赖人员个人的高素质,会有风险过大。企业不能依靠人,要建立起结构体系和规范制度。

以下为郑歆炜讲演实录:

郑歆炜:运维和安全可能是两个分开的话题,我想就这两个技术做一个随想,也是和大家探讨,探讨这几年我在运维当中我的想法和困惑。

我先讲一个故事,有一个服务器官网通知到无法访问,系统管理员确认是由于拒绝服务攻击导致服务器无法提供服务。于是系统管理员联系了IDC负责人,通报了情况后,要求IDC负责人和电信进行协调,共同防御进攻。这个在大家看来是一个很正常的流程,应该没有任何问题。但我们再看下面的,系统管理员也没有闲着,他在等待的时候对数据包进行了分析,发现了是对域名发起的攻击,系统管理员把公司里面所有可以用的应用补丁下载中的服务器选出来,大概选了三十台,然后把官方网站同步到这三十台服务器上,同时将只有两台服务器的域名解析到分布在全国各地的补丁服务器上。攻击虽然还在持续,但是网站已经可以访问。

这个系统管理员做了一件非常了不起的事情,他不但分析了攻击,而且做出了正确的响应。这件事情发生在我刚入公司的时候我的同事做的。我在想可能拿到现在,如果系统管理员能做到这样的响应情况是一个非常优秀的系统管理员。但那时候就已经做到了。现在看来这件事情做得非常漂亮,包括防御的过程和选择,还有应对措施都非常好。因为当时的系统是非常标准的,是完全一样的系统,优秀的个人素质,导致这件事情处置得非常迅速和果断。对于公司来说,这么快的响应解决,非常好,可以讲这个人是公司难得的人在。

我们再讲第二个故事,是另外一个管理员,这也是一个比较早期的故事,可能当时Windows 管理员没有干什么事情,他每天也就是开关游戏,他只负责最简单的游戏服务开关,每天看服务状况,他从来不知道Windows服务器甚至还要打补丁或者干别的事情,但是过了几年之后他换了一件工作,同样是做Windows管理员但却发现了很多问题,Windows系统要打补丁了,他觉得很奇怪,为什么以前不需要打补丁而现在需要打补丁。因为原来公司是做整体安全保护的,他们所有的服务器都是通过一个整体来保护,就算没有补丁也可以保证服务器的安全,而且服务器是做内网管理,外网连接全部中断,所以他在管理的时候根本没有遇见过任何网络中断或者外网访问混乱的问题。

这个故事告诉我们什么呢?优秀的基础体系结果设计,配合整体安全策略,实现基础安全。让维护和安全更容易,更有效。

来看第三个故事,就像第一个人一样,他不仅擅长系统管理、擅长网络安全,而且它的部门里面同样都是拥有各自专长的擅长网络管理和网络安全,当然他们的领导也是技术专家,运营部门撑起了公司数千台服务器,大概四个人,效率高,而且没有出现过任何网络问题,因为三个人都是网络安全高手,系统管理员对网络的解决比网络部可能更有效,他们更快地解决问题。所以公司也没必要设立安全部门了,运维部门就解决了所有的问题。过了几年以后,他的领导走了又招了一位领导,但是其他三个会觉得环境变了也觉得没什么意思就走了,其中有个人就离职了,他们发现接手的人在各种方面都不如自己,也跟自己配合不如原来那么默契了,于是大家相继离职了,这时候公司反而出现一个问题,就是没有人能做以前工作的事情,整个部门全部重新设定,包括重新设计了系统管理部、网络安全部。当然,这个故事说明了什么问题呢?这个公司过度依赖人,把所有事情都集中于人,最后导致出现了致命的问题,带来一个非常致命的问题是人和整体之间没有处理好,最后人离开了没办法要解决剩下的问题只能重新招人,但重新招的人没办法满足需求,只好重建系统。

这三个故事,系统维护人员高素质对运维安全体系帮助非常大。一个优秀的系统管理员,大家看到开始的那位系统管理员他解决问题非常快,而且非常有效,这样的话在一个公司里面如果都是这样的精兵强将的话也许安全问题就解决了,不会也这么多黑客。

故事二就说明一个良好的基础结构体系设计,对整个公司安全风险和维护人员的工作难度都会带来很多好处,而且能让整个公司的运作更良好。

故事三说明一个过于依赖人员素质的运维体系是不可取的。

我们现在面临的三个问题。运维体系,因为我把运维和安全体系是分开的两个部分,这个部分运维体系面临的问题,一个是系统的多样化和应用的多样化,人员的更替频繁。像我们讲的Windows、Linux系统等更多系统,但这些多样的问题带来管理上更麻烦,应用上也是。第三个问题是人员更替,因为现在信息流通了,所有的人员想换工作很容易,公司要不停地招人,接替。我这几年发现我的同事换得很快,经常有人离职有人接手。我想应该是个普遍现象。

网络部分,我们看现在的系统网络,首先应用的多样化就带来网络部分的复杂,因为各种各样的应用,开各种各样的端口让管理更麻烦。还有就是各种协议的问题,早上说了Web方面,那可见其它部分的问题就更多了,现在网络部分如何开放这些协议都带来了很严重的问题。

现在我们看安全体系所面临的问题,一是太多的应用所带来的安全问题。因为公司越大,各种各样的运营东西也就越来越多,做得多错得多,不是说都错了,但是错的概率大了很多。很多公司过快发展,很多公司因为过多注重业务的发展,导致了安全出现断层,很多时候很多公司做了很大的业务,但是没有安全部门或者安全部门刚刚开始筹建,就带来了安全的断层。还有就是重实现忽视安全,在我的职业生涯中,很多时候遇见问题是安全提出的问题被业务部门所拒绝,因为业务部门要求我们的业务是给公司带来盈利的,你必须得保证业务先行,而忽视了安全。这样的话很多时候安全都退到后面一步。

人员安全意识不足。我对这几年的看法,我觉得现在计算机越来越容易用了,是人都可以用计算机,是一个必备的资源,但是这些人的安全意识并没有达到一定程度,反而不是去追求高度,而是一些最基础的安全,这反而是我们现在面临的最大问题。

攻击方式多样。现在只要翻几个网页就可以攻击,而且攻击多样化对防守的一方要求更高。各种各样的攻击,安全人员首先要熟悉这些攻击才可以防御这些攻击,但是这样的话对安全人员的要求就比以前提高很多,也许以前只要补补漏洞,现在还要熟悉各种各样的安全技能。

现在我提几个我对运维体系的看法。第一、标准化。有三个解释:安装、系统配置、应用编译。标准化为什么好?为什么我把这个放在第一条呢?因为我认为标准化可以给公司带来很多好处。因为所有的系统让你管起来方便,而且可以保证配置的安全,这样也避免了误配置导致的安全问题。还有就是应用编译,我们都知道现在是受动编译的,各有各的爱好,很多系统管理员喜欢编译一套自己的东西,但是这样过多地个人发挥导致管理上的麻烦,这些如果能规范起来,保证系统和运营的迁移都有很多好处,我觉得是值得推广的事情。

网络划分,我在这里分为两块,一是网络横向划分,就是保证网络纵深的问题,我们在后台中间件的这些地方保证向后发起连接的内网,就是我们向服务器后面看,所要保证的安全,如果一个黑客攻击了前台的服务器,他需要时间渗透到后边的服务器,我们的纵深如果太浅的话,他直接获得了后台DB地址,可能留给我们响应的时间就很短,如果能很好地横向划分就会给我们带来很好的防守时间,在预警上我们可以有更多时间去检查入侵。

一是网络纵向划分,任何一台服务器肯定都有网段,肯定很多服务器在一个网段。根据应用划分这些网络,可能游戏服务器都在一个网段里面,Web服务器都在一个网段里,这样就会带来一个好处,一台服务器在防火墙做策略的时候可以做到统一化,必然的话很多应用稀奇古怪的防火墙开到最后跟没上是一个样。

我对此做的一点解释,标准化系统可以让快速部署,让我们所有的系统都更具有弹性,在第一个故事里我们就可以看到,如果没有标准化的部署,这个系统管理员不可能快速地利用这些服务器进行部署,这样让一个快速迁移和应用合并或后续管理员的接手都有好处,如果实现了标准化就可以实现这些好处。

还有就是网络划分,我对内外网分离这件事情很难说,虽然我在这里写了,但每个公司都有每个公司的应用,不可能把内外网完全分离,但我觉得这是一个好的方式,如果有可能的话这样做可以让系统使用方面有更多的灵活性,而且根据应用划分网络,让网络有了层次,可以直接提高安全系数,可以讲我们不做任何事情,但是安全已经能上一个很高的水平。

安全体系方面我列了两点,要讲安全这里都是专家,我就不班门弄斧,说了两点。包括我对一些公司的检查和情况的发现,包括一些交流,我发现人员的确是安全的根本,但是安全实现必须得依靠这些人,假如每个公司里面每个人都知道自己系统应该怎么做就安全,这样的话公司就会实现很好的安全。但是现在问题是我们希望安全成为每个人的自觉意识,如果每个人都自觉地遵守就会很安全,不然的话就会带来很多问题,安全部每天累得半死最后说不定哪天还被黑了。

再就是制度和自觉结合,我觉得有的时候安全单靠个人的自觉不能实现绝对的问题,如果所有人都自觉但就不需要法律了,我们还有法律就说明有些人还不自觉。唯一就是制度上面让这些不自觉的人遵守自觉人遵守的东西。所以制度保证了,每个人都明确自己的职责和他们所需要做的事情,这样他们也明白自己该做什么、不该做什么。制度和自觉配合起来,我觉得才能实现最好的安全体系,不然的话,一些人光是自己在实现安全,但是一帮人在那里做破坏安全的事情,最后这个体系也是崩溃的,哪怕做得再多,可能最终一个小损失就会带来很大的问题。

最后我们再来看一个案例,这是一个很简单的结构,用户在这里访问Internet,有一些应用服务器、一些DB,还有Web系统,通过互联网访问,管理这些机器。这个结构是一个非常普通的结构,也是很多公司最开始都是这样的结构,这个体系的实现也非常简单,通过应用上的程序开发来保证传输的安全。通过一套统一系统,部署更简单,我们更规范地部署,因为毕竟简单,系统也能快速地检查。

这里面的安全上的特点,它们是依靠每台机器来管理这些,通过一套管理系统来部署这些安全策略。安全操作就是通过管理系统来规范这些策略和做法来规范这些体系。安全因为毕竟是互联网上服务器全是没有防火墙保护的,就通过安全制度的执行检查,去检查安全制度的执行,形成一个循环,这是一个最简单的安全案例。

这个案例的成功点,简单的有效安全体系,当然就实现简单,使用简单,和承担风险相比,代价较低也容易实现和维护。简单有时候也是一种优点,实现这么简单的体系,使用起来简单,不用招很多很高级别的管理员,不用担很大的风险,因为相对来说实现的简单,承担的风险也相对可以接受,因为代价的低要承担的风险也会多一点,但是对比起来也是比较简单的。系统建立成本低,基本上没有什么特别的东西,都是最基本的,必须采购。人员培养简单,基本的培训就能胜任系统维护管理员。

这个案例的失败点,安全被分割,每个部分都是独立,造成安全过于孤立,容易造成单个部分的损失。一旦扩大到几千台服务器,承担的代价就非常大,安全部门对这些问题的保护经常会有单个部分的损失。

我们来看第二个案例,这个案例比较复杂(图)。首先,用户访问互联网,但是他前面这条曲线我用虚线表示了,这个地方其实有一道防火墙,但不是真正意义上的防火墙,所有的访问都通过这条策略过滤后再访问游戏服务器和Web Sever,在这道服务器背后也有一套安全策略才能访问到后台的DB和主机,这时候这些管理人员是通过一台防火墙拨通VPN之后,登录直接访问内网然后来实现管理这些服务器的,可以讲管理员不通过外网来管理服务器。

我们看看这个体系的特点,网络部分采用了大内网结构,所有的机器都在一个内网里面,逻辑上都在一个内网里面,但是可能有些地方被隔断。ACL保护外网服务器,节约了宝贵的防火墙资源,保护范围广,几乎所有机器都可以实现ACL保护。再就是 VLAN策略,这些中间的曲线就是VLAN(图)的划分,这中间可能也有各自的安全策略来保护是否能访问。这样的话VLAN就严格了各个运营体系的区域划分。这样就相当于船的隔仓,破了一个仓也不会进入水而危及到边上。

系统部分特点,安装配置标准化,良好的系统配置规范,标准化所有系统。系统通用化,系统标准化带来系统应用的通用化,因为标准化的系统能让迁移更安全。

我们来看一下安全部分,这个系统就是整体安全,所有服务器受到统一策略保护,这些安全策略检查也非常方便,因为这些策略都是交换机上的。再就是实现安全策略代价小,不需要在每台机上有策略。还有就是内网的划分非常细致,每个内网都是经过严格划分的,保证两个应用之间没有应用需求的话两个区域之间是不会连通的。内网间的通讯流量,保证了不需要的工具不可能通过VLAN。

管理网络部署,登录管理网络入口唯一,登录严格管理,人员权限划分,有了登录入口的唯一性,登录就可以严格检查,也可以划分人员的权限,因为有了VLAN的划分,完全可以做一套策略,不同的人有不同区域的访问。这个案例就是第一个系统管理员的故事,他们的人员素质非常好,有非常高的安全素质。这套系统的成功点可能就在于它的优秀的基础结构体系设计,因为一套系统如果设计成这样的体系的话,他首先考虑到所有的Windows服务器,所有的Windows服务器都没有补丁,没有安全策略依然可以很稳定,没有被入侵过,就是因为有了这套体系的保护,让安全有了良好的基础,他们可以很容易地实现安全。一开始就让整体安全有很高的层次、很高的门槛,大家跨过这个门槛时就已经保护了所有的服务器,实现起来也很简单,运维体系架构在这样的结构上,管理服务器去检查服务器,还有一些对服务器的操作方面都可以放宽很大的要求,不像以前的服务器可能要注意很多操作,但是有这些基础的保护的话,让很多操作都更简单了。

维护人员的高素质保障了体系思路的实现和执行,让这个体系发挥比较好的作用。但是这个体系的失败点就是内网实现代价太高,因为以这种模式的大内网,中国比较大的互联网公司实现内网,首先设备的成本就非常高,特别是跨机房之间的内网接通需要的设备成本非常高,还有就是南北问题解决困难,还有管理点的选择,在北方管理南方,就算是南北连通起来,访问起来也会非常慢。还有就是对人员的依赖度过高,因为所有的VLAN划分都是以人为基础,培养人的代价非常高。

这个失败点是我们以前团队当中遇到的问题,前期人员促进了发展,但是中后期过度依赖人员导致出现人员断层。虽然优秀的架构设计可以保留下来,但是人员造成的问题,对团队的继续发展造成了严重的问题。

我们做一些总结,从以上介绍两套系统中寻找成功点,剔除失败点。来构成一套较为理想的体系,大家仁者见仁,智者见智。

整体基础安全保护,重点在于ACL策略的保护,我个人对ACL策略也不是很清楚,但是我觉得这样的系统能让大家有个很好的门槛,我发现很多公司使用交换机的时候都是把它当做普通的路游设备,有这些功能往往起到事半功倍的效果,能用起来当然最好。

前期的架构和网络规划很重要,因为前期设计起来那么一套体系,我也待过很多公司,我遇到的很多问题是我们到一家公司发现很多问题,问题是我们怎么改造这套网络,我们有很多好想法、很多好计划,但是没办法实施,因为公司在运营,你不可能推倒这个架构建一个让自己觉得满意的系统,没有公司可以接受这样的体系。因为如果前期第一次设计得好的话能给后期代理很好的帮助。粮食的设计让系统拥有可以持续发展能力,因为现在机器已经是一个廉价的设备,已经不在乎多少台服务器。以前我记得我们在一起聊天的时候就讲了一个很好玩的故事,一个论坛十万人,另外一个论坛两万人,但是十万人的不可以实现,两万人的可以实现,我们就用两万人的。结构设计出来,对网络进行划分/分隔应用,可以保证应用部署的规范,如果能一直遵守这个策略,保证应用能很好地部署,这样的话也是非常好的,其实这也属于架构范畴。最后一条就是安全纵深,我觉得这里恐怕有很多渗透高手,没有纵深保护这些东西就很难实现,让黑客需要更多的时间去搜索我们的后台,这样的话我们才能让我们有足够的预警时间去阻断这个攻击。当然有些公司可能有更好的应用。

完善的规范制度。我觉得这对很多业务的促进是非常好的,因为体系的设计,技术员实现了,最终还是要检查修复的,不可能上去以后第二天就不管,这样的话需要系统自我修复和自我完善的能力,这必须得要求制度来做。

严格的检查完善机制。所有的事情必须得有力的执行,并且根据反馈不断完善。而这一条就需要管理层,运营层的理解和支持,因为很多时候是很多人对安全部门不理解、不支持,最后导致很多问题的出现。这就需要管理层对运维人员做一些制度或者规范上的支持,因为管理上的支持很多时候能让很多人理解。

下面开始讲我的主要想法,我觉得这个话的确说得很对(图),人员是一切的基础,没有一个好的人员什么事情都不用谈。同样,一个好的人员也可以让事情事半功倍。都是非常优秀的人才这样的话可能这个团队去干什么事情都很简单。每个团队的个人素质是最关键的,因为这个团队既然都优秀,就像木桶一样,最后一块短板可能是制约它发展的,所以每个人的素质是最关键的。就像我们需要建立一个非常优秀的团队,每个人都拥有高素质,这样这个团队一定能干出很多事情。

再往后面看,我们团队如果完全依赖人员个人的高素质,这显得风险过大,因为人是最不可靠的东西,因为毕竟服务器给它一加一肯定得出二,找个人的话可能不等于二了。我们不能依靠人,我们的团队需要依靠结构体系来规范制度,有人离开我们可以欢送他离开,再补充我们所需要的人,整个团队对人员的需求也不会很高。

对付黑客最好的办法也许就是所有人都成为黑客,这样世界上全是黑客的话,我相信就没有黑客了。所有人素质都非常好,整个团队整体能力得到成倍提高,并且个人能力让问题解决更快捷和安全,这同样也是一个团队最终的目标。

作为一个反方,过于依靠个人的能力的团队,存在很多问题,而且很容易存在人员断层,现在培养一个人非常难,我在跟我以前一个同事聊天的时候他现在是一个公司的CEO,他说他现在最大的问题就是每天在招人,每天培养成他所需要的,但他突然发现他把人员培养好之后已经没力气做事情。我们不如反过来想想,我们只要有一套好的架构体系和完善制度规范,我们这个团队里面就不需要人员,也不需要人员的素质,我们只需要一些普通人员就能支撑公司的运转。当然这是正反两方的意见,不知道大家看到这个观点怎么想,我觉得有的时候我自己也很矛盾,因为毕竟一个高素质的团队大家都是好手自己在一起交流、工作环境都会好。但是这样又带来问题,公司不希望完全依赖人,把鸡蛋全部放在一个篮子里,这样太危险了。这是相对矛盾的问题。

大家都希望自己团队的团员都很好,就像打篮球一样,都希望每个队员是乔丹。但我们又会存在另外一个问题,我们也不愿意建立起来今天走了一个人我们公司就要损失很多的地步,我们更希望是比较完整的体系,我们有一套体系随便找一个人来,我们公司的系统就可以正常运营。

如何平衡这两方?如何建立起一个不依赖高素质人员组成的优秀运维和安全体系,案例一就能满足我们的需求,简单的系统,简单的人,找个网吧管理员就能做好,他们每天只需要检查这些服务器在不在。当然这个体系运维起来让问题分布了,相对来说,损失一个区域对公司来说打击不是很大,在我们能承受的范围内还是可以承受的,虽然安全事件会很多。这的确降低了人员要求,也许招一个人就可以管理这套系统。

案例二是一个优秀体系、优秀团队,体系建立起来要花很大的代价,要花很多人的努力才能建立起这个完善的体系,但是这样的话让后面的人很轻松,这个体系建立起来之后,从2000年到后面几年,就只有一次被入侵的事件,而且那时候所有的 Windows机器都是不打补丁,居然能保证这样的成绩,还是比较骄傲的一件事情。

我说一下我自己的感受,我在这样的一个团队里,我每天在想的事情就是我的周围的人为什么安全素质不能更提高一点,每天想的就是这个问题。然后我在这个团队也待过,我想的问题就是每天能不走人,因为走一个人损失非常大,而且阵痛要很长一段时间才能消失。跟大家看到前面的问题也有点相似,大家如果在这中间找一个很好的平衡,既有良好的安全素质又有良好的安全体系,也许这是个问题吧,我不知道是不是哲学问题,反正我是无法解释的。

原文地址:http://tech.qq.com/a/20080318/000447.htm

看到技术文章很稀奇——绿盟于旸:让阿里安娜火箭爆炸的缓冲区溢出

主题:缓冲溢出历史、八卦和娱乐

可惜没有他的幻灯片ppt,好多图片看不到啦。 还有演讲中提到两个神奇的汉字(这两个汉字对应的内码恰好是Windows当中参数的地址。),那两个汉字是什么啊?

来自绿盟的于旸,在现场发表演讲。

以下为文字实录:

于旸:我首先做个自我介绍,我叫于旸,目前主要从事信息技术安全有关的研究工作。腾讯虽然不是一家安全公司,但是腾讯科技对于信息安全问题的重视程度和在对待上的专业态度,一直以来都给我留下了很深刻的印象。举个例子,我们可能会注意到,在腾讯的网站上有一个专门的安全中心的页面,会对腾讯的软件中的一些安全问题及时在这里通知用户,并且FIX。在中国仅此一家,如果把微软中国也算上的话就是两家。

所以,我非常荣幸今天在这里和来自腾讯以及全国各地的各位安全专家们一起,就一些信息安全方面的问题进行讨论。我演讲的题目是《缓冲溢出历史、八卦和娱乐》。用缓冲区溢出这个题目对在座各位朋友并不陌生。我可能无法用短短的一个小时让大家了解很多的技术,但是我会尽量让大家听得愉快。

如果大家想进一步地了解相关的技术,可以关注一下明天禇诚云和吴石的演讲。其中一定会有更加详细和精彩的内容。

首先,我们来简单看一下什么是缓冲区溢出以及缓冲区溢出的历史,然后我会花一点时间给大家介绍在二十年当中,我们和缓冲区溢出以及它的诸多“亲戚”所做的搏斗。第二部分内容我会给大家介绍一些和缓冲区溢出相关的小例子,这些东西可能没有很多的技术含量,但是可能会比较有趣。

首先我们来看什么是缓冲区溢出,严格来说,我们去查相关的专业资料可以看到一个很精确的定义,但实际上在广义上我们把所有的内存读写类漏洞,包括很多,基本上通俗的我们都称之为缓冲区溢出。今天在我的演讲之中用的缓冲区溢出的概念是最广泛意义上的,并不是精确地去指一个具体的缓冲区溢出问题。

到底什么是缓冲区溢出呢?我们看这张图上面(图),我找了一个油漆桶的图。简单说,我们在200毫升的咖啡杯里倒了205毫升的咖啡。不管什么原因,结果都是咖啡倒多了。咖啡倒多了杯子承纳不下,它会流到别的地方。流到什么地方去呢?会流到什么东西上面去呢?根据情况不同可能导致不同的危害。简单来说,这就是缓冲区溢出。

在这里我给大家举一个简单的例子。这是一台Windows 2000,在Windows2000当中有一个程序叫MRinFo,这个程序是Windows自带的网络程序,这个程序它在处理命令行参数的时候是存在程序溢出问题的。不会导致安全风险,但是我想可以用这个程序作为一个例子,让大家大概对缓冲区溢出有一个概念。首先我们给这个程序敲入参数,这个参数并不是程序设计的时候,它是做预计的输入,预计的输入应该是IP地址或者域名,返回之后地址不能被解析。如果我们把这个参数输得相当长,大家看它很快就返回了,根本就没有出现这些(图)。为什么呢?因为在程序设计的时候,正常情况下如果一个地址不能被解析,它就会转入打印的流程。由于在这个地方我们传递的相当长的参数,导致了缓冲区溢出的发生,程序就直接崩溃,或者可能转入了其它流程,最后就没有打印出信息来。

我再给大家看另外一个例子。刚才一瞬间非常的迅速,可能没有看清楚,我们再来一遍。大家看一看,我给它传递了一个很长的参数,但是在末尾我加了两个汉字(图),在座各位有认识这俩字的吗?这不是太上老君画的符,这是两个我们在字库里可以找到的汉字。这两个汉字对应的内码恰好是Windows当中参数的地址。这两个汉字是什么?就是我刚才说的200毫升的咖啡杯我们倒了205毫升,这就是那5毫升。这5毫升咖啡流到了不该流的地方,而恰好它的内容我们又把它设定为一个特殊的值,就是我说的函数的溢值。这个程序在转入到下一流程的时候就会被两个神奇的汉字所欺骗。这就是一个最简单的缓冲区溢出的例子。

所以,我们可以用一个原本用于网络操作的程序来完成一个锁屏的工作。简单来说,我们几乎可以对任何安全漏洞下这样一个定义,什么叫安全漏洞?就是可以让程序执行没有设定的功能,你如果能实现这个,那它就是一个安全问题。我们先把这个MRinFo 程序放到一边,一会儿还会用上它。

以前大家如果对安全漏洞没有太多了解,或者大家想去了解和学习我给大家推荐一个我的朋友也是我的同事,他写的一个小小的文档。一般来说,我们除了刚才的这种非常典型的急于备战的程序溢出之外,把堆溢出以及覆盖BSS区等等问题都在广义上称之为容易溢出的问题。

导致缓冲区溢出的原因是什么呢?在历史上,当然我说的历史不是很长的时间,可能十几年前甚至于十年以内的时间。最早是由于我们使用了一些不安全函数,或者是没有正确地使用好一些函数导致的。这是导致缓冲区溢出比较简单的方式。后来又出现了类似于整数问题导致的一些缓冲区溢出,以及近两年又出现一些新的情况。我在这里就不给大家一一介绍。

我们把其中的一条我认为比较有意思的导致缓冲区溢出的方式给大家看一下,整数问题(图)。对于我们的计算机来说,它有一个非常有意思的特性,我们知道一个数是正数还是负数,为什么?因为写阿拉伯数字的时候下面可以加一个减号表示负,在脑子里面我们也可以形成这样一个逻辑概念,但计算机没有这个功能。为了表示负数在计算机当中是用了一个特殊的方式,在这里我也不进行介绍了。总的来说,大家知道在计算机处理数字的时候,两个数字相加它的值可能小于那两个数字,两个数字相乘可能得出来的值也小于那两个数字。就是加和乘不一定使结果变大。反过来减和除也不一定使结果变小。另外,内存当中的一段数字它既可以认为它是一个正数也可以认为是一个负数,这都是在程序当中所决定的,如果在这个当中没有处理好也会出现一些问题。

整数问题的确是非常让人在这个地方出问题的。但是,像这种只是表示温度上出一点小的差错可能无伤大雅,不会出现什么严重的后果。但是也有出现严重后果的时候,现在我就要开始八卦了,这是阿里安娜五星火箭,1996年5月4日,失事四颗卫星同时被毁,这是什么原因导致的呢?因为火箭的控制程序是拉非人写的,程序员把一个长整形变量写成了短整形导致了溢出。就是这么一个小小的错误,导致阿里安娜五星火箭失事的非常重要的原因。当然整体来说还有别的原因,比如本身这段代码在阿里安娜五型火箭没有用的,这其实也是整个开发管理方面的问题,因为大并不适用于五型火箭。在四型火箭里可能没有用好的性能做这样一个负值,到了五型火箭就会出问题。我们看到给火箭写程序的人也会出这样一个错误。

还有一个例子,代码本身找不出什么问题来,实际上代码也没有问题,但是这段代码如果拿 VC2003去编译的话,在一些特殊的情况下就会出问题。为什么呢?在VR2003里面对于new的处理没有考虑到整型,如果我们传递一个大的参数,比如 Lx4然后后面七个零,在这个时候,因为一个整形是多少?四、五十节,这时候会把Lx4后面七个零这个数字乘以4。在分辨内存的时候会乘4,一乘4就导致的32位整型的上溢,算出来的一个值是多少呢?是零。或者说我们用稍微再大一点的数字,实际上真正分配的内存是一个比较小的值。

顺便说一下,这个安全问题在VC2005里面已经得到了解决。接下来我们再用一点时间说一下缓冲区溢出的一段小小历史。今天当我们谈到历史两个字的时候,可能脑子里面浮现出来的是巨大的时间跨度和厚重的文化。但是对于信息技术领域,因为它本身年龄就不是很大,没有很长的历史,对于信息安全技术它就更加年轻了,在这个领域里面可能十年就是很长的时间了。那我们的缓冲区溢出到现在多长时间呢?也就二十多年时间。这个技术第一次登上历史舞台,被公众所了解、所看到是在1988年11月2日,就是非常著名的Morris蠕虫事件。Morris蠕虫是罗伯特Morris Junior编译,他为什么叫这个名字呢?因为洋人取名字跟中国人不一样,在座各位不可能跟父母用一样的名字,但是外国人觉得这个名字不错就可以给自己儿子用。所以我们用Junior来表示区别,很显然他的父亲也叫Robert Morris。

我们想象一下,1988年,我对这段情况不了解,中国可能还没有这种互联网,甚至连实验性的互联网都没有。你会发现这里面闪耀着很多的智慧,是你在今天的这些木马病毒当中看不到的。举一个例子,那时候主要是VIX,这些机器各自是不一样的,甚至硬件价格都不一样,Morris蠕虫是由原代码和脚本组成的,它感染一台机器之后会利用这台机器上的编译器去编译,所以它可以跨平台,它本身是已原代码方式存在的,它感染下一代的时候也是把原代码传过去。

Robert Morris也就因为这件事情成了世界上第一个因为计算机被正式地被计算机法所判决的一个人,他被判了400小区的社区服务和一万美元的罚款。同时 Morris蠕虫事件之所以这么有名,就是因为它直接导致了CERT这个组织的成立。就是1988年发生的蠕虫事件之后美国就赶紧成立了CERT,有了 CERT之后中国有成立了CERT。如果没有蠕虫事件可能我们在座各位很多都不会从事这个行业。Morris蠕虫事件是互联网非常重要的一个事件。老 Robert Morris实际上是我们现代unix系统的设计者,这就很难怪他儿子为什么这么厉害了。另外,老Robert Morris也是美国国家安全局的首席科学家。这就是Robert Morris(图)。

但是Morris蠕虫出现的时候,实际上公众对其一无所知,只是非常小范围的传播,即使是搞技术的人对它也不是很了解,只是知道有风险,具体怎么样都不清楚。包括Morris出现之后大家还是不清楚。这个时候另外一个人走上了历史舞台,Spaftord,这个老头对Morris蠕虫进行了分析,并且编写了INTERNET蠕虫分析。他在分析蠕虫的时候也同时把缓冲区溢出的知识带给公众,但是这一次介绍仍然可以说不是非常透彻和详细的。真正意义上的一篇专门用来论述缓冲区溢出技术的文章,实际上是1996年才发表,发表在PHRACK 49的杂志,他的本名叫ALEGH ONE,在这篇文章当中,可以说是非常详细地把缓冲区溢出这个知识介绍给公众。ALEGH ONE是谁呢?大家可能都看过邮件列表,他管理过五年,在1996-2001年之间,大部分时间都是他在管理这个邮件列表。

我们知道,今天来说缓冲区溢出威胁最多的系统可能是Windows系统。在1999年之前,可能这种情况都不是这样。当时很多人都认为缓冲区溢出这个技术在Windows系统上是难以实施的,而在unix或者是Sun是比较容易实施的。1999 年,Spyrit写了一篇非常有里程碑意义的文章,也是发表在PHRACK55期杂志上。这篇文章可以说是近十年来信息安全灾难的一个开端。当然我不能说没有这篇文章现在我们就不会有这么多木马、不会有这么多蠕虫,但至少可以说它是我们今天所有做Windows安全技术研究的最早的一篇。

从Morris蠕虫算起,我们和缓冲区溢出已经搏斗了差不多整整二十年。在这二十年当中,防守的一方几乎总是落于下风,直到这两年情况才有所改观。除了在开发过程当中实施安全编程原则和流程等之外,我们还找到了一些其它更全局、更宏观的方法,这些方法有软件的、有硬件的,因为时间有限,我今天就简单给大家介绍一些。

一个非常简单而且有效的技术,Stack Cookie,这个系统最早是在Linux系统上提出来的,并且做了实现。但是这个技术真正让广大的程序员们了解,功劳还是微软的,因为微软在 Visual Studio2003里面内置了Stack Cookie代码。这个技术说起来也非常简单,大家还记得我刚才做的例子吗?(图),在这两个神奇的汉字之前是我们输入的一段东西,如果没有这两个东西,这个缓冲区溢出毫无意义,最多只能导致程序崩溃。如果我们没有写这么长的话就不会发生缓冲区溢出。

StackCookie技术的核心在什么地方呢?就是对我们编译器所编译的每一个程序进行小小的修改,让堆栈的地方,也就是这两个汉字所占用的地方前面放上。这是被调函数的局部变量(图),我们在这里放上StackCookie,在每此将要到返回地址里去找代码执行之前,让程序先检测一下它的前面,因为在函数开始的时候我们放进去StackCookie

我们知道值是多少,当需要调用它的时候,我检测一下这个StackCookie和开始一样不一样,如果不一样的话就说明什么?已经发生了溢出,这个地方被修改了,因为我们要改这个地方就必然要改到它,因为是顺着下来的,用这个简单的方法就可以比较准确地检测到覆盖返回地址的行为。这的确是一个非常简单同时也非常有效的方法。

在VC2003的编译当中,默认开这个选项。研究相关技术的人也找到了对抗 StackCookie的方法,做编译器这方面同时大家也找到了另外一些反过来克制的方法,双方的搏斗一直到今天仍然在继续,但是最基本的包括思路上都还是基于StackCookie区域当中,具体的技术细节我今天在这里就不详细介绍。

刚才说的是软件上面,在硬件上,今天在座各位大家用的电脑,或者说你们今天去买一个新的 CPU,几乎这个CPU里面一定有这样一个技术,叫“内存不可执行”,或者叫NX技术。什么意思呢?我们知道计算机的内存在过去我们可以给它加上一个标志,它是否可读、是否可写。但是没有这样一个标志,我标志这段代码、这段数据是否可执行,它是否可作为代码来执行,没有这样一个标志。为什么呢?因为过去可能是因为CPU本身不够快,我让它在处理每一个内存的时候还要额外判断,会降低运行性能。但现在CPU已经足够强了,我可以牺牲百分之几的性能来做这件事情。所以这个技术实际上并不是这两年出现的。在很早以前,SUN就已经有了,只不过是因为我刚才说的性能问题近两年才在X86个人电脑上出现。

实际上,在X86处理器也不是这两年出现的,最早在2001年的时候InteL就已经在自己用于服务器的技术上处理这个技术。只不过还是我刚才说的由于性能问题没有在电脑上用,因为对于服务器来说安全的权重要更大一些,我可以为了安全牺牲一点性能。我们现在在一个Windows系统上,大家在系统设置界面里可以看到“数据执行保护”,英文叫DEP,它实际上就是使用了CPU的这个功能。我们传递进去的数据实际上可能是存放在一个数据区的,通过NX技术,我们可以把这种专门用来存储数据区的地方就标志为数据,不能执行,CPU就会拒绝执行这个区域的东西。简单来说,NX技术就是解决这样一个问题。

反过来,从攻击者这边来说,现在也有人研究出来了一系列的如何对抗NX技术的方法。举一个简单的例子,我的这个例子当中,如果这个CPU设置了内存不可执行的,不受影响,为什么呢?我传递的是代码。RETURN这个技术就是传递进去一系列地址,用这一系列地址来描述。当然得非常精巧地研究如何用一些特殊的地址去构成这样一个序列,让它们去实现一些功能。在Windows上实施这个技术的时候有一个便利条件,因为Windows特别是在2003及其以前的版本上有这样一个系统的这样一个技术,它可以决定是否启用。我们调用一次它,把当前进程的 DISABLE不用它,然后就可以正常地按照这个流程来了。

但是总的来说,这些技术实施之后,还是大大地增加了攻击者的成本,大大增加了攻击者的难度,安全就是这样,不可能百分之百的解决这个问题,但这是一场博弈,就像刚才李总说的,我们要尽可能地增加这些坏人的成本。

这是另外一个非常有效的技术(图)。Safe C Library。我们刚才说了缓冲区溢出是伴随着C语言的东西,如果完全用C++来写代码,基本上不会出现缓冲区溢出的问题。但是很多时候我们完全不能放弃C语言,来用C++。在这里我给大家介绍Safe C library。使用Safe C library来取代传统的这些C函数,可以非常有效地避免我刚才说的各种缓冲区溢出的问题,像大家看到的这个(见图),这是传统的写法。这是用Safe C library的写法。大家可以看出,两者之间的改动并不是很大,但是用这种方法基本上可以解决缓冲区溢出的问题。即使在这上面出现一些异常情况也不会有什么危害。而且总体来说实施起来也不是很难。

还有一个可能是更年轻一点也是更有效一些的技术,就是SAL,什么是SAL呢?它实际上是一种注释技术,我不知道我的解释准不准确,但是我看相关文档之后我觉得它就是注释技术,就是为编码添加一些注释,但是这个注释更多地是让程序去看的,是让编译器去看的,而不是让人去看的。为编码添加注释,帮助那些不易被发现的问题。

举个例子,这是一个函数定义,它接收了Buffer和BufferLength,我们如何让程序知道它是一个缓冲区和缓冲区长度呢?利用SAL我们可以把它标出来,让这两个本来没有什么关系的变量发生关系,做这样一个标记(图)。现在就把它们两个联系起来了,大家看这个难度也不是很大,我刚才说的这些都是非常有效的技术。

我刚才的科普工作就告一段落,现在还有一点儿时间,我给大家简单地就一些缓冲区溢出类的安全问题做一些小小的演示。

第一、像内存不可执行类等等的方法,可以在程序运行的时候检测出这些发生的溢出问题。接下来我给大家演示一种情况,这种情况是不会被检测出来的。当然,这种情况它可能出现的概率也非常小,但非常有意思。这是我写的一个小小的程序,它模拟了一个软件的登录界面,我们只需要输入一个任意长的数值就可以登录界面。这是为什么呢?类似的安全问题在历史上是实际出现过的。在2001年就出现过类似的问题,只需要用一个小小的溢出来标识,你不需要密码也可以以任意用户登录成功,实际上在这个例子中描述的就是那样一个情况。有一个用来表示是否登录成功的标志,虽然我们在前面把它标志为了FALSE,但是因为发生了缓冲区溢出,把局部变量覆盖了一点点,因为不管拿什么值覆盖,本来是零,你只要让它不是零,这个验证就通过了。因为这个地方覆盖的是局部变量。覆盖的是这个区域(图),不涉及执行的问题,并不需要执行什么代码,同时也不涉及覆盖返回地址的问题,可以根本用不着硼着这个地方的StackCookie。千万不要认为这种现象会消失。

我这里还有另外一个例子,在这个例子当中,它们俩的基本代码是差不多的,只不过我在这个地方用了一个安全函数,所以在这里就不会出现缓冲区溢出问题,它不会让写进去的程度超过。但是它犯了另外一个错误,Printf,在这里因为错误的使用了 Printf,导致了一个格式串的问题,我个人认为这是最有意思的,它有意思是在哪里呢?刚才我们看了可以饶过验证。

接下来我要演示的问题,我们可以看到密码,因为这个程序不再有我们刚才说的缓冲区溢出问题了,我已经限制了最多只拷贝这么长(图),所以无论如何它都不可能再发生溢出了。但是由于它存在格式串的问题,我输入的是百分号X,但打印出来的并不是百分号X。这个数字是什么呢?这是当前堆栈里面的数据,具体格式串漏洞是怎么回事以及它的原理,如果大家有兴趣的可以去找一些资料来看。我这里只是给大家简单展示一下它的现象。

我们回过头来看这个代码(图),Password是作为一个局部变量放在这里。在我们输入一个格式串的时候,会作为第一个参数处理。我们看到内存当中的这一串数字(图),我们把它复制下来。这些都是十六进制的数据,我们现在把它还原成字符,大家看到是这样几个(图),后四个字母,7465,现在我们反过来,改成6574。现在我们就得到了一个完整的密码。这个例子当中我们就是用格式串问题去窃取内存当中的数据。其实格式化漏洞在Windows系统上非常罕见,因为Windows程序员可能不太喜欢用Pranff函数。但是也有例外,如果大家用Windows2000就会发现(图)。类似这样的问题还出现过在国外非常有名的邮件系统里,当时我们发现的时候就觉得非常有意思,因为我们今天展示的是我自己写的一个小程序,我把密码放在局部变量当中,那是一个邮件系统,它的程序处理流程的时候是这样,你登录,用户名、密码输入进去,然后把密码从它的数据库里面取出来进行比较,因为设计者可能没有考虑很多的安全,这个密码是能保存在数据库里面,它能放在内存里进行比较。如果你输入的我们刚才说的格式串问题,就可以用刚才的方法直接把前面拿出来比较过的这些残存在内存中的密码看到,几乎是利用这个方法可以非常稳定、可靠地拿到任何用户的登录帐号。

这些问题虽然看上去很有意思或者觉得匪夷所思,真的会犯这种错误吗?会有。DIR真的能溢出几乎不可能造成什么安全风险。我们可以在这个地方看一下(图):“找不到文件”。在处理一些特殊情况的时候,和一些为了兼容老的系统所保留下来的代码之间,在它们之间的配合上,在处理这种特殊情况的时候没有处理好,所以会引发一个堆栈溢出。

我们来看一下情况是怎么样的(图)。现在我敲完之后大家看到cmd不见了,为什么?崩溃了。这个问题是我的一个同事在2003年初的时候发现的,因为的确这个东西虽然有趣但它不能说是一个安全漏洞。现在再用这两个神奇的汉字,现在已经不一样了,因为在内存当中会做一个转换,所以我们必须找一个被转换之后恰好是函数地址的汉字,后来发现它们正好是吻合的,它被转换之后也恰好是我们刚才说的函数。我们现在就用它来锁屏试试看。

接下来我们来看今天的最后一个演示。我们还回到刚才的MRINFOR,我们没办法把一串代码交给它。实际上现在已经有技术完全解决这个问题。大家看到的这一串奇怪的字母(图),它们就是由字母编写的代码,它们既是字母,也是代码,本身它们完全可以被CPU执行,执行的结果就是进行计算器程序。同时,我又找了一个可以表示为字母的跳转地址。这四个字母恰好在我当前的平台上是一个可用的跳转地址,所以它们俩结合在一起就是长长的字符串,同时这个字符串可以执行一个功能,就是运行计算器。

刚才是我做的一些科普和基于技术的娱乐和八卦,希望能够引起大家对于这方面相关知识的兴趣,也算是给明天吴石和禇诚云的演讲做一个引子吧,谢谢大家!

原文地址:http://tech.qq.com/a/20080318/000332.htm

批处理实现禁止运行指定程序的办法(ps:适用对象为初级上网用户)

全盘禁止运行指定程序(*.exe) 批处理
复制:::::内命令,保存为k.bat(可以自己改名啊)文件。可远程调用看效果。
注册表中禁止运行:
::::::::::::::::::::::::::::::::::::::
@echo off
set route=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
:fix
for /f %%i in (list.ini) do reg add “%route%\%%i” /v Debugger /t REG_SZ /d 全盘禁止运行%%i /f >nul 2>nul
cls
::::::::::::::::::::::::::::::::::::::
注册表中解除禁止运行:
::::::::::::::::::::::::::::::::::::::
@echo off
set route=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
:unfix
for /f %%i in (list.ini) do reg delete “%route%\%%i” /f >nul 2>nul
cls
::::::::::::::::::::::::::::::::::::::
k.bat文件同目录内建一”list.ini”文件,内容为要禁止的文件名,如:
a.exe
b.exe
……(可自行添加)

当然这只是治标的办法,因为改个名字就可以运行拉,这个就是相当于镜象劫持的效果(熊猫烧香的时候开始流行起来劫持杀毒软件,后来杀软才开始注意保护自己!!)。

(ps:适用对象为初级上网用户)

镜像劫持:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution
Options\360rpt.exe Debugger “病毒文件全路径”

这句就相当于病毒文件把360修复程序劫持啦,运行360修复程序就相当于在运行病毒文件!!

这个脚本在注册表中的形式就是这样:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\a.exe]
“Debugger”=”全盘禁止运行a.exe” 

这里的脚本只不过把病毒文件路径添加上特定文字使原程序路径不正确最终实现禁止运行指定名称的程序或文件(因为不光exe可以被镜像劫持)

av终结者也是这么做的!

看到技术文章很稀奇——吴鲁加:企业如何进行数据安全防御

很有意思的用户!!不过遇到的却是不少,就因为那个机器狗好多机子中病毒,结果原来保险箱保护的QQ都不能运行啦(提示有木马。。。要杀!却杀不掉!!),后来整系统的时候干脆就把这个保险箱去掉啦,换用微点主动防御软件了!!

大多数用户他们对挂木马或者对病毒是没有特别多概念的。

……

用户认为总有病毒杀不掉,然后我总会中毒,我机器上已经装了正版杀毒软件了,我总会中毒,但是我还是必须用网银、还是必须上QQ、玩游戏,这种中国大部分普通网民的一个常态。

深圳点击查看深圳及更多城市天气预报大成天下信息技术有限公司的吴鲁加分享了他在企业数据安全的研究成果。

以下为吴鲁加讲演实录内容:

主持人:大家早上好!昨天的议题包括了网络游戏安全等议题,可以说是内容丰富。相信今天议题也是非常值得期待。我们知道现在的网络攻击不再仅仅是顽童的游戏,更多更专业的商业黑客也介入其中,通过对企业内网的不断渗透,获得更大的价值和利益。一方面是企业不断购置新的软件设备抵御黑客,另一方面,企业内网入侵事件频频出现。下面我们有请在安全领域有着多年实践经验的专家吴鲁加先生来给我们一个答案吧。

吴鲁加:各位朋友,大家好!非常感谢腾讯主办的这次安全峰会,这次峰会的主题是安全跟沟通。因为我们最近几年一直都在做内网安全方面的工作,所以我想这次这个交流的主题定位在企业内网安全的实践和思考。在开始之前先做一个自我介绍,虽然站在这个讲台上,但是实际上我不从事技术方面,包括研究、开发这些工作很长时间了。实际上现在更多的只是一些点和面上的东西。目前我们做的一家公司是大成天下,主要的方向是在终端和数据安全方面,目前还是有一定的经验和实践案例的,产品包括两款:超级巡警、铁卷。

今天上午我想跟大家交流的提纲大致是这样的:首先我们面临哪些问题?目前企业界通常是怎么应对这些问题?根据这些东西做一些发散,把一些技术的点罗列出来。最后进行归纳。

最开始我们面临的问题,我这边基本上都是以图片来展示(图),这些都是在网上直接找到的新闻,比如新浪上的新闻,google报告恶意网站有上升的势头。这副图大家都可以看到一个非常非常明显的上升曲线。同时声称中国恶意网站占到总数的67%,这个比例是一个比较可怕的比例。像昨天方兴提到的Web2.0时代我们有很多的攻击,实际说这种攻击目前已经逐步流行起来了。比如百度空间的蠕虫,利用百度空间漏洞传播的蠕虫。包括校内网的蠕虫。这些在目前都已经出现。也就是说Web2.0时代这种恶意的攻击已经是初见端倪了。

另外,除了类似蠕虫、挂马之外的攻击之外,还包括一些表面上看起来没有什么危害的,这个页面不带任何木马、病毒,但是它实际上是一个欺诈页面,就是俗称的钓鱼。这边的一些统计数据是从06年12月到07年12月,新的钓鱼网站数量统计,应该说这个数量虽然已经是一个疯狂上涨的趋势。

在SNS、BLOG出现的各种各样的信息泄露事件,这种事件也是越来越多。这边有一个杀毒软件厂商做过一个实验,他在Facebook注册了一个帐号,添加200人为好友,这200人中有87人接受了好友请求,其中有82个人把所有的个人档案共享出去了,其中包括一些数据,比如生日、邮件等等。这些实际上会带来一些信息的泄露。同时很多人有写BLOG的习惯,这个可能会泄露很多信息,这种也是安全问题。

像应用程序方面的漏洞,这边举了几个例子。像联众、realplay等等,这些都越来越多的影响了用户的安全。再有就是员工的跳槽或者说设备的失窃以及最近沸沸扬扬的陈冠希的事件,这实际上都是由于各种各样的原因导致的数据的泄露。大家最熟悉的可能就是黑客、病毒的攻击,中了各种各样的招,所以出现了问题。这边再有的例子就是客服、后台的数据库。这是一位朋友跟我交流的,也是属于Web2.0公司,他提到过在他们公司里有很多呼叫中心人员,这些客服人员有一定权限读取数据库信息,并且能把数据库信息导出做一些处理和统计,这些权限对客服人员是必须的,但是他们实际上发生过这种情况,因为在这个领域竞争比较激烈,所以同行就会采用类似商业间谍手段来收买一两个客服人员或者甚至找一两个人去应聘客服,最后可以非常轻易的把一些关键用户,假设类似移动每个月消费3000元以上的用户列表打出来直接带走,实际上会带来非常大的损失。这就是客服和后台数据库我们面临的一些问题。

前面罗列出了一些面临的问题,这些问题应该说林林总总。它实际上并不仅仅局限在某个领域,而是通常我们在内网里头会遇到的或者说比较难以解决的。目前大家是如何解决这个问题呢?这两个图是我在微软网站上直接载下来了,首先如果我们做一个界定的话,微软本身定义了生成防护的模型,从策略、过程、意识开始,在把这些东西明确后,走到物理安全、边界安全、内网安全,最后到主机、应用程序、数据安全。我的主题里把所有网络思想意识、安全策略这方面都忽略掉了,我们把沟通主题局限在主机、应用程序和数据,也就是说刚才我提出的这些问题基本上也都落点在这三个范畴里。这三个范畴里的问题再来界定一下他们的安全我们希望能做到怎样呢?这是一个比较常见的说法。就是说在一个提供服务、应用程序和正常网络架构安全环境中我们要提供高的保密性、可用性和完整性,也就是说我们实际上并不会考虑把这个数据非常非常严格的保护起来,但是它的可用性丧失了,三者是缺一不可的。这是我们希望讨论的。

讨论之前,这边是网上可以看到的一篇文章《微软如何面对每个月100000次的攻击》,这个是在前端的边界、内网方面做的防护,如果有兴趣的朋友可以先去看一看。后面过到目前大多数企业执行的安全策略。我这边有几个案例,像这个案例是惠普如何做安全的,他们做了一个东西,IDA,这个软件起什么作用呢?左边这个是软件管理和监控工具,通过服务端可以监控每一台主机上安装上什么样的软件,然后允许他安装什么软件和不允许他安装什么软件,右边是补丁分发的系统,这都是惠普自己的。同时他们安装了SEP11,它其实是在防病毒、反间谍软件、防火墙、入侵防护方面做了控制从个人端基本安全上做控制。这是他们的一些基本界面(图)。另外在部分重要的机器上,爱森哲除了采用上述方式之外,他们还做了一些额外防护,加密。等于全系统的加密,从启动开始就直接加密,整个硬盘都做起防护。这个是惠普或者爱森哲这样做的。

目前我们大多数的公司就我们目前所接触到的很多公司,实际上都还没有在内网里做这些工作,大多数企业基本上就是防病毒软件来希望拦截所有内网安全问题。这边有几幅图,我跟几个朋友说要过来做一次交流的时候,他们跟我说正好手里有几幅图,或许可以当做演示的材料,实际上可能真是确有其事。这些都是号称在外面有一些兜售原代码的人在做的一些操作。甚至我自己都遇到过一次,我们有一个同事跟我说有人在网上叫卖我们产品原代码,就是铁卷源代码,这个时候比较紧张,纳闷怎么会发生这种情况。

于是让这个同事跟对方去聊,你总得证明它是铁卷的原代码,我们才会买。最终我们采集了证据实际上不是我们的源代码,而是我们竞争对手的源代码。我们竞争对手也是做数据安全的,自己的信息和源代码在外面兜售,但是这种情况绝不少见。

即便我们采用上述方法来做防护的时候,可能还会有一些隐隐担忧,该做的都做了,为什么还不放心呢?怎么保证员工不会有意或者无意的泄露各种紧密。可能有一个比较尖锐的问题,为什么用了杀毒软件,还会中毒。各种各样的技术都得上来,否则的话,中毒是必然的。

因为有漏洞、木马或者商业化的免杀出现,我们有没有办法防御所有的入侵和Oday。这是另外一个想法,我们现在所做的大多数防护工作都在事前、事中,我们所做的防火墙、防病毒或者入侵检测或者刚才提到的任何的一些东西,要么防止黑客进来做了层层防御,如果黑客进来的时候我希望第一时间发现黑客,但是事实上或者说从目前情况分析的话,我觉得情况未必都能如此理想。也就是说,这种事后的工作实际上也是蛮需要做的。但是目前这块应该是缺乏的,我们被入侵以后,黑客潜伏下来后我们应该做些什么操作。甚至我们定位了以后,我们应该怎么操作。这个时候我们是没有太多的考虑到的。可能更多的是我们直接把它移交到防务部了,这个不归我们信息安全部门管了,大家向玛丽祷告了。

我们从源头分析,用户可能做哪些娱乐工作呢?这边列了很多,上网、聊天、游戏、交友、下载、看电影、听音乐、网络视频、在线视频等等,这些都是企业用户没有办法完全禁止在企业网里做这些事情。但是做这些事情面临的风险,实际上我们目前做的防范措施都是有缺失的。用户用电脑做什么工作,这边也列出了他会做的工作,这些工作也是他必须能够满足的,也就是实际上无论他们做正常工作还是做娱乐休闲操作,这些是常规应用,这些应用我们必须满足他,满足之后,我们必须防止攻击者在里面窃取源代码、窥探用户。

这边是一个简单的小归结:刚才说了那么多应用、那么多风险,实际上在内网部分现在我们没有控制到的,包括应用程序漏洞、包括挂马、钓鱼、SNS欺诈。还有员工本身可能带来的危害、风险。这边既然发散看来了,就罗列一些目前部分安全保障措施,包括审计、加密、备份、防护、升级。

审计这块,现在有一些公司做了网络审计方面的操作,在内网上做各种各样的审计,来分析他安装了什么样的软件,浏览过什么样的网页之类的,并且有一些统计视图。审计另外有一些文件操作的一些产品,可以根据文档类型来确定用户打开或者编辑、修改、删除、重命名等等,对文件做的所有操作都能够定义出来,这个时候实际他适宜于内部高精密的网络、高精密的单位。

加密这块目前的思路也比较多,包括磁盘加密,PGP,或者链路加密、应用加密、数据加密。数据加密的话,这里可以先做一个简单的演示,实际上大家应该可以看到我的PPT右下角有一个小锁,这个锁是什么概念呢?实际上表示了我这个PPT文档是受加密的,但是我打开或者编辑这个PPT又没有任何干扰。比如我现在新建一个Office Word文档,关闭之后我们可以看到这个数据带了一个加锁的图表,但是我们也可以正常打开编辑。

我们用二进制来看,他已经和普通OFFICE文件头不一样了。这就是我们加密最简单的应用。比如说他可以把文件直接另存,假设我们另存成JPG文件,当前幻灯片保存是JPG文件,这个时候也可以看到下方也有一个小锁,我们试图打开这个文件是失败的。我这个控制端是一个比较特殊的,我可以自行解密。解密完后我们可以看到内容是正常的,所也这些解密操作都会有信息存放在自己电脑里,当我回到企业内网之后就能够马上把这些数据同步到服务器上,也就是说我在外面做了什么操作都会保存回去。这种保存操作也就是尽量的底层、尽量的往磁盘空的处理头写。采用这样的技术,就可以做到我们刚才提到问题的防护。

比如数据库存取保护。还有刚才说的客服问题,如果我们把客服人员采用的数据库程序加入到我们受保护的进程里,实际上通过各种各样的应用程序所导出的excel、PDF之类的文件实际上都会加密,并不会轻易被一些恶意用户拿走。另外这边是采用类似的技术对源代码进行保护的一种方案。实际上在用户端采用类似技术对源代码进行保护,但是最大的问题在于比如SVN服务器,在这种情况下我们希望数据是明文存放,这样会更安全一些。如果数据明文存放,而用户又有服务器帐号,他们就可以直接比如自己装一个虚拟机,跑到内网里把明文文件取出来,导致数据泄露。这个我们也有一些解决方法,通过SSL隧道来做这样的事情,链路上也是加密的,网络层通过一些应用程序来防止没有装客户端的用户直接连到SVN服务器上。同样这边都是一些简单的例子(图),图形图像文件的保护,所有的图片、电影文件只要一传递到服务器上,都会马上的被直接加密。加密完后只有在本机上才可以阅读,类似于我现在把电脑里这个PPT直接拷出去的话,目前只有在我们电脑可以阅读和我们公司同事上阅读,直接传出去的话,它的内容也都是加密的,是无法直接打开的。这个也是类似的(图),像这种就是加密的保护方案。

备份这块,有一些比较有趣的解决方案。比如apple出的小的无线的盒子,我觉得蛮有意思的。它的设备很精巧,可以和机器上的应用程序配合起来,只要一回家或者一到公司就可以把机器上的数据做好备份。如果是企业级的,管理员可以设定备份数据。假设我的电脑坏了,我可以通过买一台新的笔记本电脑,输入密码,什么也不用管,最后我新的电脑在半天之后就和我原来那台电脑所有的内容都一模一样了。这种备份的方法或者策略也是蛮不错的。

另外客户端的防护,这是在座朋友都比较感兴趣的。是不是黑客永远都能领先一步?我们怎么样才能缩短时间差?像Mcafee、趋势都有一些不错的东西,Mcafee收购了一家siteadvisor的小团队。他们能做的是什么呢?当我们用户访问一个网站的时候,或者我直接在google、百度搜索内容的时候,这个时候他有一个类似于网站评价系统告诉你这个网站是安全的或者是有风险的。如果他有风险的话,他是什么样的风险。这是一个非常庞大的数据库,然后Mcafee通过自动的测试,就是说我们做一些程序,这些程序自动去访问网站并且从网站上下载一些程序、安装这些程序,安装完这些程序查看他是否有一些我们定义为恶意操作的这种行为。然后再把这些数据入库,通过这种形式来做。

像google、firefox,用户可以主动告诉网站目前有哪些恶意网站是做了哪些操作之类的,他们把这些数据库同步完后,直接在后台和google做一些通讯,当用户访问到被挂马的网站的话,通过google搜索到,google会给出一些恶意提示,现在IE7、IE8也都有这些功能。我们有一个畅游巡警软件也做着类似的事情,我们希望尽量把时间差给缩短,也就是说希望把siteadvisor这种比较长的回应机制直接嵌入一个引擎,一旦用户访问到恶意网站,我们通过他报给服务器,服务器去检索和判断,当然目前还要加上一些受判断,来判断这个网站究竟是不是恶意网站,如果是就同步到用户,只要有一个用户遇到了问题而且被我们拦截住了,这个时候所有的其他系统再准备访问这个网站的时候都会看到一个大红警报,告诉他这个网站可能存在问题。这是我们希望能够尽量缩短时间差的一种方式。

监控,监控客户端电脑上跑了那些进程、软件,或者允许不允许装哪些软件之类的。

升级,升级和打补丁是最重要的,在内网里更多企业是用SUS来做这些工作的。这是我们的超级巡警(图)我们做上了系统补丁检查和第三方应用程序漏洞检查的工作。可以直接打上补丁,安装最新的版本或者我们应用临时方案,当某个动态库出现安全问题的时候,我们可以自己打补丁或者小功能临时载掉,保证用户安全。360也是做了相当不错的,它的漏洞修复也是能起到同样的作用。

刚才基本上发散的东西说完了。然后剩下的时间也不太多,我简单归总一下。问题出现在什么地方?这个PPT我昨天晚上还稍微改了一下,把方兴所说的新WEB时代说法放进来。现在纵深防御的体系缺乏了对新WEB时代的防护。包括社区蠕虫、恶意代码、层出不穷的木马、表面上没有任何程序危害行为的欺诈。这些我们是缺乏防护的,包括微软整个防御体系里也没有对这方面有特别好的方案。另外一个在目前我们觉得内网里头缺乏的,应该是考虑事前防御、事中应急和分析非常多,绝大多数人都是这样,希望御敌于我们之外。事实上敌人总是能够混进来的,我们对敌人混进来之后如何来做安全保障缺乏一个考虑。这边是绿盟的一个图(图),他们通过桌面保护、终端保护、行为管理以及各种各样细小功能结合一起来做的一个工作。另外从赛轮铁克,他们做了两个工作,一个是端点防护。

对终端保护我们希望做到尽量的快速有效。另外他们做了端点遵从的工作,这个类似于思科也做 NAC的事情。只要端点不符合策略,我们就不允许他接入企业网络,这两个加在一起也是比较完整的解决方案。从我们自己角度来说,我们所做的是增强补丁管理工作,通过畅游巡警加强对恶意网站、浏览器安全。通过文档加密这一系列东西来强化事后保障的能力。刚才我们所罗列出来面临的攻击或者员工带来的风险这块,实际上对于面临的包括应用程序漏洞,我们可以直接对于用系统应用补丁来解决,然后对各种欺诈和钓鱼,实际上通过恶意URL识别来做拦截。员工本身会带来风险,员工离职了,把100多G的原代码往外拷或者中毒、丢了设备等等,这个一个可以通过加密来做,二是通过审计来做。防住了这些部分,我们就把这两个大问题解决掉了。

最后再闲聊一下,说一说360的一些划时代的改变。前几天看新闻里头,360他们的产品线,包括我们现在所知道的安全卫士、保险箱、漏洞管理、软件管理,还有未来马上要推出来的浏览器,这个我们在新闻上都看到了。360的商业模式或者说在客户端安全保护模式实际上做得相当得不错,而且它的推广模式做一定程度上改变了目前客户端安全防护的迟缓的效应。比如管理链条是怎么做的,他通过帮助用户装软件,通过软件管理快速帮用户装软件,这个有非常好的引导,都是受过认证安全的软件。在一定程度上帮助用户删软件,当软件出现漏洞或者风险,我们可以删除或者用同类软件替代。通过浏览器让用户少中毒,其实我还不知道360浏览器是什么效果,说不定跟我们的畅游有一点点类似。这个应该说都是希望能够让用户少中毒,尽量的缩短和黑客的时间差的一些手段,然后帮助用户删除病毒和木马,如果删不掉,又想用东西的话,还有保险箱。一环一环扣的比较紧密,通过这个能做不少事情。目前我们能够看到的盈利模式,比如推卡巴、Windows优化大师,从中长期来看,通过软件管理、漏洞管理、软件百科能够很大程度掌握客户端话语权。整个生命周期都希望管起来。本身以免费策略打破杀毒软件收入循环,也是蛮有意思。前面是安全软件的推广平台,后面会是一个装机软件平台。

最好的保障是我们希望做到无声的安全,电脑装后,安全这些东西应该默认带好,对用户没有任何干扰,如果我们希望得到好的关注,又希望经常的干扰一下用户,比如金山产品、360产品,都会时不时弹出一些信息,告诉他最近有什么新闻、事件,这个通过统计效果是非常好的,能够带来大量的点击、流量和反馈,这种情况又跟这种“无声安全”的策略有一些冲突。整个来说,我觉得360这一系列的东西其实在客户端也是补全了刚才我们所描述的客户端对新的Web时代缺乏防护的这一环,但是也有我的一些困惑吧。时候也到了,谢谢大家!看看有什么咱们可以一起交流的问题可以一块聊一聊。

以下为现场问答:

问:铁卷这部分做透明加密的时候,本身对明文文档有没有一个备份机制,假如铁卷出现BUG,我的文件会不会丢失?

吴鲁加:目前备份还没有做。在我们想做的范畴里,已经标成蓝色是我们做好的(图),这个备份还没有标,就是我们还没有完全做好。实际上这是必须考虑的。对密钥这块我们有一个强制备份的机制。我们也有密钥代管的服务。

问:你的机器已经被感染了,你还不知道怎么删除它,那为什么用户还会希望接着用它的网络银行?我不是很理解用户已经知道自己不安全了,还想接着使用一些很敏感的数据呢?

吴鲁加:这个我觉得其实是这样的,昨天方兴也提到过这个问题,或者说普通用户,至少在我们的调查里头,我们有这样一些员工到网吧这些地方去做一些调查,包括跟自己亲朋好友做各种各样的沟通,实际上应该说绝大多数用户他们对挂木马或者对病毒是没有特别多概念的。在中了毒后,之所以像保险箱这种东西在一定程度上大行其道也有这个原因,用户认为总有病毒杀不掉,然后我总会中毒,我机器上已经装了正版杀毒软件了,我总会中毒,但是我还是必须用网银、还是必须上QQ、玩游戏,这种中国大部分普通网民的一个常态。这个可能360的朋友也会有一些见解,因为360保险箱在市场上占有的份额也是相当大。

问:你好!您刚才提到google和Firefox挂木马上有合作,他们合作具体方式、技术方案?

吴鲁加:不是google和firefox他们合作,而是国外有一个非盈利组织 stopbadware。他们对恶意URL做一个标准的数据库,Google直接引用数据库的内容。你在google上搜索可以看到如果一个网站曾经被挂过木马或者曾经存放过恶意软件,google会有一个提示。如果你仍然是比较固执要访问这个网站的话,实际上google不会一下子把你带到这个网站上,而带到一个定制页面,告诉你这个网站不安全,然后为什么不安全,这个组织认为他有什么问题,如果你还要继续访问,你可以把链接拷贝下来继续访问。也就是 google规避了它的风险,规避掉了把用户带到不安全的网站的问题。

原文地址:http://tech.qq.com/a/20080319/000409.htm

看到技术文章很稀奇——吴石:几种软件缺陷的可能利用方法

演讲中提到:

一个程序可以看作是两张图,一张叫做数据流图、一张叫做代码流图,发现安全问题就是在这两张图上发现一条路径,发现这条执行路径的话,可以执行攻击者所需要的功能。
……
挖掘有几个技术条件:第一,对调试很了解。对软件结构很了解。对所想挖掘的功能要比较了解。第二,你要有一点想法或者有一点经验,知道软件在什么情况下可能会出现问题。然后下一步要写一个程序去把这样的问题找出来,而不是自己去找。

IM及协议安全专家吴石分享了他在软件缺陷上的研究成果,以及在IM的第三方软件存在的发现等话题。

以下为吴石讲演实录:

吴石:我的题目是几种不常见的软件缺陷,但是内容可能有一些出入。第二,我也是一个初学者,PPT里可能也存在很多问题,也希望各位专家指出来。

我们先看看常见的软件缺陷:第一,栈溢出。就是在栈中申请一段内存,一般是数组或字符串,在对这段内存做操作的时候,错误的写操作可能导致栈中也特殊意义的地址被用户的输入内容所控制。最早发现是一些字符串操作的函数中,比如strcat,后来又发现在Strncpy如果不正常操作的话也会出现这个问题。最后有一个Windows UNicode处理的函数如果不正常使用也会出现这样的问题。下面我介绍的是整数溢出的问题。

整数溢出是多发于的情况,特别是一些加、乘的操作出现在内存前面就要特别注意了。加或者乘出来的数不一定比原先两个数大。还有一个正负数比较的问题,或者是符号扩展的问题。即使现在这个问题仍存在于很多软件中。但是在很多流行软件中已经很少出现了,比如微软的软件、国外大公司的软件。但是在国内软件这个问题依然是很多的。这个问题在JAVA软件中也经常存在。例如银行系统,系统错误处理,把别人帐号上扣掉的金额,一个正的金额加到你的帐号上。

第二,heap overflow。这是现代程序C语言主要申请分配方法,所以他比栈溢出比例大的多。微软做了很多防护措施,所以它利用起来是非常复杂的。尤其是 WindowsXP2之后的版本,比如vista。堆管理主要利用两张表,freelist、lookaside,freelist[0]代表着一些不规则的可以利用的chunk,尤其是比较大的chunk。freelist[1] – freelist[n]代表2的整数次方可以利用的堆中的chunk。利用这样堆溢出的问题,你需要对Windows堆管理非常熟悉。比如有人通过 freelist[0]这个链表成功利用。目前有一个immdbg的程序对这种研究利用是很有帮助的。因为他把堆分配的内容都可以显示出来。对vista 软件的攻击,理论上应该是不存在的。因为vista对堆管理有严格控制,但是有很多软件使用自己的内存管理方法,比如OFFICE,他们自己堆管理方法和内存方法是和vista不一样的,这些方法往往采用教科书的方法或者以前系统的方法,所以他们这些方法是有可能被利用起来。

第三,未初始化的问题。栈上的问题由德国人在06年详细讨论过。头一次压栈的时候,在栈上写需要内容,然后函数退出,导致栈顶上移,有问题的函数压栈时正好利用这段栈空间,如果函数中发现了未初始化问题,比如数组,那么其内容刚好是我们刚写入的内容的栈空间,就可能被利用。先把堆里的大部分内容写成自己需要的内容,未初始问题发生时,比如堆里指针的内容就可能指向我们需要的内容。目前这个问题是大量存在的,OFFICE存在了很多。比如这个月微软补丁,excel那一个补丁里就包括很多这样的问题。你可以对比新旧的OFFICE软件,你发现 OFFICE2007有一些新加的代码就是做初始化工作的。

第四,二次释放或者叫double free问题。内存泄露是现代软件大敌,特别是服务器软件。有很多程序员害怕发生这样的问题,申请内存时总是想释放它,结果释放多了几次,这样也会有安全问题。曾经在linux上的方法很巧妙、经典,但是在目前Windows上比较难以利用。很多软件采用自己管理内存方法,那么就很可能被利用到。

我们现在可以讨论一下可以利用软件问题,就是可以执行任何代码软件的充分条件,就是将任意4 字节内容写到任意内存地址。如果满足这个条件的话,它肯定是可以被利用的。这个条件叫做充分条件。在栈的溢出或者堆溢出,将任意4字节内容写如某些特定的内存地址,而这些地址有特殊含义。由于代码流或者数据流在X86里是混合的。还有一些更特殊的情况,任意1字节写进某些特定的地址,这些地址刚好有特殊含义,可能也会引发这个问题。所以我们总结一下,离充分条件越近的,越有可能这个问题被利用,可以被执行任意代码。

关键问题就在于写内存操作,而不在于读内存。写内存操作可以改变很多东西,读内存的话,即使发生异常的话,这些问题也往往不能被利用。当我们要从大量程序中快速找到可以利用的漏洞的时候,要首先找到那些写操作引起的异常。第二,比较少出现的异常。未初始化问题发现,就要了解一下未初始化缺省填充的字符。这是一个例子,我们可以详细分析一下哪些结果是被利用的,根据我们原则:第一,写操作的过程。这个看起来比较复杂,而且可能是一个整数溢出的问题。

下面讲讲我的心得,另类栈溢出的问题。这是一个递归函数,与一般的栈溢出不同的是向下溢出,由于栈内存空间是有限的,这个一直压栈的过程会导致内存读写到栈分配内存空间之外,找出问题的关键在于代码流程图中找到可以由用户控制的“圈”。一般情况下,这种会造成程序崩溃,某些特殊情况下会造成执行恶意代码。这种情况是很特殊特殊的。就是两个现成的栈紧紧挨在一起。第二,栈每次分配空间都比较大。第三,编译器要比较老的那种才可以。新的编译器会检查这样的情况。

我们考虑完栈溢出的话,可以考虑相应的堆溢出情况,堆溢出情况更加复杂,但是更有灵活性。在一部分情况下有可能被利用,如果你利用这种方法去寻找的话。

安全问题可以借用的数学理论,因为数学方法是人类经过几千年总结出来的,具有普遍意义和前瞻性。我们可以看到安全问题很大部分是由攻击者和研究者发现一条可以控制的代码或者数据流,这些是程序员没有想到的。传统堆栈溢出基本上可以看作是系统或者库函数的比较不明显的后门,攻击者或研究员对这些后门比一般程序员了解。基本上一个程序可以看作是两张图,一张叫做数据流图、一张叫做代码流图,发现安全问题就是在这两张图上发现一条路径,发现这条执行路径的话,可以执行攻击者所需要的功能。

针对这样的问题,数学上准备了相应的理论,图论这方面的研究早就有了。我认为以后研究者所做的工作就是根据自己经验,以图论理论进行指导,利用计算机快速找到一条安全问题的路径。而厂商要做的就是利用自己强大的计算能力,快速遍历所有可知性路径来证明软件安全性。这是我的一点心得体会。

第三个可以借用的理论叫做编译原理。C/C++程序都需要经过编译优化措施执行,在这个编译过程中编译程序事实上获得了很多有用的信息,如何在软件上安全利用这些信息,目前很多公司进行了很多有意义的尝试。但是离真正有用还是有一定差距。这种方法理论上应该比Fuzzing的方法好,他知道软件结构可以较快发现软件的问题。

下面又是我的一个体会,我比较倾向应用这样方法得到一些可用信息后,自动构造一些测试用例去测试,这样的话,测试性能和人力成本就会大幅降低。

第四个可以借用的数学理论就是人工智能和统计理论。目前的话,有很大的问题。因为样本库太少。我们可以首先做模板方法,比如前面提到+或者×出现内存分配前面,我们可以做一个模板,用这个模板去扫描原代码,试图发现这样的问题。从这些模板匹配方法再慢慢过度到模式匹配方法。但是人工智能和统计理论对其他的一些网络安全问题有很大的作用。比如说DDOS或者靠数量来使得网站、程序、崩溃的这些方法,它应该是会取得很大的作用。它对网络流量的分类目前还是取得一定的成功,不能说很大的成功。

下面举一个例子,这是MSOFFICE内存管理。以2007为例,以Msopvalloccore分配内容,以msofreepv释放内存,每次释放内存时都会改变地址值,让地址值走向政正确的位置。分配内存时,读出freelist第一个元素,符合申请的话,就把内存空间提供给需要申请的函数。同时把freelist下一个元素作为表头。释放内存时,他是把指向释放内存的地址作为表头,把前一个指向下一个元素。可能遇到的问题,有一个double free问题,这在OFFICE内存方法上是一个知名弱点,因为他对这个问题没有检查,很有可能造成代码执行。具体方法我下一页PPT会提到。这样就启发我们在很多软件里都自己写内存管理方法,这样的话,一些经典问题就有可能在自己写的管理方式中被利用。尽管OS层已经不存在这个问题。

攻击的思路。实际上这是一个代码程序解释。首先我们申请很多内存,在地址上填上我们所需要的内容,把这些内存释放掉。为了保证程序成功的可能性更大一点,我们也做这样一个工作。申请一段内存,两次free后,OFFICE内存管理会错误把表地址作为释放后可以利用的内存地址,再申请一段比较小的内存,填上需要覆盖的内存地址。再请几段小内存,OFFICE内存管理会错误把需要的内容填到需要覆盖的内存。ms第二个内存问题,未初始化利用。他和double free利用也差不多。这个提醒微软不仅要把系统安全搞安全就可以了。在EXCEL2003就有这样的低级错误。堆溢出的问题在这套内存管理体系也是存在,堆溢出而且是不受OS这种保护的。它是可以很容易的利用的。

下一个问题是数组越界读写,这也是一个漏洞发现的主流渠道。因为以前这些有问题的库函数的方法并不能发现漏洞了,既使是整数溢出也非常罕有了。整数溢出目前也是比较少了,但是数组越界在一定范围内还是存在的。目前我找到很多问题还是数组越界读写。如果这个传入的参数存在一个写的操作,这个内容就可能写到任意的内存地址。

下面我讲讲IM软件普通存在的问题。第一个问题,集成第三方软件太多了,这些软件往往不提供源代码,造成开发人员对接口的理解不完整或不正确。因为IM软件有很多东西是自己不擅长的,往往采用第三方软件。但是第三方软件代码质量不一定绝对安全,所以会造成一些安全问题。还有一些是存在在继承的第三方软件,存在于老的版本,老的版本报出安全问题之后,IM软件并没有更新所使用的软件包。IM软件缺省认为客户端或服务器是可信任的或者部分可信任,这就是造成极大安全。特别是比较复杂的功能,如语音视频功能中,安全问题是大量存在的。即时聊天软件有的采用了简化加密算法,这对于对抗暴力破解性能很差。还有一些软件不正确使用加密方法,比如使用了一个固定密钥,密钥存在于客户端制之中,如果有人把密钥提取出来就可以知道聊天内容。第四,软件团队不稳定,造成软件代码质量很差,而且指导思想不一致,可能在一些国产然间中发现大量未完成功能,这些功能都可能是安全隐患。

我今天演讲就到这里,谢谢!

现场问答:

问:首先你说这个编译器里面会产生一些代码或者你刚才说的微软里面存在的问题,编译器为什么会发生这种情况?还有一点,像微软默认申请,有什么说法?像你说的发现很多软件未完成的功能,这种软件一般都比较大,带了很多库,你是全部去看?

吴石:我不知道。主要是看可以执行的地方。

问:你怎么知道他什么地方可以执行?

吴石:首先通过调试器去看,首先要使用它,然后加一个调试器。然后看他可能执行的代码。

问:你一般分析这种东西需要多长时间?

吴石:因为我不是全部分析他的内容,我只是分析代码流如果存在问题的话。

问:关于图论来减少软件BUG这个东西有没有实践?

吴石:我自己目前在做这方面的东西。而且你看IDA软件,我刚才提到一个德国人,他就是把代码流程画成一张图的形式给你看。

问:通过源码生成图还是可执行代码?

吴石:可执行代码。

问:会不会产生很多遗漏的地方?

吴石:这个东西是IDA做的,目前我没有看到遗漏的地方或者比较少。

问:能不能考虑一下通过这种数学的方法解决软件缺陷?

吴石:我刚才提到一家公司是用编译原理方法去解决软件问题和软件安全问题,它的这些东西是在所有大的厂商里现在都在用。所以这个前景还是有的。

问:ms他们会有一个自己的内存管理方法,为什么有操作系统不用,而自己建立?

吴石:因为有一些特殊需求,操作系统内存管理方法往往对他的特殊需求支持的不是很好或者是产生的不是很快,最关键原因他认为这个方法不是很快,所以他用自己的一套方法管理内存。

问:能不能举例说明一下,除了快之外还有没有其他因素?

吴石:如果利用OS方法的话,因为每次申请内存可能跟OS2的N次方,它的内存碎片产生的最少,对堆管理不可利用的产生的最少。如果不是2的n次方就会产生很大的碎片。如果利用自己的内存管理方法,他知道它会产生这样的内存分配,所以他可以避免了这样的问题,导致性能有所提升。

问:我想问一下,刚才提到很多安全问题已经不是像以前简单的危险函数使用的问题,已经是一些比较深层次的问题,现在针对这种情况有没有什么好的方法或者是好的软件能够达到自动化的程度,能达到多少?

吴石:如果有源代码的话,Coverity目前是最好的。但是如果是安全问题,好不了多少。大量还是要靠人工分析,如果完全想完全解决安全问题。他对其他的软件问题,比如内存泄露或者未初始化这些问题做得还是不错。他为什么对安全问题做得不好呢,我估计里面没有一个真正懂安全的人去指导这个工作。

问:能不能介绍一下挖掘功能使用到哪些工具?

吴石:我本来想写一个光速入门的ppt,因为我的笔记们没有带电源,就没有写。挖掘有几个技术条件:第一,对调试很了解。对软件结构很了解。对所想挖掘的功能要比较了解。第二,你要有一点想法或者有一点经验,知道软件在什么情况下可能会出现问题。然后下一步要写一个程序去把这样的问题找出来,而不是自己去找。如果自己去找的话,这样的精力或者时间花费太多,我以前是自己去找,但是效果不是很好。

原文地址:http://tech.qq.com/a/20080319/000410.htm