基于动态分支选择的定向模糊测试方法及系统技术方案

技术编号:38971735 阅读:30 留言:0更新日期:2023-09-28 09:35
本发明专利技术公开了基于动态分支选择的定向模糊测试方法及系统,该方法首先使用定向模糊测试工具获取被测程序的目标点,并生成可执行文件,获得执行路径和输入偏移序列。其次基于得到的种子执行路径对遗漏分支池进行更新,并针对更新过程中新增的遗漏分支,计算分支属性。然后基于分支属性,获得每个分支对应的权重,由权重计算带有不同分支特性标记的分支在候选分支集合中的数量。最后基于候选分支集合使用开源工具的模糊变异方法根据结构体实例进行模糊变异。该系统包括静态分析模块、信息提取模块、分支调度模块和模糊变异模块。本发明专利技术提升了定向模糊测试整体的效率,探索到被测程序中更多路径,并能发现更多程序漏洞。并能发现更多程序漏洞。并能发现更多程序漏洞。

【技术实现步骤摘要】
基于动态分支选择的定向模糊测试方法及系统


[0001]本专利技术属于自动化软件测试领域,具体涉及基于动态分支选择的定向模糊测试方法及系统。

技术介绍

[0002]模糊测试是一种通用的软件测试方法,能够自动或者半自动地生成输入用例发送给被测程序执行,并通过观察被测程序的运行状态和输出结果以挖掘程序中可能存在的缺陷或者漏洞。传统模糊测试方法是基于覆盖率引导的,其通过在被测程序的每个基本块中插入桩点,能够在执行过程中提供代码覆盖率等运行时反馈信息,并利用反馈信息对输入用例的生成过程进行引导。
[0003]定向模糊测试方法在覆盖率指标的基础上添加了目标点导向,在模糊测试流程开始前将被测程序中可能出现漏洞的代码行或者操作序列标记为目标点,并设计了对应的种子适应度计算方案,在模糊测试流程中驱动种子逐渐逼近目标点以触发漏洞。
[0004]定向模糊测试工具AFLGo在程序编译阶段将被测程序中可能触发漏洞的代码行标记为目标点,通过静态分析计算程序中每个基本块到目标点之间的距离,在模糊测试过程中通过该距离信息计算种子和目标点之间的最终距离用于优先级计算和能量分配;定向模糊测试工具ParmeSan利用Address Sanitizer进行内存相关错误的定位,并通过差异比对自动化提取被测程序中的目标点。CN114417348B提出了一种多目标导向模糊测试方法,通过种子的多维度特征和模拟退火算法分配种子能量;CN114756471A提出了基于字节敏感能量分配的漏洞类型导向模糊测试方法,在运行时统计不同类型漏洞特征信息,以此计算不同输入字节的变异权重;CN115269412A提出了一种基于目标前置区域搜索的定向模糊测试方法,基于被测程序中目标点前置基本块的运行时信息进行全局的种子选择和能量调度。
[0005]现有定向模糊测试方法在利用目标点提供的导向信息时普通存在精度损失问题,在种子级别进行信息计算和策略设计,将基本块级别的细粒度指导信息向粗粒度转换以计算种子的优先级,用于在种子池中筛选出优质种子并分配能量,指导信息由基本块级别向种子级别转换的过程会不可避免地损失精度,无法对模糊测试过程进行有效导向,影响整体测试效率。

技术实现思路

[0006]针对以上问题,本专利技术提出了基于动态分支选择的定向模糊测试方法及系统。
[0007]基于动态分支选择的定向模糊测试方法主要包括四个阶段:静态分析阶段、信息提取阶段、分支调度阶段和模糊变异阶段。首先,模糊测试系统对被测程序进行静态分析,将可能触发漏洞的代码行标记为目标点,并对被测程序进行编译插桩;其次,模糊测试系统在模糊测试过程中基于种子的执行路径更新遗漏分支池,并计算其中新增分支的深度、漏洞距离、热度系数等属性;然后,模糊测试系统根据不同分支属性值的大小,判断该分支是否带有深度深、漏洞近、热度高等特性并进行标记,根据不同分支特性在测试过程中发现的
种子数量和漏洞数量,实时调整特性权重并进行动态分支调度,获得当前需要进行探索的预选分支集合;最后,模糊测试系统对预选分支集合中的遗漏分支进行模糊测试并记录新发现的种子。
[0008]将遗漏分支作为模糊测试的整体调度对象,以在基本块级别维护基本块和目标点之间精确的指导信息,同时设计了多个测试相关的分支属性,在每轮模糊测试迭代开始前根据不同分支属性的实时有效性进行动态分支调度,进一步提高漏洞挖掘效率。
[0009]基于动态分支选择的定向模糊测试方法,具体包括如下步骤:
[0010]1、静态分析阶段
[0011]使用定向模糊测试工具获取被测程序的目标点、对程序进行编译插桩并生成可执行文件。包含以下内容:
[0012]1.1目标点获取
[0013]利用内存错误检测工具AddressSanitizer(ASAN)编译被测程序,基于ASAN在被测程序中添加的错误检测标识定位目标点并保存目标点位置信息。
[0014]1.2程序编译插桩
[0015]直接编译被测程序生成字节码文件。同时对被测程序进行插桩编译,使用随机哈希值作为程序中每个基本块的独立标识,并将提供标识信息的代码作为桩点插入到程序基本块中,生成被测程序的可执行文件。
[0016]1.3动态执行分析
[0017]利用数据流分析工具DataFlowSanitizer对被测程序进行编译,生成的可执行文件在种子执行过程中能输出种子的执行路径,以及路径中相邻分支的输入偏移序列等运行时数据。
[0018]2信息提取阶段
[0019]维护遗漏分支池用于保存测试中发现的遗漏分支,使用字节码文件生成被测程序的控制流图CFG,利用目标点位置信息在CFG中对目标点进行标记。
[0020]在模糊测试过程中对发现的所有种子进行动态执行分析,基于得到的种子执行路径对遗漏分支池进行更新。
[0021]针对更新过程中新增的遗漏分支,计算并记录该分支的深度、漏洞距离、热度系数等属性。具体包含以下内容:
[0022]2.1遗漏分支池更新
[0023]将种子执行路径中相邻的未被覆盖的分支视为遗漏分支,将遗漏分支作为模糊测试的整体调度对象。在模糊测试开始时,对种子池中用户提供的初始输入用例进行动态执行分析,将得到的遗漏分支作为初始数据保存到遗漏分支池BranchPool:{missBranch1,

,missBranch
z
,

,missBranch
q
},z=1,2,

,q,q为遗漏分支池中的遗漏分支总数。
[0024]其中分支missBranch
z
=<BasicBlock
a

BasicBlock
b
>,代表被测程序的基本块BasicBlock
a
在满足missBranch
z
处的约束条件后,跳转到BasicBlock
b
,并维护每个遗漏分支的结构体实例,结构实例中保存了该分支的标识、原始种子、输入偏移序列、分支属性和分支特性标记等信息。
[0025]2.1.1修剪遗漏分支
[0026]基于种子执行路径删除遗漏分支池中已被覆盖的遗漏分支。
[0027]在模糊测试过程中每发现一个种子Seed,代表模糊测试系统覆盖了被测程序中新的程序分支,对Seed进行动态执行分析,得到Seed的执行路径BasicBlocks:{BasicBlock1,

,BasicBlock
x
,

,BasicBlock
w
},x=1..w,w为Seed执行过程中覆盖的基本块数量,遍历BasicBlocks中所有连续两个基本块组成的分支Branch
x
=<BasicBlock
x

BasicBlock
x+1
&本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.基于动态分支选择的定向模糊测试方法,其特征在于,包括如下步骤:S1、使用定向模糊测试工具获取被测程序的目标点,对程序进行编译插桩并生成可执行文件,进而获得执行路径和输入偏移序列;S2、维护遗漏分支池保存测试中发现的遗漏分支,使用字节码文件生成被测程序的控制流图CFG,利用目标点的位置信息在CFG中对目标点进行标记;在模糊测试过程中对发现的种子进行动态执行分析,基于得到的种子执行路径对遗漏分支池进行更新;对更新过程中新增的遗漏分支计算并记录该分支属性;S3基于分支属性,将遗漏分支池中的分支标记为带有不同的分支特性,并记录每个分支特性在测试过程中发现的种子和漏洞数量,进而获得每个分支对应的权重,由权重计算带有不同分支特性标记的分支在候选分支集合selectedBranches中的数量nbr[i];S4基于候选分支集合selectedBranches,使用ParmeSan开源工具的模糊变异方法根据结构体实例进行模糊变异。2.根据权利要求1所述的基于动态分支选择的定向模糊测试方法,其特征在于,在S2中所述对遗漏分支池进行更新的具体过程如下:2.1.1将种子执行路径中相邻的未被覆盖的分支视为遗漏分支,将遗漏分支作为模糊测试的整体调度对象;在模糊测试开始时,对种子池中用户提供的初始输入用例进行动态执行分析,将得到的遗漏分支作为初始数据保存到遗漏分支池BranchPool:{missBranch1,...,missBranch
z
,...,missBranch
q
},z=1,2,...,q,q为遗漏分支池中的遗漏分支总数;其中分支missBranch
z
=<BasicBlock
a

BasicBlock
b
>,代表被测程序的基本块BasicBlock
a
在满足missBranch
z
处的约束条件后,跳转到BasicBlock
b
,并维护每个遗漏分支的结构体实例;所述结构体实例中保存了该分支的标识、原始种子、输入偏移序列、分支属性和分支特性标记信息;2.1.2在模糊测试过程中每发现一个种子Seed,代表模糊测试系统覆盖了被测程序中新的程序分支,对Seed进行动态执行分析,得到Seed的执行路径BasicBlocks:{BasicBlock1,...,BasicBlock
x
,...,BasicBlock
w
},x=1...w,w为Seed执行过程中覆盖的基本块数量,遍历BasicBlocks中所有连续两个基本块组成的分支Branch
x
=<BasicBlock
x

BasicBlock
x+1
>,如果Branch
x
在BranchPool中存在则将其删除,表示该遗漏分支已被覆盖;2.1.3动态执行分析收集Seed执行路径中未被覆盖的程序分支并将其保存到遗漏分支池BranchPool中;给定分支Branch
x
=<BasicBlock
a

BasicBlock
b
>,将BasicBlock
a
视为Branch
x
的前驱;在动态执行分析过程中,以BasicBlocks中任意基本块BasicBlock
c
为前驱的未被覆盖的分支Branch
x
=<BasicBlock
c

BasicBlock
k
>被视为遗漏分支并保存到遗漏分支池中。3.根据权利要求2所述的基于动态分支选择的定向模糊测试方法,其特征在于,在步骤2.1.3中,还包括:利用数据流分析工具DataFlowSanitizer对程序执行过程中的数据流进行解析,收集Seed中传递到遗漏分支missBranch
z
并影响该分支条件取值的输入偏移序列offs={[x1,y1]...[x
v
,y
v
]...[x
u
,y
u
]},v=1...u,u为偏移片段数量,0≤x
v
≤y
v
<Len,Len
为程序输入Seed的长度,其中每个片段[x
v
,y
v
]表示Seed中偏移为x
v
到y
v
的连续字节传递到了分支missBranch
z
中;将Seed视为发现missBranch
z
的原始种子,保存原始种子Seed和输入偏移序列offs到missBranch
z
的结构体实例中。4.根据权利要求3所述的基于动态分支选择的定向模糊测试方法,其特征在于,在S2中所述计算分支属性的具体过程如下:2.2.1BasicBlock
m
为被测程序main函数入口所在基本块,missBranch
z
的分支深度计算为:BasicBlock
m
到missBranch
z
的前驱基本块BasicBlock
a
的在CFG图上的最短路径距离,用Dijkstra算法在CFG上进行计算;2.2.2对于mis...

【专利技术属性】
技术研发人员:徐向华陶泓宇
申请(专利权)人:杭州电子科技大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1