解决方案需求
数字化转型正在成为社会发展的新常态,智能AI技术、大数据和5G网络新技术将推动社会各行各业迈入数字新基建的新时代,构建一套完美的解决方案方能扬帆领航。
了解更多了解更多

模糊测试介绍

作者:容域科技 发布时间:2023-02-06
1.简介
模糊测试(Fuzz Testing)的理论和应用目前都已成熟,已有各种Fuzz安全测试的框架、工具和书籍问世。在信息安全领域,很多安全测试都引入了Fuzz Testing思想进行安全漏洞挖掘。
模糊测试是一种介于完全的手工渗透测试与完全的自动化测试之间的安全性黑盒测试类型。它充分利用了机器的能力:随机生成和发送数据,同时尝试将安全专家在安全性方面的经验引入。从执行过程的角度来说,模糊测试的执行过程非常简单,大致可以分为如下5个阶段。
 
2.测试步骤
 (1)确定输入向量
几乎所有可以被攻击者利用的安全漏洞都是因为应用程序没有对用户输入进行安全的边界校验,或者对非法输入有过滤但并不完全造成的。能否实施有效的模糊测试,关键在于能否准确地找到输入向量。我们将确定输入向量的原则定义为:一切向测试目标程序输入的数据都应该被认为是危险的,所有输入向量都可能是存在潜在安全风险的模糊测试变量。
 
(2)生成模糊测试数据
识别所有的输入向量之后,就可以依据输入向量产生模糊测试数据。产生模糊测试数据的方式主要有两种:一种是通过预先确定的值,使用基于已存在的数据通过算法将其变异,生成新的测试数据;另一种是通过分析被测试应用程序及其使用的数据格式,动态生成测试数据。无论选择哪一种方式,都应该使模糊测试数据的生成自动化,否则将大大降低测试效率。 
 
(3)执行模糊测试
在完成前面两个步骤以后,就可以执行模糊测试了。在这一步中,需要依据测试目标的不同选择不同的测试方法,一般会向被测试目标发送数据包、利用被测试程序打开包含测试数据的文件等。与生成模糊测试数据一样,执行模糊测试同样需要实现自动化。
 
 (4)监视异常
在进行模糊测试的过程中,一个非常重要的步骤就是对测试过程中的异常和错误进行监控。模糊测试的目的不仅是希望确定被测试程序是否有安全漏洞,更重要的是确定程序为何会产生异常,以及产生异常后对漏洞进行重现,从而使安全专家可以针对漏洞编写测试代码,以确定漏洞的存在,同时,厂商可以对漏洞进行及时的修补。
 
 (5)根据被测系统的状态判断是否存在潜在的安全漏洞
如果在模糊测试中发现了一个程序错误,依据我们的审计目的,需要判断这个程序错误是一个可利用的安全漏洞还是程序Bug。
 
3.举例和方法
显然,模糊测试的整个执行过程是需要依靠工具进行的自动化测试——如此大规模的数据和分析完全依靠手工是不现实的。那么,为什么模糊测试需要和安全专家的经验结合起来呢?我们用一个例子演示一下。
 
为了简单起见,假定我们要测试的应用是一个C/S应用的服务端程序。这个程序运行在Linux平台上,叫做WPServer。我们唯一知道的信息就是客户端和WPServer之间使用基于TCP/IP的自定义协议进行通信。在这种情况下,我们该如何尝试找到应用系统中可能存在的漏洞呢?有如下两种方法:
(1)方法1
第一种方法是:如果我们手头上有WPServer的源码,通过代码审计显然可以找到可能的漏洞。如果没有源码,我们依然可以通过逆向工程的方式用代码审计找到漏洞。当然,这必然要求审查者具有足够好的技能,而且,被测应用规模越大,需要付出的成本越高。
(2)方法2
第二种方法是:尝试抓取客户端和服务器之间的通信数据,根据这些数据分析客户端与服务器之间的通信协议,然后根据协议的定义手工构造协议数据,对WPServer发起攻击,尝试找到可能的漏洞。
在以上两种方法中,第二种方法在成本上显然要比第一种低,而且由于第二种方法关注的是协议层面的攻击,所以效率会更高。但是,仔细思考一下,第二种方法还是存在一些问题:完整的协议分析难度大,很难遍历所有的输入路径;人工编造、变异协议数据的成本很高。
在第二种方法的基础上,我们尝试引入模糊测试的概念。由于机器生成和发送数据的能力足够强,因此我们完全可以把生成数据的任务交给机器去完成。当然,协议的分析主要还是依赖人工完成。虽然模糊测试领域内有一些自动化的协议分析手段,但从效率和效果上来说,在面对复杂协议的时候,人工分析的方式更为有效、稳妥。

4. 模糊测试技术
模糊测试技术的基本流程分为:预处理(preprocessing)、输入数据构造(input building)、输入选择(input selection)、评估(evalution)、结果分析(post-fuzzing)。
1)预处理
工作:搜集目标相关信息并制定模糊测试的策略, 为监控目标在测试中的运行状态做必要的准备。通常依赖于插桩、符号执行以及污点分析这类程序分析技术
搜集目标相关信息,比如目标的输入数据格式、目标的内部结构,并为监控测试中目标的状态变化做必要的准备。该环节面临的挑战是:使用什么程序分析技术,以及模糊测试究竟需要对目标内部信息有多详细的了解
根据模糊测试对程序内部信息分析的程度,现代的模糊测试方法可以划分为3类:黑盒模糊测试 (Black boxfuzzing)、灰盒模糊测试(Grey boxfuzzing) 和白盒模糊测试(White boxfuzzing)。
1. 插桩:
插桩技术通过向目标的代码中合适的位置添加预设好的代码,获得程序的静态或动态执行信息。比如程序的抽象语法树,覆盖率以及函数内变量取值等。插桩技术的缺点是会带来资源的开销。插桩分两种:
动态插桩
动态插桩则是在运行的过程中对运行过的代码进行插桩。比如利用QEMU等模拟技术,进行动态插桩,可以获得程序运行时的信息,缺点是资源的开销大。
静态插桩
通过GCC编译器在汇编语言上插桩,LLVM在生成的中间语言LLVMIR(low level virtual machine intermediate representation)上插桩。优点是节省时间、速度快,缺点是依赖于程序源码。
2. 符号执行
将程序行为的推理归结为逻辑领域的推理,通过构建一个表示程序执行的逻辑公式,可以同时推断一个程序在不同输入上的行为。该方法可以使模糊测试获得较好的覆盖率,并可以深入到程序深处,探寻可能存在漏洞的区域。符号执行也有两种:
静态符号执行:
静态符号执行通常会因为程序中循环和递归的存在,陷入到路径爆炸中,还会因为路径约束中包含诸如取Hash值等操作,导致约束求解失败。由于存在这2种问题,使用较多的是动态符号执行。
动态符号执行:
动态符号执行通过对程序进行实际执行与符号化执行,维护程序的实际状态和符号化状态,通过将难以求解的约束替换为实际值,缓解了静态符号执行的问题,并按照深度优先的搜索策略对目标程序进行了探索。
存在的问题:
①由于程序分支的存在,路径爆炸的问题仍然存在,程序越复杂, 路径爆炸的问题就越严重。解决的一种办法是通过启发式的方法,选择比较重要的路径进行探索。
②虽然动态符号执行使用实际值替换的方法,解决了一部分静态符号执行无法绕过的约束,但是也会丢失一些路径,造成探索结果的不完整。
③所有的符号执行技术都受限于约束求解方法的能力,比如如何处理类似取余操作这样的非线性约束,仍然是符号执行面临的挑战
为了能够将符号执行更好地应用到模糊测试中,近年来诞生了一些工作:比如Pangolin 通过允许符号执行重用之前的计算结果;Intriguer通过利用字段级的信息,都实现了对符号执行过程的加速。ILF通过使用神经网络,对由符号执行专家生成的大量高质量输入数据进行学习,得到了合适的模糊测试策略。
3. 污点分析
该技术会观测程序中,哪些程序数据受到了预先准备好的污染源(比如输入)的污染,目的是跟踪污染源和汇聚点(比如有敏感信息的程序数据)之间的信息流。
静态污点分析
静态污点分析不需要程序实际运行,通过对程序静态分析,获得程序控制流图、抽象语法树等信息, 依据数据流以及依赖关系进行污点分析;
动态污点分析
动态污点分析则是在程序实际执行的过程中,利用程序的动态执行信息进行污点分析
动态污点分析检测的可信度更高,但是检测结果是否全面, 取决于动态污点分析对程序的覆盖情况,而且动态污点分析会消耗更多的资源; 静态污点分析又会和符号执行一样,可能会陷入到路径爆炸中,而简化后的静态污点分析又存在着严重的过度污染问题。
将污点分析技术应用到模糊测试中,并降低其资源消耗是近年来的重要研究方向。比如GREYONE尝试通过减少污点分析跟踪的对象、降低污点分析的开销、提升模糊测试的检测效率。
2)输入构造
种子获取、种子筛选、种子突变。
具体的挑战是如何在尽量满足语法语义检查的情况下,短时间内生成 大量的输入,用以对目标做全面而深入分析。
首先得到一个数据 S SS ,然后数据 S SS 按照一定的策略进行一定次数的变异,获得大量新数据 I、II , 最后将I 、II输入到被测试对象中进行测试。其中数据 S SS 被称为种子(seed), I 和II 是测试实际使用的输入数据
3)评估
现阶段的研究都会聚焦于模糊测试器在2个指标上的表现:覆盖率和暴露漏洞平均时间
覆盖率是软件测试中的一个衡量指标,指的是在测试过程中,对象被覆盖到的数目占总数的比例。 通常而言,高覆盖率更可能发现更多的隐藏漏洞,众多研究因此集中在覆盖率提升上
AFL 使用上下文无关的边覆盖率作为评估指标。
Angora 使用上下文敏感的分支覆盖率。
VUzzer 使用了块覆盖率替代边覆盖率作为覆盖率评估的对象。
暴露漏洞平均时间:
暴露漏洞平均时间被Böhme AFLGo选做评估指标在 与 基 准 模 糊 工 具 AFL 的对比实验中,AFLGo 复现单个漏洞的时间远比AFL少,这证明了该评估指标的有效性。此后Hawakeye同样使用了这一指标来证明其性能。Parmesan 在通过sanitizer来发现潜在漏洞的研究工作中,也是用暴露漏洞平均时间作为评估指 标同Angora等定向灰盒模糊工具进行比较。
4)结果分析
结果分析发生在模糊测试结束以后,主要目的是对于模糊测试的输出信息进行分析和处理。物联网中的模糊测试主要面临两个问题:
将模糊测试应用到物联网领域问题就是特定物联网设备上运行的程序通常对于其实际硬件的配置有着高度的依赖性。简单的从固件中提取一个用户级别的程序,然后使用模糊测试进行检测,通常是行不通的。
Iot-Fuzzer认为大多数物联网设备通过其官方移动应用程序进行控制,并且此类应用程序通常包含有与设备进行通信所使用协议的丰富信息,因此通过识别和重用特定于程序的逻辑(比如加密)来改变测试用例(尤其是消息字段),就能够有效地对物联网目标进行模糊测试,而无需依赖于有关其协议规范的任何知识。
物联网设备远远无法满足模糊测试需要的吞吐率
多项研究成果表明物联网设备采用全仿真的系统,可以获得最高的吞吐量,这是因为真实的物联网设备相比于桌面工作站或者服务器要慢得多
内核模糊测试通常利用暴露出来的系统调用接口和外围接口,从用户空间进入到内核组件中进行模糊测试,以检测内核中可能存在的漏洞
主要面临的问题:
Windows内核程序以及很多相关组件的源代码并 不开源,将导致传统的反馈机制不再适用。
内核中的代码由于存在中断、多线程操作等机制,使得模糊测试变的很复杂。
内核模糊测试一旦检测到程序的崩溃,将会导致整个操作系统重新启动,极大地影响了模糊测试的效率。
为了克服这些问题,产生了一些专门针对内核安全进行模糊测试的研究:
比如syzkaller是由Google开发的一种以获得高覆盖率为导向的内核 模糊测试工具,目前实际使用比较多,并经常被用于对比实验中。
Razzer是基于syzkaller通过使用LLVM和修改后的SVF技术针对内核中存在的数据争用问题进行的模糊测试
TriforceAFLAFL的QEMU模式,在系统模拟器的帮助下,通过跟踪分支信息,对Linux的内核进行模糊测试。
kAFL通过利用Intel提供的进程追踪技术,获取代码运行时的控制流信息,并通过使用Intel的硬件 虚拟特征(VTGx)提升效率并使得kAFL独立于特定的操作系统。
传统的模糊测试应用到内核模糊测试上将面临着众多的问题,包括内核态代码的复杂执行环境,以及内核崩溃的处理问题。另外内核安全面临的威胁来源是不确定的,可以是外部固件,也可以是第三方开发的驱动程序,还可以是内核程序自身设计的问题。模糊测试在内 核安全领域的应用还有待进一步的研究。静态分析或模糊检测技术通常对内存溢出等漏洞有效,而无法挖掘协议实现库的逻辑漏洞。

5.总结
简单地说,模糊测试尝试降低安全性测试的门槛,通过半随机方式的数据发送找出被测系统的漏洞。显然,测试者对被测应用越了解,测试者的技能越娴熟,模糊测试数据的生成就越准确。但与代码审计相比,模糊测试显然更容易进行。而且通过自动化工具,模糊测试可以把安全方面的经验积累到工具中,为组织持续的安全性测试提供帮助。
 

全部方案

数字新基建
等保云灾备