模糊测试论文阅读 MOPT: Optimized Mutation Scheduling for Fuzzers

MOPT: Optimized Mutation Scheduling for Fuzzers

来自 Usenix 2019,文章地址

作者来自浙江大学

1. Abstract

基于突变的模糊测试生成测试用例的实用性依赖于变异调度策略,现有的变异策略通常遵循特定的分布选择变异算子,效率低下。作者提出了新的变异调度方案MOPT,利用定制的粒子群优化(PSO)算法寻找最优的变异算子分布,并提供了 pacemaker 模式加速PSO的收敛速度。实验表明,MOPT-AFL 可以发现多 170% 的安全漏洞和多 350% 的崩溃。 MOPT-AFLFast 和 MOPT-VUzzer 的表现也优于原生。提供合理性、兼容性和稳定性的同时,引入的成本可以忽略不计。

2. Introduction

AFL及其衍生的Fuzzer通常使用特定的变异调度器在一组预定义的变异算子(在哪里变异、如何变异)集合中选择,并应用在种子上,一次生成新的测试用例。比那一调度器不直接产生变异算子,二十预定义算子的概率分布。利用强化学习在每一轮中动态选择变异算子的性能提升不显著。几个被忽略的问题:

  • 不同的变异算子发现漏洞和新路径的效率是不同的,因此如果均匀选择,则会在效率低的突变算子花费过多资源,从而降低总图模糊效率。
  • 变异算子的效率因目标程序而异。每个变异算子的效率都和被测程序有关,静态推断这种依赖关系是困难的,因此,好的变异调度器必须根据每个算子在目标程序上的运行时效率来做出决策。
  • 变异算子的效率会随时间发生变化。最优变异调度器依赖于算子的历史效率来计算最优概率分布以选择算子。由于算子效率的动态特性,该概率计算过程需要快速收敛。
  • 调度程序会产生性能开销。突变调度器对模糊器的执行速度有影响。
  • 对机器学习来说,数据是不平衡的。例如,变异算子只能以小概率生成有趣的测试用例,这可能会影响梯度下降算法和其他机器学习算法的有效性。

本文将变异调度视为一个优化问题,基于粒子群优化算法设计了变异调度方案MOPT,动态评估候选变异算子的效率,将变异算子的选择概率调整为最优分布。

MOPT 将每个变异算子建模为沿概率空间 [xmin,xmax] 移动的粒子,其中 xmin 和 xmax 分别是预定义的最小和最大概率。在局部最佳概率和全局最佳概率的指导下,每个粒子(即算子)朝着其最佳选择概率移动,这可以产生更多质量好的测试用例。因此,MOPT的目标是通过聚合粒子找到的概率来找到算子的最优选择概率分布,从而聚合产生更多质量好的测试用例。与 PSO 类似,MOPT 根据其局部最佳概率和全局最佳概率迭代更新每个粒子的概率。然后,它整合所有粒子的更新概率以获得新的概率分布。 MOPT 可以快速收敛到选择变异算子的概率分布的最佳解,从而显着提高 fuzzing 性能。

MOPT是一种通用方案,可广泛应用于基于突变的模糊器。作者还设计了 pacemaker 模式,可以进一步加快MOPT的收敛速度。

本文贡献:

  • 调查了现有变异调度器的缺点,从中得出结论,变异算子应该根据它们的历史性能来调度。
  • 提出了变异调度方案MOPT,它能够选择更好的变异算子并获得更好的模糊测试效率。具有广泛性。
  • MOPT具有良好的稳定性、兼容性和低成本。
  • MOPT-AFL 发现 97 个以前未知的安全漏洞, 15 个先前已知的漏洞。
  • 开源 https://github.com/puppet-meteor/MOpt-AFL

3. Background

3.1 Mutation-based Fuzzing

基于变异的模糊器基本流程,该文章主要在种子变异这一步做工作。

3.2 Mutation Operators

AFL的变异

在这里插入图片描述

3.3 Mutation Scheduling Schemes 变异调度方案

AFL的三个变异阶段

  • 确定性变异
  • 随机性变异
  • 拼接后随机变异,首轮未发现新路径和漏洞时执行该阶段

本文主要关注改进随机性变异,找到最优的概率分布。

3.4 Mutation Efficiency

确定性变异各个算子产生有趣测试用例占比,BitFlip 1/1、BitFlip 2/1和Arith 8/8效率很高,不同程序效率不同

在这里插入图片描述

确定性变异各个算子所用时长
在这里插入图片描述

各阶段时长以及发现有趣用例占比。AFL大部分时间花在确定性阶段,随机性阶段的效率更高。

在这里插入图片描述

4. Overview of MOPT

4.1 Design Philosophy

我们将这个问题简化为寻找变异算子的最优概率分布,然后调度器在测试目标程序时选择下一个算子。每个变异操作探索自己的最优概率。然后,基于这些最优概率,可以得到变异算子的全局最优概率分布。可以利用粒子群优化(PSO)算法来找到算子的最优分布。

4.2 Particle Swarm Optimization (PSO)

粒子群优化算法参考文章:https://blog.csdn.net/m0_61735754/article/details/123510676

PSO 易于实现,计算成本低,非常适合优化变异调度。需要注意的是,粒子群优化算法需要一个候选解。

v n o w ( P ) = w ∗ v n o w ( P ) + r ∗ ( L b e s t ( P ) − x n o w ( P ) ) + r ∗ ( G b e s t ( P ) − x n o w ( P ) ) v_{now}(P)=w*v_{now}(P)+r*(L_{best}(P)-x_{now}(P))+r*(G_{best}(P)-x_{now}(P)) vnow(P)=wvnow(P)+r(Lbest(P)xnow(P))+r(Gbest(P)xnow(P))

x n o w ( P ) = x n o w ( P ) + v n o w ( P ) x_{now}(P)=x_{now}(P)+v_{now}(P) xnow(P)=xnow(P)+vnow(P)

v n o w v_{now} vnow 由速度惯性、到局部最佳位置的位移即自身认知、到全局最佳位置的位移即社会认知三部分决定

4.3 Design Details

没有直接使用粒子来探索候选分布,而是首先探索每个算子的最优概率,然后构造最优概率分布。

Particles. 每个变异算子视为一个粒子,预定义概率空间 [ X m i n , X m a x ] [X_{min}, X_{max}] [Xmin,Xmax] x n o w x_{now} xnow 表示变异算子被调度器选择的概率。

L b e s t L_{best} Lbest. 变异算子产生更多有趣的测试用例的位置。利用局部效率 e f f n o w eff_{now} effnow 进行度量,表示发现的有趣测试用例数量除以该变异算子在一次迭代期间的被调用次数。比值最大的位置即为 L b e s t L_{best} Lbest

P b e s t P_{best} Pbest 所有变异算子产生最多有趣的测试用例的位置。与原始 PSO 在统一解空间中移动粒子不同,MOPT 在不同概率空间中移动粒子(具有相同的形状和大小)。因此,没有适合所有粒子的唯一全局最佳位置。相反,不同的粒子在这里具有不同的全局最佳位置(在不同的空间中)。全局效率 g l o b a l e f f global_{eff} globaleff 表示每个算子在所有种群中贡献的有趣测试用例数量。计算所有算子的全局效率分布, P b e s t P_{best} Pbest g l o b a l e f f global_{eff} globaleff在分布中的比例。通过这种分布,具有更高效率的粒子(即算子)可以获得更高的被选择概率。

Multiple Swarms. MOPT 实际上仅探索解空间中的一个候选解 (即概率分布),很可能陷入局部最优,因此MOPT采用多个群并将定制的PSO算法应用于每个群,以避免局部最优。MOPT只采用最有效的群,并利用其分布来安排模糊过程中的突变。 s w a r m e f f swarm_{eff} swarmeff 表示该群贡献的有趣测试用例的数量除以一次迭代产生的新测试用例数量。

总体为以下三步

  • 为每个群体中的所有粒子定位局部最佳位置。在每个群内,在模糊过程中评估每次迭代中每个粒子的局部效率 e f f n o w eff_{now} effnow,对于每个粒子,局部效率 e f f n o w eff_{now} effnow最高的位置为局部最佳位置 L b e s t L_{best} Lbest
  • 定位群体中所有粒子的全局最佳位。每个粒子的全局效率 g l o b a l e f f global_{eff} globaleff 是跨群体评估的,然后评估粒子的全局效率分布,每个粒子在这个分布中的 g l o b a l e f f global_{eff} globaleff 比例是被全局最佳位置 P b e s t P_{best} Pbest
  • 只选择表现最好的群。评估每个群在一次迭代中的效率 s w a r m e f f swarm_{eff} swarmeff ,选择效率最好的,其在当前迭代中的概率分布应用于模糊测试。

每次迭代结束时,MOPT 以与 PSO 类似的方式移动每个群体中的粒子,即按照上述公式。 需要注意的点, 不能超过概率空间 [ X m i n , X m a x ] [X_{min}, X_{max}] [Xmin,Xmax],每个种群内所有的粒子概率(即位置)和为1。 在更新所有 swarm 中所有粒子的位置后,fuzzer 可以继续将这些粒子移动到新的位置,并输入新的 PSO 迭代。

5. Implementation of MOPT

5.1 MOPT Main Framework

在这里插入图片描述

  • PSO Initialization Module

该模块主要进行参数初始化,仅在模糊其开始运行时执行一次

(1) 将每个粒子在每个群中的初始位置$ x_{now} 设置为随机值,并将一个群中的所有粒子的 设置为随机值,并将一个群中的所有粒子的 设置为随机值,并将一个群中的所有粒子的 x_{now} 之和归一化为 1 ; ( 2 ) 将每个粒子在每个群中的粒子移动的位移 之和归一化为1; (2) 将每个粒子在每个群中的粒子移动的位移 之和归一化为1;(2)将每个粒子在每个群中的粒子移动的位移v_{now}$设置为0.1;(3) 将每个群中的每个粒子的初始局部效率 e f f n o w eff_{now} effnow设置为0; (4) 将每个群中的每个粒子的初始局部最佳位置 L b e s t L_{best} Lbest设置为0.5; (5) 将每个粒子跨群的初始全局最佳位置 G b e s t G_{best} Gbest设置为0.5。请注意,初始化模块仅在模糊器开始运行时执行一次。

  • Pilot Fuzzing Module

该模块使用多个种群来执行 fuzzing,其中每个种群探索不同的概率分布,按顺序评估每个种群,每个种群的终止条件为生成一定数量 p e r i o d p i l o t period_{pilot} periodpilot的新测试用例。

对于每个种群,其概率分布用于调度变异算子并且模糊测试,在模糊测试期间,该模块将测量三个测量值:(1)特定粒子(即变异算子)贡献的有趣测试用例的数量,(2)特定粒子的调用次数,(3)该种群发现的有趣测试用例数量。

局部效率是(1)除以(2),当前种群的效率是(3)除以 p e r i o d p i l o t period_{pilot} periodpilot

  • Core Fuzzing Module

该模块将选取由 Pilot fuzzing Module 选择的最佳种群,并使用其概率分布来执行模糊测试,并在生成一定数量 p e r i o d p i l o t period_{pilot} periodpilot的新测试用例后停止。随后可以测量每个粒子贡献的有趣测试用例的数量,无论来与哪个群体。然后可以计算粒子之间的分布,并定位每个粒子的全局最佳位置。请注意,如果在 Pilot Fuzzing Module中只使用一个 种群,那么这两个模块可以合并。

  • PSO Updating Module

使用Pilot Fuzzing Module以及Core Fuzzing Module提供的信息根据上述公式更新每个种群中的每个粒子,进入下一次迭代。

5.2 Pacemaker Fuzzing Mode

由于AFL及其衍生品在确定性变异阶段花费更多时间,而随机性变异阶段以及拼接阶段发现更多新路径和漏洞,所以MOPT提供了针对AFL的优化。当MOPT完成对一个种子测试用例的变异后,如果长时间没有发现新的唯一崩溃或路径,则会选择性地禁用后续测试用例的确定性阶段。该模式的优势

  • 确定性阶段花费太多时间,会减慢整体效率。另一方面,MOPT仅更新破坏阶段中的概率分布,而与确定性阶段无关。因此,使用起搏器模糊模式禁用确定性阶段可以加快MOPT的收敛速度。
  • 跳过确定性阶段避免在某一个种子上花费太多时间,就能从队列中挑选更多的种子进行突变,从而有更好的机会更快地发现漏洞。
  • 确定性阶段在模糊开始时可能具有良好的性能,但过一会儿就变得效率低下。此模式仅在效率降低后才选择性地禁用此阶段,因此可以从该阶段中受益,同时避免在其上浪费大量时间。

具体地,有两种Pacemaker Fuzzing Mode,分别为(1)MOPT-AFL-tmp 当新的有趣测试用例超过了预定义的阈值会再次启用确定性变异;(2) MOPT-AFL-ever 禁用后永远不启用。

6. Evaluation

6.1 Experiment Settings

下载大量相应格式的文件,每个目标程序,随机选择100个相应格式的文件作为种子。

评估指标:崩溃数量,路径数量。

实验挺充足的…

7. Further Analysis

7.1 Steadiness Analysis 稳定性分析

研究初始种子集对MOPT的影响。三组实验(1)每个程序都有一个空种子,这是一个包含字母“a”的文本文件;(2)20个格式良好的种子输入;(3)200个格式良好的种子输入

效率分析

7.2 Overhead Analysis 开销分析

几乎可以和AFL媲美,并且对于执行速度慢的测试用例可能表现会更好

8. Limitation and Discussion

评估中展示的性能优势可能不适用于所有可能的程序和种子。我们的评估可以通过进一步进行更深入的大规模评估来加强。为了使我们的评估更加全面,我们计划在未来使用更多真实世界的程序和基准对 MOPT 进行大规模评估。

未来工作:研究更好的变异算子,构建更全面和代表性的基本数据集系统地评估模糊器的性能

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是使用互信息法和虚假最近邻点法确定最佳时间延迟和嵌入维数,并进行相空间重构的MATLAB代码示例: ```matlab % 输入参数 x = ... % 输入的一维时间序列 maxDim = ... % 最大嵌入维度 maxTau = ... % 最大延迟时间 % 互信息法估计 MI = zeros(maxDim, maxTau); for m = 1:maxDim for tau = 1:maxTau X = zeros(length(x)-(m-1)*tau, m); for i = 1:length(x)-(m-1)*tau X(i,:) = x(i:tau:i+(m-1)*tau); end MI(m,tau) = mutualinfo(X(:,1), X(:,2)); % 仅计算前两个维度的互信息 end end % 绘制互信息矩阵 figure; imagesc(MI); xlabel('Delay time'); ylabel('Embedding dimension'); colorbar; % 虚假最近邻点法估计 D = zeros(maxDim, 1); for m = 1:maxDim X = zeros(length(x)-(m-1)*maxTau, m); for i = 1:length(x)-(m-1)*maxTau X(i,:) = x(i:maxTau:i+(m-1)*maxTau); end [~, D(m)] = fnn(X); end % 绘制虚假最近邻点曲线 figure; plot(1:maxDim, D, 'o-'); xlabel('Embedding dimension'); ylabel('FNN'); % 确定最佳嵌入维度和时间延迟 mOpt = ... % 根据互信息矩阵或虚假最近邻点曲线确定最佳嵌入维度 tauOpt = ... % 根据互信息矩阵或虚假最近邻点曲线确定最佳时间延迟 % 相空间重构 X = zeros(length(x)-(mOpt-1)*tauOpt, mOpt); for i = 1:length(x)-(mOpt-1)*tauOpt X(i,:) = x(i:tauOpt:i+(mOpt-1)*tauOpt); end ``` 其中,mutualinfo函数用于计算两个维度之间的互信息,fnn函数用于计算虚假最近邻点的比例。在实际应用中,需要根据具体问题选择合适的估计方法和参数,并对重构后的相空间进行进一步分析和处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值