陈晓燕,高 彦
(78156部队,兰州 730020)
基于源码的漏洞挖掘技术,是以程序源码为基础进行分析研究,从中挖掘漏洞的技术方法。使用这种方法的前提条件,是必须获取目标软件的源代码。虽然有这一限制条件,但源码使得漏洞挖掘的难度大大降低,而借助于各种方法技巧,找到漏洞就相对更加容易一些。因此,在有源码的情况下,通常都会使用这类方法。
从这个角度可以把这些技术分为白盒测试,黑盒测试和灰盒测试三类。这是一种非常形象的说法。黑盒这个词在许多领域都有使用,指的是不清楚内部结构的一个体系或整体。而黑盒测试,只是向其进行有目的的输入,通过观察这个系统的输出来猜想输入对系统产生了什么样的影响,当经过大量的尝试,就可以确定这个系统在哪些方面存在缺陷,进而发现漏洞。白盒与灰盒则是相对黑盒而言的。白盒就是要查看这个系统的内部结构,弄懂它整个的工作原理,然后从中找出逻辑上或其他方面的漏洞。灰盒则介于两者之间,既有反汇编目标软件,分析其逻辑的思想,又有根据输入输出发现漏洞的黑盒思想。
漏洞挖掘技术有许多种,在具体使用中的方法也不相同,针对不同的目标软件,通常会先进行简单的分析,据分析结果来制定一个大概的漏洞挖掘操作思路,这些思路非常灵活,但总的来讲,可以总结出一个一般流程。首先,对于不开源的程序或软件,要对其反汇编,得到可读的汇编代码,然后根据汇编代码指令,找到程序的入口、出口,将它分割为表示过程或函数的组,即对程序进行过程抽象。对于开源程序,由于有源代码,可直接进行过程抽象。有了过程抽象的结果后,我们可以对程序进行测试输入、漏洞扫描或是进行代码与指令的具体分析。这两条线路分属动态分析与静态分析两种方法,而进行测试输入也可以作为黑盒测试方法。
主要从两个方面进行。一是在有源代码的情况下,由分析者考虑程序员可能会出现的逻辑性错误或疏忽,这就需要分析者自身是一位优秀的程序工程师,并掌握大量的安全经验和漏洞挖掘技巧。二是针对目标程序,由测试者手工构造特殊输入条件,这些输入包括有效的和无效的输入,然后观察程序输出和它所产生的状态变化等,从而分析漏洞是否存在。
Fuzzing技术是一种非常典型的黑盒测试技术。它的基本原理是使用大量半有效的数据作为应用程序的输入,以程序是否出现异常为标志,来判定是否存在的漏洞。
Fuzzing技术中的输入有如下两个特点,第一是数量十分庞大,以数量来覆盖所有漏洞可能产生的方面,由于通常是使用Fuzz工具来自动完成,大量的输入就成为可能,从而对输入的目的性要求降低;第二是它输入数据的半有效性,Fuzz工具也并非完全漫无目的的输入,为了提高效率,设计者对输入做了必要的规定,使输入的必要标识部分有效,让程序认为这个输入合法,接受它并让它在程序内部进行处理,而其他的部分则是随意的,这就使得在程序处理这些数据时可能会出现错误的结果,严重的甚至可以直接使程序崩溃。
静态分析技术的原理是通过分析程序中的语法和语义来发现程序中常见的安全问题。所谓静态分析,就是程序处于静态,不运行它,也不给输入,直接通过分析目标程序反汇编的逻辑,发现其中出现的问题。静态分析重点检查函数调用是否有缺陷,返回状态是否有异常,特别是有没有边界检查函数调用,这些函数有strcpy、strcat等,它们可能造成缓冲区溢出,还有需要用户提供输入的函数、在用户缓冲区进行指针运算的程序等,因为这些位置最容易出现漏洞,也是程序员容易疏忽的地方。
动态分析技术,就是在程序动态运行的过程中对软件中存在的漏洞进行检测。运用这种技术,它的目标软件首先必须是可执行程序,并且在分析的过程中还要有输入操作,然后通过观察执行过程中程序的运行状态、内存使用状况和寄存器的值等来发现潜在问题。其中的原理就是利用操作系统提供的各种接口对运行的程序跟踪监视,来获得目标程序运行过程中的运行数据及运行状态以供参考分析。当前比较常用的有环境错误注入法以及数据流分析法两种方法。环境错误注入法,是故意将一些容易引发错误的输入注入到软件运行中,然后根据程序是否有不正常的反应来达到验证的目的。运用此法,对程序的可靠性及容错性进也是一种有力的检验。
这种技术严格来讲与别的漏洞挖掘技术有很大的区别,它并不是用来发掘一些未知的0day漏洞的,而是用来分析已经公布漏洞的原理,可以算是一种漏洞分析技术,其原理就是通过将已经发布的漏洞补丁安装后,从二进制代码中具体查出与安装前不一样的地方,从而定位这个漏洞的位置,并可以分析出这个漏洞背后的逻辑问题,因此这一技术也称为补丁比对技术。
总之,每种漏洞挖掘技术的使用都有着一定的限制条件,也有着挖掘时的侧重点,在实际运用时针对具体情况进行判断,选择适合的一种或几种配合使用,达到安全的目的。