2022软件工程领域顶会fuzz技术研究相关论文汇总|技术进展
2023-4-11 20:49:56 Author: mp.weixin.qq.com(查看原文) 阅读量:7 收藏

近年来,软件工程领域顶会也涌现了许多fuzz方面的优秀论文,其论文的创新性、质量与技术覆盖面不次于安全领域顶会。我们将2022年软件工程领域顶会中与fuzz技术相关的论文统计出来以供大家查阅,此次汇总涉及ICSE,ASE,FSE,ISSTA,OOPSLA五项会议。我们还将此次分享的论文在研究方向上进行了分类,放于文末,以供大家参考。

Semantic Image Fuzzing of AI Perception Systems

自治系统通过感知系统对传感器从物理世界获取的原始数据进行解读。针对感知系统进行测试旨在发现有可能导致系统失效的错误。当下的测试方法还不够充分。人工对实际输入数据解释和注释的成本很高,因而手动测试套件规模较小。模拟与现实之间的差距降低了基于模拟世界进行测试所获得的结果的有效性。而合成测试输入的方法并没有提供相应的预期解释。为了解决这些问题,论文设计了一种新的针对感知系统的模糊测试方法——semSensFuzz,这种方法通过将真实世界的传感器读数与真实的解释配对后生成测试用例,再对其进行基于语义的变异实现。论文实现了此方法,并用它来评估它的可行性和潜力,以改进感知系统的软件测试。论文利用它生成了150,000张语义变异图片作为5个当前流行的感知系统的测试输入。论文发现这种方法结合了包含新的和主观上真实的图像作为输入的测试,并且其发现了可以揭露那些指定解释和计算解释上存在明显不一致性的输入。论文同样发现:相较于对真实世界图像进行人工的语义注释的方法,这种方法耗费更低的成本生成测试用例。

Free Lunch for Testing: Fuzzing Deep-Learning Libraries from Open Source

深度学习(Deep-Learning,DL)系统让论文的生活愈加便捷,也在学术界和工业界引起了广泛关注。但与此同时,DL系统内的漏洞可能是毁灭性的,并且在关键应用场合可能会威胁到人类的生命。迄今为止,大量的研究工作都致力于测试DL模型。DL底层库是构建、优化和运行DL模型的基础,然而出乎意料的是,针对DL底层库的测试工作却非常有限。一个潜在原因是底层DL库的测试样例生成是很困难的。这些底层库的公共APIs主要都是通过python完成,而由于其动态类型的原因,使得自动确定API输入的参数类型变得更加困难。本文中,论文提出了FreeFuzz,首个对开源代码进行挖掘从而对DL库进行模糊测试的方法。具体来说,FreeFuzz的代码/模型有三个不同的来源:(1)来自代码片段的库文档,(2)库开发者测试,(3)自然环境下的DL 模型。FreeFuzz自动运行收集到的代码/模型,使用工具对每个覆盖到的API的动态信息进行跟踪,包括在调用过程中每个参数的类型和值,以及输入输出的张量的大小。最后,FreeFuzz利用追踪的动态信息对每个覆盖到的API进行模糊测试。针对PyTorch和TensorFlow(两个当下最流行的DL库)利用FreeFuzz进行广泛研究,结果显示FreeFuzz能自动追踪1158个流行的API的动态信息用来模糊测试,相较于最先进的LEMON多9倍,开销比LEMON低3.5倍。迄今为止,FreeFuzz为PyTorch和TensorFlow检测出了49个bugs(其中有38个被开发者确认为属于未知漏洞)。

WINDRANGER: A Directed Greybox Fuzzer driven Basic Blocks

有向灰盒模糊测试(Directed Grey-box Fuzzing, DGF)是一种用来引导模糊器向着程序中预定义的目标站点进行测试的安全测试技术。为了更好的实现方向性,DGF会优先考虑执行路径更靠近目标站点的种子。因此,评估一个种子执行路径与目标站点的距离(又称,seed distance)对于DGF而言是非常重要的。首个有方向灰盒模糊测试器,AFLGo,在静态分析过程中使用了一种计算基于基本块级距离的方法,同时通过累计执行的基本块的距离来计算seed distance。在AFLGo之后,大多数现有的最先进的DGF技术都使用执行路径上的所有基本块信息,并只使用控制流信息进行seed distance计算。然而,并不是每个基本块都同样重要,在某些基本块中(又称偏离基本块),执行路径开始偏离目标程序。

在本文中,论文提出了一种叫做WINDRANGER的技术,这种技术可以利用偏离基本块来促进DGF。WINDANGER应用静态可达性分析和动态过滤来识别偏离基本块。为了进行定向模糊测试,WINDRANGER使用偏离基本块及其相关的数据流信息进行种子距离计算、突变、种子优先排序以及探索-开发调度。论文在由29个程序组成的3个数据集上对WindRanger进行了评估。实验结果表明,WindRanger的到达目标站点的速度分别比AFLGo、AFL和FairFuzz快21%、34%和37%,检测目标崩溃的速度分别快44%、66%和77%。此外,论文通过提供手动识别的可疑位置作为目标站点,发现了WindRanger在ffmpeg(一个被OSS-fuzz进行大量模糊测试的流行多媒体库)中分配了CVE ID的0day漏洞。

MOREST: Model-based RESTful API Testing with Execution Feedback

RESTful API可以说是当前接入Web服务最流行的端口。黑盒测试是确保RESTful API可靠性的新兴技术之一。测试RESTful API的主要挑战是需要生成对API操作调用进行深入测试的正确序列。为了构建有意义的操作调用序列,研究人员提出了基于OpenAPI规范,学习和利用API依赖的技术。然而,这些技术要么缺乏对于APIs是如何进行连接的全面认知,要么缺乏对于已学习知识进行调整的灵活性。

本文提出了一种基于模型的RESTful API测试技术Morest,该技术构建并维护一个动态更新的RESTful服务属性图(RESTful-service Property Graph, RPG),以对RESTful服务的行为进行建模并指导调用序列的生成。论文对Morest进行了实验评估,结果表明,与最先进的技术相比,MOREST成功请求的API操作平均增加了152.66%-232.45%,代码行覆盖增加了26.16%-103.24%,检测的bugs增加40.64%-215.94%。总的来说,论文将MOREST应用于6个真实项目,并且发现了44个bugs(其中的13个无法被现有的方式检测出来)。特别地,其中2个确认的漏洞来自Bitbucket,这是一个著名的代码管理服务,拥有超过600万用户。

Controlled Concurrency Testing via Periodical Scheduling

并发控制测试(Controlled Concurrency Testing, CCT)技术对于并发bug检测方面表现出了良好的前景。他们的关键想法是控制线程执行的顺序,探索并发程序可能的交错空间,以检测bug。然而,现有的CCT技术中存在各种挑战,使他们变得无效。在本文中,论文提出了一种新的CCT技术PERIOD。与以往的工作不同,PERIOD将并发程序的执行建模为周期性执行,并系统地探索可能的交错空间,其中的探索受周期性调度的指导,并受之前测试的交错的影响。论文在10个真实世界的CVEs和36个广泛使用的基准程序上对PERIOD进行了评估,实验结果现实PERIOD在有效性和运行时消耗方面相较于其他的CCT技术而言都表现更佳。此外,论文在真实世界程序上发现了5个未知的并发bug。

Combinatorial Testing of RESTful APIs

本文介绍了一种采用组合测试(Combinatorial Tetsting,CT)对RESTful API进行测试的系统的、全自动的测试方法——RestCT。RestCT是系统性的,因为它不仅覆盖和测试RESTful API中一定数量操作的内部操作,而且还覆盖和测试每个操作中特定输入参数的交互。这是通过一种新的两阶段测试用例生成方法实现的,该方法首先生成一个约束序列覆盖数组,以确定可用操作的执行顺序,然后应用自适应策略生成和细化多个约束覆盖数组,以具体化每个操作的输入参数。RESTCT也是自动的,因为其应用只依赖于给定的对于RESTful APIs的Swagger规范。CT测试模型的创建(特别是针对操作和输入参数的依赖关系的推断)以及测试用例的生成和执行都是在没有任何人工干预的情况下完成的。在11个真实世界中的RESTful APIs上的测试结果展示了RESTCT的效果和效率。特别的,RESTCT发现了8个新的bug,其中只有一个bug能被当前最流行RESTful APIs测试工具所触发。

Automated Testing of Software that Uses Machine Learning APIs

越来越多的软件应用程序将机器学习(Machine Learning,ML)解决方案纳入认知任务,统计模拟人类行为。为了测试这样的软件,需要大量的人力来设计与软件相关的图像/文本/音频输入,并判断软件是否像大多数人一样处理这些输入。即使暴露了不当行为,通常也不清楚问题是在认知ML API中还是在使用该API的代码中。

本文介绍了Keeper,一个新的利用认知ML APIs对软件进行测试的工具。Keeper为每个ML API设计一个伪逆函数,以经验的方式反转对应的认知任务(例如,图像搜索引擎伪反转图像分类API),并将这些伪逆函数合并到符号执行引擎中,自动生成相关的图像/文本/音频输入并判断输出正确性。一旦不当行为被曝光,Keeper会尝试改变软件中ML API的使用方式,以减少不当行为的产生。论文基于一系列开源应用的评估测试结果显示Keeper很大程度上改进了分支覆盖率,同时识别出了许多未知的bug。

μAFL: Non-intrusive Feedback-driven Fuzzing for Microcontroller Firmware

Fuzzing是发现软件缺陷最有效的方法之一。然而,将其应用于细微的控制元件会带来许多挑战。例如,基于重新托管的程序无法实现对外围设备的建模,因此不能用于模糊测试相应的驱动程序代码。在这项工作中,论文提出了μAFL——一种模糊测试细微控制元件的方法。它利用现有嵌入式系统开发中的调试工具,构建了一个兼容AFL的模糊测试框架。

具体地说,论文使用调试软件的dongle将PC机上的模糊环境与单片机设备上的目标固件连接起来。为了在不使用昂贵的代码工具的情况下收集代码覆盖率信息,μAFL依赖于ARM ETM硬件的调试功能,该功能完全透明地收集跟踪指令并将结果传递到PC上。然而对原始ETM数据的模糊测试,需要大量的计算资源来恢复实际的指令流。因此,论文提出了一种代码覆盖率的替代表示,它保留了与原始AFL算法相同的路径灵敏度,但可以直接处理原始ETM数据,而无需将它们与分解的指令进行匹配。为了进一步减少工作负担,论文使用DWT硬件的特性有选择地收集感兴趣的运行信息。论文在两家主流供应商(NXP和STMicroelectronics)的两个现实测试平台上对μAFL进行了评估。通过论文的模型,在SDK附带的驱动代码中发现了10个zero-day错误,在NXP SDK中发现了3个zero-day错误。

BeDivFuzz: Integrating Behavioral Diversity into Generator-based Fuzzing

评估模糊器性能的一个主流指标是分支覆盖率。然而,论文认为仅仅关注覆盖许多不同的分支(即丰富度)是不够的,因为大多数覆盖的分支可能只执行过一次,这不能有效地表现对提高代码覆盖率的帮助。相反,还应该考虑分支执行的分布情况(即分支执行的均匀性)。也就是说,只有当生成的输入不仅触发了许多不同的分支,而且用不同的输入可以均匀地触发它们时,才会认为该模糊器具有行为多样性。论文提出了BeDivFuzz,一种基于生成结果的反馈来驱动模糊测试的技术。BeDivFuzz通过输入的语法正确与否区分改变结构和保持结构的突变,并根据所接收的程序反馈结果将突变策略偏向于有效性和行为多样性。论文已经在Ant、Maven、Rhino、Closure、Nashorn和Tomcat上评估了BeDivFuzz。结果表明,通过建立生物多样性指标,即生态学领域的希尔数,BeDivFuzz实现了比目前技术水平更好的行为多样性。

CONFETTI: Amplifying Concolic Guidance for Fuzzers

模糊测试(fuzzing)允许开发人员通过自动生成能揭示缺陷的输入来检测代码中的漏洞。大多数模糊器通过为应用程序生成输入并对这些输入的字节进行变异,然后检测分支覆盖情况来指导模糊过程。白盒模糊测试(例如,污点跟踪或 concolic 执行)有时与覆盖指导的模糊测试集成在一起,以帮助提高覆盖率,尤其是其中受复杂约束条件控制,难以触及的那些边。这种集成通常采用有针对性的输入突变的形式,例如,将特定字节值放置在某些输入的特定集合中以覆盖分支。然而,这些动态分析技术在实践中并不完美,这会导致输入字节和分支的谓词之间的重要关系丢失,从而降低了该技术的有效性。论文引入了一种新的、极为简单但有效的技术:全局提示。它允许模糊器可以不仅仅是在目标位置插入这些有趣的字节,还可以在任何输入的任何位置插入。论文在 Java 中实现了这个想法,创建了 Confetti,它使用目标和全局提示进行模糊测试。在与两种基准方法(最先进的灰盒 Java fuzzer 和没有全局提示的 Confetti 版本)进行实证比较时,论文发现 Confetti 覆盖了更多分支并发现了 15 个以前未报告的错误,其中包9 个基准方法都无法找到。通过对 Confetti 的执行进行事后分析,论文确定全局提示在揭示新覆盖方面至少与传统的有针对性的提示一样有效。

Demystifying the Dependency Challenge in Kernel Fuzzing

到目前为止,模糊测试操作系统内核仍然是一项艰巨的任务。这其中的一个重大挑战是,许多内核代码被锁定在特定的内核状态下,当前的内核模糊器无法有效地探索如此大的状态空间。论文将此问题称为依赖性挑战。虽然有一些研究试图解决依赖性挑战,但从来没有研究过依赖关系的流行程度和分类。大多数以前的工作只是尝试在依赖关系相对容易识别的时候被动地找机会去恢复依赖关系。在本文中,论文进行了一个度量研究,以系统地了解依赖关系背后的真正挑战。让论文惊讶的是,论文发现即使对于经过充分模糊测试的内核模块,未解决的依赖项仍然占未覆盖分支的59% - 88%。

此外,论文还表明,依赖性挑战只是一个症状,而不是未能实现更大覆盖率的根本原因。通过提炼和总结论文的发现,论文相信该研究为未来内核模糊测试的研究提供了有价值的指导。最后,论文直接基于研究所得的见解,提出了一些新的研究方向。

Evaluating and Improving Neural Program-Smoothing-based Fuzzing

如今,模糊测试通常被建模为优化问题,例如,通过典型的基于搜索的解决方案(如进化算法)在给定的时间内最大化代码覆盖率。然而,这种解决方案被广泛认为会导致计算资源使用效率低下,即低效突变。为了解决这个问题,最近提出了两个基于神经网络平滑的模糊器,Neuzz 和 MTFuzz,通过神经网络模型来近似程序的分支行为:输入种子的字节序列和输出向量来表示程序分支行为。此外,考虑到突变具有较大梯度的字节可以更好地探索分支行为,开发了突变这些字节的策略,以生成新的种子作为测试用例。同时,尽管该方法在相关论文中已被证明是有效的,但它们仅在有限的数据集上进行了评估。尚不清楚它们的关键技术组件如何以起作用以及其他因素是否会影响模糊测试的性能。为了进一步研究基于神经网络程序平滑的模糊测试,论文首先构建了一个包含 28 个流行开源项目的大规模基准测试套件。然后,论文在这些基准上广泛评估 Neuzz 和 MTFuzz。评估结果表明它们的边缘覆盖性能可能不稳定。此外,无论是神经网络模型还是突变策略都不能始终如一地有效,它们的梯度引导机制的能力已经受到损害。受这些发现的启发,论文提出了一种简单的技术 PreFuzz,它通过资源利用高效的边缘选择机制改进了基于神经网络程序平滑的模糊器,以增强其梯度引导和概率字节选择机制,以进一步提高突变的有效性。论文的评估结果表明,PreFuzz 可以显着增加 Neuzz/MTFuzz 的边缘覆盖率,并揭示了多种实用指南,以推进基于神经网络程序平滑的模糊测试的未来研究。

Fuzzing Class Specifications

通过可执行的约束条件来表示类别对于各种软件工程任务(如测试生成、bug查找和自动调试)是很重要的,但是开发人员很少编写它们。从代码推断约束的技术可以填补这一空白,但它们仅支持特定类型的断言,很难适应支持不同编译语言的断言。

为了解决上述问题,本文提出了SpecFuzzer,这是一种结合了基于语法的模糊处理、动态不变检测和突变分析的新技术,可以自动生成类别规范。SpecFuzzer使用:(i)一个fuzzer作为候选断言的生成器,这些候选断言来源于从类别定义中自动获得的语法规则;(ii)动态不变检测器- daikon -用于过滤测试套件的无效的断言;(iii)基于突变的机制对断言进行聚类和排序,以便对相似的约束进行分组,然后对较强的约束进行优先级排序。基于语法的模糊使SpecFuzzer能够直接适应支持不同的规范语言。

本文在评估最新技术GAssert和EvoSpex中使用的43种Java方法的基准上评估了所提出的技术。结果表明,SpecFuzzer可以轻松地支持更有表达能力的断言语言,根据标准性能指标,在推断规范方面,SpecFuzzer比GAssert和EvoSpex更有效。

GraphFuzz: Library API Fuzzing with Lifetime-aware Dataflow Graphs

论文提出了GraphFuzz的设计与实现,它是一种新的结构感知、覆盖感知和对象生命周期感知的模糊器,能够自动测试低级库的API。不同于其他模糊器,GraphFuzz将执行的函数序列作为数据流图,从而使它能够在数据和执行轨迹级别上执行基于图的突变。GraphFuzz附带了一个自动化的规范生成器,以减少开发人员的集成工作。

论文使用GraphFuzz来分析了Skia——严格测试的谷歌Chrome图形库——并且使用GraphFuzz生成的harnesses与手动优化、精心编写的LibFuzzer的harnesses对比。论文发现,GraphFuzz生成的测试用例以最少的平均开发工作量实现了2-3倍以上的代码覆盖,并且还发现了该过程中以前的未知缺陷。论文通过分析另外四个开源库和发现几十个以前未知的缺陷,论文演示了GraphFuzz在低级api上的适用性。所有与安全相关的发现都已经被开发人员报告和修复了。

Linear-time Temporal Logic guided Greybox Fuzzing

软件模型检查和运行时验证是一种广泛用于软件系统时态属性检查的验证技术。尽管它们是属性验证技术,但它们在实践中常用来“发现bug”,即发现违反时态属性的行为。基于这一观察结果和利用模糊测试的最新进展,论文构建了一个灰盒模糊测试框架来发现违反线性时间时态逻辑(LTL)属性的情况。

论文的框架以一个用C/C++编写的顺序程序和一个LTL属性作为输入。它在有状态的软件系统中发现对LTL属性的违反或反例跟踪;然而,它并没有实现验证。论文的工作实质上扩展了定向灰盒模糊测试,以监视任意复杂的事件排序。论文注意到,现有的定向灰盒模糊测试方法仅限于监视到达一个位置或监视简单的事件排序,如使用后释放。同时,与模型检查器相比,论文的方法找到反例的速度更快,从而在给定的时间预算内找到更多的反例。

论文的LTL-Fuzzer工具,建立在AFL模糊器之上,实验证明在著名的协议(如OpenSSL和Telnet)中可以有效地检测错误。论文使用LTL-Fuzzer来重现已知的漏洞(CVEs),通过检查从rfc(已经分配了12个CVEs)中提取的属性来找到15个0 day bug,并用来在现实世界的协议实现中发现违反安全性和活性属性的行为。论文的工作代表了对软件模型检查器的实际改进——同时代表了对现有灰盒模糊器的概念改进。论文的工作为理解软件模型检查、运行时验证和灰盒模糊测试之间的未探索的协同效应提供了起点。

Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

深度学习(DL)技术在许多具有挑战性的任务中被证明是有效的,并在实践中被广泛采用。然而,以前的工作已经表明,作为构建和执行DL模型的基础的DL库包含bug,并可能导致严重的后果。不幸的是,现有的测试方法仍然不能全面地检测DL库。它们利用现有的训练过的模型,并且只在模型推理阶段检测bug。在这项工作中,论文提出了Muffin来解决这些问题。为此,Muffin采用了一种专门设计的模型模糊测试方法,允许它生成不同的DL模型来探索目标库,而不是只依赖于现有的训练模型。Muffin通过定制一组度量标准来度量不同DL库之间的不一致性,使差异测试在模型训练阶段成为可行的。通过这种方式,Muffin可以最好地使用库代码来检测更多的bug。为了评估Muffin的有效性,论文在三个广泛使用的DL库上进行了实验。结果表明,Muffin可以在流行的DL库的最新发布版本中检测到39个新的错误,包括Tensorflow、CNTK和Theano。

On the Reliability of Coverage-Based Fuzzer Benchmarking

给定一个程序,没有一个模糊器能发现任何bug,论文如何知道哪个模糊器更好?在实践中,论文经常将代码覆盖作为模糊覆盖有效性的代替度量,并认为获得更大覆盖的模糊器更好。

事实上,在24个程序上对10个模糊器进行23小时的评估,论文发现一个覆盖更多代码的模糊器也会发现更多的bug。在所获得的覆盖率和由模糊器发现的bug数量之间有很强的相关性。因此,用获得的覆盖范围来比较模糊器似乎是合理的,并由此得出关于模糊器在寻找bug方面的优势的经验。

然而奇怪的是,如果论文比较多个模糊器的覆盖范围而不是发现的错误的数量,论文发现在哪个模糊器更优异这个问题上没有很强的一致性。最擅长实现覆盖范围的模糊器,可能不是最擅长发现bug的。

One Fuzzing Strategy to Rule Them All

覆盖引导下的模糊测试已经成为模糊测试自动发现程序漏洞的主流。最近,一组名为Havoc的模糊器被提出,它采用一种随机搜索机制,显式或隐式地来增加他们的边缘探索。然而,他们只倾向于采用默认的Havoc设置作为一个实现选项,而没有人尝试探索其在不同设置下的能力或检查其潜在改进的基本原理。在本文中,为了解决这些问题,论文进行了第一次关于Havoc的实证研究,以加强对其特征的理解。具体来说,论文首先发现,将默认的Havoc设置应用于模糊器可以显著提高它们的边缘覆盖性能。有趣的是,论文进一步观察到,即使是简单地执行Havoc本身而不将其附加到任何模糊器上,也会带来强大的边缘覆盖性能,并优于论文研究的大多数模糊器。此外,论文还延长了Havoc的执行时间,并发现大多数模糊器不仅可以显著地提高边覆盖率,而且还倾向于相近的性能(即他们的性能差距在很大程度上得到了弥补)。受到研究发现的启发,论文进一步提出了HavocMAB,它将Havoc突变策略建模为一个多臂赌博机问题,需要通过动态调整突变策略来解决。评估结果表明,对于所有与Havoc相比的基准项目,HavocMAB可以显著提高11.1%的平均边覆盖率,甚至略优于最先进的QSYM,后者通过采用三个并行线程增加了其计算资源。论文更进一步的使用三个并行线程执行HavocMAB,结果在所有基准项目上,平均边覆盖率比QSYM高出9%。

Path Transitions Tell More: Optimizing Fuzzing Schedules via Runtime Program States

覆盖引导的灰盒模糊测试(CGF)是最成功和最广泛使用的发现bug技术之一。优化CGF采用了两种主要方法: (i)通过推断输入字节和路径约束之间的关系来减少输入的搜索空间;(ii)制定模糊测试过程(例如,路径转换),并建立概率分布来优化能量调度,即每个种子生成的输入数量。然而,前者对推理结果是主观的,其中可能包括路径约束的额外字节,从而限制了路径约束解析、代码覆盖发现和bug发现的效率;后者的形式化只集中于种子的能量调度,而不注意种子中字节的调度。

在本文中,论文提出了一种轻量级的模糊器方法,Truzz,以优化现有的覆盖引导灰盒模糊器(CGFs)。为了解决上述两个挑战,Truzz识别了与验证检查相关的字节(即保护错误处理代码的检查),并保护这些字节不被频繁突变,使大多数生成的输入检查程序的功能,而不是被验证检查拒绝。当模糊器推断字节约束关系时,字节级关系的确定缓解了加载额外字节的问题。此外,在Truzz中提出的路径转换可以有效地将种子优先排序为新路径,收获许多新边,并且新路径很可能属于具有许多未发现的代码线的代码区域。为了评估论文的方法,论文在Truzz中实现了6个最先进的模糊器,AFL,AFLFast,NEUZZ,MOPT,FuzzFactory和GreyOne。实验结果表明,Truzz平均能比普通的模糊器多生成16.14%的输入流入函数代码,此外多生成24.75%的新边。最后,论文的方法在8个目标程序中找到了13个错误,其中6个还没有被普通的模糊器识别出来。

R2Z2: Detecting Rendering Regressions in Web Browsers through Differential Fuzz Testing

渲染回归是由web浏览器引入的一个bug,其中网页不再像用户所期望的那样运行。这种呈现错误严重损害了web浏览器和web应用程序的可用性。渲染bug的独特之处在于,它们会影响网页所呈现的视觉外观,但这些网页没有预定义的正确外观。因此,自动检测其外观中的错误具有挑战性。在实践中,web浏览器供应商依赖于非常简单且时间紧迫的手动分析来检测和处理渲染回归。

本文提出了一种自动寻找渲染回归的工具R2Z2。R2Z2使用了差异模糊测试方法,该方法重复的比较两个不同版本的浏览器在提供相同HTML作为输入下的渲染结果。如果渲染结果不同,R2Z2将进一步执行跨浏览器兼容性测试,以检查渲染差异是否确实是渲染回归。在确定了一个渲染回归后,R2Z2将进行深入的分析,以帮助确定回归。具体来说,R2Z2执行类似增量调试的分析,以精确定位导致回归的浏览器源代码提交,以及检查渲染pipeline阶段,以确定哪个pipeline阶段负责。本文实现了一个R2Z2的原型,特别是针对Chrome浏览器。到目前为止,R2Z2在Chrome中发现了11个之前未被发现的渲染回归,所有这些都得到了Chrome开发人员的确认。重要的是,除一种情况外,R2Z2都正确地报告了错误。此外,在所有情况,R2Z2正确地指向了导致错误的pipeline阶段。

FADATest: Fast and Adaptive Performance Regression Testing of Dynamic Binary Translation Systems

DBT(Dynamic binary translation)性能通常使用行业标准和经典基准套件进行评估。但由于DBT系统产生的额外开销,需要极长的时间来完成所有的基准套件测试。此外,DBT系统需要可运行的二进制输入作为测试用例。而由于每个测试都需要从测试程序编译为特定架构下的二进制程序,为生成有效的测试输入增添难度。还有,DBT系统通常应用在不同的平台。由于不同平台计算水平的差异,使用相同的测试用例,会带来测试误差。为了解决上述问题,本文提出FADATest框架,实现快速、自适应的DBT系统性能回归测试。FADATest通过动态分析程序智能捕获真实基准测试程序的运行特征信息。然后通过这些信息,FADATest自动生成适应性的测试程序。生成的测试程序可以准确地模拟原始基准程序的行为和性能,而且运行速度更短。在FADATest框架中,可以根据需求增加或降低测试程序的规模。实验方面,本文实现了FADATest的原型框架,部署两个基准测试组件SPEC CPU2017和PARSEC,对两个广泛使用的DBT系统QEMU、Valgraind进行性能测试。实验结果表明,FADTest生成的测试程序可以发现原始基准测试程序发现的性能回归问题,而且效率更高。在低功耗AArch64平台上的评估结果表明,生成的测试程序的适应性使FADATest在该硬件平台上实现了较高的测试效率而不损失测试精度。

Nessie: Automatically Testing JavaScript APIs with Asynchronous Callbacks

现有对于具有回调的函数的测试用例生成器无法生成回调嵌套的测试用例。原因如下:第一,无法识别可以接受异步回调参数的API函数,也就无法传递回调给这些函数。第二,无法构造回调中包含对另一个函数调用的测试用例。本文提出了面向Javascript的Nessie,将API调用嵌套到回调中,并支持异步API测试。提出了一种新颖的基于树的测试用例表示形式,允许通过排序API调用或嵌套API调用来增加测试用例。此外,还设计了一种算法,可以基于已经运行的测试用例的反馈来迭代生成树。该算法可以确定哪些API函数接受异步或同步回调,并根据现有嵌套实例指导测试生成器基于真实的API用法来生成测试用例。实验方面,将Nessie应用于10个JavaScript库,共包含了356个API函数,其中142个具有回调。相比LambdaTester,Nessie可以更快甚至到达更高的覆盖率。而且,Nessie平均只需要生成136个测试用例就可以达到LambdaTest生成1000个测试用例所实现的覆盖率。

A Novel Coverage-gudied Greybox Fuzzing based on Power Schedule Optimization with Time Complexity

覆盖引导的灰盒模糊测试是一种实用的检测软件漏洞的方法,其目的是尽可能实现更高的代码覆盖率。一个常见的实现方法是通过对使用更少时间发现新边的种子分配更多的能量。然而,由于在复杂程序代码中通常会包含有一些难以到达的分支,因此仅仅考虑到达新的边可能会导致效率较低。代码复杂度是衡量代码安全的关键指标之一 。相较于结构简单的代码,有着更高代码复杂度的程序更可能会产生更多的分支,造成安全问题。本文提出了一种新的模糊测试方法,通过进一步使用代码复杂度对AFL和AFLFAST中的能量调度过程进行优化。论文方法是试图生成更倾向于被测目标程序中有更高复杂度的代码的输入。此外,论文在三个真实程序中实施了初步实证研究,并且实验结果显示所提出的方法能够在改进覆盖率发现的同时触发更多的crash。

Finding and Understanding Incompleteness Bugs in SMT Solvers

论文提出了Janus, 用来发现SMT约束器的不完全bug。关键在于利用可以保持SMT种子公式可满足性的局部增强和削弱规则对SMT公式进行变异。生成的测试用例可以被用来寻找SMT求解器的不完全bug,例如,SMT求解器没有预料到的输入会返回unknown。论文基于对SMT求解器的模糊测试框架YinYang上实现了Janus。从2021年六月到八月,论文对目前最先进的SMT求解器Z3和CVC5利用Janus进行了压力测试,共计汇报了31个不完全bug。其中,26个被确认为unique bug,其中的19个已被开发者修复。论文发现了不同bug:功能、回归和性能bug,这些bug引发了开发人员之间的讨论,并进行了深入分析。

Auto Off-Target: Enabling Thorough and Scalable Testing for Complex Software Systems

软件系统支撑的操作系统内核、基带、引导加载程序、固件、物联网和汽车构建了数十亿人每天都依赖的基础设施。测试这些系统很关键,特别是当他们的复杂度增长时,并且这些系统通常是使用了不安全的C或者C++语言写的。

然而,测试这样复杂的系统会带来严峻的挑战,例如,没有模拟器的自定义硬件,或缺少在目标设备上进行测试和调试的重要设置。因此,无法使用常见的测试技术和工具进行测试。

脱靶 (OT) 测试是一种很有前途的技术,它可以解决这些挑战:提取部分代码并进行调整以在不同的硬件平台上运行,具有更好的工具支持、更容易的调试和更高的测试吞吐量。不幸的是,由于创建 OT 程序的过程是手动的,因此该技术不能很好地扩展并且主要以临时方式使用。

本文中提出了一项新的系统测试方法Auto Off-target(AoT)。基于从源代码和构建过程中提取的信息,AoT可以自动用C语言生成OT程序。AoT的工作不仅仅在于代码生成,同时还提供了一种机制来帮助在OT代码中重新生成和发现程序状态。生成的OTs是自包含的并且独立于原始的构建环境。因此,部分复杂或嵌入式软件可以在一个标准x86_64的及其上进行运行、分析、debug和测试。

论文在从操作系统内核、引导加载程序和网络堆栈中选择的数万个函数上评估 AoT。 论文证明了论文可以对大多数生成的 OT 运行模糊测试和符号执行。 论文进一步在错误查找活动中使用了 AoT,并在为 Google Pixel 5 和 6 手机提供支持的 Android redfin 和 oriole 内核中发现了七个错误。

LawBreaker: An Approach for Specifying Traffic Laws and Fuzzing Autonomous Vehicles

自动驾驶系统(ADS)在自动驾驶车辆上部署之前必须进行彻底的测试。高保真模拟器使得他们能在不同的场景下进行测试,包括那些难以在真实世界的测试中重现的场景。虽然以前的方法已经表明测试用例可以自动生成,但是他们倾向于关注弱的oracle(例如,在无碰撞情况下到达目的地),而不评估旅程本身是否安全和符合法律规定。在这项工作中,论文提出了LawBreaker,一个用于测试基于真实交通规则的自动框架,它兼容不同的场景描述语言。LawBreker提供了一种丰富的、面向驾驶员的规范语言来描述交通法规,以及一个模糊测试引擎,该引擎通过最大化规范覆盖范围来搜索违反它们的不同方式。为了评估论文的方法,论文基于Apollo+LGSVL实现了本算法,并明确规定了中国的交通法规。LawBreker发现了14起违反这些法律的行为,其中包括173起导致事故的测试案例。

QATest: A Uniform Fuzzing Framework for Question Answering Systems

深度学习技术的巨大进步使问题回答(QA)系统具有处理各种任务的能力。许多商用QA系统,如Siri、谷歌Home和Alexa,已经被部署来协助人们完成不同的日常活动。然而,现代QA系统通常被设计用来处理不同的主题和任务格式,这使得测试收集和标记任务都变得困难,从而威胁到它们的质量。

为了缓解这一挑战,本文设计并实现了一个基于变质测试理论的QA系统的模糊测试框架,即QATest。它提供了第一个统一的解决方案,可以为各种QA系统自动生成具有oracle信息的测试用例,如机器阅读理解、开放领域QA和知识库上的QA。为了进一步提高测试效率,生成更多检测错误行为的测试用例,论文基于问题数据的特征设计了N-Gram覆盖和复杂优先级来指导生成过程。为了评估QATest的性能,论文在四个为不同任务设计的QA系统上进行了实验。实验结果表明,由QATest生成的测试用例能有效地检测出数百个QA系统的错误行为。结果表明,该试验标准可以提高试验的多样性和模糊测试效率。

So Many Fuzzers, So Little Time

模糊测试(“fuzzing”)是一种广泛使用且有效的、用来发现软件中的崩溃和安全漏洞的动态技术,由许多工具支持,因此它们在检测能力和执行速度方面不断提高。在本文中,论文报告了论文在超过三年的时间里,对一个非平凡的代码库Contiki-NG使用最先进的基于突变的和混合的模糊器(AFL, Angora, Honggfuzz, Intriguer, MOpt-AFL,QSym,和SymCC)来暴露和修复各层网络栈的严重漏洞时的发现。作为一个副产品,论文提供了一个基于git的平台,可以创建和应用一个新的、相当具有挑战性的开源bug套件,用于评估真实软件漏洞上的模糊器。使用这个bug套件,论文对这些模糊器的有效性进行了公正和广泛的评估,并测量了sanitizers对它的影响。最后,论文提供论文在未来如何使用和评估模糊工具的经验和意见。

Coverage-based Greybox Fuzzing with Pointer Monitoring for C Programs

C语言一直被认为是系统软件实现的主要编程语言。同时,由于其低级的内存控制,它经常存在各种内存漏洞。有大量提高内存安全性的方法,其中基于覆盖的灰盒模糊处理(CGF)因其实用性和令人满意的有效性而广受欢迎。然而,CGF是根据捕获的崩溃来识别漏洞,因此无法检测到非崩溃的漏洞。在本文中,论文考虑跟踪指针元数据(状态、边界和引用)来检测更多不同的漏洞。此外,由于C语言中的指针通常与内存操作直接相关,因此论文设计了两个标准来进一步使用指针元数据作为CGF的指导,使模糊测试过程以程序的脆弱部分为目标。

Fuzzle: Making a Puzzle for Fuzzers

随着模糊技术的快速发展,对自动合成错误程序的需求激增。以前的方法主要是将错误注入到现有的程序中,这使得它们在实现触发错误的功能时受到影响,因为生成的程序可能包含意想不到的错误。在本文中,论文通过将bug合成问题转换为迷宫生成问题来解决这一挑战。具体来说,论文通过将迷宫中的移动序列给编码为函数调用链来合成一个完整的bug程序。通过实验设计,本文提供了一个精确的ground truth。此外,它允许使用从现有漏洞样本中提取具体的路径约束条件来生成基准测试。本文在一个名为Fuzzle的工具中实现了论文的想法,并用五个最先进的fuzzer来评估它,以经验证明它的价值。

Griffin: Grammar-Free DBMS Fuzzing

模糊测试是一种很有前途的DBMS测试方法。DBMS模糊处理中的一个关键组件是语法:由于DBMS对输入强制执行严格的验证,该模块通过生成语法和语义正确的SQL语句来提高模糊处理的效率。然而,由于各种DBMS的语法存在巨大差异,因此要使模糊器适应它们是非常困难的。考虑到许多DBMS还没有经过很好的测试,迫切需要一种有效的DBMS模糊化方法不受语法依赖的影响。

在本文中,提出了一种基于无语法突变的DBMS模糊器Griffin。Griffin没有依赖语法,而是将DBMS的状态总结为元数据图,这是一种轻量级的数据结构,可以提高模糊处理中的突变正确性。具体来说,它首先跟踪内置SQL测试用例中执行语句的元数据,然后构造元数据图来迭代地描述元数据和语句之间的依赖关系。基于这些图,它重新组织语句,并使用元数据引导的替换来纠正语义错误。论文在MariaDB, SQLite, PostgreSQL和DuckDB上评估Griffin。实验结果表明Griffin比SQLancer、SQLsmith和sqrel分别多覆盖73.43%-274.70%、80.47%-312.89%、43.80%-199.11%的分支,在12小时内分别多发现27、27和22个bug。Griffin总共发现了55个以前未知的bug,其中13个认证为cve。

HTFuzz: Heap Operation Sequence Sensitive Fuzzing

基于堆的时间相关性漏洞(use-after-free,double-free)与堆操作序列(memory allocation、deallocation)密切相关。为了有效地发现此类漏洞,可以通过集成堆操作序列反馈来增强传统基于代码覆盖率的解决方案。本文针对基于堆的时间相关性漏洞,提出了一种新颖模糊测试方案HT-Fuzz。其利用模糊测试提高堆操作的覆盖率以及操作访问的指针的多样性,前者体现控制流,后者体现堆操作的数据流。通过这些数据的提高,模糊器可以发现更多的基于堆的时间相关性漏洞。本文设计了HTFuzz的原型,并在14个应用程序上进行测试,对比11个优秀的模糊器。实验结果显示,HTFuzz要优于这些对比对象,发现了更多的基于堆的时间相关性漏洞。详细来说,HTFuzz找到了比(AFL、AFL-sensitive-ma、AFL-sensitive-mw、Memlock、PathAFL、TortoiseFuzz、MOPT、Angora、Ankou)分别更多的堆操作序列和0day基于堆的时间漏洞,分别为(1.82x、2.62x、2.66x、2.02x、2.21x、2.06x、1.47x、2.98x、1.98x)和(1.45x、3.56x、3.56x、4.57x、1.78x、1.78x、1.68x、4.00x、1.45x)。HTFuzz发现了37个新漏洞,其中包括32个新的基于堆的时间相关性漏洞和5个其他类型的漏洞,每个漏洞都被分配了一个CVE编号。

Effectively Generating Vulnerable Transaction Sequences in Smart Contracts with Reinforcement Learning-guided Fuzzing

随着计算机程序在区块链上运行,智能合约已经广泛应用于许多去中心化应用程序,但同时也带来了可能造成巨大财务损失的安全漏洞。因此,对智能合约的漏洞进行检测至关重要。然而,现有的智能合约模糊测试工具仍然无法有效检测需要特定易受攻击交易序列才能触发的复杂漏洞。为了解决这一挑战,我们提出了一种基于强化学习的漏洞引导模糊测试工具RLF,其被用于生成易受攻击的交易序列以检测智能合约中的这些复杂漏洞。特别地,我们首先将智能合约的模糊测试过程建模为马尔可夫决策过程以构建强化学习框架。然后我们创造性地设计了一个同时考虑漏洞和代码覆盖率的适当奖励,以便有效地引导模糊测试工具生成特定的交易序列来揭示漏洞,特别是与多个功能相关的漏洞。我们进行了大量实验以评估RLF的性能。实验结果表明,我们的RLF优于最先进的漏洞检测工具(例如,在30分钟内检测到的漏洞数量增加了8%-69%)。

Efficient Greybox Fuzzing to Detect Memory Errors

灰盒模糊测试是一种被证明有效的测试方法,可用于检测现代软件系统中的安全漏洞和其他bug。灰盒模糊测试还可以与内存错误检测工具(例如AddressSanitizer (ASAN))结合使用,进一步增强检测某些类型漏洞的能力,如缓冲区溢出和释放后使用错误。但是,内存错误检测工具会引入额外的性能开销,这可能会降低灰盒模糊测试的性能,使用ASAN进行模糊测试的性能开销为未使用的2.36倍,一定程度上抵消了使用内存错误检测工具带来的好处。最近的研究将额外的开销归因于程序启动/关闭的成本,其主要决定fork-mode fuzzing的性能。在本文中,论文提出了一种专门针对fork-mode fuzzing进行优化的新型内存错误检测工具。基本思想是使用随机标记而不是不相交元数据(传统内存错误检测工具所使用的方法)来标记对象边界。然后,所有读/写操作都会被插桩以检查标记是否存在,如果存在,则会检测到内存错误。由于论文的设计不使用不相交元数据,因此非常轻量级。这意味着程序启动和关闭的开销被最小化,这对fork-mode fuzzing有益。论文将设计实现为ReZZan工具,并展示了其提升模糊测试性能1.14-1.27倍,具体取决于配置。

FuzzerAid: Grouping Fuzzed Crashes Based On Fault Signatures

模糊测试已经成为在程序中发现漏洞和缺陷的重要方法。许多在工业界使用的模糊测试器每天运行,会产生大量崩溃报告。诊断这些崩溃报告可能非常具有挑战性且耗时。现有的模糊测试器通常采用代码覆盖率或调用堆栈哈希等启发式方法来过滤重复的漏洞报告。虽然这些启发式方法成本较低,但通常不精确,并且仍会报告许多对应于同一漏洞的“独特”崩溃。本文中,论文提出了FuzzerAid,它使用故障签名来对由模糊测试器报告的崩溃进行分组。故障签名是一个小型可执行程序,由原始程序中可以重现漏洞的必要语句组成。在论文的方法中,论文首先使用给定的崩溃生成一个故障签名。然后,论文使用其他触发崩溃的输入执行该故障签名。如果重现了崩溃,论文将崩溃报告分类到带有该故障签名标记的组中。如果没有,论文将生成一个新的故障签名。当所有能触发崩溃的输入都被分类后,论文进一步将触发崩溃根本原因相同的故障签名合并到一组中。论文将论文的方法实现为工具FuzzerAid,并在15个真实世界漏洞和4个大型开源项目生成的3020个崩溃报告上进行了评估。论文的评估显示,论文能够正确地将99.1%的崩溃报告进行分组,并仅报告了17(+2)个“独特”漏洞,优于现有的最先进的模糊测试器。

Minerva: Browser API Fuzzing with Dynamic Mod-Ref Analysis

对于浏览器测试,测试用例的质量依赖于浏览器API调用,交互更多的API调用将转化为更高的覆盖率。然而,数千个API产生一个几乎无限的搜索空间。为了减少这个空间,现有的方法只考虑经过人工选择的API集合,因此在被忽视的API中隐藏的bug将不会被发现。此外,人工标记只能确认API关系中的一小部分,且极大依赖于相关领域知识。本文提出了MINERVA,可以有效地检测浏览器API中隐藏的bug。其包含了两个部分,动态mod-ref分析和引导代码生成。在模糊测试开始之前,动态mod-ref分析可以构建API干扰图。首先从浏览器的代码库中自动识别单个浏览器API,然后将引导浏览器动态搜集API之间的mode-ref关系。在模糊测试期间,引导代码生成模块将基于API之间的mode-ref关系生成API调用序列,且会为API分配权重。实验方面,本文实现了MINERVA的原型,在主流的三款浏览器(Safari、FireFox、Chromium)上进行了测试。与最先进的模糊器相比,MINERVA提高了19.63%到229.62%的边覆盖率,多发现了2倍到3倍的unique bug数量。MINERVA发现了35个之前未出现的bug,其中20个具有5个CVE编号。

RoboFuzz: Fuzzing Robotic Systems over Robot Operating System (ROS) for Finding Correctness Bugs

Robot Operating System(ROS)是一个用于机器人开发的开源中间件,其具有如下特点:分布式机器人进程间的信息传递、硬件抽象、开发工具集合和常用的机器人库(如路径规划算法)。机器人系统即有网络层应用,又有物理层设备。这种特点使得现有的传统内存模糊测试无法检测出其系统中存在的语义正确性bug(如违反物理规律、违反规范等)。本文提出了ROBOFUZZ,第一个系统性测试ROS系统中所有层的模糊测试框架。不同于传统的模糊测试方法,该框架具有可定制的输入突变器、混合执行器、Oracle处理程序和反馈引擎。根据要测试的ROS目标层,可以通过自定义突变模式、要观察的状态、要检查的属性和要利用的语义反馈来选择合适的测试策略。根据这种策略,RoboFuzz通过对被测系统(SUT)的两个副本进行突变和发布消息,有效地探索被测系统(SUT)的状态空间,一个在网络世界中运行(即模拟器),另一个在现实世界中物理运行。然后收集来自两个世界的SUT状态,以查找错误并生成语义反馈,以辅助进一步的输入生成。实验方面,本文在四个具有ROS的机器人应用(PX4 quadcopter,TurtleBot3,Move It 2,Turtlesim)进行测试。ROBOFUZZ发现了30个bug,其中25已被认证,6个已被修复,13个高危漏洞已经影响了一大批基于ROS开发的机器人系统的正常使用。

SEDiff: Scope-Aware Differential Fuzzing to Test Internal Function Models in Symbolic Execution

符号执行是对程序行为进行符号化推理的一种程序分析技术。内部函数模型的正确性对符号执行和其应用来说是至关重要的。不正确的内部函数模型可能导致程序推理不正确。而现有的符号执行方案没有探索内部函数及内部函数模型的语义,因此无法发现内部函数中的隐藏的bug。本文设计了范围感知区分的测试框架SEDiff。提出用最小程序合成的方法生成内部函数模型的SMT-LIB表达式,帮助准确地提取内部函数模型。将内部函数的原始实现中的路径定义为一个功能,并将模型中的路径映射到其原始实现,以识别模型功能。此外,还结合了灰盒模糊测试技术,设计了一个覆盖率度量和一个反馈机制,用来帮助生成范围内的测试用例。实验方面,与采用内部函数模型的符号执行引擎进行对比,SEDiff可以高精度地定位函数模型的功能,成功检测到了298个内部函数模型中存在的49个新的bug,比XSym高出16个,进一步说明了识别模型功能的重要性。

Fuzzing Deep-Learning Libraries via Automated Relational API Inference

现有关于对DL(DeepLearning)库的模糊测试只能依据文档用例、开发者测试、深度学习模型来生成测试用例,从而忽略了大量API。本文提出了DeepREL,首次通过自动推断相关API来提高DL库测试的效率。同时本文有一个基本的假设:在DL库文件中会存在相当一部分API具有相同结构的输入和输出,因此可以在相关API之间复用输入/输出的结构。DeepREL首先通过API的语义和语法信息自动推断所有可能的匹配API对;然后根据这些相关API合成具体的测试用例;之后利用大量有代表性的合法输入去检测这些API是否真正相关;最后利用通过验证的API对,并基于突变策略生成多样化的测试输入,用于检测相关API之间的不一致。实验方面,DeepREL测试了两个使用最广泛的深度学习框架PyTorch和TensorFlow,DeepREL可以比FreeFuzz多覆盖157%的API,同时检测出了162个bug,其中106个已经被证实是新发现的。更为重要的是,DeepREL在3个月内,检测出13.5%的PyTroch-issue中追踪的高危漏洞。

Almost Correct Invariants: Synthesizing Inductive Invariants by Fuzzing Proofs

现实生活中的程序包含多个语义对验证引擎不可用的操作,例如第三方库调用、内联汇编和 SIMD 指令、特殊的编译器提供的原语以及对无法解释的机器学习模型的查询。即使程序验证已经取得了非凡的成功,但为此类“开放”程序合成归纳不变量仍然是挑战。目前,这个问题是通过手动“关闭”程序来解决的,方法是通过尝试捕捉未建模操作的行为来提供手写存根(stubs);但是编写存根不仅困难乏味,而且通常不正确,这使得此种做法存在严重的问题。

在本工作中,论文提出几乎正确的不变量(Almost Correct Invariants)作为自动策略来为此类“开放”程序合成归纳不变量。论文采用主动学习策略,其中数据驱动的学习者提出候选不变量。与先前尝试验证不变量的工作不同,论文试图证伪不变量:将证伪问题简化为一组对非确定性程序的可达性检查;论文利用现代fuzzer的成功来回答这些可达性检查。论文的工具 Achar 自动合成足够的归纳不变量来证明目标程序的正确性。论文将 Achar 与最先进的不变量合成工具进行比较,该工具基于程序源的公式进行定理证明。尽管Achar没有强大的稳健性保证,但论文的实验表明,即使几乎不提供对程序源的访问,Achar的性能也优于具有完全访问源的最先进的不变量生成器。论文还在当前不变量合成引擎无法处理的程序上评估 Achar,如调用外部库调用、内联程序集和卷积神经网络查询;Achar能在合理的时间内成功地推断出必要的归纳不变量。

DocTer: Documentation-Guided Fuzzing for Testing Deep Learning API Functions

输入约束对许多软件开发任务都很有用。例如,函数的输入约束能够生成有效输入以更深入地测试函数。深度学习 (DL) 库的 API 函数具有特定于 DL 的输入约束,这些约束在自由格式 API 文档中有非格式化的描述。现有的约束提取技术对于提取特定于 DL 的输入约束是无效的。为了弥补这一差距,论文设计并实现了一个分析 API 文档以提取DL API函数特定输入约束的新技术DocTer。DocTer 采用一种可以自动构建规则的新颖算法,以API描述依赖解析树的形式从语法模式中提取API参数约束。然后将这些规则应用于流行的DL库中的大量API文档,以提取它们的输入参数约束。为了证明提取的约束的有效性,DocTer使用约束来启用有效和无效输入的自动生成,以测试DL API函数。论文对三个流行的DL库(TensorFlow、PyTorch 和 MXNet)的评估表明,DocTer提取输入约束的精度为 85.4%。DocTer从174个API函数中检测到94个bug,包括一个以前未发现的安全漏洞且现被记录在 CVE 数据库中,而没有输入约束的基线技术仅检测到59个bug。94个bug中的大多数(63个)是以前未发现的,其中 54 个在论文报告后被开发人员修复或确认。此外,DocTer检测到文档中的 43 处不一致,其中 39 处已修复或确认。

Efgicient Greybox Fuzzing of Applications in Linux-Based IoT Devices via Enhanced User-Mode Emulation

灰盒模糊测试已成为最有效的漏洞发现技术之一。然而,灰盒模糊测试技术不能直接应用于物联网设备中的应用程序。主要原因是执行这些应用程序高度依赖特定的系统环境和硬件。为了在基于Linux的物联网设备中执行应用程序,大多数现有的模糊测试技术都使用全系统仿真来最大限度地提高兼容性。但是,与用户模式仿真相比,全系统仿真的开销很大。因此,之前的一些工作,例如 FirmAFL,提出将全系统仿真和用户模式仿真结合起来,以加快模糊测试过程。尽管尝试将应用程序转向用户模式仿真,但却没有现有技术支持在用户模式仿真中完全执行这些应用程序。为了解决这个问题,论文提出了 EQUAFL,它可以自动设置执行环境以在用户模式仿真下执行嵌入式应用程序。 EQUAFL首先在全系统仿真下执行应用程序,并观察在用户模式仿真期间程序可能卡住甚至崩溃的关键点。通过观察到的信息,EQUAFL 可以迁移用户模式仿真所需的环境。然后,EQUAFL使用增强的用户模式仿真重放网络和资源管理行为的系统调用,以满足嵌入式应用程序在其执行期间的所有需求。论文在来自不同系列物联网设备的70个网络应用程序上评估了 EQUAFL。结果表明,EQUAFL 在模糊测试效率方面优于最先进的技术(平均而言,比全系统仿真的 AFL-QEMU 快26倍,比FirmAFL快 14 倍)。论文还从测试的固件映像中发现了10个漏洞,包括6个CVE。

MDPFuzz: Testing Models Solving Markov Decision Processes

马尔可夫决策过程(MDP)为序列决策问题建模提供了一个数学框架,其中许多问题对安全至关重要,例如自动驾驶和机器人控制。人工智能研究的快速发展为求解MDP提供了有效方法,例如深度神经网络 (DNN)、强化学习 (RL) 和模仿学习 (IL)。然而,这些求解MDP的流行模型既没有经过全面测试也不严格可靠。论文提出了第一个用于求解MDP模型的黑盒模糊测试框架,MDPFuzz。 MDPFuzz通过检查目标模型是否进入异常和危险状态来形成测试预言机。在模糊测试期间,MDPFuzz 通过测量它是否可以减少累积奖励或形成新的状态序列来决定保留哪个突变状态。论文使用高斯混合模型 (GMM) 和动态期望最大化 (DynEM) 设计了有效的技术来量化状态序列的“新鲜度”。论文还通过估计目标模型在状态上的局部敏感性来优先考虑具有较高崩溃可能的状态。 MDPFuzz在用于求解MDP的最先进模型上进行评估,包括监督DNN、RL、IL和多智能体RL。论文的评估场景包括自动驾驶、飞机防撞和两个经常用于对RL进行基准测试的游戏。在12小时的运行过程中,论文在每个模型上发现了80多个崩溃触发状态序列。论文展示了杰出的发现,即崩溃触发状态。虽然它们看起来很正常,但与正常状态相比,它们会诱导不同的神经元激活模式。论文进一步开发了一个异常行为检测器来优化所有评估的模型,并使用 MDPFuzz 的结果对其进行修复,从而在不牺牲准确性的情况下显着增强鲁棒性。

SLIME: Program-Sensitive Energy Allocation for Fuzzing

能量分配策略是最流行的模糊测试技术之一,用于提升代码覆盖率和漏洞挖掘能力。核心想法是fuzzer应该将更多的计算能量分配给具有高效发现独特路径和变异后触发崩溃的种子文件。现有解决方案通常定义几个属性作为其分配逻辑中的关键度量,以估计种子的潜力,例如执行速度、文件大小和控制流图中触发边的数量。属性的效率通常假设在不同的程序中是相同的。然而,论文发现这个假设并不总是正确。因此,具有静态能量分配逻辑的最先进的能量分配解决方案难以在不同程序上实现理想的性能。为了解决上述问题,论文提出了一种新的程序敏感解决方案,SLIME,以实现对每个程序具有多种属性的种子文件的自适应能量分配。具体来说,SLIME 首先设计了多属性感知队列,每个队列都包含具有特定属性的种子文件。其次,为了提高投资回报,SLIME 利用定制的上置信边界方差感知 (UCB-V) 算法来统计选择具有最高预计奖励的属性队列,即能找到新的执行路径和崩溃的属性队列。最后,SLIME 对选定属性队列中的种子文件进行变异,以对程序执行属性自适应模糊测试。论文在 9 个真实世界的程序上针对先进的开源fuzzer AFL、MPt、AFL++、AFL++HIER、EcoFuzz 和 TortoiseFuzz 评估 SLIME。结果表明,与上述fuzzer相比,SLIME 分别发现了 3.53 倍、0.24 倍、0.62 倍、1.54 倍、0.88 倍和 3.81 倍个独特漏洞。论文将开源 SLIME 的原始模型,以方便未来的 模糊测试研究。

SnapFuzz: High-Throughput Fuzzing of Network applications

近年来,模糊测试受益于计算能力的提高和重要算法进步,促进系统在生产软件中发现了许多关键bug和漏洞。尽管取得了这些成功,但并非所有应用程序都可以有效地进行模糊测试。特别是,诸如网络协议实现之类的有状态应用程序会受到低模糊测试吞吐量的限制,并且需要开发涉及自定义时间延迟和清理脚本的复杂模糊测试工具。在本文中,论文提出一种用于网络应用程序的新型模糊测试框架 SnapFuzz。其提供了一个健壮的架构,可以将慢速异步网络通信转换为快速同步通信,在安全的最近点对目标进行快照,通过将文件重定向到自定义的内存文件系统来加速文件操作,并移除许多对脆弱修改的需求,例如配置时间延迟或编写清理脚本。使用 SnapFuzz,论文对五种流行的网络应用程序进行了模糊测试:LightFTP、TinyDTLS、Dnsmasq、LIVE555 和 Dcmqrscp。论文报告了显著的性能加速,分别为 62.8倍、41.2倍、30.6倍、24.6倍 和 8.4倍,在所有情况下都明显简化了模糊测试。由于其优势,SnapFuzz 在这些应用程序中还比 AFLNet多发现 12 次崩溃。

PrIntFuzz: Fuzzing Linux Drivers via Automated Virtual Device Simulation

Linux 驱动程序与内核共享相同的地址空间和特权,但具有更大的代码库和攻击面。 Linux 驱动程序没有经过很好的测试,其比内核具有更弱的安全保证。由于缺少硬件设备的支持,现有的模糊测试解决方案无法覆盖大部分驱动程序代码,例如初始化代码和中断处理程序。在本文中,论文提出一个高效且通用的模糊测试框架 PrIntFuzz,可以测试被忽略的驱动程序代码,包括 PRObing 代码和 INTerrupt 处理程序。PrIntFuzz首先通过进程间字段敏感、路径敏感和流敏感的静态分析从驱动程序中提取知识。然后利用这些信息构建一个灵活高效的模拟器,其支持设备探测、硬件中断仿真和设备I/O拦截。最后,PrIntFuzz 应用多维模糊测试策略来探索被忽略的代码。论文开发了 PrIntFuzz 的原始模型,并成功模拟了 311个虚拟PCI (Peripheral Component Interconnect)设备、472个虚拟I2C (Inter-Integrated Circuit)设备、169个虚拟USB (Universal Serial Bus)设备,并在相应的设备驱动程序中发现了150个 bug。论文已经向 Linux 内核社区提交了针对这些 bug 的补丁,目前已经合并了 59 个补丁。在 Linux 5.10-rc6 的对照实验中,PrIntFuzz 发现了 99 个 bug,而最先进的fuzzer只发现了 50 个。PrIntFuzz覆盖了最新的Linux内核上的11968个基本块,而最先进的模糊器Syzkaller只覆盖了2353个基本块。

TensileFuzz: Facilitating Seed Input Generation in Fuzzing via String Constraint Solving

种子输入对于基于突变的模糊器的性能至关重要。现有技术利用符号执行和梯度下降来生成种子输入。然而,这些技术并不特别适合种子输入的变异操作(即通过变异使输入长度变化,其中影响最大的是使输入长度变长的操作),这是种子输入生成的关键步骤。符号执行使用低级的约束条件进行建模并且更喜欢长度固定的种子输入,而梯度下降仅能处理约束条件是用种子输入的算术函数来表示的情况。变异种子输入需要考虑许多参数:长度、偏移量和总数,有些领域需要考虑的是种子长度,有些领域考虑偏移量,还有的领域考虑某些参数的种子数量多少。字符串求解器理论特别适合处理这些关系。因此,文章提出了一种称为 TensileFuzz 的新技术,识别输入字段并将它们表示为字符串变量,使得种子输入表示为这些字符串变量的串联。在字段变量之间插入额外的填充字符串变量。上述关系属于逆向工程并形成字符串约束,解决了填充变量实例化的问题并按照此约束来变异输入。文章中提出的方法还集成了线性回归和梯度下降,以确保变异的输入满足路径约束。后续实验与 AFL 以及许多具有类似功能的模糊器(包括 Qsym、Angora 和 SLF)进行比较,结果表明TensileFuzz 在路径覆盖方面明显优于其他模糊器 39% - 98%。

Coverage-Guided Tensor Compiler Fuzzing with Joint IR-Pass Mutation

现存的模糊测试方法虽然可以应用于tensor compiler测试,但是却无法很好地驾驭复杂的编译器架构。它们或无法生成合乎语法和语义的输入,将大部分时间浪费在测试词法解析组件上;或不考虑触发不同的优化,无法生成轻量级的有效输入;或缺乏有效的引导机制;或没有考虑张量编译器的优化通道序列的搜索空间。本文提出了一种专门针对tensor compiler的测试框架TZER,采用基于生成的方法自动生成任意低级的IRs用来模糊TVM。首先,TZER聚焦于低级的IR变异。其次,其应用了覆盖率引导机制引导模糊测试发现更深层次的代码。同时,TZER设计了专属于tensor compiler的变异器,以实现更有针对性和更有效的IR突变。还有,TZER进一步构建了一种新的覆盖引导模糊策略,执行IR和优化过程的联合突变。实验方面,本文设计了针对TVM complier的TZER,与LibFuzzer、LEMON、TVMFUZZ进行比较。实验结果表明,TZER能够大幅度领先,与第二相比,TZER的覆盖率提高了75%,测试价值提高了50%。在TZER发现的49个独特的新bug中,有37个已经被确认,其中25个已经修复并且合并到TVM分支中。

我们将此次统计的论文大体分为两类,一是技术创新,如在种子调度技术,引导,变异技术上的创新;另一种是面向实际应用的创新,如面向浏览器,硬件的创新。

种子调度技术

A Novel Coverage-gudied Greybox Fuzzing based on Power Schedule Optimization with Time Complexity(ASE)

SLIME: Program-Sensitive Energy Allocation for Fuzzing (ISSTA)

覆盖率优化技术

Coverage-based Greybox Fuzzing with Pointer Monitoring for C Programs(ASE)

HTFuzz: Heap Operation Sequence Sensitive Fuzzing(ASE)

SEDiff: Scope-Aware Differential Fuzzing to Test Internal Function Models in Symbolic Execution(FSE)

BeDivFuzz: Integrating Behavioral Diversity into Generator-based Fuzzing (ICSE)

Evaluating and Improving Neural Program-Smoothing-based Fuzzing (ICSE)

Path Transitions Tell More:Optimizing Fuzzing Schedules via Runtime Program States(ICSE)

变异技术

CONFETTI: Amplifying Concolic Guidance for Fuzzers(ICSE)

One Fuzzing Strategy to Rule Them All (ICSE)

并行技术

Controlled Concurrency Testing via Periodical Scheduling(ICSE)

定向fuzzing技术

WINDRANGER: A Directed Greybox Fuzzer driven Basic Blocks(ICSE)

Fuzzer评估模型

So Many Fuzzers, So Little Time(ASE)

On the Reliability of Coverage-Based Fuzzer Benchmarking(ICSE)

脱靶程序自动生成技术

Auto Off-Target: Enabling Thorough and Scalable Testing for Complex Software Systems(ASE)

测试样例生成技术

Fuzzle: Making a Puzzle for Fuzzers(ASE)

TensileFuzz: Facilitating Seed Input Generation in Fuzzing via String Constraint Solving (ISSTA)

基于强化学习的fuzzer

Effectively Generating Vulnerable Transaction Sequences in Smart Contracts with Reinforcement Learning-guided Fuzzing (ASE)

Sanitizer优化技术

Efficient Greybox Fuzzing to Detect Memory Errors (ASE)

Crash分析技术

FuzzerAid: Grouping Fuzzed Crashes Based On Fault Signatures (ASE)

面向SMT求解器的方法

Finding and Understanding Incompleteness Bugs in SMT Solvers(ASE)

面向DBMS的方法

Griffin: Grammar-Free DBMS Fuzzing (ASE)

面向程序不变量的方法

Almost Correct Invariants: Synthesizing Inductive Invariants by Fuzzing Proofs(ISSTA)

面向机器人操作系统的方法

RoboFuzz: Fuzzing Robotic Systems over Robot Operating System (ROS) for Finding Correctness Bugs(FSE)

面向张量编译器的方法

Coverage-Guided Tensor Compiler Fuzzing with Joint IR-Pass Mutation(OOPSLA)

面向深度学习库的方法

Fuzzing Deep-Learning Libraries via Automated Relational API Inference(FSE)

DocTer: Documentation-Guided Fuzzing for Testing Deep Learning API Functions (ISSTA)

Free Lunch for Testing: Fuzzing Deep-Learning Libraries from Open Source (ICSE)

Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing (ICSE)

面向物联网的方法

Efgicient Greybox Fuzzing of Applications in Linux-Based IoT Devices via Enhanced User-Mode Emulation(ISSTA)

面向浏览器的方法

Minerva: Browser API Fuzzing with Dynamic Mod-Ref Analysis(FSE)

R2Z2: Detecting Rendering Regressions in Web Browsers through Differential Fuzz Testing(ICSE)

面向马尔可夫决策过程的方法

MDPFuzz: Testing Models Solving Markov Decision Processes(ISSTA)

面向网络应用程序的方法

SnapFuzz: High-Throughput Fuzzing of Network applications(ISSTA)

面向自动驾驶的方法

LawBreaker: An Approach for Specifying Traffic Laws and Fuzzing Autonomous Vehicles(ASE)

面向深度学习问答系统的方法

QATest: A Uniform Fuzzing Framework for Question Answering Systems(ASE)

面向内核的方法

PrIntFuzz: Fuzzing Linux Drivers via Automated Virtual Device Simulation (ISSTA)

Demystifying the Dependency Challenge in Kernel Fuzzing (ICSE)

面向感知系统的方法

Semantic Image Fuzzing of AI Perception Systems (ICSE)

面向网络协议的方法

MOREST: Model-based RESTful API Testing with Execution Feedback (ICSE)

Combinatorial Testing of RESTful APIs (ICSE )

Linear-time Temporal Logic guided Greybox Fuzzing  (ICSE )

面向API的方法

Automated Testing of Software that Uses Machine Learning APIs (ICSE)

GraphFuzz: Library API Fuzzing with Lifetime-aware Dataflow Graphs(ICSE)

Nessie: Automatically Testing JavaScript APIs with Asynchronous Callbac(ICSE)

面向嵌入式的方法

μAFL: Non-intrusive Feedback-driven Fuzzing for Microcontroller Firmware (ICSE)

使用fuzzer生成断言

Fuzzing Class Specifications (ICSE)

面向动态二进制翻译系统(DBT)的方法

FADATest: Fast and Adaptive Performance Regression Testing of Dynamic Binary Translation Systems(ICSE)

以上就是本次分享的全部内容,各位读者如果有疑问,欢迎与我们共同探讨!


文章来源: https://mp.weixin.qq.com/s?__biz=MzU1NTEzODc3MQ==&mid=2247485794&idx=1&sn=517baf2e6b01a7fa109473f4de3eeeff&chksm=fbd9a2deccae2bc884bf4244b5073613093224d5cc6d3ab6e6149176607f678b99b6129f44fb&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh