腾讯科技讯 3月19日消息,在为期两日的网讯网络安全技术峰会上,微软安全响应中心的禇诚云分享了他在软件安全漏洞与软件开发上的研究成果。
以下为褚诚云讲演实录:
褚诚云:大家好!我叫褚诚云,来自微软公司。我这个讲座可能跟其他人的讲座都有一点不一样,我是从产品开发的角度和大家分析安全漏洞。我希望利用这个机会可以和大家分享一些在软件开发过程中如何避免安全漏洞的经验。我先自我简单介绍一下,SWI称为Secure Windows Initiative,我们这个组处理微软产品的安全问题。我们这个组严格意义上隶属于MSRC的一部分。 ChrisW是我们一个资深的架构师。
现在我们转到正题。很多人说微软是不是真正了解安全,为什么这么说呢?微软的安全漏洞问题层出不穷。如果真正懂得安全,为什么产品还有这么多安全漏洞呢?
今天讲的核心问题:第一,什么是安全漏洞。第二,为什么代码中存在安全漏洞。第三,我们想探讨一下对每一个安全漏洞,我们做了什么。微软发现安全漏洞后,怎么处理它?我们是怎么在开发实践中去提高我们实践开发的指导过程,这样可以避免同样错误不要犯两次。
为什么你需要了解这些东西?现在安全漏洞不是微软一个的问题,就像腾讯总裁所说现在软件安全是整个产业的问题。比如微软收到很多不安全的反映。实际上攻击本身不是针对微软系统本身,而是上面运行的应用。我们希望通过和所有厂商共同努力,提高整个产业环境安全水准。例如,百度工具条就有安全漏洞、暴风有控件安全漏洞、迅雷也发现有很多安全漏洞、google输入法的安全漏洞,还有QQ。
下面我跟大家讨论一下五个我们组经过非常艰苦的努力,可以和大家分享的5个06、05年的安全漏洞。可以给大家公开讨论导致安全漏洞的源代码,在后面我要跟大家谈谈微软开发周期,怎么指导开发行为,这样可以降低安全漏洞的数目。最后提一下微软关于安全响应流程的部分。
什么是安全漏洞?我们定义是代码或设计缺陷,导致系统可以被恶意攻击。我想特别强调一点,实际上很多安全漏洞是一个设计上的问题。设计上没有考虑这个功能在安全上给大家带来什么样的影响,这与设计人员本身素质有关系。我们看看安全漏洞主要类型:远程代码攻击最受大家关注。但是权限提升、拒绝访问、信息泄露的比例也是非常高的。
第一个,MS03-026漏洞。这个安全漏洞大家非常熟悉了。它的问题就在于一个字母串越界的问题,就是这一行代码错误,损失非常巨大。我们得到的经验:GS编译选项,静态代码检查工具。例如在VS2005,有一个选项是可以做代码的静态分析,尤其是溢出错误,可以帮助你检查。
缓冲溢出已经谈了很久了,为什么微软还有这么多安全漏洞?问题就是说安全漏洞本身和缓存溢出不相等。很多安全漏洞其实完全不是由缓存溢出构成的。这两个是不等价的。下面说的五个安全漏洞只有一个是缓存溢出。即使这一个缓存溢出也不是那么容易看出来的。
第一个安全漏洞,06-001 WMF。这个安全漏洞很严重。当时在圣诞节,我记得我是在赴宴途中被传呼。一个圣诞节,几百人都没有过好。WMF大家都已经很熟悉,他是Windows支持的一种图像文件。简单说就是大家访问这个文件,收到这个电子邮件,只需要预览就会被感染。可能直接导致大规模蠕虫爆发,所以当时大家非常紧张。这是源代码(图),你觉得这个代码需要特别注意什么地方?我其实首先看到是win.3.1这段注释,写这段代码的时候没有考虑到安全问题,当我们读到类似这种注释的时候,我们脑子里开始紧张。我们看看它具体出了什么问题,这个是一个函数指针,这是函数指针的调用,这是执行(图),关键是在这里,当我开始处理WMF文件的时候,当收到特殊字符的时候就对它进行解析处理,把Abort方式设置好,最后开始执行。整个过程没有缓存溢出漏洞。你需要一个函数可以终止打印操作,这在Windows3.1是很正常的操作,而现在造成这么严重的安全漏洞,这就是设计上的缺陷。有时候设计的缺陷比代码缺陷更难发现。一个设计上的问题导致安全漏洞非常严重。在构造这个文件的时候,提供一个老的无用功能,结果导致一个严重的漏洞。我们把NetDDE、IPX/SPX、NETWare这些全从VISTA中删除了。我们尽可能把那些不需要用的以前的老代码统统删除,因为老代码编写过程中往往没有考虑到安全需求。即使删除不了的,我们在缺省情况也要禁用,只有用户特别有这个需求,需要他自己主动把禁用这个功能开通。而且必须加以辅助测试和fuzzing,仅仅依赖人眼查看代码是不够的。
第二个安全漏洞,06-013 IE create textrange,问题就是我访问一个网页,机器就中招了。这个安全漏洞和缓存溢出完全没有关系。有没有人能发现问题?它的错误就在goto Cleanup这个地方。hr初始赋值S-OK。为什么这是安全漏洞?首先调用pvarresult就是一个函数指针,下面检查hr=s-ok,这是一个标准的com调用。我会调用到未初始化内存。4、5年前微软如果收到这个安全漏洞,他可能认为这不是一个安全漏洞,而只是一个程序崩溃。结果现在有了heap spray攻击,可能10次有9次能达到成功攻击。静态工具专门要提高对未初始化内存访问,使用SAL确保函数返回时的错误检查。
第三个安全漏洞,05-047 plug-n-play。首先他是直接读到一个注册表key,然后拷贝到堆栈上的变量,大家初看这是非常危险的。但是我们仔细一看,发现从本地注册表读这个key,内容是攻击者无法控制的。这个key本身最多只有255字节,而且内容只有admin才能控制。堆栈的变量大小是360字节,怎么会导致字符串溢出?我们当时也一下看不出有缓存溢出问题。它的攻击就是通过这样去攻击,虽然Key在注册表也是有效,但是后来加了这样一堆东西,会自动被过滤掉,结果拷贝就会溢出的。这是一个非常有意思的缓存溢出漏洞。得到经验是禁用危险的APIs,以前有这样的反对意见,只要我知道我在做什么,即使用危险的API也没有什么问题。这个例子就看出,在有些情况下即使你以为你知道你在干什么,但是还会发生你并没有想到的后果。所以我们彻底把危险的API从VISTA完全取消掉。
第四个漏洞,06-013 IE。当你访问一个文件类型属于不安全类型,我们通知你下载而不是直接执行。这就是代码(图),看上去完全没有什么问题。到底它出了什么问题?我们仔细看这个变量,它可以被多个线程同时访问,可能会导致跳过安全对话框。这个漏洞也和缓存溢出没有关系。我们得到一个经验:多线程环境下测试、代码复查时的安全意识。例子:微软对安全方面的标准,包括攻击界面分析、常见安全漏洞类型、针对威胁的缓解手段、针对安全缺陷来复查代码。我们这个组本身不可能去复查所有微软代码,要依靠各个产品组自身复查代码,但是你复查代码,你需要知道你去找什么样的错误。如果不知道要去找什么的话,即使你看半天也发现不出来什么。
第五个漏洞,06-018 MSDTC。这个实际上是自定义的内存分配。这里有一个宏,我看到这个代码是比较头疼的。微软针对这个安全漏洞补丁,发现了两次公告,第一次公告没有发布对,只好发第二次安全补丁。微软得到经验:对内存分配器加注SAL。在Windows VISTA删除大多数的定制在内存分配器,除非有特别考虑,一般是不允许的。另外,在汇编代码一级经验证补丁,这样可以避免补丁发布的错误。
安全漏洞分析小结:分析安全漏洞产生的根本原因,在已经实施现有的流程后,为什么还有安全漏洞?我已经规定你产品组需要做的安全流程,结果还有安全漏洞,这可能有两个原因,第一,我说要做的事你没有做,这是管理上的问题。第二,你确实做了我要做的东西,但是还是避免不了安全漏洞。那就是流程或工具的问题。提供建议来完善现有工具和开发新的工具,同安全软件开发集成,并提供反馈。减少以后的安全漏洞。
|
|
||||||||||
![]() |
![]() |
| 谁是反垄断法第一被告? | 联想手机定位按摩女? |
热门新闻排行
IT新闻
互联网
通信
网评
| 关于腾讯 | About Tencent | 服务条款 | 广告服务 | 腾讯招聘 | 腾讯公益 | 客服中心 | 网站导航 | |
| Copyright © 1998 - 2008 Tencent Inc. All Rights Reserved | ![]() |
| 腾讯公司 版权所有 | |