Fuzz(1)

2023/02/15

前言

模糊测试技术综述 2021 计算机研究与发展

上面Paper的一点个人笔记。推荐大家学习的时候可以多看一些Paper,英文看不懂,中文的还是可以研究研究的。

重点:安全四大顶级会议,简称S&PCCSSecurityNDSS。感兴趣可以看看。

信息安全四大顶会 - 20189211 - 博客园 (cnblogs.com)

摘要

本文通过搜集分析四大顶会相关文章,总结出迷糊测试基本工作流程,包括:预处理、输入数据构造、输入选择、评估、结果分析这5个环节,针对每个环节中面临的任务以及挑战,结合相应的研究成果进行分析和总结,其中重点分析以American Fuzzy Lop工具及其改进成果为代表的,基于覆盖率引导的模糊测试方法。

模糊测试技术在不同领域中使用时,面对着巨大的差异性,通过对相应文献进行整理和分析,总结出特定领域中使用模糊测试的独特需求以及相应的解决方法,重点关注物联网领域,以及内核安全领域。

模糊测试

发展历程

截至目前的发展里程图,期间诞生了多个开创性的或影响的工作

image-20230216160407508

1998-2004大多为黑盒模糊测试,其中比较重要的有Protos以及Peach:

2007,动态符号执行与测试数据生成技术的进步,诞生了Sage模糊测试方法,此方法基于符号执行白盒模糊测试方法。

符号执行:阅读https://www.cnblogs.com/lqerio/p/15980670.html

白盒测试:能够对目标内部情况有足够的了解,可以获得高质量的输入数据,绕过目标的输入检查,获得较高的覆盖率和深层漏洞检测效果

2008,为对输入数据高度结构化的目标进行模糊检测,诞生了jsfunfuzz,此方法根据语法模型生成随机但语法正确的JS代码,这种基于语法生成输入的思想,成为之后对输入数据高度结构化目标进行模糊测试的重要指导思想。

上面的基于符号执行白盒模糊测试方法,受限于符号执行本身的问题,比如资源消耗过多,以及路径爆炸,导致模糊测试效率不高.白盒模糊测试因为需要充分了解目标内部信息,因此会消耗大量的资源,比如消耗时间去分析程序内部细节,而且对于复杂的程序,得到详细而全面的内部信息是不现实的.为了提高模糊测试效率,诞生了继续改进白盒模糊测试使用少量的目标内部信息进行模糊测试的2个方向。

2009,沿着改进白盒模糊测试的方向,出现Vganesh,使用污点分析代替符号执行,污点分析技术,可以将程序攻击点中使用到的变量值,同输入数据特定部分建立联系,进而指导模糊测试的变异策略.该思想也被灰盒模糊测试借鉴使用

2013,使用少量目标内部信息进行模糊测试的思想带来了灰盒模糊测试,该方向最重要的成果是在 2013年出现的AFL,一款覆盖率为导向的模糊测试工具,通过插桩的方法,采集输入数据对应的边覆盖率,作为模糊测试种子选取的衡量指标.AFL通过使用进化算法以及精心构造的突变策略。

模糊测试基本工作流程

image-20230216181153176

该流程可以划分为5步:预处理(preprocessing)、输入构造(input building)、输入选择(input selection)、评估(evaluation)、结果分析(post-fuzzing).其中第1和第5个环节属于模糊测试开始前的准备工作和模糊测试结束后的收尾工作,实际测试环节是第2~4个环节。

预处理环节的工作是:搜集目标相关信息并制定模糊测试的策略,为监控目标在测试中的运行状态做必要的准备.通常依赖于插桩、符号执行以及污点分析这类程序分析技术。

输入构造的工作是:首先获取一定数量的种子,随后确定种子的能量分配策略、种子的优先级以及种子的突变策略,最后依据这些信息获得大量的输入数据

得到大量输入数据后,可以考虑通过输入选择环节,对数据进行筛选.其主要工作是:尝试通过提 前过滤掉无效的输入数据,以节省模糊测试的时间.从工作的目的来看,该环节适合使用机器学习技术通过完成模式识别任务,在输入被执行前就提前判断数据的有效性

评估部分的主要工作是:设计合适的实验,依照评估指标对模糊测试进行评估.合适的评估指标,可以给模糊测试带去执行结果的真实反馈,这是制定模糊测试执行策略的重要依据.同时,设计合适的实验更能反映模糊测试方法的实际性能,增加可信度.一个合适的模糊测试实验通常需要考虑:选择合适的模糊测试方法用作对比、选择合适的对象作为模糊测试的目标、选择合适的重复测试次数以及测试使用的超时时间等.

模糊测试结束以后,由于获得的结果无法被直接使用,还需要在结果分析环节进行处理.该环节的工作是:对获得的测试结果进行去重、复现、分析以及威胁性评估等工作,最终确定是否发现了有价值的漏洞

预处理

预处理环节的目的是搜集目标相关信息,比如目标的输入数据格式、目标的内部结构,并为监控测试中目标的状态变化做必要的准备.该环节面临的挑战是:使用什么程序分析技术,以及模糊测试究竟需要对目标内部信息有多详细的了解。

分析技术

程序分析技术包括:插桩符号执行以及污点分析,当然这只是常见的3种

1.插桩

分为动态插桩和静态插桩2种,静态插桩通常在源码或者中间代码的编译过程中进行,常见的比如通过GCC编译器在汇编语言上插桩,LLVM在生成的中间语言LLVM IR(low level virtual machine intermediate representation)上插桩.优点是节省时间、速度快,缺点是依赖于程序源码,动态插桩则是在运行的过程中对运行过的代码进行插桩,比如利用QEMU等模拟技术,进行动态插桩,可以获得程序运行时的信息,缺点是资源的开销大.插桩技术已经被应用到模糊测试中,比如AFL中就有静态插桩和动态插桩的2种模式,使得AFL可以在源码以及二进制代码上进行模糊测试.

QEMU技术:Qemu是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备

插桩技术的缺点是会带来资源的开销。

2.符号执行

符号执行将程序行为的推理归结为逻辑领域的推理,通过构建一个表示程序执行的逻辑公式,可以同时推断一个程序在不同输入上的行为.该方法可以使模糊测试获得较好的覆盖率,并可以深入到程序深处,探寻可能存在漏洞的区域。

也分为动静态两种,静态符号执行通常会因为程序中循环和递归的存在,陷入到路径爆炸中,还会因为路径约束中包含诸如取Hash值等操作,导致约束求解失败.由于存在这2种问题,使用较多的是动态符号执行,动态符号执行通过对程序进行实际执行与符号化执行,维护程序的实际状态和符号化状态,通过将难以求解的约束替换为实际值,缓解了静态符号执行的问题,并按照深度优先的搜索策略对目标程序进行了探索。

动态符号执行也有自己的问题.①由于程序分支的存在,路径爆炸的问题仍然存在,解决的一种办法是通过启发式的方法,选择比较重要的路径进行探索.②虽然动态符号执行使用实际值替换的方法,解决了一部分静态符号执行无法绕过的约束,但是也会丢失一些路径,造成探索结果的不完整.③所有的符号执行技术都受限于约束求解方法的能力,比如如何处理类似取余操作这样的非线性约束,仍然是符号执行面临的挑战。

为了能够将符号执行更好地应用到模糊测试中,近年来诞生了一些工作,比如Pangolin通过允许符号执行重用之前的计算结果,Intriguer通过利用字段级的信息,都实现了对符号执行过程的加速.ILF通过使用神经网络,对由符号执行专家生成的大量高质量输入数据进行学习,得到了合适的模糊测试策略。

3.污点分析

该技术会观测程序中,哪些程序数据受到了预先准备好的污染源(比如输入)的污染,目的是跟踪污染源和汇聚点(比如有敏感信息的程序数据)之间的信息流。

分为静态污点分析动态污点分析2种.静态污点分析不需要程序实际运行,通过对程序静态分析,获得程序控制流图、抽象语法树等信息,依据数据流以及依赖关系进行污点分析;动态污点分析则是在程序实际执行的过程中,利用程序的动态执行信息进行污点分析.两者相比较而言,动态污点分析检测的可信度更高,但是检测结果是否全面,取决于动态污点分析对程序的覆盖情况,而且动态污点分析会消耗更多的资源;静态污点分析又会和符号执行一样,可能会陷入到路径爆炸中,而简化后的静态污点分析又存在着严重的过度污染问题

GREYONE尝试通过减少污点分析跟踪的对象、降低污点分析的开销、提升模糊测试的检测效率

预处理阶段的类型划分

根据模糊测试对程序内部信息分析的程度,现代的模糊测试方法可以划分为3类:黑盒模糊测试(black-box fuzzing)、灰盒模糊测试(grey-box fuzzing)和白盒模糊测试(white-box fuzzing),3种类型的模糊测试,没有优劣之分,只是有着各自的特点

1.黑盒

黑盒测试也被称为输入输出驱动(IO-driven)的测试,或者是数据驱动(data-driven)的测试.黑盒模糊测试不能对目标内部状态以及结构进行分析,只能获得如目标的输入数据格式等内部无关信息.此外在测试过程中,黑盒模糊测试无法跟踪目标内部的执行状态,只能通过检测目标的输出数据,对目标的状态进行判断.

黑盒模糊测试的问题是,由于不了解检测目标的内部信息,会生成大量无效输入,导致测试的覆盖 率相对偏低,检测深层漏洞的能力有限。因此比较适用于输入数据高度结构化的目标以及复杂且难以分析的目标。黑盒模糊测试从最早的PROTOS,Peach,发展到如今的EDLTA,IFuzzer,IMF,Iot Fuzzer,在网络、文件、内核以及物联网模糊测试上都有着重要的应用

2.白盒

获得充足的目标内部信息,通常采用符号执行的方法.好处是可以生成高质量输入数据,在覆盖率以及程序的深层漏洞检测上有更好的表现,但实际应用中,容易陷入路径爆炸,且会消耗大量资源,影响效率。

近年来有一些研究尝试加速符号执行的速度,或者尽量将模糊测试和符号执行分离成2个过程.为了加快符号执行,Pangolin提出允许符号执行重用之前的计算结果,Intriguer则通过利用字段级的信息,对符号执行在模糊测试中的使用作出了优化。

了尽量避免因使用符号执行而影响模糊测试的效率,提出在模仿学习的框架之下,通过对学习任务的描述,从符号执行中学习一种高效、快速的模糊测试方法以及策略.在T-Fuzz中通过设计算法,识别出程序中阻碍模糊测试继续进行的非关键校验和关键校验.通过二进制重写,覆盖掉非关键校验,最大限度地解除程序校验对模糊测试的限制,这是对程序而不是输入进行变异.符号执行在T-Fuzz中只作为最后的验证方法以过滤误报

3.灰盒

灰盒模糊测试是白盒模糊测试的一种变体,它只能获得部分程序内部信息,用于模糊测试.其蕴含的思想是:对程序内部进行细致而全面的分析,并是获得良好测试结果的必要条件,仅依靠有限的与测试目标相关的信息,再配合良好的测试策略,仍然可以获得令人满意的测试结果

灰盒模糊测试中,最重要的研究成果是AFL模糊测试工具.它通过在编译时插桩,搜集模糊测中边缘覆盖率信息,并使用了进化算法,将边覆盖率作为算法的适应函数(fitness function),使得模糊测试可以沿着覆盖率增大的方向进行,极大地改善了模糊测试的效果

总的来说,黑盒模糊测试工具是轻量级的测试工具,设计简单,测试速度快,但是检测效果并不理想,适用于难以对内部进行检测的对象,以及对于开发和检测时间有较高限制的情况下.白盒模糊测试工具是重量级的测试工具,更加智能,检测效果更好,对于深层的漏洞有更好的检测效果,但是无论是设计实现还是执行测试更加复杂与耗时,适用于可以分析内部信息的检测对象,以及对于深层漏洞有较高检测需求的任务.灰盒模糊测试并没有明确的定位,当对于目标内部信息分析较多的时候,灰盒模糊测试就更加偏向于白盒,反之则会偏向于黑盒.相比于白、黑盒模糊测试,灰盒模糊测试总体上来看更有优势,通过灵活的设计,灰盒模糊测试可以在检测能力与资源消耗之间寻找一个合适的平衡点,获得最佳的检测效果

4.AFL及其改进工作

诞生了大量的改进工作,具体见论文。

实际测试环节

此部分由输入构造、输入选择、以及评估3部分构成.

输入构造

输入构造环节的目的是构造出可以被检测目标执行,用于模糊测试的输入数据.具体的挑战是如何在尽量满足语法语义检查的情况下,短时间内生成大量的输入,用以对目标做全面而深入分析

目前获得输入数据的普遍方法是:首先得到一个数据S,然后数据S按照一定的策略进行一定次数的变异,获得大量新数据I,最后将I输入到被测试对象中进行测试.其中数据S被称为种子(seed),I是测试实际使用的输入数据.这样做的好处是可以通过精心构造种子来保证输入的有效性,然后通过对种子进行合理的变异,获得大量的高质量输入数据.为了获得足够多的高质量输入数据,需要经过种子获取、种子筛选、种子突变3个阶段.种子获取阶段将介绍种子的来源,种子筛选阶段会介绍种子的能量分配以及优先级分配策略,种子突变则会介绍相应的突变策略

输入选择

输入选择的主要目的是在输入被实际执行前,尽量将其中的无效数据滤除掉,以节省执行时间.虽然通过良好的策略,可以尽量保证输入数据的质量,但是无效数据仍然是多数,造成模糊测试运行缓慢效果不佳.输入选择环节主要的挑战是如何在输入数据执行之前就识别出数据是否有效,这是一个模式识别的问题,使用机器学习技术是一个不错的选择。

介绍灰盒模糊测试中的输入选择工具FuzzGuard

评估

评估的主要目的是选取一个合适的评估指标,用于评估模糊测试执行结果,从而帮助模糊测试制 定合理的策略并反映模糊测试检测漏洞的真实能力,

现阶段的研究都会聚焦于模糊测试器在2个指标上的表现:覆盖率暴露漏洞平均时间

结果分析

结果分析发生在模糊测试结束以后,主要目的是对于模糊测试的输出信息进行分析和处理.面临的挑战是对于得到的输出状态,安全人员通常要手动去重,然后进行复现并分析根本原因,最后根据威胁程度,判断是否是有意义的漏洞.该过程高度依赖于相关领域知识以及必要的漏洞分析和复现能力

具体应用场景下的模糊测试

物联网中的模糊测试

FIRM-AFL认为通过利用物联网固件中的软件漏洞,实现针对物联网设备的攻击是物联网设备面临严重威胁的主要来源。

其中存在的困难有特定物联网设备上运行的程序通常对于其实际硬件的配置有着高度的依赖性.简单的从固件中提取一个用户级别的程序,然后使用模糊测试进行检测,通常是行不通的。IoT-Fuzzer认为大多数物联网设备通过其官方移动应用程序进行控制,并且此类应用程序通常包含有与设备进行通信所使用协议的丰富信息,因此通过识别和重用特定于程序的逻辑(比如加密)来改变测试用例(尤其是消息字段),就能够有效地对物联网目标进行模糊测试,而无需依赖于有关其协议规范的任何知识

检测速度是模糊测试的重要指标,而大部分的物联网设备远远无法满足模糊测试需要的吞吐率,为了提高吞吐率AVATAR通过提供更好的硬件组件支持来构建一个混合执行环境,使嵌入式固件的动态程序分析成为可能.为了进一步提高吞吐率,Firmadyne为系统模式QEMU增加了物联网固件的硬件支持,并通过修改内核和驱动程序来处理由于缺乏实际硬件而导致的物联网异常,从而完全仿真系统.它同时支持ARM和MIPS这2种架构。

内核安全中的模糊测试

内核是构成计算机操作系统的核心程序,可以完全控制操作系统中的一切事物.内核中存在的漏洞,对整个操作系统有着致命的威胁。

内核模糊测试通常利用暴露出来的系统调用接口和外围接口,从用户空间进入到内核组件中进行 模糊测试,以检测内核中可能存在的漏洞。

面临一系列挑战,首先由于Windows内核程序以及很多相关组件的源代码并不开源,将导致传统的反馈机制不再适用.其次内核中的代码由于存在中断、多线程操作等机制,使得模糊测试变的很复杂.最后内核模糊测试一旦检测到程序的崩溃,将会导致整个操作系统重新启动,极大地影响了模糊测试的效率。

其他领域

除了上述两个,在安卓系统安全,算法复杂度等方面也有着广泛的应用

模糊测试的挑战与机遇

模糊测试在漏洞检测上起着重要的作用,但这一技术同样可以被攻击者利用,为恶意攻击者提供便利,因此针对模糊测试的对抗技术反模糊测试出现了,无论是反模糊测试自身的研究,还是其带给模糊测试技术的挑战,都是研究的重要方向.除此之外,模糊测试的种类复杂繁多,每一个应用领域都有着自身独特的需求,能否将各种各样的模糊测试工具集成起来,形成一个通用的平台,是模糊测试实用化的一个重要挑战和方向.近几年来,机器学习的相关技术飞速发展,已经在图像识别,自然语言处理等领域大放异彩,模糊测试与其相结合可以说是趋势所在,但是找到两者合适的结合点,最大限度发挥两者的优势仍然是一个需要研究的方向

反模糊测试

目前主流的模糊测试技术通常依赖于4个前提:1)单次执行速度要足够快;2)模糊工具可以获得覆盖率的反馈;3)目标程序中的路径约束可以被符号求解;4)崩溃可以被模糊工具所检测到

基于这些依赖条件,为了实现反模糊测试,要在不对正常执行造成过大的影响的条件下,减缓模糊测试的执行速度,或者通过干扰覆盖率图,使得模糊工具无法从覆盖率图中获取有效信息,也可以干混合执行,使得正常能够被符号执行或污点分析求解的内容变得无法求解

模糊工具的集成

研究人员针对不同的领域提出不同的模糊测试方法,产生了种类多的模糊测试工具.研发出一种适用于所有场景的模糊工具并不现实,如何将不同模糊测试工具进行整合,构造一个通用模糊测试平台,是模糊测试实用化的一个重要研究方向。

机器学习在模糊测试的应用

机器学习技术在图像识别以及自然语言处理领域有着广泛的应用,将其使用到模糊测试领域是一个非常值得探索的领域,但是仍然有很多挑战需要应对.首先要面对的就是数据源问题,模糊测试虽然可以生成大量的输入数据,但是大多是即时生成的,无法在不同的测试目标之间通用,这就对于构建通用数据集,方便模型训练,造成了很大的阻碍,也导致了无法生成一个提前训练好的,可被多种模糊测试使用的预训练模型,只能使用模糊测试实时生成的数据训练模型.其次就是数据不平衡问题,模糊测试生成的数据中,能够真正实现测试目的的数据,在数量上相对偏少,正负样本的极度不平衡,使用步进式训练的方法只能缓解该问题,但无法从根本上解决.最后,执行速度对于模糊测试来说非常重要,而复杂机器学习模型的训练往往会耗费大量时间,并且已有的不使用机器学习技术的模糊测试工具在性能上尚能满足人们的需求,模糊测试对于机器学习技术的需要并不迫切