模糊测试(精选5篇)
模糊测试 篇1
0 引 言
近些年来,利用软件漏洞实施网络攻击的行为层出不穷,互联网络的各个关键领域都面临着严峻的挑战。如何更好地保证软件质量,减少软件漏洞,成为当前安全领域一个重要的研究方向。当前用来发现安全漏洞的方法主要有三种:白盒测试,黑盒测试和灰盒测试。
白盒测试采用的主要方法是源代码审计。因为可以获取所有的源代码,所有可能的代码路径都可以被审核,所以该方法具有覆盖能力强的优点。主要的缺点是需要大量的人工分析,复杂性高。比如重要的软件项目一般包含数十万行代码,源代码分析工具产生的报告可能非常冗长而不易阅读[1]。目前主要的源代码分析工具主要有三种[1]:(1) 编译检测器,用于在源代码编译时查找漏洞。代表工具有微软的PREfast for Drivers[2]。(2) 源代码浏览器。这类工具允许测试者执行代码的高级搜索和代码枚举,用来寻找关键函数调用的位置[1]。当前流行的代码浏览器主要有Cscope[3]和Linux Cross-Reference[4]。(3) 源代码自动审核工具。用于扫描源代码以及自动识别可能的关键区域[1]。当前流行的工具有:可参见文献[5,6,7,8,9,10]。
黑盒测试是一种不需要知道被测目标内部细节而直接进行输入测试的一种测试方法。该方法可用性好,操作简单,但是覆盖能力一般,测试过程中会产生大量无效的测试用例。
灰盒测试介于白盒测试和黑盒测试之间,包括黑盒测试审核同时也包括通过逆向分析获取汇编形式的源代码,即二进制审核[1]。灰盒测试有很好的可用性,但存在很大的复杂性,尤其在二进制审核工作上要花费大量时间。目前自动化的二进制审核工具主要有IDA[11]、LogiScan、BugScam、Inspector、SecurityReview、BinAudit。
1 模糊测试发展史
模糊测试作为黑盒测试的一种具体技术,开始于1989年。Barton Miller教授在UW-Madison中使用模糊测试的方法来测试UNIX应用程序的健壮性[12]。当时采用一种简单纯粹的黑盒测试,只是验证应用程序是否崩溃,具有很高的失效概率。1999年,Oulu大学开始进行PROTOS测试集的开发工作,结合了白盒和黑盒的测试方法。2002年Oulu大学发布成熟的PROTOS SN MP测试集[13]。同年Dave Aitel发布开源的模糊测试器SPIKE,该测试器实现了基于块的方法,具有描述可变长数据块的能力,主要用于测试网络应用程序[14]。2004年,Michal Zalewski发布了针对web浏览器的模糊测试工具mangleme[15]。2005年,Michael Sutton等人在Black Hat USA Briefings in 2005上发布同时基于变异和生成,用于对文件格式进行模糊测试的工具,包括 FileFuzz[23]、SPIKEfile[24]和notSPIKEfile[22]。同年,商业模糊器(Codenomicon,Mu Security等)被引入市场,大量的开发人员开始关注于模糊测试[17]。2006年开始出现大量针对ActiveX控件的模糊测试,代表工具有David Zimmer发布的COMRaider[36]和H.D.Moore发布的AxMan[18]。
随着越来越多安全领域的研究人员关注于模糊测试,模糊测试将会有很大的发展。
2 模糊测试技术研究现状
2.1 自动化模糊测试的一般流程
模糊测试是一种具体的高度自动化的黑盒测试技术:用大量半合法的数据作为程序的输入去覆盖大量的界限情况,来更好地保证不存在可以利用的脆弱点[19]。
模糊测试自动化实现的一般流程是:首先产生半合法的数据(该数据是指它具有足够的正确性,能让编译器直接忽略它,但又有足够的非法性,能导致错误的发生),接着将这些数据发送给目标程序进行处理,然后观察应用程序,看程序是否在处理这些数据时发生错误。如果发生错误,测试工具保存提交的数据,为后来的分析作好准备,然后继续提交畸形的数据。如果应用程序不会有错误,测试工具会选择是否删除畸形的数据,然后继续下一个循环[19]。
主要的测试流程如图1所示。
2.2 模糊测试方法分类
模糊测试方法主要分为两类:基于变异的模糊测试和基于生成的模糊测试。基于变异的模糊测试方法是指将收集的正确的数据按照一定的方法进行改变。改变的方法可以是随机变异或者是启发式变异。启发式变异可以是用长的字符串替换小的字符串,或者将长度值变异成特别大或者是特别小。基于生成算法的模糊测试开始于一个特定的描述文件格式或者网络协议的规范,然后通过依据这些规范组合大量测试用例。该测试方法的关键是构造大量测试用例,每一个测试用例要区别于正常的数据,使得测试用例既可以触发程序的问题,又不能使测试用例过于非法,否则目标程序有可能直接丢弃了非法的测试用例。
基于变异的模糊测试的优点是测试者不需要知道协议或应用程序的知识就可以进行测试。所有的一切只需要一个或多个好的样本和一个测试方法。另一个方面,基于生成的测试方法需要做大量的前期工作来学习特定的规范并且手动产生测试用例。
在生成和变异两种分类的基础上,Michael Sutton 等人将具体的模糊测试技术分为以下几类[1]:(1) 预先生成测试用例,即PROTOS框架采用的方法[13]。采用该方法时,首先要对一个专门的协议规范进行研究,目的是为了理解所有被支持的数据结构和每种结构可以接受的值的范围[1],然后依据规范生成特定的具有一定覆盖率的测试用例,最后将测试用例发送到目标程序。该测试方法没有引入随机机制,测试用例有限,一旦运行完后,模糊测试就结束了[1]。(2) 随机方法。该方法只是简单产生随机测试数据给目标程序。随机测试方法简单但是低效。该方法产生大量的测试用例,但是这些测试用例很难达到测试标准,同时代码覆盖率很低[21]。(3) 协议变异人工测试。该方法主要依靠个人经验构造变异测试用例,常用来测试Web应用测试[1]。测试时需要大量人工参与,测试结果很大程度上取决于测试者的个人经验。(4) 变异和强制性测试。测试从一个有效的协议或数据格式样本开始,持续不断打乱文件中的每一个字节[1]。该测试方法不需要对被测试软件进行研究,实现起来简单但是很低效。代表工具有notSPIKEfile[22] 和FileFuzz[23]。(5) 自动协议生成测试。该测试方法需要理解和解析测试对象的协议规范或者文件格式定义。测试工具动态解析这些模板,生成测试数据,然后将数据发送到目标程序[1]。采用该测试方法产生的测试用例有效性高,具有较高的代码覆盖率,但是在前期分析协议时需要花费大量时间。主要的代表工具有:SPIKE[25]和SPIKEfile[24]。
2.3 模糊测试的测试对象
目前模糊测试对象已经渗透到安全领域的各个方面,出现了很多针对特定测试对象的测试工具。测试对象多种多样,难以区分。Michael Sutton 等人对测试对象进行了大致的分类,主要有:
(1) 环境变量和参数 测试对象主要是命令行参数和环境变量。现在的主要工具有iFuzz[26],该工具采用C语言开发,存在一个自动处理目标二进制代码的引擎,主要用于本地的模糊测试。
(2) Web应用程序和服务器 Web应用容易受到各种类型的漏洞攻击。主要有:拒绝服务、跨站漏洞、sql注入漏洞、目录遍历、缓冲区溢出、远程代码注入等[27]。当前的主要的测试工具有:Dave Aitel开发的SPIKE代理[28]和WebScarab[29]。SPIKE工具是基于浏览器的Web模糊器。工具采用代理方法捕获web请求,然后依据一定的规则对目标web站点进行测试。WebScarab工具可以向应用程序的参数注入模糊值[1]。另外同类工具还有SPI[30]、Codenomicon Http[31]、beSTORM[32]等等。
(3) 文件格式 测试对象是针对特定的文件格式,主要用于发掘客户端文件解析漏洞[1]。漏洞主要包括:拒绝服务、整数溢出、堆栈溢出、逻辑错误、格式化字符串。当前主要的测试工具有:notSPIKEfile、SPIKEfile、FileFuzz。
(4) 网络协议 网络协议的模糊测试原理是通过特定的Socket形式将变异或者生成的含有错误信息的数据包发送给目标程序。现有的代表工具有SPIKE和ProtoFuzz。其中SPIKE比较流行,工具用SPIKE脚本描述目标网络协议,然后设置模糊器根据协议开始测试。另外还有一些专门针对特定协议的模糊测试工具。这些工具包括ircfuzz[33]、dhcpfuzz[34]、Infigo FTPStress[35]。
(5) Web浏览器 现在的Web浏览器可以处理动态html文件、表单、脚本语言等多种目标。随着Web浏览器的功能日益增强,其存在的漏洞也越来越多。目前应用最广的是针对组件的测试,尤其是针对ActiveX组件。代表工具有COMRaider[36]和AxMan[37]。
2.4 模糊测试中存在的问题
如何有效地绕过目标程序对样本数据进行验证的问题。在模糊测试的测试目标中,有很多目标的格式和协议提供了各种类型的验证。比如,网络协议和文件格式通常用校验和和哈希去帮助检测数据包和文件内容的完整性。这些机制会给测试设置障碍,因为我们要改变文件的内容以达到测试的目的,当文件内容改变后,提交的数据有可能因为不能通过校验而被应用程序直接丢弃,导致测试用例的运行仅仅覆盖到目标程序中少量代码就结束了,极大地影响了测试效果。
所有的测试用例都到达同一测试深度的问题:通过对代码覆盖率的分析,会发现在一些测试过程中,所有的测试路径都在代码的同一个地方被阻截下来。如果不做特定的改变,几乎所有的测试用例所能测试到的代码深度和覆盖率到都是一样的,大量的测试用例就失去了测试意义,严重影响测试效果。
如何测试加密和压缩数据的问题:加密的数据格式将很难被挖掘。如果挖掘工具对样本中随机变化的字节不做任何处理,目标程序的样本识别器或者编译器就不能编译这些数据。问题的关键在于是否能保证测试工具具备一定的能力去在变异数据前解密数据,生成数据,然后在提交数据前重新加密数据。针对通过压缩来验证的数据格式的目标测试程序的解决方法也一样:测试工具要具有解压和压缩数据的能力。
3 进一步研究的方向
随着模糊测试被运用得越来越广泛,该项技术也必将日益成熟。结合模糊测试的特点和问题,归纳其今后的研究方向主要有以下几个方面:
协议自动化分析 基于协议来生成或变异样本可以产生具有很好覆盖率的测试用例,进而提高测试效果,该方法还有利于突破一些验证机制,比如在变异数据后再进行校验和计算,来突破校验和的验证。这同时也带来一个很明显的缺陷:需要在测试前花大量的时间分析测试目标的协议或规范,即使是一个很简单非公开的协议也需要花费大量的时间。协议自动化分析正好弥补这一缺陷。
代码覆盖技术 提高测试效果最好的方法之一就是提高测试用例的代码覆盖率。在生成测试用例的过程中引入知识,和一些智能算法,例如遗传算法[38],同时利用调试器检测代码覆盖率,可以很好地提高测试用例的效果。
故障检测与定位 有一些应用程序的错误产生在应用程序的外部是很难发现的,同时定位到出现错误的地方也很困难。解决该问题可以提高监视器的检测精度或者结合动态二进制插装。现在的动态插装系统有 DynamoRIO、DynInst、Pin。
设计更加高效通用性好的测试平台 当前的测试平台大多针对特定的系统或者特定的服务和应用,并且大多数都需要借助于其他工具进行测试评估来提高测试效果,比如需要借助于代码覆盖率计算工具。设计一个较为完整的测试平台是一个趋势。该平台需具有自主的协议分析能力,代码监控能力,获取测试用例执行信息的能力。同时要有高效的算法来协调各个组件的运行,提高整体测试效率。利用虚拟机技术监测,结合符号执行技术提高路径覆盖率是一个很好的研究方向。
摘要:通过介绍发现安全漏洞的三种方法,引出模糊测试。首先介绍了模糊测试的历史,接着从模糊测试的一般流程,模糊测试方法,测试对象,测试中存在的问题四个方面详细介绍了模糊测试的研究现状,最后根据模糊测试的研究现状和特点归纳了今后模糊测试的研究方向和研究方法。
关键词:模糊测试,协议,测试用例,变异,生成
模糊测试 篇2
(一) 安全漏洞的定义和产生。
安全漏洞指的是在网络硬件、软件或协议中, 其系统安全策略在设计或应用时潜藏的安全隐患, 这些隐患可能导致网络系统在受到恶意攻击时发生问题, 导致网络系统瘫痪或重要数据丢失。任何一种新兴技术的应用都可能产生网络安全漏洞, 除此之外, 网络系统中的应用软件结构过于复杂也可能导致安全漏洞的数量增多。
(二) 安全漏洞的具体分类。
现阶段具有一定破坏性的网络漏洞共有120个大类, 在大类中, 又可进一步划分出835个小类, 网络漏洞可根据划分方式的不同出现多种类型, 可以按产生阶段分为设计类和实现类;也可以按危害程度分为功能类和安全类;还可以按照宿主类别分为操作系统类、软件产品应用系统类以及协议类, 现阶段普遍使用第三种方法对网络安全漏洞进行分类。
(三) 以SQL注入为例对安全漏洞具体分析。
SQL注入是现阶段一种比较流行的网站侵入模式, 具有操作简单、易上手等特点, 因此, 比较容易在网络系统中发生。在具体操作时将特定的代码加独到目标字符串中, 将其作为原有的数据参数传输到服务器中, 使服务器产生不当处理, 攻击者可以借此避开网络数据库中的权限控制系统, 轻松获得网络系统中的所有数据[1]。
二、Fuzzing测试技术及其具体应用
(一) Fuzzing概述。
Fuzzing又被业界普遍成为Fuzz Testing, 运用网络安全漏洞的检查程序, 将指定数据传输给相应组件, 或修复指定的残缺格式, 可以通过外部传输的有关数据对网络系统内部的一些行为进行控制, 对安全漏洞数量较多的网络系统测试效果尤其明显, 是目前比较先进的自动化软件测试技术。
(二) Fuzzing测试思想与工作流程。
Fuzzing测试的主要目的是用于检查计算机软件的应用性, 利用用户身份, 对计算机的大多数相关程序进行无规律的尝试, 以制造半有效数据, 之后将这些数据输入到需要进行测试的程序中, 根据该程序对其处理的过程, 分析系统中是否存在安全漏洞。而Fuzzing的工作流程如下:首先, 确定需要进行测试的程序;其次, 谨慎挑选进行测试的交互点;第三, 编写Fuzzing相关测试数据;第四, 将得到的有效数据传输到交互点中;第五, 对测试程序的状态进行实时监测;最后, 找出系统安全漏洞。
(三) Fuzzing测试工具。
Fuzzing的测试工具叫Fuzzer, 由数据生成、程序运用、目标监测三部分组成, 从程序设计方向可分为Record and Replay Type Fuzzer和Model-Based Type Fuzzer两种类型;而从数据产生方向上可分为Mutationbased Fuzzer和Generation-based Fuzzer两类。
三、以Fuzzing为基础的网络协议安全测试大体方案
(一) 网络协议概述。
网络协议是一种存在于两个或多个通信实体间的网络行为规范, 规定了两者或多者之间的相关责任和义务, 对网络系统交互做出保障, 一份网络协议的制定需要对协议规范、协议编址和寻址以及协议数据包进行重点把握。
(二) 网络协议Fuzzer设计与实现。
Fuzzing测试的主要针对对象为FTP、HTTP以及SMTP, 而网络协议Fuzzer的设计需要满足以下四种功能:其一, 在测试时可以提供出本地及远程两种Fuzzing测试方案;其二, 可以构建出若干种Fuzzing模式以供客户选择;其三, 对系统进行测试时可实时监控;其四, 满足多种协议需求。
(三) 网络协议安全性测试方案。
该方案需要安全漏洞测试、监控以及评析等相关工具, 在测试时, 首先建立与测试程序的联系, 之后编制Fuzzing数据, 然后将数据传输至指定目标, 并对测试程序进行实时监测, 收集有异常现象的信息, 之后针对异常对数据进行合理调整, 最后对安全漏洞做出评估, 完成整个网络安全协议的安全性测试过程。
结论
本文基于模糊测试技术, 对网络协议的安全性进行了分析, 论述了该技术的具体应用, 为网络协议未来的发展提供了依据。
摘要:现阶段的网络协议普遍存在不同程度的安全漏洞, 本文通过对安全漏洞的简述, 引出Fuzzing测试技术, 并分析该技术的具体应用, 最后给出以Fuzzing为基础的网络协议安全测试的大体方案, 以期网络协议可以更好的为信息化时代服务。
关键词:模糊测试技术,网络协议,安全性,测试
参考文献
基于模糊测试的软件漏洞检测方法 篇3
关键词:模糊测试,软件漏洞,检测
1.模糊测试流程
(1) 确定测试的对象和输入的矢量。模糊测试是针对确定的程序进行的检测技术, 因此, 在进行模糊测试之前要先确定好需要测试的程序。一般来说, 漏洞的产生绝大多数是由用户直接或间接造成的, 有可能是因为接收的一些信息, 也有可能是错误运行了程序。所以, 一定要确定好输入的微量, 这是影响到测试结果的关键步骤。
(2) 生成模糊测试数据。在确定了程序和输入矢量之后, 就可以生成测试数据, 然后由系统根据数据自动选择测试数据方式。
(3) 执行模糊测试数据。这一步会与上一步生成测试数据并行进行, 执行过程一般包括启动目标程序、发送测试数据到目标程序等。同样, 在这个过程中实现自动化也是必需的和十分重要的。
(4) 监测异常。在进行模糊测试的时候, 一定要注意监测异常。如果不能对检测过程中的异常进行监测并加以分析, 可能会导致服务器崩溃, 那么就影响了检测的准确性。监测还能对源数据进行分析, 从而发现其中存在的未被发现的异常。
(5) 确定可利用性。一旦检测到异常, 首先应该查找异常出现的地方, 然后分析其原因, 解决异常。这些步骤就需要手工来完成, 而且也需要具备丰富的知识。
2.模糊测试方法
模糊器主要分为基于变异的模糊器和基于生成的模糊器两种, 基于变异的模糊器主要是对已有的数据进行改变来创建测试用例, 基于生成的模糊器是指通过协议或者文件格式来进行变异, 从而创建测试用例。同时, 我们还可以把模糊测试方法分成以下4类。
(1) 预生成测试用例。这种方法要求在使用前对测试对象的相关数据进行分析, 因此, 这用这种方法进行测试之前需要进行大量的工作, 这可能在一定程度上延长了检测时间。这种方法没有引用随机制, 因此不能生成很多的测试例子。
(2) 随机方法。这种方法是效率最低的, 正是由于它的随机性, 使得它不能全面地对软件进行测试。不过这种方法可以快速地发现漏洞, 但是具有较大的运气成分。对一个比较大的数据包, 不推荐采用这种方法, 因为这种方法有一定的不可靠性, 用这种方法对较大的数据包进行检测, 就会使检测时间变得很长, 不利用接下来的工作, 影响了检测效率。
(3) 人工协议变异测试。这种方法一般是用于测试Web应用软件的。这种方法依靠经验的成分比较高, 因此, 它需要对经验进行总结并记录存档。其实这就是通过人工输入数据来找出漏洞的, 因此, 它比随机方法还要简单, 但是自动化不强。
(4) 自动化变异或暴力测试。这种方法具有一定的强制性, 因为它能够强制代码覆盖在测试结果为良好的程序上, 然后再进行检测。但是, 这种方法的检测效率是比较低的, 因为在检测过程中, 系统会处理很多根本无效的数据, 这样就会延长测试时间, 拖慢进度。不过, 这种方法在这些问题上还是有一定的缓解能力的, 因为这种方法是可以全程利用自动化的原理的。
3.模糊器类型
(1) 本地模糊器。命令行参数和环境变量是将变量引入到程序中的两种最基本的方式, 因而针对setuid应用程序的模糊器可分为两类:命令行参数模糊器和环境变量模糊器。还有一类本地模糊器是文件格式模糊器。很多应用程序在处理畸形文件时可能会出现异常, 这就需要文件格式模糊器来参与监测。其中, 浏览器模糊器是一种特殊的文件格式模糊器, 它通常利用HTML的功能来实现模糊测试过程的自动化。
(2) 远程模糊器。远程模糊器的测试对象为基于网络的应用程序, 诸如各类服务器软件。这类应用程序一直以来都是模糊测试最重要的测试对象。远程模糊器主要包括网络协议模糊器和Web应用程序模糊器。网络协议模糊器被分为两类:以简单协议为测试对象的模糊器和以复杂协议为测试对象的模糊器。Web应用程序模糊器已经成为访问后端服务的一种流行方式, 这些后端服务包括电子邮件等网络服务。
(3) 模糊器框架。模糊器测试框架实际上就是通用的数据库, 可对于各种不同的试验对象进行归纳统计, 因此, 可运用的范围和领域较广, 能够针对不同的类型目标进行分析。
参考文献
[1]夏一民, 罗军, 张民选.基于静态分析的安全漏洞检测技术研究[J].计算机科学, 2006 (10) .
模糊测试 篇4
关键词:网络协议漏洞挖掘,模糊测试,启发式测试用例生成,Peach
互联网的发展,在促进人们生活水平的同时也面临着巨大的挑战。随着软件开发技术门槛的降低,软件的质量出现参差不齐的情况,很多系统在开发过程中本身就存在很大的隐患,容易受到各种各样的攻击[1]。网络协议在整个网络安全中占据着十分重要的位置,是各种网络传输的载体,它产生的漏洞具有很高的威胁性,一直是软件安全研究的热点。在模糊测试的过程中,模糊测试数据生成和网络协议识别是两个最重要的模块[1⁃2]。
1 网络协议模糊测试技术研究
1.1 基于参数权值的启发式模糊测试框架基本思想
基于参数权值的启发式模糊测试框架需要解决以下问题:基于C/S的模式进行通信;网络协议格式的解析;网络协议动态域匹配问题;数据输入空间的优化。
(1)基于C/S模式的协议通信
网络通信主要分为两种模式:C/S模式和B/S模式,其中C/S模式是指客户端/服务方式,通过TCP/IP协议传输数据,常用的网络应用层协议都是构建在TCP/IP之上的。
(2)协议格式的解析
针对常见的网络协议,总结了抽象的网络协议格式如图1所示。
在协议格式中HEAD和END是必须的,只有正确理解协议格式才能构造出合法的输入数据,在传统的基于错误注入的方法上,随机对字段进行变异,就很难保证修改的字段是否有效[3]。而在基于程序理解格式的基础上,才能对协议域进行有效变异,保证数据生成的有效性[4]。
(3)动态字段的匹配
采用Block⁃Based协议描述语言在对协议描述时,采用了如图1所示的协议格式模型,这样当在创建数据包时,可以将协议中长度字段绑定到对应的数据域,在内容字段进行更新后,长度等动态字段也会自动进行更新[5]。
(4)输入空间优化
一般用户的数据需要经过三层才能达到目标程序,接口访问层、输入数据校验层和逻辑功能实现层。基于测试的网络协议数据包根据效果可以分成:未通过输入数据验证被直接丢弃的数据包;经过输入验证层的验证,但是没有引发漏洞的数据包;到达了最终的实现逻辑层并且触发漏洞的数据包[6]。
1.2 基于参数权值的启发式模糊测试框架的基本步骤
基于参数权值的启发式模糊测试框架执行过程主要由以下部分组成:协议格式解析、测试脚本构造、参数权值衡量&启发式信息获取、构造并发送测试脚本、异常监控[7]。
(1)网络协议格式的解析
在模糊测试框架中,采用基于中间者的拦截模式,采用Trans Fuzz系统获取客户端和服务器端的网络流量,这样可以在网络交互一定次数稳定后再抓取相应的网络数据,保证了数据的准确性。在Trans Fuzz中,内置了数据分析模块,采用Wireshark和基于生物信息学结合的方法对网络协议进行解决,配合一定的人工干预,转换成Peach软件所需要的数据模型格式,减轻了对使用模糊测试器的专业要求,扩大了使用范围。
(2)模糊测试脚本的构造
为了提高模糊测试效率,在测试用例生成上,采用自动化的方法是非常有必要的。采用基于块的描述语言,定义一种协议描述XML文件对协议的各个字段进行定义。之所以选择XML文件,是因为XML文件具有通用性,已经成为数据传输格式的标准,而且很多开源工具或者语言都提供了对XML很好的支持。使用自定义算法获得协议后,要自动转换成上面的格式,需要实现一个转换工具bkc,实现将抓取的格式转换成上面的格式部分,同时针对Wireshark工具也编写了相应的工具pdml2bk,用于实现Wireshark格式到Peach Pit格式的转变[8]。
(3)基于参数权值的启发式测试用例生成
在测试数据生成策略中,采用启发因子指导测试用例的生成过程,启发因子的使用大大缩小了输入域的状态空间。启发因子主要采用软件自动提取,重点关注程序中的敏感函数和比较常量。在生成测试数据后,采用基于参数权值的方式对待测的测试数据进行权值估计,最后按照相对权值的大小确定发送顺序,优先选择容易导致漏洞的测试用例。
目前进程监控调试工具主要有:Pin(Intel),Dy⁃namo RIO,Valgrind,pydbg。考虑到采用的Python平台,pydbg的功能基本满足了需要,而且pydbg很好地实现了对Windows32系统的兼容,提供了指令级别的监控和调试[9]。
2 网络协议模糊测试技术实现
2.1 网络协议模糊测试开源平台的选择
为了实现基于参数权值的启发式模糊测试框架,在综合比较开发一套全新的框架和在现有平台基础上修改后,对现有工具进行了评估,主要基于以下几个方面:
(1)平台的应用范围,可维护性和更新速度;
(2)软件是否开源,软件组件是否可扩展,允许用户自定义的模块,是否支持基于块的协议描述语言;
(3)选用的模糊测试器应该尽量简化用户的工作,让用户有更多的精力实现自己的算法。而且应该尽量支持不同的协议,具有广泛的适用性;
(4)模糊测试器应该尽量具有较好的平台适用性,在常见的主流平台上都有对应的版本,这样算法才具有更大的应用范围,针对不同的平台不需要修改就可以使用;
(5)软件的开发语言应该是目前主流的开发语言,而且源代码应该具有良好的注释和规范性,具有相应的源代码说明。
鉴于Peach更新速度更快,可扩展性更好,选择Peach作为基于权值的启发式模糊测试框架的实现平台。
2.2 基于参数权值的启发式模糊测试框架
Peach内置了基于变异和基于生成的测试用例生成方法。Peach主要由以下组件构成:数据表示,数据产生模块,数据发送模块,异常监视模块,日志记录模块。在数据表示中,Peach定义了一种自定义的格式Peach Pit文件,它基于XML表示了协议的基本配置、数据模型、状态模型、测试配置、代理和监视器、运行配置等多种信息。Peach的工作流程如图2所示。首先,用户创建Peach Pit文件,Peach从文件中读取配置信息后根据数据模型和状态模型进行数据变异,变异后的数据通过Publisher发送到目标应用程序,Peach通过pydbg或者windbg对目标程序调试监视,如果发现错误则输出到指定的地方进行后续分析。
在要实现的平台中,需要对上述流程进行修改,满足基于参数权值的启发式模糊框架的要求,修改后的流程图如图3所示。改进后的流程图主要在以下方面进行了修改:
(1)Peach Pit文件的生成由网络协议字段识别算法生成,省去了手工编写的麻烦,提高了自动化程度,简化了模糊测试的流程。
(2)实现了自定义的模糊测试数据生成器Mutator,在测试数据生成中,加入了启发式进行,对生成的字符串进行了参数权值评估,发现漏洞的概率会相应的提高。
2.3 基于参数权值的启发式模糊测试平台实现
(1)网络协议字段识别算法的实现
网络协议字段识别算法的思想如下:对于wireshark不同识别的协议,采用前面提到的生物信息学方法进行字段识别;识别结束了,采取相应的转换工具,将前面识别后的结果转换成Peach Pit XML格式,以便于让后续的Peach读取。
算法的具体步骤如下:采用局部序列对比算法计算字节序列之间的相对距离,得到距离矩阵;采用非加权成对群算术平均法,根据序列顺序构建系统树;采用渐进比对算法遍历系统树,实现多序列对比。PI项目采用构造系统树的启发式方法引导多序列对比的执行,可以有效降低多序列对比的时间复杂度。
(2)网络协议格式转换算法
实现自动化转换的方法如图4所示。方法的主要思想是采用类似于中间者攻击模式,在中间假设一个Trans Fuzz系统,获取Peach和服务器端的通信流量,然后对截取的数据包进行分析,转换成Peach结构存储在Peach Pit文件的数据模型中。在截取数据流量的过程中,要让系统首先进行几次迭代,因为前期要进行数据连接的建立过程。通过图形界面对Trans Fuzz进行配置,可以控制要提取的元素,进行一定的人工分析,辅助完成Peach Pit文件的生成。
在Trans Fuzz中,数据分析功能的结构如图5所示。数据分析模块的输入来自客户端和服务器端的原始协议数据包,输出是一个Peach Pit中的数据模型。从图5中可以看出,数据分析过程可以分为相关但又相对独立的三个阶段:伪造数据包构造,数据分解和树形结构转换。在第一个阶段中,原始数据转化成伪造数据包。第二阶段,伪造数据包作为数据包解析过程的输入。第三阶段,来自数据包解析阶段的输出被转化成Python对象,然后提取信息写入Python配置文件。采用了模块化的思路把这三个阶段分成三个模块,这样能够在修改时相对独立,容易扩展。
在转换的过程中,需要对字符串进行切割,传统的方法在对协议进行树形构建的过程中,存在一些错误区分的情况。根据经验,采用启发式策略指导协议树的构造过程。在策略中主要是下面两种:采用特定的分隔符进行字符串分割,如括号或者指定的字符0x FFFF;查找协议字段间的关系,主要是数据字段和对应的长度。
在转换成Python Tree结构后,得到了一些不同的Data Model,这些不同的数据模型代表不同的数据命令或者执行过程,然后在后续的识别过程中,针对不同的数据模型分别进行测试,验证该过程的有效性。
(3)启发因子的抽取
采用IDA提取启发因子的具体过程如图6所示。首先对目标代码执行反汇编,然后运行自己写的Python脚本代码,分别记录不安全函数和比较常量,写入相应的配置文件。
(4)自定义测试数据生成模块实现
模糊测试框架中,采用了启发式的模糊测试用例生成方法,这样需要采用自定义的Mutator实现功能,采用启发因子得到的启发规则,主要是利用启发因子func⁃tion File.conf和constant File.conf指导数据生成过程,完成优化。对网络协议中的字段进行域划分,对不同的域根据前面的启发因子可以大致计算出取值范围,进而构造正常元素和异常元素。在发送数据时,对各个字段进行笛卡尔乘积,这样遍历输入空间,输入空间较随机方法得到了很大的缩小。在发送数据后,发送的Tracer对每个输入进行权值评估,在不断的计算过程中得到权值列表,按照指定的顺序发送到真实的目标软件。在这个过程中,输入数据生成和权值衡量是可以同时进行的。
3 网络协议模糊测试技术验证
3.1 设计框架方案和环境需求
框架的验证是在Windows下完成的。框架实现采用Peach2.3.8源代码,网路协议抓包和解析工具Wire⁃shark,调试工具Windbg,IDAPython等。
3.2 软件实验结果和分析
对模糊测试框架的评价主要从三个方面来评估:发现漏洞的效率,发现漏洞的数量和软件的易用性。
(1)发现漏洞效率分析
采用Peach自带的命令,在命令行上对filezilla.xml进行验证,具体的命令是Peach⁃afilezilla.xml,搭建Peach代理,默认端口是9000,监听服务器程序的运行情况。执行后,在另一个cmd窗口,执行命令Peachfilezilla.xml,这样Peach就会发送测试数据到服务器FTP软件上。
(2)发现漏洞数量分析
针对File Zilla FTP软件,通过分析改进前和改进后发现的漏洞类型,都发现了数据分支比较漏洞和函数参数漏洞,分别是改进前和改进后发现的USER命令漏洞,从数量上看该方法并没有遗漏基本的漏洞,在保证时间提升的情况下,基本发现了漏洞。
(3)软件的易用性分析
对于测试用例分析,主要有三种情况:改进前和改进后都存在的测试用例类型;改进前存在,改进后不存在的测试用例类型;改进前没有,改进后新增的测试用例类型。
①改进前和改进后都存在的测试用例类型:对于该测试用例,在改进前是由多个‘A’组成的字符串导致目标软件缓冲区溢出漏洞,而在改进后是由多个空格组成的字符串导致的漏洞。
②改进前存在,改进后不存在的测试用例类型:主要是采用空格字符串替代USER,然后后面是多个‘A’组成的长字符串,因为在协议域分析中USER是常量,没有对该域进行变化。
③改进前没有,改进后新增的测试用例类型:主要是USER命令和不定长的空格组成的命令,后面有不同长度的空格,这样可以测试参数的长度类型,这个在改进前的方法中是随机的,而且不用空格,是采用其他字符。
3.3 软件代码的可复用性分析
基于权值的启发式模糊测试框架不仅仅局限于Peach软件,启发因子的提取可以独立出来,指导其他模糊测试工具的数据生成模块。协议格式识别模块也是可以复用的,提供协议格式后,提供对外接口,提取工具可以根据结构获得协议解析格式。这样框架的应用范围是广泛的,具有一定的实践意义。
在本文中,主要对FTP协议进行分析,其他协议也可以通过相同的过程进行分析,主要是验证协议的不同实现是否存在漏洞。
4 结论
网络协议漏洞挖掘一直是信息安全工作者研究的热点之一,而模糊测试在漏洞挖掘方面一直占据着重要的地位。通过研究模糊测试方法在网络协议漏洞挖掘方面的应用,针对传统模糊测试方法在模糊测试数据生成和网络协议自动化识别方面的不足,本文提出了基于参数权值的启发式模糊测试框架,并对框架在具体的FTP协议上进行了实验验证和分析,证明了框架的可行性和有效性。
参考文献
[1]李伟明,张爱芳,刘建财,等.网络协议的自动化模糊测试漏洞挖掘方法[J].计算机学报,2011,34(2):242-255.
[2]杨世德,梁光明,余凯.基于ARM嵌入式系统底层漏洞挖掘技术研究[J].现代电子技术,2015,38(18):57-59.
[3]李淼,吴世忠.软件漏洞起因的分类研究[J].计算机工程,2006,32(20):163-165.
[4]李鹏,王汝传,王绍棣.格式化字符串攻击检测与防范研究[J].南京邮电大学学报(自然科学版),2011,27(5):84-89.
[5]ZHANG Zhao,WEN Qiaoyan,TANG Wen.An efficient mutation-based fuzz testing approach for detecting flaws of network protocol[C]//Proceedings of 2012 International Conference on Computer Science and Service System.Washington DC:IEEE,2012:814-817.
[6]GORBUNOV Serge,ROSENBLOOM Arnold.Auto Fuzz:automated network protocol fuzzing framework[J].International journal of computer science and network security,2014,10(8):239-245.
[7]SHIN Y,MENEELY A,WILLIAMS L,et al.Evaluating complexity,code churn,and developer activity metrics as indicators of software vulnerabilities[J].IEEE transactions on software engineering,2013,37(6):772-786.
[8]SUI A F,TANG W,HU J J,et al.An effective fuzz input generation method for protocol testing[C]//Proceedings of 201113th IEEE International Conference on Communication Technology.Jinan,China:IEEE,2011:728-731.
模糊测试 篇5
大型空调是现代建筑中的能耗大户。早期大空调系统是根据最大冷负荷的冷冻水定流量技术设计, 由于实际应用中空调冷负荷不断变化, 这种设计除了浪费大量能量外, 也容易造成蒸发器的过冷状况。现代设计中多采用传统PID控制变频调节水泵控制水的流量, 简单能完成控制功能, 但是由于冷冻水系统具有大滞后、非线性和时变的复杂特性, 很难建立精确的数学模型来描述, 使传统的PID控制系统平衡时间长、能效差, 效果不理想。模糊PID控制算法使用简便、调节灵活、计算量小、实用性强, 还具有快速性好、稳定性强、鲁棒性高的优点, 达到较高的控制精度和很好的自适应能力。由于模糊控制器的结构和知识表达单一, 难以处理复杂控制系统所需的启发性知识, 引入专家判断的作用是快速使水温进入稳定状态, 减少在温度设定值附近的震荡, 减少进入稳定状态的时间来提高实验效率。这样模糊控制与专家系统的有机结合就产生了一种新的智能控制方式。
实践中我们设计了一种新型的水循环系统的空调试验台, 利用水循环来测量压缩机工作效率、性能, 模糊-专家PID控制系统在动态性能上有更好的表现, 能够更快速的达到测试条件, 并且稳定时间更长, 留给测试空调性能的时间也更加充足, 整个系统的测试性能显著提升。
控制系统的基本结构和原理
空调试验台的结构
空调制冷系统由压缩机、冷凝器、膨胀阀、蒸发器等器件组成[1], 如图1所示, 从空调蒸发器流出的冷冻水被送到室内冷却盘管中, 与周围的空气热交换, 降低室内温度, 从冷却盘管流出的吸热后的冷冻水被送回入蒸发器.制冷剂在蒸发器中蒸发吸收冷冻水的热量, 使冷冻水出水温度降低, 制冷剂经过压缩机进入冷凝器冷凝放热, 热量传递给冷却水。冷却水经过冷却塔, 将这部分热量传递给外界大气, 达到室内温度降低效果。空调试验台是利用水循环来测量压缩机工作效率的系统。要想测试压缩机的效率, 只需要测试冷凝器放出的热量和蒸发器吸收的热量即可;冷凝器放出的热量被外部水循环吸收, 蒸发器吸收的热量由外部水循环提供, 所以只要控制好外部的水循环, 整个控制系统就能达到稳定。然后通过测量流过冷凝器和蒸发器水吸收和带走的热量就可以计算出压缩机的效率。
冷凝器放出热量同时蒸发器吸收热量, 所以靠近冷凝器部分的水温度会升高, 靠近蒸发器部分的水温度会降低, 图2为系统热量传递图。交换水系统能够迅速的让冷水和热水溶合, 最高效的完成热交换, 所以整个系统最关键的地方是交换水系统。测试点为冷凝器的水流量, 蒸发器的进出口温度和蒸发器的水流量, 相应的我们的控制点为蒸发器进出口温度和冷凝器进出口水温度。所以整个控制系统的关键点在于如何将蒸发器和冷凝器的进出口温度在最短的时间内稳定下来。
只要保证蒸发器部分水循环的热量和冷凝器部分水循环的热量平衡, 就可以达到测试的目的, 其中的关键如何设计交换水系统、冷却塔系统和辅助冷源系统。交换水系统是由横河温度调节器UT55A来调节变频器来完成对变频水泵的控制, 从而达到调温的目的。在控制算法中, 由于交换水控制系统关系到整个系统的平衡, 好的控制算法对系统的稳定有很大的帮助。
模糊PID控制器
普通PID控制器是通过对误差e (t) 进行比例、积分、微分运算后将结果作为控制器输出。在计算机控制中用数字PID表达式为:
模糊控制是以模糊集合论和模糊逻辑推理为基础在智能控制领域获得了广泛应用, 尤其是被控对象具有不确定性、非线性控制理论处理时更为有效, 模糊控制理论结合PID控制得出的一种新型控制方式-模糊PID控制, 原理框图如图3所示。
模糊PID控制器是一种在常规PID调节器的基础上, 应用模糊理论建立参数∆kp、∆ki、∆kd与偏差绝对值e (t) 和偏差变化绝对值∆e的函数关系, 根据e (t) 和∆kp不同对∆kp、∆ki、∆kd进行自适应调节的方法。
专家PID控制器
专家控制 (Expert Control) 的实质是研究受控对象和控制规律的各种知识, 以智能的方式利用这些所归纳知识 (专家经验) 来设计控制器, 即根据偏差及变化率建立了被控制量和偏差的一种映射关系[2,3], 专家PID控制系统的结构如图4所示。
图中e (k) 表示当前时刻采样的误差。设e (k-1) 、e (k-2) 为前面两时刻的误差值, 则有下式[4]:
设PID控制参数分别为kp、ki、u (k) , 控制器当前时刻输出为u (k) , u (k-1) 前一时刻输出, 则专家PID的设计规则为:
(1) 若 (M1为一较大值) , 表明此时绝对误差值非常大, 因此不管误差变化趋势如何, 控制器均满幅输出, 以迅速减小绝对误差。
(2) 若e (k) ∆e (k) >0, 表明此时绝对误差值在增大, 或暂时稳定不变, 应按下面的规则分别设计。
如果e (k) >M2 (M2相比M1较小) , 表明绝对误差值仍然较大, 可增大控制器整体的控制作用使绝对误差值迅速减小, 此时控制器的输出为:
如果e (k) <M2, 则表明绝对误差值虽然正在增大, 但当前误差绝对值并不太大, 可以设置控制器输出为:
(3) 若e (k) ∆e (k) <0且∆e (k) ∆e (k-1) >0或者e (k) =0则表明当前系统绝对误差值正减小或恰好处于平衡, 此时输出值不做修改。
(4) 若∆e (k) ∆e (k-1) <0且∆e (k) ∆e (k-1) <0, 表明误差处于拐点, 这时, 应视误差的大小选择控制作用。若误差比较大, 即e (k) >M2, 则应进行较强控制:
(5) 最后当误差很小, 即e (k) <ε时, 加入积分控制, 减小系统静差。
上述规则描述中, 有M1>M2>0, k1>1>k2>0, ε为一个较小的正数。专家PID实质上是用分段控制来达到改善整体控制效果。
模糊-专家PID控制系统的设计
图5为模糊-专家PID控制器控制方案框图, 由温度传感器测量的温度与设定值进行比较, 即可得到偏差e (t) 及偏差变化率∆e (k) , 根据开关设定值控制控制策略选择采用专家控制还是模糊PID控制。当e (t) 大于开关设定值时采用模糊PID控制, 当e (t) 小于开关设定值时采用专家控制, 在组态软件程序中可以用if-then语句实现。
模糊控制的设计
模糊控制方法可以进行粗调和细调, 为了实现这一功能, 将e (k) 和∆e (k) 的实际论域区间为[-40, 40], 40为温度的最大值, 转化为准确地论域:
得到变化后的e (k) 和∆e (k) 的变化范围减小, 再将它模糊化, 变为模糊变量E和ΔE, 两者均包括模糊集{B, M, S}, B代表大, M代表中, S代表小。建立控制系统相应的∆k p、∆ki、∆kp推理规则。
模糊推理和去模糊化后得到:
式中uj (E, ∆E) =uj (E) u j (∆E) 。
专家控制器的设计
当温度的测量值在设定值附近, 且达到误差精度要求时, 模态选择开关切换为专家控制状态, 此时维持控制器的输出不变, 使整个系统的温度调节控制在当前的最佳状态。当温度超过误差精度范围时再切换到模糊控制器控制状态。专家控制主要是实现对-3<∆e (k) <3时的误差控制。
试验台系统matlab仿真
结论
采用模糊专家PID控制器后系统达到稳定所需要的时间明显减小, 系统的控制能力明显增强。采用这种控制算法以后, 由于减少了振荡, 整个系统的调试时间大大缩短, 达到平衡后, 系统能够停留在稳定状态更长的时间。