[论文笔记]A systematic review of fuzzing based on machine learning techniques

A systematic review of fuzzing based on machine learning techniques

Wang, Yan, Peng Jia, Luping Liu, Cheng Huang和Zhonglin Liu. 《A Systematic Review of Fuzzing Based on Machine Learning Techniques》. 编辑 Tao Song. PLOS ONE 15, 期 8 (2020年8月18日): e0237749. https://doi.org/10.1371/journal.pone.0237749.

Abstract

本文回顾了近年来将机器学习技术用于模糊测试的研究进展,分析了机器学习如何改善模糊测试的过程和结果,并为模糊测试的未来工作提供了启示。首先,本文讨论了将机器学习技术用于模糊场景的原因,并确定了使用机器学习的六个不同阶段。然后,本文从机器学习算法的选择预处理方法数据集评估指标超参数设置等方面,系统地研究了基于机器学习的模糊模型。接下来,本文根据常用的评估指标评估机器学习模型的性能。评估结果证明,机器学习技术具有对模糊预测的分类能力。最后,分析了传统模糊工具和基于机器学习的模糊工具之间发现漏洞的能力的比较。结果表明,机器学习技术的引入可以提高模糊测试的性能。但是,仍然存在一些局限性,例如训练样本不平衡并且难以提取与漏洞相关的特征。

Intro

文章分析和总结了以下问题:

  • RQ1: 为什么可以将机器学习技术用于模糊测试
  • RQ2: 模糊测试中的哪些步骤使用了机器学习技术
  • RQ3: 哪些机器学习算法已用于模糊测试
  • RQ4: 哪些技术用于基于机器学习的模糊测试的数据预处理
  • RQ5: 哪些数据集用于测试和评估
  • RQ6: 哪些衡量指标用于结果评估
  • RQ7: 如何设置机器学习模型的超参
  • RQ8: 机器学习模型的性能如何
  • RQ9: 基于机器学习的模糊测试发现漏洞的能力如何

Traditional Fuzzing Techniques

image-20201224163124916

传统模糊测试的挑战:

  1. 如何对种子进行变异
  2. 如何提高代码覆盖率
  3. 如何绕过验证

局限性和缺陷

  • 静态分析从二进制代码或源代码中提取相关信息,以在不运行程序的情况下指导模糊测试。但是,静态分析在过程中缺少上下文信息,并且高度依赖先验知识,从而导致准确性低和误报率高。
  • 动态分析需要在实际系统或仿真器中执行目标程序,它监视程序状态并在执行时获取相关的运行时知识。它包括动态符号执行和动态污点分析

Introduction of Machine Learning Technology

机器学习通过从现有示例数据或经验中学习来获取新知识或新技能,并自动优化计算机系统本身的性能。机器学习任务可以分为传统机器学习,深度学习和强化学习。根据输入数据是否被标记以及标记数据的数量,传统的机器学习分为有监督学习,无监督学习和半监督学习。

image-20201225093501217

机器学习技术在模糊测试中的应用也引起了安全研究人员的关注,其本质是将漏洞检测视为程序或样本分类的问题

Applying Machine Learning Techniques for Different Fuzzing Steps

根据使用机器学习解决的问题,模糊测试的步骤可以分为:

  • Seed file generation
  • Testcase generation
  • Testcase filter
  • Mutation operator selection
  • Fitness function
  • Exploitability analysis

image-20201225094638570

Seed file generation

可以通过使用机器学习技术来学习种子文件的通用功能特征,这些特征导致更高的代码覆盖率,更多的崩溃和更多的传统模糊测试中独特的执行路径,并最终通过基于生成或基于变异的方式生成更多种子文件。

Skyfire(Wang等人2017提出的数据驱动种子生成方法使用PCFG(概率上下文相关语法,其中包含语义规则和语法特征)自动提取语义信息。这些语义信息和语法规则用于种子生成。使用此方法可以确保生成的种子文件通过语法分析和语义检查。最终,Skyfire可以执行到目标程序的更深层路径,从而更有效地发现深层漏洞。

Fast fuzzing(Nichols et al.2017使用深度神经网络,以增强随机突变测试的有效性。该方法从AFL生成的样本中学习特征,并生成种子文件,这些种子文件通过生成对抗网络(GAN)的对抗训练来增加执行路径。

SmartSeed(Lv et al.2018读取输入文件并将其转换为二进制形式的矩阵类型,然后使用WGAN和MLP从收集的数据集中自动学习触发唯一崩溃或唯一路径的特征。训练后的模型可以生成更容易导致崩溃的种子文件和唯一路径。

Cheng et al.2019使用RNN和seq2seq来找到PDF文件与目标程序执行路径之间的相关性。然后,使用这种相关性生成新的种子文件,这些文件更可能在目标程序中触发新路径。

NeuFuzz(Wang等人,2019通过LSTM学习了样本中已知的漏洞程序和潜在的漏洞模式,以发现可能包含该漏洞的执行路径。然后,NeuFuzz优先执行可以覆盖包含漏洞的路径的种子文件,并根据预测结果为这些种子文件分配更多的变异能量。

Testcase generation

构建代码覆盖率高或面向漏洞的测试用例可以有效地提高模糊器中漏洞检测的效率。

Samplefuzz(Godefroid et al.2017是使用基于神经网络的统计学习技术从样本输入自动生成输入语法的首次尝试。提出并评估了基于seq2seq递归神经网络的PDF对象自动学习生成模型。该模型不仅可以生成大量新的有用对象,而且可以提高覆盖率。

Fan和Chang,2017年提出了一种为专有网络协议自动生成黑盒模糊测试用例的方法。该方法使用seq2seq通过处理其流量来学习专有网络协议的生成输入模型,并使用该学习模型来生成新消息。

GANFuzz(Hu et al.2018通过在生成对抗网络中训练生成的模型来估计工业网络协议消息的基础分发功能,从而学习协议语法。可以基于此生成模型生成格式正确的测试用例。

DeepSmith(Cummins et al.2018将随机程序的生成作为语言建模问题。它使用LSTM模型学习代码语料库上编程语言的语法,语义以及常规结构和模式。 DeepSmith基于编译器测试的生成方式生成具有格式化语法的测试用例

Sablotny等(Sablotny et al.2018构建了堆叠式RNN的模型以生成HTML标签和新的测试用例来测试浏览器的渲染引擎,主要思想是从大量HTML标签中学习字符序列的概率分布来生成HTML标签。

IUST DeepFuzz(Nasrabadi et al.2018通过使用基于深度递归神经网络(RNN)的神经语言模型(NLM)学习复杂的输入文件的结构。 IUST DeepFuzz首先删除输入文件的非文本部分,然后将其替换为token。在训练结束后,将token替换为删除部分的变体,以生成新的测试用例。

NEUZZ(She et al.2019进一步提出了一种梯度引导搜索策略,该策略可计算并使用平滑逼近梯度(即NN模型)来识别目标突变位置,从而可以最大化目标程序中检测到的错误数量。它还演示了如何通过在错误预测的程序行为上逐步重新训练模型来改进NN模型。

Paduraru等(Paduraru and Melemciuc 2018用不同的文件格式对语料库进行聚类。通过将输入文件的语料库视为一系列字符,可以通过seq2seq学习每个cluster的生成模型。此方法可以生成新的测试样本,该样本可以根据训练后的模型执行更多的分支。

Li等(Li et al.2019b提出了一种基于WGAN的工控协议模糊测试数据生成方法。该方法可以了解实际数据帧的结构和分布,并在不了解详细协议规范的情况下生成相似的数据帧。

DeepFuzz(Liu et al.2019b通过seq2seq模型从原始GCC测试套件中学习了正确的C程序语法。该模型根据学习的语法连续生成语法正确的C程序。然后,使用插入,替换和删除策略来生成测试用例,从而对编译器进行模糊测试。

V-Fuzz(Li et al.2019a构建了一个图嵌入网络来训练漏洞预测模型。根据训练后的模型,指导模糊器生成倾向于到达潜在漏洞区域的样本。提取漏洞功能和安全功能的属性控制流程图,以在功能级别上进行学习。评估的可能性用作在预测阶段指导测试样本偏爱的度量。

Testcase filter

在模糊测试期间,PUT需要执行大量样本,并且执行质量不均匀的所有样本既耗时又效率低下。测试用例过滤器的目的是从大量样本中选择更有可能触发新路径或漏洞的测试输入。可以对输入样本进行分析和分类,以确定应使用机器学习技术进一步执行哪些样本以发现安全漏洞。

Gong et al.2017 根据AFL生成的样本训练了深度学习模型,该样本导致程序状态发生变化以及程序状态保持不变。新一轮AFL生成的样本是否可以改变程序状态可以通过训练后的模型进行预测。因此,AFL无法执行无法生成新状态的样本,从而可以提高模糊器的效率。

Augmented-AFL(Rajpal et al.2017实现了几种神经网络架构,以学习预测给定一组输入修改的预期代码覆盖率的能力。在模糊测试中,学习的功能用于预测完整输入文件的热图,对应于每个文件位置发生突变的概率,从而导致新的代码覆盖。然后将覆盖图用于确定突变位置的优先级。

Mutation operator selection

模糊测试中的变异算子的概念源自生物遗传算法。模糊测试中的变异运算符包括添加,修改和删除之类的操作。不同位置的不同突变会产生不同的影响。变异算子的选择策略是实现提高模糊效率的目标,例如增加代码覆盖率或包含敏感路径。

贝克尔等。 (Becker et al。2010指定了一个有限状态机,并分解了不同的消息类型以分析邻居发现协议。工作的主要思想是使用基于跟踪,调试和监视网络的三种不同奖励功能的强化学习模型进行模糊测试,以选择最佳的模糊测试策略。

LEFT(Fang and Yan 2018构建了一个基于强化学习的模型,以对Android手机中的LTE功能进行模糊测试。该模型主要包括三种模糊测试方法:仿真仪器黑盒模糊测试,威胁模型感知模糊测试和RL引导模糊测试。

FuzzerGym(Drozd and Wagner 2018使用LLVM Santizers高效的程序监视器来获取状态信息。该信息用于强化学习(RL)优化变异器选择。通过将OpenAI Gym与libFuzzer集成在一起,强化学习和模糊测试的优势相结合,以实现跨多个benchmark的更深入的覆盖,并直接从输入数据中实现对变异选择策略的学习。

Fitness function

在遗传算法中,适应度函数是目标函数的一种特殊类型,用于总结一个单一的品质因数,如何封闭给定的设计解决方案以实现既定目标(Wikipedia 2019a)。适应度函数是指用于评估基于遗传算法的最新模糊测试中测试用例的满意和不满意标准的评估方法。常见的适应性功能包括代码覆盖范围,潜在漏洞位置。

肖等。 Sun等人(2018提出了一种基于遗传编程的新适应度函数,该函数不同于当前基于主流代码覆盖率的方法。它结合了马尔可夫链和PCFG模型,以从程序员开发的一组正常脚本中学习通用性,并使用所学习的信息通过测量脚本与通用脚本的偏差来计算脚本不通用性。偏差较大的脚本更有可能触发解释器中的错误。此偏差用于计算基于GP语言模糊测试脚本的适用性

Exploitability analysis

漏洞可利用性是指攻击者攻击和利用漏洞的可能性。它是漏洞的固有属性。在模糊测试中,有很多崩溃和错误消息,但只有其中一些是漏洞。如何从这些崩溃中查找真正的漏洞是一个挑战。常用的漏洞分析方法是静态分析和动态分析。采用诸如!exploitable(Team MSECMSS 2013),CERT工具之类的工具技术。

ExploitMeter(Yan等人,2017使用贝叶斯机器学习算法对从软件中提取的静态特征进行初步判断。模糊过程中的初始判断和可利用性判断相结合,以更新最终可利用性结果。

Exniffer(Tripathi et al.2018建议使用机器学习来自动确定更常见的崩溃可利用性预测规则。该方法使用支持向量机(SVM)来学习从核心转储文件中提取的功能(崩溃时生成),以及来自最新处理器硬件调试扩展的信息。

詹等。 (Zhang and Thing 2019生成了指纹,用于基于n-gram分析和特征哈希对每个崩溃输入进行动态执行跟踪。指纹然后被发送到在线分类器以建立分类模型。在线分类器启用的增量学习使模型即使在发生大量崩溃时也能很好地扩展,同时易于为新的崩溃更新。

Analysis of Machine Learning Based Fuzzing Model

在选择用于模糊测试的机器学习算法的当前工作中,对各种算法的性能进行系统比较的工作较少。本节系统地总结了模糊测试中使用的机器学习模型的知识。它总结了以下五个方面:

  • Selection of machine learning algorithm
  • Pre-processing methods
  • Datasets
  • Evaluation metrics
  • Hyperparameters setting

Selection of machine learning algorithm

模糊测试利用机器学习的分类能力来训练隐藏的漏洞检测模型。训练数据来自大量已知的样本集和程序执行反馈信息,可以有效提高漏洞检测的效率。但是,将不同的机器学习算法应用于不同的场景。即使在相同的场景中,选择不同的算法也会导致结果显着不同。fuzzer的输入数据可以是十六进制文本,源代码,二进制字符串,网络数据包和其他形式。 PUT还包含复杂的语法,语义和逻辑结构。判断哪种机器学习算法对模糊测试的复杂环境有效是一个难题。

image-20201228154838890

Pre-processing method

由于PUT的类型不同,因此输入格式也大不相同,例如文本,图片,视频,网络数据包和程序代码。该数据需要转换为可用于机器学习的输入。表4总结了模糊测试常用的数据预处理方法。

image-20201228154925959

在模糊测试中,预处理方法分为三类:程序分析,自然语言处理和其他。

程序分析是指通过使用静态或动态分析的技术来提取程序功能或运行时信息,例如堆栈,寄存器,汇编指令,跳转,程序控制流程图,抽象语法树和程序执行路径

自然语言处理是指使用复杂的文本处理技术直接提取输入为文本的方法,以提取输入数据中的隐藏特征,例如n-gram(Damashek 1995),计数统计,Word2vec(Goldberg和Levy 2014),热图(Wilkinson and Friendly 2009)和其他方法(Fan和Chang 2017; Yan等人2017; Karamcheti等人2018b)。

其他包括将程序分析与自然语言处理技术相结合(Wang等人2019; Zhang and Thing 2019)或将整个文档或pdf对象转换为向量(Rajpal等人2017; Lv等人2018)以及自定义方法。根据文献(Gong et al.2017)的定义,测试用例的二进制序列由32位表示,模糊技术由4位表示,突变位由10位表示,突变值由32位,用1位表示是否新的测试用例。最后,每条数据都可以组合成一个79位的二进制序列,前78位作为输入,最后1位作为标签

Datasets

机器学习的性能主要受训练数据的影响。特别是,深度学习在数据量不足时很容易导致过度拟合。在当前工作中,用于基于机器学习算法的模糊测试的数据集来自以下来源:

  • Web-crawler
  • Fuzzing generation
  • Self-build
  • Public dataset

所使用的公共数据集及其对应的分类如下:

**Learning from “Big Code” datasets(Github 2017)😗*作为一个开源项目,上述内容包含与代码相关联的大量公共数据,例如Python AST(此数据集包含100’000 + 50’000 python文件作为已解析的抽象语法树以及JavaScript ASTs(该数据集包含150,000个JavaScript文件。该数据可作为JavaScript和已解析的抽象语法树使用)。

The NIST SARD project datasets (NIST 2006): 其中包含超过100,000种不同编程语言的测试用例,涵盖了数十种不同类别的弱点,例如常见弱点枚举(CWE)中的弱点。这些测试用例包含软件生命周期所有阶段的文件,例如设计,源代码和二进制文件,其中还包含针对漏洞的补丁程序。

GCC test suite datasets (GCC 2019): GNU编译器集合包括C,C ++,Objective-C,Fortran,Java,Ada和Go语言的前端,以及这些语言的库(例如libstdc ++,libgcj。)。

DARPA Cyber Grand Challenge datasets (DARPA CGC 2016 DARPA网络挑战二进制文件是DARPA发布的200个二进制程序的集合,这些程序具有广泛的功能。这些程序是创建自动修改,验证和修复错误的工具所面临的公开挑战的一部分。所有这些二进制文件的共同点是,每个二进制文件都包含一个或多个由人类在编程时生成的错误,这些错误由开发人员记录。

LAVA-M datasets (Dolan-Gavitt et al. 2016由GNU Coreutils套件中的四个程序组成:uniq,base64,md5sum和who,它们分别被标注具有唯一ID的28、44、57和2265错误,并带有一些未标记的错误。这些错误位于程序的深处,仅当程序输入缓冲区中的偏移与4字节的“ magic”(随机)值匹配时才触发。近年来,该数据集已成为基准测试复杂白盒模糊器,符号执行工具和一些灰盒模糊器的常用方法。

VDiscovery datasets (Grieco et al. 2016): 该数据集由漏洞发现工具VDiscovery发布,总共包含402个唯一样本。这些样本包括针对1,039个Debian程序的138,308个系统调用序列。

Evaluation metrics

基于机器学习技术的模糊测试方法的性能评估可以分为两个方面:机器学习模型的性能评估和漏洞检测能力的评估。

机器学习模型的评估基于分类指标。表5总结了用于评估模糊测试中的机器学习模型的度量标准和详细信息,还计算了使用这些度量标准的次数。

基于机器学习的模糊测试方法对漏洞检测能力的评估与传统的模糊测试方法相同。表6总结了用于评估基于机器学习技术的模糊测试方法的漏洞检测性能的指标和详细信息。

image-20201230151516478

image-20201230151418900

Hyperparameters setting

在机器学习模型的实现中,超参数的值不是通过训练获得的,而是需要在训练之前进行人工设置的。通常,有必要优化超参数并选择最佳的超参数集以提高学习的性能和有效性。表7分析和比较了文献著作,并总结了为机器学习中一些关键超参数选择的值。

image-20201230151617727

Performance Evaluation of Fuzzing Model Based on Machine Learning

Performance evaluation of vulnerability detection capability

在模糊测试中,存在诸如如何变异和生成输入种子文件,如何提高覆盖率以及如何有效地通过验证的挑战。本文研究了机器学习技术的应用能否有效缓解瓶颈问题。本章总结了基于机器学习的模糊测试工具的实验结果,并从覆盖率,独特的代码路径,独特的崩溃或错误,通过率和效率等方面对它们进行了评估。

Coverage

覆盖率是模糊测试中用于评估漏洞检测性能的最常用指标。表8总结了本文提到的所有基于机器学习的模糊模型的实验结果。总体而言,机器学习技术在模糊测试中的应用提高了代码覆盖率。

image-20201230154959494

Unique code path
Unique crash or bug

表9总结了不同文献中的崩溃和错误实验的结果。引入机器学习的模糊测试工具比实际程序中的传统模糊测试工具发现更多的崩溃和错误,并且整体上公开了多个CVE。但是,还有一些工具(例如神经模糊测试)在实验过程中找不到任何崩溃

image-20201230155110434

Pass rate

通过率表示可以通过程序语法检查的生成样本的百分比。与CFG在XML上的34%的通过率相比,Skyfire(Wang等人,2017)拥有85%的XSL和63%的XML,这些XML可以通过语义检测并由于考虑到上下文而达到应用程序执行状态。 SampleFuzz(Godefroid等人,2017)的通过率在70%至97%之间,显示出良好的学习质量。 DeepFuzz的通过率(Liu et al.2019b)随着迭代次数的增加而增加。所有采样方法的最佳合格率都是通过30次训练实现的。最高通过率为82.63%,经过80%的训练后稳定。通过深度学习和基于语法语义信息的自动学习生成的样本文件具有较高的样本通过率。但是要发现安全漏洞,需要执行一个格式已损坏的文件,因此有必要权衡样本有效性的比例。

image-20201230155208783

Efficiency

测试效率是评估模糊运行时的时间开销,包括两个方面:执行时间和生成时间。执行时间是指在模糊测试过程中执行测试样本的时间开销,例如发现给定数量的崩溃和挂起的时间,每秒执行的测试样本数以及执行相同的测试样本所花费的时间。 。生成时间是指生成种子文件或测试样本所需的时间。表11总结了基于机器学习的模糊模型的测试效率的实验结果。在执行时间方面,使用机器学习可以提前选择高质量的样本,并减少无用样本的执行。

image-20201230155256236

Conclusion and Future Directions

(1) Datasets

在这项研究中,我们发现在当前的模糊测试领域中没有公开的数据集可以用作基准。由网络爬虫,模糊生成,自构建构建的数据集不是通用的,而且鲜为人知。一些公共数据集已用于包含更少的类别,更少的功能,并且用于训练的数据是不平衡的。数据集的质量将严重影响漏洞检测模型的性能。因此,我们认为将机器学习引入模糊测试中必须建立开放的数据集,以用作测试基准。

(2) Feature selection

机器学习通过学习数据集的特征来构建分类模型。选择不同的特征将导致模型的分类准确性和精度不同。程序的结构和执行信息与漏洞发现领域中的漏洞没有直接关系,因此如何从程序或样本中选择实用功能成为影响模糊测试性能的重要因素。目前,自然语言处理技术已经比较成熟,因此可以考虑使用自然语言处理领域的先进技术来提取有用的信息,如代码属性,程序的语义和语法特征等。

(3) Selection of learning algorithms

不同的机器学习技术适用于不同的场景,并且不同的网络配置可能导致不同的结果。首先,应将模糊测试的不同阶段的特点,相应数据的大小,不同算法的优缺点作为算法选择的基础。其次,可以尝试将图卷积网络,融合神经网络和可解释的深度学习模型与模糊集成在一起,并且有必要研究更复杂,更合适的神经网络模型以提高生成样本的质量

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值