CovRL-Fuzz:基于大模型变异的JavaScript解释器模糊测试技术 | 技术进展
2025-1-8 03:0:0 Author: mp.weixin.qq.com(查看原文) 阅读量:2 收藏


基本信息

原文名称:Fuzzing JavaScript Interpreters with Coverage-Guided Reinforcement Learning for LLM-Based Mutation

原文作者:Jueon Eom;Seyeon Jeong;Taekyoung Kwon

原文链接:https://arxiv.org/abs/2402.12222

发表期刊:ISSTA,2024

开源代码:暂未开源

 

一、引言

传统的模糊测试方法在处理JavaScript严格的语法要求时面临挑战。语法级别的模糊测试生成语法正确的输入,但可能限制了变异的多样性。而基于令牌的模糊测试虽然更灵活,但可能在连续变异中产生语法错误,阻碍了更深层次漏洞的发现。
因此,为了弥补这一空白,作者提出了CovRL-Fuzz,利用覆盖率引导大模型进行微调的Fuzz技术

二、概述

CovRL-Fuzz的基本框架如图1所示,主要由三部分组成:

  • 种子队列的选择和变异执行

  • 对种子的覆盖率收集并创建覆盖率权重图

  • 利用权重图和Interesting seed对大模型进行微调

    图 1  CovRL-Fuzz结构图

三、覆盖率加权奖励

覆盖引导模糊测试利用覆盖反馈来探索不同的代码路径,事实证明,在检测软件错误方面比传统的黑盒方法更有效。这种方法以AFL等工具为代表,强调通过变异来最大化代码覆盖率,在查找安全漏洞方面特别有效。尽管覆盖引导模糊测试取得了成功,但现有的基于LLM的模糊测试技术(包括Fuzz4All和COMFORT)主要使用黑盒方法[1,2],现有方法通常未在其变异过程中引入覆盖反馈,限制了大模型在探索代码路径和提升检测效率方面的能力
自动标识存在漏洞的API
该方法采用TF-IDF来强调不太常见的覆盖点,有效地专注于发现新的代码覆盖区域(图1中的2)。TF-IDF通过为不太常见的标记分配更高的权重来优先考虑它们,而更常见的标记则获得较低的权重。应用此方法来创建加权覆盖图,重点关注未被充分探索的区域。图2说明了覆盖率加权奖励(CWR)过程的实际应用。
考虑执行图2(a)中控制流图(CFG)所示的程序的场景。CFG中有一个循环C,以及分支D和E。利用模糊器生成的测试用例执行了该程序并获得了覆盖率结果。在之前使用CodeLLM的基于强化学习的微调方法的基础上,通过应用基于软件输出的奖励信号进一步扩展了这一想法。值得注意的是,JavaScript解释器中的错误大致可分为语法错误和语义错误,其中包括引用、类型、范围和URI错误。
图 2 PromptFuzz提示词模板
假设从测试用例1(TC1)获得的覆盖率如下:[1, 3, 4, 0, 0]。应用图3公式,覆盖率将转换为二进制映射,以指示路径是否已执行(1)或未执行(0),而不管执行了多少次。因此,TC1的TFcov图更新为:[1, 1, 1, 0, 0]。此过程也同样适用于其他测试用例(图2中的(b))。还使用每个种子的TFcov定义基于覆盖率的权重图IDFcov来衡量哪些代码路径被频繁访问,哪些不被频繁访问。
考虑图2(b)中生成的三个TFcov图,[1, 1, 1, 0, 0]、[1, 1, 0, 0, 1] 和 [1, 0, 0, 0, 0]。基于这些TFcov图,计算基于覆盖的权重图IDFcovIDFcov被计算为一个权重图,其值为[-0.13, 0.0, 0.18, 0.49, 0.18](图2中的(c))。通过对TFcovIDFcov进行加权和来创建加权覆盖图,从而获得奖励。
仅当测试用例没有任何语法或语义问题时,才会计算Rcov奖励方案通过为实现不寻常覆盖水平的测试用例提供更高的回报,激励基于LLM的变异器探索更广泛的覆盖范围
假设通过模糊测试生成了两个新的测试用例TC4和TC5,并执行程序以获得TFcov图。通过将每个TC与IDFcov逐个元素相乘来创建加权TFcov,然后根据公式计算Rcov作为元素之和。对于TC4来说,由于它执行了大部分TC1、TC2和TC3已执行的代码路径,因此受到了-0.13的惩罚,而TC5由于执行了罕见或以前未执行的代码路径,因此获得了0.54的奖励(图2中的(d))。

、基于覆盖率引导的大模型微调

通过掩码进行变异的模糊测试环境可以概念化为RL的bandit环境。在该环境中,提供掩码序列W\MASK作为输入(x),预期输出是掩码序列W MASK(~)。使用PPO算法(对模型进行微调(图1中的3)。在该情形下,它可以通过串联微调两个LLM来实现:一个LLM充当突变器(演员),而另一个LLM充当奖励者(评论家)。使用预训练的LLM来初始化变异器和奖励者的参数。奖励者使用图3所示的方法进行训练。
图 3 权重奖励公式

五、实验设计及结果

(一)数据集建立及大模型参数设置

数据集:使用pytorch v2.0.0、transformers v4.38.2和afl 2.52b实现了CovRL-Fuzz的原型。截至2022年12月,从多个存储库中的回归测试套件中收集了数据,包括V8、JavaScriptCore、ChakraCore、JerryScript、Test262和js-vuln-db。然后对数据进行了预处理以获取训练数据和种子,从而为实验收集了52000个唯一的JavaScript文件。

预处理:对上述JavaScript解释器的回归测试套件进行了简单的预处理,以删除注释、过滤掉语法错误并简化标识符。然后将处理后的数据直接用于训练。预处理是利用UglifyJS工具的-m和-b选项进行的。

训练:利用预先训练好的Code-LLM、CodeT5+(220m)[3]作为奖励器和改变器。对于基于CovRL的微调过程,每个变异周期训练奖励器和改变器1个时期。使用的批次大小为256,学习率为1e-4。优化利用了AdamW优化器和学习率线性预热技术。基于LLM的奖励器使用来自CodeT5+的编码器通过分类方法预测奖励信号。利用对比搜索方法,结合动量因子α为0.6和top-k设置为32,以增强CovRL的有效性。此外,通过设置地图大小的缩放因子M,将覆盖图大小与AFL的建议保持一致。这确保了仪器容量得到优化。对于中等规模的软件(约10K行),使用的映射大小为216。对于超过50K行的大型软件,使用的映射大小为217,在粒度和性能之间取得平衡。

(二)实验设备
Intel(R) Xeon(R) Gold 6134 CPU @ 3.20GHz(64 核)
64 位 Ubuntu 20.04 LTS OS
三块NVIDIA GeForce RTX 3090 GPU
(三)实验设备
实验一:与现有Fuzzer比较
覆盖率:表2描述了每种模糊测试技术的有效覆盖率和总覆盖率。评估结果表明,CovRL-Fuzz的表现优于最先进的JavaScript解释器Fuzzer。观察表明,CovRL-Fuzz在所有目标解释器中获得了最高的覆盖率,边缘覆盖率平均增加了102.62%/98.40%/19.49%/57.11%。为了强调CovRL-Fuzz的有效性,监测了边缘覆盖率的增长趋势,如图4所示。在每次实验中,CovRL-Fuzz始终比任何其他Fuzzer更快地实现最高的边缘覆盖率。与覆盖引导基线相比,CovRL-Fuzz立即显著实现了更高的覆盖率。这表明基于LLM的CovRLFuzz突变比覆盖引导模糊测试中的启发式突变更有效。与LM基线相比,CovRL-Fuzz实现了高覆盖率。然而,在ChakraCore中,Montage和CovRL-Fuzz之间的覆盖率只有微小差异,这可以归因于Montage从其自己的测试套件语料库导入和执行代码的策略,从而实现了更高的覆盖率。在这方面,没有代码导入功能(Montage w/o Import),CovRL-Fuzz记录的覆盖率明显高于Montage。此外,如图4所示,虽然Montage的覆盖率随着时间的推移趋于收敛,但CovRL-Fuzz的覆盖率仍在继续增加。这表明随着时间的推移,CovRL-Fuzz可能会比Montage获得更多的覆盖率。请注意,虽然其他LM基线没有考虑训练时间,但CovRL-Fuzz在实验期间包括了基于CovRL的微调所需的时间。此外,观察到CovRL-Fuzz甚至在接近24小时时仍在继续增加覆盖率。它显示了其在获得覆盖方面的有效性。
表 1 针对 JavaScript 解释器的基准Fuzzer
表 2 与表1列出的其他JavaScript解释器Fuzzer的比较
图 4 边覆盖随时间变化
语义和语法正确性:CovRL-Fuzz不是语法级模糊测试方法,它不会对语法和语义有效性进行后处理。但是,假设CovRL-Fuzz使用基于RL的微调,由来自测试结果的奖励信号驱动,与随机模糊测试(Token-Level AFL)相比,可以实现更高的有效性。为了验证这一假设,评估了唯一测试用例的错误率。实验结果如表2所示。对于所有JavaScript解释器,CovRL-Fuzz的错误率都低于Token-Level AFL。此外,与大多数Fuzzer相比,CovRL-Fuzz的错误率更低。虽然它没有在JavaScriptCore(JSC)和ChakraCore(Chakra)中实现最低错误率,但与大多数基线相比,CovRL-Fuzz的错误率仍然明显较低。请注意,Montage(w/o Import)的高错误率是由于它无法访问其他测试套件中的函数。为了更详细地分析错误率,分析了V8(最大、最可靠的JavaScript解释器)上Fuzzer触发的错误类型,如图5所示。结果表明,与覆盖率引导基线相比,CovRL-Fuzz触发的语法错误更少。此外,即使不使用COMFORT和Montage使用的后处理技术,它产生的语法和语义错误也比LM基线少。这些结果表明,CovRL-Fuzz成功地通过CovRL降低了错误率,而无需启发式后处理。
图 5 V8上生成的测试用例的错误率
发现的bug:为了确定CovRL-Fuzz实现的覆盖率改进和低错误率是否有助于检测错误,通过使用ASAN在调试模式下编译的JavaScript解释器进行了实验。依靠ASAN生成的输出报告进行堆栈跟踪分析,以消除重复的错误。还手动分析并按错误类型对结果进行分类。表3显示了CovRL-Fuzz和比较的模糊器发现的独特错误的数量和类型。与其他模糊器相比,CovRL-Fuzz发现了最多的独特错误。具体来说,CovRLFuzz发现了14个独特的错误,其中9个错误是由CovRL-Fuzz检测到的,包括堆栈溢出和堆缓冲区溢出。这些结果凸显了其在错误检测方面的有效性。从实验结果中可以看出,基于LM的模糊器尽管实现了更高的覆盖率,但往往会发现更少的错误,而启发式模糊器虽然实现了较低的覆盖率,但通常会发现更多的错误。然而,无论这种趋势如何,CovRL-Fuzz在有效发现大多数错误方面表现出了卓越的性能。
表 3 CovRL-Fuzz和其他JavaScript解释器Fuzzer发现的独特bug
实验二:与其他LLM Based的Fuzzer比较
使用Fuzz4All进行了24小时的实验,Fuzz4All是一种基于LLM的最先进的模糊测试技术,使用适用于编译器的提示进行变异。虽然TitanFuzz和FuzzGPT都采用基于LLM的变异,但它们对手工制作的注释、提示和变异模式的使用是专门为深度学习库设计的。这种专业化使得它们很难被JavaScript解释器轻松采用,这就是为什么它们没有被包括在实验对象中。表5显示了CovRL-Fuzz和Fuzz4All之间覆盖率和错误率的比较结果。虽然Fuzz4All和CovRL-Fuzz的覆盖率和错误率没有显示出显著差异,但很难断言Fuzz4All实现的覆盖率改进和错误率对发现错误有显著贡献。表6显示了Fuzz4All和CovRL-Fuzz发现的错误。Fuzz4All发现的错误只是CovRL-Fuzz发现的错误子集中的一小部分。这些结果意味着,该方法通过CovRL结合覆盖引导的模糊测试和基于LLM的变异,在错误检测方面比最先进的基于LLM的模糊测试技术更有用。
表 4 与Fuzz4All的对比
表 5 与Fuzz4All发现的bug对比
实验三:关键环节消融实验
对CovRL-Fuzz的两个关键组件CovRL和CWR进行了消融研究,基于覆盖引导模糊测试,超时时间为5小时。表6显示了根据不同的CovRL和CWR变体的错误率和覆盖率。
CovRL的影响:为了评估CovRL的影响,与w/o LLM(TokenAFL)进行了比较,前者使用了tokenlevel启发式突变,后者只是将基于LLM的突变应用于覆盖引导模糊测试,而后者代表了CovRL-Fuzz。实验结果表明,虽然与w/o LLM相比,w/o CovRL的LLM成功降低了错误率,但并没有显著提高覆盖率,甚至略有降低。相比之下,w/CovRL的LLM对所有目标的覆盖率都有所提高。这些发现表明,在覆盖引导模糊测试中应用基于LLM的CovRL突变是有效的。
CWR的影响:为了评估CovRL中使用的CWR与其他奖励相比的影响,在实验中加入了w/o RL和两个额外的奖励过程。对于奖励,对两种类型的奖励进行了比较:覆盖率奖励(CR)和覆盖率奖励(CRR)。CR是设计的一个简单的二元奖励过程,其中对找到新覆盖的测试用例给予1的奖励,对没有找到新覆盖的测试用例给予0的惩罚。另一方面,CRR是传统基于RL的模糊测试技术中使用的奖励,计算为当前覆盖率与总累积覆盖率的比率。
在实验结果中,与w/oRL相比,w/CR和w/CRR的覆盖率几乎没有增加。然而,CovRL-Fuzz在有效和总覆盖率方面都实现了最高的覆盖率,并且表现出较低的错误率。这些结果表明,使用CWR的覆盖引导模糊测试技术有助于有效提高基于LLM的变异的覆盖率。

表 6 消融实验对比

实验四:真实环境发现的Bug
评估了CovRL-Fuzz在特定模糊测试期间查找真实错误的能力。调查了CovRL-Fuzz可以找到多少真实错误,以及它是否可以发现以前未知的错误。因此评估了CovRL-Fuzz是否可以为每个目标在2周内找到真实错误。测试了截至2023年1月的每个目标解释器的最新版本。表8总结了CovRL-Fuzz发现的错误。共发现58个错误,其中50个是以前未知的错误(15个已注册为CVE)。在发现的错误中,45个得到了开发人员的确认,18个已经修复。根据CVSSv3.1,发现的CVE的平均风险评分为7.5,有些甚至高达9.8。

表 7 Bug的发现数量

六、总结

本文引入了CovRL-Fuzz,这是一种基于LLM的新型覆盖引导模糊测试框架,它首次集成了覆盖引导强化学习。本文的方法将覆盖反馈直接集成到基于LLM的变异中,增强了覆盖引导模糊测试以减少语法限制,同时实现了有效测试,以实现对JavaScript解释器更广泛和隐藏的路径探索。与现有的模糊测试策略相比,本文的评估结果证实了CovRL-Fuzz方法的卓越功效。令人印象深刻的是,它在JavaScript解释器中发现了58个 与现实世界安全相关的错误,其中15个是CVE——其中50个是以前未知的错误。
—END—


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