智能定向灰盒模糊测试IDFuzz:一种基于神经网络的输入突变引导方法
第一, 研究主要作者、机构及发表情况 本项研究的主要作者来自清华大学(Tsinghua University),包括Yiyang Chen、Chao Zhang、Long Wang、Wenyu Zhu、Nuoqi Gui、Zheyu Ma、Xingjian Zhang。合作者还来自武汉大学(Wuhan University, Changhua Luo)和湖南大学(Hunan University, Bingkai Su)。该研究成果于2025年8月13日至15日在美国华盛顿州西雅图市举行的第34届USENIX安全研讨会上发表,论文标题为“IDFuzz: Intelligent Directed Grey-Box Fuzzing”。该论文被收录于会议论文集,并可通过USENIX官网开放获取。
第二, 研究的学术背景 本研究属于软件安全与漏洞挖掘领域,具体聚焦于模糊测试(Fuzzing)技术的一个分支——定向灰盒模糊测试。模糊测试是一种通过向目标程序提供大量随机或半随机的输入并监控其异常行为(如崩溃)来发现软件漏洞的自动化技术。其中,定向灰盒模糊测试旨在高效地测试程序中的特定目标代码,例如用于补丁测试、验证候选漏洞或复现已知漏洞。
然而,现有定向模糊测试工具(如AFLGo、WindRanger、Beacon、SelectFuzz等)普遍存在一个关键缺陷:它们在关键的输入变异(Mutation)步骤中缺乏有效的策略。这些工具大多沿用了源自AFL(American Fuzzy Lop)的随机变异方法,即随机选择输入偏移量和长度进行修改。在定向测试场景下,为了到达特定目标点,往往需要修改输入中特定且关键的字段。随机变异方法不仅方向性弱,而且会导致大量无效尝试(研究引用指出超过65.1%的变异输入无法接近目标)。尽管在覆盖率引导的模糊测试中,输入生成技术已有深入研究(如关联分析、符号执行),但这些方法应用于定向模糊测试时,面临计算开销大、可扩展性差或准确度不足的挑战。因此,开发一种轻量级、可扩展且能处理多种复杂约束的输入变异策略,成为提升定向模糊测试效率的关键难题。
本研究的核心目标是解决上述问题。研究团队的核心洞察是:历史变异输入中蕴含了可以引导未来变异趋向目标代码的“经验”。具体而言,如果一个输入A通过变异生成了更接近目标的输入B,那么通过对比A和B的字节级差异,就可以提取出一些接近目标的经验(例如,关键字段位于何处)。研究旨在设计一种智能的、数据驱动的输入变异方法,能够自动化地从历史输入中学习并提取这种经验,并利用它来指导后续的输入变异,从而显著减少无效尝试,加速到达目标代码。
第三, 研究的详细工作流程 IDFuzz的设计围绕一个基于神经网络(NN)的模型展开,其工作流程主要分为三个核心阶段:模型初始化、模型训练和梯度引导的定向变异。
1. 模型初始化阶段 此阶段的目标是定义神经网络的输入和输出。输入定义为模糊测试输入的字节值向量。输出的定义则需要精心设计,以承载研究所需的两个层面的“经验”:第一层经验(如何到达已探索的代码)和第二层经验(如何推断如何到达未探索的代码)。 * 相关代码提取:首先,进行目标支配性分析。使用轻量级静态分析技术(基于LLVM框架中的经典Lengauer-Tarjan算法),提取目标代码在程序控制流图中的支配基本块序列。这些基本块是到达目标代码所必须顺序覆盖的,从而将整个程序空间浓缩为与定向测试强相关的部分。此举将模型输出的维度从代表整个程序空间大幅降低(通常减少95%以上,最终维度小于50)。 * 分支编码:这是IDFuzz的一项关键技术。它不直接使用距离值或整个覆盖位图作为输出,而是将每个支配基本块的覆盖状态编码为输出向量的一个维度。具体算法是:如果第i个支配块被覆盖,其对应输出维度设为1。如果第i个块未被覆盖,但前一个支配块被覆盖(且该支配块属于“A类”,即与下一个支配块相邻),则分析前一个支配块的非支配出边的覆盖情况,用一个介于0和1之间的小数来编码其分支行为,并将该小数置于第i个块的输出维度中。这种编码方式不仅包含了“路径是否接近目标”的距离信息,更重要的是通过编码分支行为,让模型能够学习“如何通过调整分支行为来顺序覆盖下一个支配块”。此外,它将同一个条件语句下的兄弟边关联起来,使得模型能够从未探索边的已探索兄弟边中学习经验,从而具备了推断如何到达未探索代码的潜力。
2. 模型训练阶段 此阶段的目标是利用模糊测试过程中产生的输入数据来训练神经网络模型。关键挑战是从海量测试输入中高效地构建一个高质量、小规模的数据集。 * 自适应数据集生成:该技术用于智能采样。首先,从种子队列中筛选出覆盖支配块数量最多的前20%的标签对应的种子输入(这些输入更接近目标,经验价值更高)。其次,利用相邻种子(在两次变异步骤内)字节分布相似性的观察,进行去重:对于拥有相同相关分支行为的相邻种子,只选取一个代表性种子。最后,为每个重要标签均匀收集100-150个由这些种子生成的测试输入,最终训练集大小约为1000个样本。这种设计避免了直接用种子队列导致的样本不足,也避免了包含所有生成输入导致的数据集过大。 * 训练时机控制:为了避免模型训练期间错过新的代码覆盖导致经验“过时”,设计了一个自适应机制。持续监控新支配块被发现的频率。如果超过阈值时间θ(例如60秒)没有发现新支配块,则开始生成训练集并进行模型训练。初始训练后,如果新覆盖的支配块数量达到N(例如1),或字节分布显著不同的种子比例超过R(例如5%),则择机重新训练模型。 * 神经网络架构:选择了一个成本效益高的3层多层感知机模型,使用ReLU作为隐藏层激活函数,Sigmoid作为输出层激活函数以归一化输出。该模型能够在所有测试程序中以10个训练周期内达到超过95%的准确率。
3. 梯度引导的定向变异阶段 模型训练完成后,IDFuzz利用其梯度信息来指导种子输入的关键字段定位和变异。 * 梯度计算:对于一个给定的种子输入,将其字节向量输入模型,并计算模型输出(即编码的分支行为向量)相对于模型输入(即每个输入字节)的梯度。理论上,梯度绝对值越大的字节,对特定分支行为的影响越大。 * 梯度过滤:这是IDFuzz另一项关键技术,用于解决现实中的噪声问题。研究观察到,具有最大梯度值的字节往往不是关键字节,而是那些几乎所有样本中值都相同的“固定字段”(如文件魔数)。数学上,这是因为这些字节值变化几乎为零,导致梯度计算的分母趋近于零,梯度值被放大。此外,相邻支配块的关键字节也会在当前支配块的梯度向量中表现出较大值。为解决此问题,IDFuzz设计了梯度过滤算法:通过比较目标支配块(如第n块)与其较远支配块(如第n-2块和第n+2块)的梯度向量中各个字节的排名,过滤掉那些在所有向量中排名都很高(可能是固定字段)或仅在相邻块向量中排名高(可能是邻居的关键字节)的字节。最终保留在目标块梯度向量中排名相对靠前的字节(如前20个)。 * 字段识别:基于过滤后得到的关键字节集合,利用DBSCAN(基于密度的空间聚类)算法在输入的一维空间(按字节偏移)上进行聚类。具有高梯度值的连续字节会被聚合成一个“关键字段”。识别出的字段长度会被调整为2的幂次方(1, 2, 4),以适配AFL的变异器。 * 变异策略:根据当前种子覆盖的支配块深度和模型训练集中已有的经验类型,采取两种变异策略: * 积极变异:如果训练集中包含覆盖更深一层支配块(第一层经验)或同层但不同分支行为(第二层经验)的样本,则模型已学习到如何覆盖下一个支配块的经验。此时,使用对应支配块的梯度向量,经过过滤和聚类后,对识别出的关键字段进行积极变异(尝试0-255的随机值以及AFL定义的“有趣值”)。 * 保守变异:如果模型尚未学习到如何覆盖更深代码的经验,则避免变异那些在当前已覆盖最深支配块的梯度向量中排名靠前的字节,以防止已取得的进展发生倒退。 * HAVOC变异:最后,IDFuzz会运行一个短暂的AFL HAVOC随机变异阶段,以补偿梯度过滤可能发生的错误,并确保在模型尚未就绪时仍有变异能力。
第四, 研究的主要结果 研究团队通过一系列实验对IDFuzz进行了全面评估。
1. 触发已知漏洞的效率评估 在谷歌模糊测试套件上,将IDFuzz集成到四个先进的定向模糊测试器(AFLGo、WindRanger、Beacon、SelectFuzz)中,替换其原有的输入变异模块。以漏洞复现的平均时间作为衡量标准。 * 关键发现:对于难以复现的目标(平均复现时间大于10分钟),IDFuzz带来了稳定且显著的加速效果。对于AFLGo、WindRanger、Beacon和SelectFuzz,IDFuzz分别提供了2.88倍、大于2.63倍、大于2.38倍和大于2.01倍的加速,所有改进在统计上均显著。综合所有目标,IDFuzz将现有定向模糊测试器的性能平均提升了超过2.48倍。特别值得注意的是,有三个目标程序(harfbuzz、libarchive、vorbis)只有在配备了IDFuzz的模糊测试器下才能成功复现漏洞。 * 对比其他输入生成方案:将集成了IDFuzz的基础AFL(AFL-IDFuzz)与代表关联分析的Angora、代表符号执行的SymCC以及另一款优化输入变异的定向模糊测试器Waflgo进行对比。结果显示,AFL-IDFuzz的性能显著优于其他三者,平均加速比分别超过2.35倍、27.78倍和5.27倍。
2. 消融研究 为了评估IDFuzz中各项核心技术的贡献,研究进行了消融实验。实验在7个真实程序上进行,评估指标是“成功变异关键字段所需的平均尝试次数”。 * 分支编码:对比使用完整分支编码的版本(IDFuzz0+0)、使用覆盖位图作为输出的版本(IDFuzzb)和使用距离值作为输出的版本(IDFuzzd)。结果表明,分支编码相比随机变异(AFL策略)将所需尝试次数减少了67%,相比IDFuzzb减少了53%,相比IDFuzzd减少了16%。证明了分支编码在提取有效经验方面的优越性。 * 自适应数据集生成:相比未使用该技术的版本(IDFuzz0+0),使用后(IDFuzz1+0)将所需尝试次数平均减少了44%,表明高质量训练集对模型性能至关重要。 * 梯度过滤:相比未使用梯度过滤的版本(IDFuzz0+1),使用后(IDFuzz0+0)在正确过滤的测试用例中,将所需尝试次数平均减少了56%。但同时,未使用梯度过滤时,错误过滤率很高(峰值达47.68%)。而结合了高质量训练集(自适应数据集生成)的完整IDFuzz,将错误过滤率降低至平均14.28%,同时将所需尝试次数相比随机策略减少了91.86%。
3. 运行时开销评估 在24小时的模糊测试周期内,测量IDFuzz关键组件的CPU时间开销。结果显示,训练数据生成、模型训练和梯度分析分别仅占总运行时间的0.06%、5.49%和0.07%。这表明IDFuzz在带来显著性能提升的同时,引入了极低的开销。
4. 案例分析 研究通过案例展示了IDFuzz定位两类具有挑战性的“变偏移字段”的能力:由方向字段决定的字段(如ELF文件中的sh_size)和由标记字节决定的字段(如JPEG文件中的区段标记)。在这些案例中,IDFuzz都能高效地(平均尝试次数在6-7次左右)和相对准确地识别出关键字段,而AFL的随机策略平均需要尝试约250次。
5. 新漏洞发现 为了评估IDFuzz在发现新漏洞方面的潜力,研究团队将AFLGo-IDFuzz应用于多个已被广泛测试的真实世界软件。在24小时的测试预算内,成功发现了6个先前未知的漏洞(已获得4个CVE编号,其中包括1个高危漏洞),以及1个对高危漏洞的不完全修复。而原始的AFLGo在相同设置下基本无法复现这些目标。
第五, 结论与研究的意义与价值 本研究提出的IDFuzz,是一种创新的、智能的定向灰盒模糊测试输入变异解决方案。其核心贡献在于,首次系统地提出并实现了一种基于神经网络模型、能够从历史测试输入中自动学习经验,并利用模型梯度精确指导输入变异趋向目标代码的方法。
科学价值:IDFuzz为解决定向模糊测试中低效随机变异这一长期存在的瓶颈问题提供了一条全新的、数据驱动的路径。它验证了神经网络在模拟程序输入-执行路径复杂关系并提取可泛化“经验”方面的可行性。提出的分支编码、自适应数据集生成和梯度过滤等关键技术,为将机器学习有效应用于程序分析和小样本、高噪声的模糊测试数据场景提供了宝贵的见解和方法论。
应用价值:IDFuzz具有很高的实用价值。它以模块化方式实现,能够轻松集成到大多数基于AFL的现有定向模糊测试器中,显著提升其在漏洞复现、补丁测试等关键安全任务中的效率(加速超过2.48倍),并大幅减少无效计算资源消耗(减少无效变异91.86%)。它还能帮助安全研究人员和开发者更高效地发现和验证软件中的未知漏洞及不完全修复,实际应用中已成功发现多个高危漏洞,证明了其强大的实战能力。
第六, 研究的亮点 1. 问题洞察新颖:明确指出并深入分析了现有定向模糊测试工具在输入变异策略上的根本缺陷,提出了利用“历史经验”进行引导的创新思路。 2. 方法创新性强:提出了一套完整的、基于神经网络的智能变异框架(IDFuzz)。其中,分支编码技术巧妙地将程序结构信息和分支行为编码为模型可学习的特征,解决了经验表示难题;梯度过滤技术有效解决了现实场景中梯度噪声问题,提升了关键字段定位的准确性;自适应数据集生成技术保证了模型训练的效率和质量。 3. 效果显著且可泛化:实验结果表明,IDFuzz不仅能大幅加速现有工具,其性能提升在针对难复现目标时尤其稳定和显著。它能够处理变偏移字段等复杂情况,并具备推断未探索代码路径的潜力(第二层经验)。 4. 实用性与低开销:IDFuzz设计为轻量级模块,易于集成,且运行时开销极低(约6%),使其非常适用于实际的、资源受限的持续安全测试环境。
第七, 其他有价值的补充 研究团队已经将IDFuzz的源代码和实验数据在Zenodo和GitHub上开源,遵循开放科学原则,方便同行验证和进一步研究。此外,论文也讨论了IDFuzz当前的一些局限性,例如静态调用图分析可能不完整、无法预测关键字段的具体值、以及对于只有两个分支的条件语句无法提取第二层经验等,并指出了未来可能的改进方向(如结合动态分析、利用梯度符号预测值范围等),体现了研究的严谨性和前瞻性。