NSC2013 中国网络安全大会分会场一 梅瑞

主持人:最后一个报告有请学界的人士,北大软件安全研究小组组长梅瑞老师来给大家做一个关于漏洞挖掘新技术探索的报告,大家欢迎。

梅瑞:今天我与各位专家和同行一块探讨一下关于漏洞挖掘方面的一些经验的分享。

团队使用的漏洞挖掘技术,1995年Peter  Neumann就提出除人为破坏之外计算机安全问题的9大原因,这些不安全因素也导致安全漏洞的存在具有必然性和普通性这两种特性。

随着互联网的发展,安全环境日益复杂,软件安全漏洞已经成为攻防双方博弈的核心问题之一。包括工控设备的安全,大数据的安全,还包括之前几位专家知道APT,我认为落到实处都要靠漏洞。

美国的一位学者以前曾说过,美国想成立漏洞银行,我挖到一个漏洞提交给银行,有人需要使用可以通过货币或者等值的漏洞交换进行使用。与其说成漏洞银行的概念,我更倾向于把漏洞作为一种期货这样一种概念。

如果刨除其他因素,单从商业价值来说,我认为漏洞完全可以作为一种期货挂牌上市交易,它也遵循一些价格波动的规律,随着安全事件或者一些软件厂商是否打补丁,都会带来漏洞价值的波动,等等。

下面我与诸位分享我的第一种漏洞挖掘技术,参考安全补丁的漏洞挖掘技术,补丁是软件厂商为了修补自己软件安全的隐患,对代码做一定的修改,但是通常我们都有这么一个共识,包括我们做开发和做安全,安全补丁只是对漏洞代码的修改,它的修改量,以及代码运行的流程,做一定的变动,并不会有太大的变化。这种漏洞修补的方式存在如下两种隐患,第一点软件的厂商在修补漏洞的时候缺乏全局的考虑,通常只注重对漏洞点的修补。第二个就是往往只考虑漏洞的上下文环境的,而没有考虑整个或者第三方代码在引进软件的全局变量或者逻辑条件的时候带来的隐患。

因此,软件的安全补丁也就面临一些安全隐患。我们需要对补丁进行分析,找出补丁所修补的代码位置,以及实际出现问题的代码位置,简称为漏洞点和补丁点。通过一些路径的查找,条件执行、符号执行,逐步约束我们执行路径,最终判断代码内部是否因为引入了补丁而产生新的安全漏洞。时间关系,不多说。做漏洞的同行都了解,补丁比对一种基于文本的,一一种基于汇编指令,一种基于结构化的。

参考安全补丁的漏洞安全技术有几个应用,一个是以微软MS 10-015为例,Windows2000,通过分析,我们发现MS 10-015在补丁点的位置加上一个标志位,VdmSafe为1的时候就可以绕过这个风险,一段代码后会将VdmSafe赋为1这样一段代码。于是我们就有这么一个思路,在VdmSafe赋为1的时候,最终我们可以伪造一个上下文的环境,最终可以触发这个函数,从而触发漏洞。

另一个例子,MS11-010,这个漏洞也是我团队发现并提交给微软的,是在分析安全补丁的基础上运用本方法发现的一个安全漏洞。MS11-010这个漏洞,漏洞点和补丁点既不在同一个代码块中,也不在同一个函数中,这种安全漏洞的修补方式是最有可能产生新的安全隐患的。

我们提出的第二种方法针对系统内核漏洞,随着Windows7和Windows8的发布,多种对抗内存攻击的安全防护机制使得传统的基于内存的攻击越来越困难,在这种情况下,内核漏洞往往可以作为突破点。我们这里关注的内核的模块主要分三类,第一类是Windows内核模块,如win32k.sys,第二类是第三方驱动等。

我们运行一个应用程序它会调用大量的Windows  API,这些API带着我们Ring3所传过去的参数,最终将参数传到Ring0级。比如我们要打印一个文档,我们在Ring3执行打印的命令,最终执行内核的调用的打印机的驱动进行打印等等。我们任意改变这个序列的时候往往会有意想不到的结果,比如改变函数进行多次调用或者调用顺序改变,甚至加一些特定的条件或者参数。

内核函数无序调用一个例子,也是我们小组发现的MSS10-011,关闭ApiPort时,系统会向Csrss发送一个消息,如果绕过这段代码就有可能继续作打过补丁的情况下继续触发漏洞。

这个图给出通过乱序组合触发漏洞,左边是微软为我们设定好的执行序列,当我们把最后一步关闭AprPort标识为零,先执行API的时候,就可以导致我们进程脱出进程列表。

以上两种漏洞挖掘方法都是关于系统软件,包括应用软件的。第三种方法是针对咱们网络软件的。诸位专家对非开源的网络软件想进行漏洞挖掘,我们协议的Fuzzing测试,往往会带来诸多的问题,首先测试空间比较大,测试效率也很低,第二个一些数据包过早的被抛弃了,第三个甚至还会断开数据通信,使得数据通信建立后期的业务数据处理的时候产生了一些漏洞,这种可能性都被我们不良的测试用例阻碍在我们测试之外了。

因此,我们有一个共识,就是要对测试用例进行裁减。网络应用程序的潜在漏洞往往存在于对发送/接收网络数据包进行处理的过程,进行Fuzzing测试时,如果不考虑这个特性就盲目的构造测试用例往往得不到什么好的效果。网络软件在进行数据处理的时候,他的网络状态不大可能发送的第一个包,往往是通信双方进行多次请求和响应之后的状态。在这种思路下,我们需要模拟网络通信的流程,来构造合适的网络数据包作为测试用例。如何模拟通信流程,就需要对软件进行立项分析。

下面这个例子也作为我们基于立项分析的应用,这是一款股票软件登录的时序图,一直到最后一步会获取用户的信息,当我们对该客户端软件进行立项分析的时候,在获取信息的过程中,客户端就会解析这个数据包,获取用户名下股票的数目,并为股票分配一块扣减,读取股票详细的信息。

如果我们能嗅探网络通信的过程,并且对数据包进行伪造,我们就可以将股票的数目修改为比如两个字节以上的数字,最终可以导致我们客户端程序产生问题,最终导致程序拒绝服务,这对于金融交易类的软件来说往往损失是巨大的。

结语,对于漏洞挖掘行当来说,我想还是要遵循百猫黑猫论,英雄不问出处,能够挖到漏洞的都是好方法,道与魔的较量,攻与防的比拼,为由不断探索才是王道,这是一门技术,更是一门艺术。

北京大学的软件安全研究小组是隶属于北京大学网络与软件安全保障教育部重点实验室,北京大学软件与微电子学院和北京大学软件研究所信息安全实验室,成员均为北大研究生,我们研究方向主要包括立项工程、软件安全漏洞挖掘、漏洞分析、软件安全评估。

论文发表的情况,主要是漏洞方面的一些编程技术。

漏洞发现情况,发现Windows操作系统漏洞5个,公开了两个,我们小组也有幸收到微软的致谢,未公开的有三个。

应用软件漏洞发现30余个,已公开的包括一些安全产品的客户端若干个,以及未公开的包括电话的客户端软件1个,以及其他应用程序。

其他成果包括目前正在研发的文档漏洞检测平台相比传统的特征数比对或者行为探测的漏洞,实现了更低的误报率和漏报率。其他工具是我们做科研课题的过程中积累的一些相关的数据。谢谢各位。

上一篇:NSC2013 中国网络安全大会2013开幕 张群英

下一篇:杨春燕:2015年电子商务交易额或达18万亿