漏洞挖掘技术研究

2011-10-19 王健宇 转载

漏洞(vulnerability)是指系统中存在的一些功能性或安全性的逻辑缺陷,包括一切导致威胁、损坏计算机系统安全性的所有因素,是计算机系统在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷和不足。漏洞的存在不可避免,一旦某些较严重的漏洞被攻击者发现,就有可能被其利用,在未授权的情况下访问或破坏计算机系统。先于攻击者发现并及时修补漏洞可有效减少来自网络的威胁。因此主动发掘并分析系统安全漏洞,对网络攻防具有重要的意义。

目前国际上比较权威的漏洞发布机构是国际安全组织CVECommon Vulnerabilities & Exposures,通用漏洞披露)和CERTComputer Emergency Response Team,计算机应急响应小组)。CVE会对认证产品从CVE Mapping等四个维度进行严格考核,同时会对厂商的攻防研究能力也进行持续的定期评估,在攻防领域没有持续投入的厂商会被取消CVE认证资格。H3C很早就从事漏洞的分析和研究,是CVE兼容性认证厂商和MAPPMicrosoft Active Protections Program,微软主动防御计划)认证厂商。

漏洞研究主要分为漏洞挖掘与漏洞分析两部分。漏洞挖掘技术是指对未知漏洞的探索,综合应用各种技术和工具,尽可能地找出软件中的潜在漏洞;漏洞分析技术是指对已发现漏洞的细节进行深入分析,为漏洞利用、补救等处理措施作铺垫。本文简要介绍几种流行的漏洞挖掘方法,以及使用该方法挖掘的典型漏洞。

1    漏洞挖掘技术分类

根据分析对象的不同,漏洞挖掘技术可以分为基于源码的漏洞挖掘技术和基于目标代码的漏洞挖掘技术两大类。

随着Internet和网页应用的普及,Web漏洞挖掘技术也浮出水面。Web漏洞出现在动态Web页面程序中,动态Web页面一般是无法获取到源码或只能获取部分源码的,因此Web漏洞挖掘技术可以归类为基于目标代码的漏洞挖掘技术。基于源码的漏洞挖掘是将源码获取后,使用自动工具或手工检查的方法进行源代码分析,从而找到软件漏洞的技术。这类漏洞挖掘多是在软件生产中测试过程的一环,可以提高软件发布后的安全性。开源(Open Source)软件也经常被第三方机构、爱好者和黑客做开源漏洞挖掘,为的是找到更多开源软件的漏洞,以促进软件的健壮性。

基于目标代码的漏洞挖掘技术与软件测试技术相近,分为白盒分析、黑盒分析和灰盒分析三种。

白盒分析采用逆向工程的方法将目标程序转换为二进制码或还原部分源代码。但是在一般情况下,很难将目标程序完全转换为可读的源代码,尤其是当原作者采用了扰乱、加密措施后,采用白盒分析会很困难。

黑盒分析是控制程序的输入,观察输出的一种方法,而不对目标程序本身进行逆向工程。它可以对某些上下文关联密切、有意义的代码进行汇聚,降低其复杂性,最后通过分析功能模块,来判断是否存在漏洞。但黑盒分析的过程需要分析者具有较高技术水平,否则很难在较短时间内找到可利用的漏洞。

灰盒分析则是将两种分析技术结合起来的方法,从而能够提高分析命中率和分析质量。

2    漏洞挖掘分析技术

漏洞挖掘分析技术有多种,只应用一种漏洞挖掘技术,是很难完成分析工作的,一般是将几种漏洞挖掘技术优化组合,寻求效率和质量的均衡。

2.1    人工分析

人工分析是一种灰盒分析技术。针对被分析目标程序,手工构造特殊输入条件,观察输出、目标状态变化等,获得漏洞的分析技术。输入包括有效的和无效的输入,输出包括正常输出和非正常输出。非正常输出是漏洞出现的前提,或者就是目标程序的漏洞。非正常目标状态的变化也是发现漏洞的预兆,是深入挖掘的方向。人工分析高度依赖于分析人员的经验和技巧。人工分析多用于有人机交互界面的目标程序,Web漏洞挖掘中多使用人工分析的方法。

2.2    Fuzzing技术

Fuzzing技术是一种基于缺陷注入的自动软件测试技术,它利用黑盒分析技术方法,使用大量半有效的数据作为应用程序的输入,以程序是否出现异常为标志,来发现应用程序中可能存在的安全漏洞。半有效数据是指被测目标程序的必要标识部分和大部分数据是有效的,有意构造的数据部分是无效的,应用程序在处理该数据时就有可能发生错误,可能导致应用程序的崩溃或者触发相应的安全漏洞。

根据分析目标的特点,Fuzzing可以分为三类:

ü  动态Web页面Fuzzing,针对ASPPHPJavaPerl等编写的网页程序,也包括使用这类技术构建的B/S架构应用程序,典型应用软件为HTTP Fuzz

ü  文件格式Fuzzing,针对各种文档格式,典型应用软件为PDF Fuzz

ü  协议Fuzzing,针对网络协议,典型应用软件为针对微软RPC(远程过程调用)的Fuzz

Fuzzer软件输入的构造方法与黑盒测试软件的构造相似,边界值、字符串、文件头、文件尾的附加字符串等均可以作为基本的构造条件。Fuzzer软件可以用于检测多种安全漏洞,包括缓冲区溢出漏洞、整型溢出漏洞、格式化字符串和特殊字符漏洞、竞争条件和死锁漏洞、SQL注入、跨站脚本、RPC漏洞攻击、文件系统攻击、信息泄露等。

与其它技术相比,Fuzzing技术具有思想简单,容易理解、从发现漏洞到漏洞重现容易、不存在误报的优点。同时它也存在黑盒分析的全部缺点,而且具有不通用、构造测试周期长等问题。

常用的Fuzzer软件包括SPIKE ProxyPeach Fuzzer FrameworkAcunetix Web Vulnerability ScannerHTTP FuzzerOWASP JBroFuzzWebScarab等。

2.3    补丁比对技术

补丁比对技术主要用于黑客或竞争对手找出软件发布者已修正但未尚公开的漏洞,是黑客利用漏洞前经常使用的技术手段。

安全公告或补丁发布说明书中一般不指明漏洞的准确位置和原因,黑客很难仅根据该声明利用漏洞。黑客可以通过比较打补丁前后的二进制文件,确定漏洞的位置,再结合其他漏洞挖掘技术,即可了解漏洞的细节,最后可以得到漏洞利用的攻击代码。

简单的比较方法有二进制字节和字符串比较、对目标程序逆向工程后的比较两种。第一种方法适用于补丁前后有少量变化的比较,常用的于字符串变化、边界值变化等导致漏洞的分析。第二种方法适用于程序可被反编译,且可根据反编译找到函数参数变化导致漏洞的分析。这两种方法都不适合文件修改较多的情况。

复杂的比较方法有Tobb Sabin提出的基于指令相似性的图形化比较和Halvar Flake提出的结构化二进制比较,可以发现文件中一些非结构化的变化,如缓冲区大小的改变,且以图形化的方式进行显示。

常用的补丁比对工具有Beyond CompareIDACompareBinary Diffing SuiteEBDS)、BinDiffNIPC Binary DifferNBD)。此外大量的高级文字编辑工具也有相似的功能,如Ultra EditHexEdit等。这些补丁比对工具软件基于字符串比较或二进制比较技术。

2.4    静态分析技术

静态分析技术是对被分析目标的源程序进行分析检测,发现程序中存在的安全漏洞或隐患,是一种典型的白盒分析技术。它的方法主要包括静态字符串搜索、上下文搜索。静态分析过程主要是找到不正确的函数调用及返回状态,特别是可能未进行边界检查或边界检查不正确的函数调用,可能造成缓冲区溢出的函数、外部调用函数、共享内存函数以及函数指针等。

对开放源代码的程序,通过检测程序中不符合安全规则的文件结构、命名规则、函数、堆栈指针可以发现程序中存在的安全缺陷。被分析目标没有附带源程序时,就需要对程序进行逆向工程,获取类似于源代码的逆向工程代码,然后再进行搜索。使用与源代码相似的方法,也可以发现程序中的漏洞,这类静态分析方法叫做反汇编扫描。由于采用了底层的汇编语言进行漏洞分析,在理论上可以发现所有计算机可运行的漏洞,对于不公开源代码的程序来说往往是最有效的发现安全漏洞的办法。

但这种方法也存在很大的局限性,不断扩充的特征库或词典将造成检测的结果集大、误报率高;同时此方法重点是分析代码的“特征”,而不关心程序的功能,不会有针对功能及程序结构的分析检查。

2.5    动态分析技术

动态分析技术起源于软件调试技术,是用调试器作为动态分析工具,但不同于软件调试技术的是它往往处理的是没有源代码的被分析程序,或是被逆向工程过的被分析程序。

动态分析需要在调试器中运行目标程序,通过观察执行过程中程序的运行状态、内存使用状况以及寄存器的值等以发现漏洞。一般分析过程分为代码流分析和数据流分析。代码流分析主要是通过设置断点动态跟踪目标程序代码流,以检测有缺陷的函数调用及其参数。数据流分析是通过构造特殊数据触发潜在错误。

 

比较特殊的,在动态分析过程中可以采用动态代码替换技术,破坏程序运行流程、替换函数入口、函数参数,相当于构造半有效数据,从而找到隐藏在系统中的缺陷。

常见的动态分析工具有SoftIceOllyDbgWinDbg等。

3    典型技术应用

3.1    使用Fuzzing技术进行网页漏洞挖掘

点击查看原图                                                      图1 Acunetix Web Vulnerability Scanner软件的HTTP Fuzzer工具

使用Acunetix Web Vulnerability Scanner软件进行漏洞挖掘,该软件提供了一些预定义好的Fuzz运算参数库,可以便于初学者上手,也可以方便分析者使用。过程如下:

1、 定义HTTP请求(Request),即定义所需访问的网页URL

2、 定义运算参数(Add generator),即定义可能产生漏洞的字符串表达式,如:查找$password$passwd$token

3、 插入运算参数(Insert into request),即将定义好的多条运算参数绑定为一条搜索策略;

4、 定义成功触发特征(Fuzzer Filters),将运算参数与HTTP请求绑定;

5、 扫描(Start)

6、 等待软件返回匹配的项,这些项就是可能的漏洞。

经过以上步骤,一个网页中可能存在的漏洞就被发现了。

3.2    使用补丁比对技术找到漏洞的例子

20081023日,微软发布的MS08-067的补丁,该问题被列为严重。该安全更新解决了服务器服务中一个秘密报告的漏洞。如果用户在受影响的系统上收到特制的RPC请求,则该漏洞可能允许远程执行代码。

漏洞挖掘过程为例说明补丁对比技术的应用。

首先保留一份原始文件,然后安装新的补丁程序,提取出相同和新加入的文件后,就可以使用软件进行对比。

点击查看原图                                                                                      图2 经过对比后发现被修改的3个函数

对比软件列出了三个函数名称,分别为0.250.670.94并列出补丁前后的相似程度。通过对比结果,可以针对性构造参数,观察补丁前后的行为,最终发现在给出的这三个函数中,有两个是和漏洞直接相关的。

4    结束语

漏洞挖掘技术脱胎于软件测试理论和软件开发调试技术,可以大大提高软件的安全性。网络安全界的第三方机构、技术爱好者也利用该技术寻找各种软件漏洞,并及时发布给大众,为提高信息安全整体水平做出了贡献。但漏洞挖掘也是一把双刃剑,已经成为黑客破解软件的主流技术。漏洞挖掘技术的发展前景是广阔的,随着信息安全越来越被重视,软件开发技术越来越先进,新的分析手段会随之出现。

发表评论:

Powered by emlog sitemap