一种面向配置缺陷的定向模糊测试方法
未命名
10-19
阅读:64
评论:0
1.本发明涉及大型开源软件中的配置缺陷检测领域,具体涉及一种面向配置缺陷的定向模糊测试方法。
背景技术:
2.随着计算机技术的不断进步,互联网作为连接全球的信息交流平台正以前所未有的速度蓬勃发展,软件也成为人类生活中不可或缺的一部分,涉及各个方面和领域。软件配置是指以用户需求和软件的功能、结构及主要特性等为依据,选择和确定相关硬件、软件型号、版本及数量,规划软件放置位置和关联关系,设置软件相关参数值等。配置作为软件提供的与用户交互的接口,既可控制软件行为,又可管理系统资源分配,具有丰富的灵活性。然而,随着软件系统的不断发展,软件规模和复杂度不断增加,软件提供的配置项数量也越来越多。配置在为用户灵活使用软件带来便利的同时,随之而来的配置故障却导致软件服务失效频发,逐渐引起业界的广泛关注。google公司的barroso和通过调研发现,配置缺陷已成为导致google服务失效的第二大原因,占比达到了近29%。
3.已有大量工作针对软件配置相关的缺陷检测展开研究,主要分为两类:一是配置功能代码缺陷检测,二是配置故障反应能力缺陷检测。前者主要通过动态或静态程序分析检测配置相关代码中的功能实现缺陷或者性能缺陷,但是无法快速生成大量的测试用例;后者通过提取软件的配置约束,注入配置错误来评估软件对于缺陷的反应能力,提升配置故障诊断的效率。事实上,不仅错误配置会导致软件系统的缺陷,有效的配置也可能暴露隐藏的软件缺陷。前人的工作大多关注错误配置值导致的系统故障,如tianyinxu等人在sosp2013发表的“do not blame users for misconfigurations(不要因为错误配置而责备用户)”,实现了面向软件源码的配置约束自动提取,通过注入违反约束的配置值观察被测程序反应。然而配置相关的软件缺陷大都是由合法值引起的。sun等人在osdi2020发表的“testing configuration changes in context to prevent production failures(测试上下文中的配置更改以防止生产故障)”中研究发现46.3%-61.9%的配置缺陷具有完全合法有效的参数值,有效参数导致的配置缺陷的比例与无效参数导致的配置缺陷比例相似,甚至更高。然而,已有的配置缺陷检测工作缺少针对配置的测试用例,配置项数量众多,和测试用例组合状态空间爆炸,穷尽每一个配置项的每一个取值,并与测试用例组合是不切实际的。所以,配置测试不充分的问题一直存在。
4.近年来,模糊测试(fuzzing)已经成为了软件测试领域的一个热门研究方向。模糊测试是一种基于随机输入的自动化测试技术,基本思想是快速生成大量随机输入并用其执行被测程序,监测程序状态,如果程序出现异常行为,如崩溃、断言失败等,就认为发现了一个漏洞。定向模糊测试(directed fuzzing)是一种对用户事先指定的程序目标位置高效测试的模糊测试技术,是模糊测试的一个分支,代表工作为m等人在security2017发表的“directed greybox fuzzing(定向灰盒模糊测试,以下简称背景技术一)”,主要基于模拟退火算法和种子能量调度策略,利用迪杰斯特拉算法计算每个种子到目标的距离,然后
随着时间的推移给距离目标更近的种子分配更多的能量,以达到对目标位置充分测试的目的。另一方面,rui zhong等人在ccs2020发表的“squirrel:testing database management systems with language validity and coverage feedback(一种基于语言有效性和覆盖率反馈方法的数据库管理系统测试方法,以下简称背景技术二)”,主要基于fuzzing测试用例自动生成方法,利用执行测试后的覆盖率反馈生成多种测试用例,使得模糊测试朝着提升代码覆盖率的方向演化。但是由于配置的多样性以及配置代码的复杂性(配置代码即以配置在程序中的初始变量为源头进行污点分析得到的代码),背景技术二不理解被测程序中的配置代码特征,也无法优先选择经过配置代码的测试用例,导致无法充分覆盖被测程序中配置代码,检测配置缺陷。
5.综上所述,大型开源软件配置数量多且依赖复杂,是导致缺陷的主要原因之一。如何对被测程序中的配置代码进行充分测试,检测配置缺陷,避免花费大量时间探索配置无关的程序路径,提高测试的准确性,缩短测试时间是本领域技术人员极为关注的技术问题。
技术实现要素:
6.本发明要解决的技术问题是针对目前配置相关的缺陷检测方法难以快速生成大量测试用例和现有定向模糊测试方法需要花费大量时间探索配置无关程序路径的问题,提供一种面向配置缺陷的定向模糊测试方法。本发明将定向模糊测试框架和配置污点分析进行融合,一方面将污点分析得到的配置代码作为定向模糊测试中的目标,另一方面对目标程序插桩,白盒化配置信息,从而充分测试配置代码,检测出软件中的配置缺陷,避免花费大量时间探索配置无关的程序路径,提高测试的准确性,缩短测试时间。
7.为解决上述技术问题,本发明的技术方案为:首先,构建面向配置缺陷的定向模糊测试系统,面向配置缺陷的定向模糊测试系统由配置污点分析模块、距离计算模块、配置与距离插桩模块、定向模糊测试模块组成;然后,配置污点分析模块读入待检测软件源码和目标配置集合,对待检测软件源码和目标配置集合进行污点分析,得到所有目标配置的影响范围以及配置与程序基本块映射关系集合ms,将ms发送给距离计算模块和配置与距离插桩模块;距离计算模块利用ms筛选得到目标基本块集合tbs,计算程序中的每个基本块到目标基本块的距离,得到距离信息集合ds,将ds发送给配置与距离插桩模块;配置与距离插桩模块读入待检测软件源码,从配置污点分析模块接收ms,从距离计算模块接收ds,根据ms和ds对软件源码进行插桩,得到插桩后的软件s,将插桩后的软件s发送给定向模糊测试模块。最后,定向模糊测试模块对s中的配置代码进行定向测试,输出配置缺陷集合cs。
8.本发明包括以下步骤:
9.第一步,构建面向配置缺陷的定向模糊测试系统,面向配置缺陷的定向模糊测试系统由配置污点分析模块、距离计算模块、配置与距离插桩模块、定向模糊测试模块构成。
10.配置污点分析模块与距离计算模块、配置与距离插桩模块相连,读取用户输入的待检测软件源码和目标配置集合,对待检测软件源码和目标配置集合进行污点分析,得到目标配置集合中所有目标配置的影响范围以及配置与程序基本块映射关系集合ms,将ms发送给距离计算模块和配置与距离插桩模块。
11.距离计算模块和配置污点分析模块、配置与距离插桩模块相连,从配置污点分析模块接收ms,从ms筛选得到目标基本块集合tbs,根据用户输入的待检测软件源码生成调用
图和控制流图,通过迪杰斯特拉算法计算待检测软件源码的每个基本块到目标基本块的距离,得到距离信息集合ds,将ds发送给配置与距离插桩模块。
12.配置与距离插桩模块和配置污点分析模块、距离计算模块与定向模糊测试模块相连,读入用户输入的待检测软件源码,从配置污点分析模块接收ms,从距离计算模块接收ds,根据ms和ds对软件源码进行插桩,得到插桩后的软件s,将s发送给定向模糊测试模块。
13.定向模糊测试模块和配置与距离插桩模块相连,从配置与距离插桩模块接收s,利用用户提供的初始种子库sp和配置文件,对s中的配置代码进行定向测试,输出配置缺陷集合cs。
14.第二步,配置污点分析模块读取用户输入的待检测软件源码和目标配置集合,对待检测软件源码和目标配置集合进行污点分析,得到目标配置集合中所有目标配置的影响范围以及配置与程序基本块映射关系集合ms,将ms发送给距离计算模块和配置与距离插桩模块,方法是:
15.2.1配置污点分析模块读入用户输入的待检测软件源码s0和目标配置集合c,c={c1,c2,...,ci,...,ci},其中ci为c中第i个目标配置,ci是常量字符串,i为c中目标配置的总数,1≤i≤i;
16.2.2配置污点分析模块使用confmapper算法(参见shulin zhou等人在qrs-c 2016发表的文章《confmapper:automated variable finding for configuration items in source code》(一种从软件源码中自动发现配置参数初始变量的方法的第4页)分析s0,从软件源码s0中发现配置参数初始变量,得到c中i个目标配置的初始程序变量,由i个目标配置的初始程序变量(简称为i个配置变量)构成配置变量集合vc,vc={vc1,vc2,...,vci,...,vci},其中vci为ci对应的配置变量;
17.2.3配置污点分析模块使用marek chalupa等人在atva 2020发表的文章“dg:analysis and slicing of llvm bitcode(一种基于low level virtual machine的程序分析和切片方法)”的dg(constructing dependence graphs for program analysis,基于构建依赖图的程序分析)算法,对vc中的配置变量进行污点分析,得到目标配置的影响范围(即污点传播变量在待检测软件源码s0中的位置)集合r,r={r1,r2,...,ri,...,ri},其中ri为ci的影响范围集合,ri={r1,r2,
…
,r
ni
,
…
,r
ni
},其中r
ni
为ri中第ni个污点传播变量在待检测软件源码s0中的位置,ni为影响范围集合ri中元素的个数,1≤ni≤ni;
18.2.4配置污点分析模块定位r中r
ni
所在s0的程序基本块位置(程序基本块是顺序执行的指令序列,每个程序基本块只有一个入口和一个出口,入口就是其中的第—条指令,出口就是其中的最后一条指令),得到目标配置与程序基本块映射关系集合ms,ms={ms1,ms2,...,msi,...,msi},其中msi为ci的映射关系集合,ci与msi中的元素具有一对多的映射关系,msi={ms1,ms2,...,ms
ni
,...,ms
ni
},ms
ni
为ci映射的第ni个程序基本块,方法为:
19.2.4.1初始化变量i=1;
20.2.4.2初始化变量ni=1;
21.2.4.3初始化
22.2.4.4定位r
ni
在s0中的位置,找到r
ni
所在程序基本块的第一条指令inst,以inst所在的文件名和行号ms
ni
表示该程序基本块;
23.2.4.5将ms
ni
加入msi;
24.2.4.6令ni=ni+1,如果ni≤ni,转2.4.4;如果ni》ni,令ni=1,令i=i+1,转2.4.7;
25.2.4.7如果i≤i,转2.4.3;如果i》i,说明ci映射的程序基本块均已放到ms中,转2.5;
26.2.5将ms发送给距离计算模块和配置与距离插桩模块。
27.第三步,距离计算模块从配置污点分析模块接收ms,从ms中筛选得到目标基本块集合tbs,并根据用户输入的待测软件源码生成调用图和控制流图,采用迪杰斯特拉算法计算待测软件源码的每个基本块到目标基本块的最短距离,得到距离信息集合ds,将ds发送给配置与距离插桩模块,方法是:
28.3.1距离计算模块从配置污点分析模块接收ms,从ms中筛选控制软件资源分配的配置(例如buffer size、cache size、timeout等,这类配置往往更容易引发内存错误)对应的程序基本块,令这些程序基本块为目标基本块,得到目标基本块集合tbs,其中tbs={tbs1,tbs2,
…
,tbsm,
…
,tbsm},m为tbs中目标基本块个数,tbsm为tbs中第m个目标基本块,1≤m≤m;
29.3.2距离计算模块使用low level virtual machine(llvm)框架(10.0.0版本及以上,后续所涉及的(llvm)框架版本号相同)中的modulepass工具分析被检测软件源码s0,得到s0中所有程序基本块集合bb,bb={bb1,bb2,...,bb
t
,...bb
t
},t为bb中程序基本块个数,bb
t
为bb中第t个程序基本块,1≤t≤t;
30.3.3距离计算模块使用llvm框架中的optpass工具分析被检测软件源码s0,得到函数调用图cg和控制流图cfg;
31.3.4距离计算模块根据cg和cfg,对bb中所有程序基本块到tbs中目标基本块的距离进行计算,得到距离信息集合ds,ds={ds1,ds2,...,ds
t
,...,ds
t
},其中ds
t
为一个二元组,ds
t
=[bb
t
,d
t
],bb
t
为bb中第t个程序基本块,d
t
为bb
t
到tbs的距离,t为距离信息集合ds中元素的个数,1≤t≤t,方法是:
[0032]
3.4.1初始化变量t=1,m=1;
[0033]
3.4.2初始化距离信息集合
[0034]
3.4.3初始化存放bb
t
到tbsm的距离集合
[0035]
3.4.4使用迪杰斯特拉算法计算bb
t
到tbsm的距离dm',将dm'放进d';
[0036]
3.4.5令m=m+1,如果m≤m,转3.4.4;如果m》m,计算bb
t
到tbs的距离d
t
,d
t
=d'中所有元素的平均值,转3.4.6;
[0037]
3.4.6将d
t
和bb
t
组合成二元组ds
t
,ds
t
=[bb
t
,d
t
],将ds
t
加入ds中;
[0038]
3.4.7令t=t+1,如果t≤t,转3.4.3;如果t》t,说明距离信息集合ds构建完毕,ds={ds1,ds2,...,ds
t
,...,ds
t
},转3.5;
[0039]
3.5将距离信息集合ds发送给配置与距离插桩模块。
[0040]
第四步:配置与距离插桩模块读入用户输入的待测软件源码从配置污点分析模块接收ms,从距离计算模块接收ds,根据ms和ds对s0进行插桩,得到插桩后的待检测软件s,将s发送给定向模糊测试模块,方法是:
[0041]
4.1配置与距离插桩模块根据ds对s0插桩,得到第一次插桩后的待检测软件s1,方法是:
[0042]
4.1.1初始化变量t=1;
[0043]
4.1.2使用llvm框架的modulepass工具分析被检测软件源码s0,得到ds
t
中的bb
t
在s0中的位置loc
t
;
[0044]
4.1.3从ds
t
中获取bb
t
对应的d
t
;
[0045]
4.1.4使用llvm框架的irbuilder接口在loc
t
处插入存储d
t
值到共享内存中的store指令,简称第一值存储指令(通过这种方式可以在s1运行时获得bb
t
到tbs的距离信息);
[0046]
4.1.5令t=t+1,如果t≤t,转4.1.2;如果t》t,说明ds中的所有程序基本块到tbs的距离信息插桩完毕,得到第一次插桩后的待检测软件s1,转4.2;
[0047]
4.2配置与距离插桩模块根据ms对s1插桩,得到插桩后的待检测软件s,方法是:
[0048]
4.2.1初始化变量i=1;
[0049]
4.2.2初始化变量ni=1;
[0050]
4.2.3使用llvm框架的modulepass工具分析s1,得到ms
ni
在s1中的位置loc
ni
;
[0051]
4.2.4使用llvm框架的irbuilder接口在loc
ni
处插入存储ci到共享内存中的store指令,简称第二值存储指令(通过这种方式可以在s运行时获得ci信息);
[0052]
4.2.5令ni=ni+1,如果ni≤ni,转4.2.3;如果ni》ni,转4.2.6;
[0053]
4.2.6令i=i+1,如果i≤i,转4.2.2;如果i》i,说明根据ms对s1插桩完毕,得到第二次插桩后的待检测软件s,转4.3;
[0054]
4.3将插桩后的软件s发送给给定向模糊测试模块。
[0055]
第五步:定向模糊测试模块根据种子选择策略赋予经过配置代码的种子(模糊测试领域中,种子代表测试用例)最高的优先级,根据能量调度策略给距离配置代码更近的种子分配更多的突变(对测试用例进行随机的比特翻转和字节替换)次数,检测目标软件的配置缺陷,方法是:
[0056]
5.1定向模糊测试模块从配置与距离插桩模块接收插桩后的待检测软件s;
[0057]
5.2定向模糊测试模块利用用户提供的初始种子库sp(初始种子库中包含了用户提供的初始测试用例,以文件的形式保存)生成初始种子队列q,sp={sp1,sp2,...,spj,...spj},其中spj为初始种子库中第j个种子,j为sp中初始种子的个数,1≤j≤j,方法是:
[0058]
5.2.1初始化变量j=1;
[0059]
5.2.2初始化种子队列
[0060]
5.2.3将种子spj发送给插桩后的待检测软件s;
[0061]
5.2.4从用户提供的配置文件中获取用户定义的最大尺寸maxsize,用户定义的最大时长maxt;
[0062]
5.2.5判断spj文件大小是否超过maxsize,如果是,说明spj会影响模糊测试运行时的种子执行速度,令j=j+1,转5.2.3;如果否,转5.2.6;
[0063]
5.2.6判断种子spj执行时间是否超过maxt,如果是,说明spj会导致s挂起,令j=j+1,转5.2.3;如果否,转5.2.7;
[0064]
5.2.7判断种子spj是否会导致软件s的崩溃(根据操作系统发出的信号sigkill进行判断,sigkill表示终结进程),如果是,说明spj会带来安全隐患,令j=j+1,转5.2.3;如果否,说明spj是一个安全的种子,转5.2.8;
[0065]
5.2.8令种子队列q中第z个种子qz=spj,将qz加入初始种子队列q;
[0066]
5.2.9若j=j,说明初始种子库中的所有种子处理完毕,得到了种子队列q,q={q1,q2,...,qz,...qz},z为q中种子的个数,1≤z≤j,1≤z≤z,转5.3,否则,令j=j+1,转5.2.3;
[0067]
5.3定向模糊测试模块根据种子执行路径上是否含有配置相关基本块(即ms中的程序基本块)对q进行选择,得到种子优先级队列q',q'={qq1,qq2,...,qqk,...qk},qqk为q'中第k个种子,k为q'中种子的个数,1≤k≤k,1≤k≤z,然后从q'中顺序选择一个种子进行模糊测试,方法是:
[0068]
5.3.1初始化变量z=1;
[0069]
5.3.2初始化优先级队列
[0070]
5.3.3将种子qz发送给插桩后的待检测软件s试运行;
[0071]
5.3.4根据插桩信息判断种子qz的执行路径上是否含有配置相关基本块,如果是,令q'中第k个种子qqk=qz,将qqk加入种子优先级队列q',q'中的种子将会被定向模糊测试模块优先选择,令z=z+1,转5.3.5;否则,说明种子qz与配置无关,直接转5.3.5;
[0072]
5.3.5若z=z,说明q中所有执行路径上含有配置相关基本块的种子均已放入q'中,转5.4;否则,令z=z+1,转5.3.3;
[0073]
5.4定向模糊测试模块从q'中选择种子,为选择好的种子分配突变次数e,然后根据种子突变策略对选择的种子进行突变,突变得到的新种子如果覆盖了插桩后的待检测软件s新的代码段,则将新种子加入到种子队列q中去,方法是:
[0074]
5.4.1初始化变量k=1;
[0075]
5.4.2从q'中选择种子qqk;
[0076]
5.4.3定向模糊测试模块使用marcel等人在ccs 2017发表的文章“directed greybox fuzzing(定向灰盒模糊测试)”中的模拟退火算法根据qqk到tbs距离(根据ds对s0插桩后在s运行时获得bb
t
到tbs的距离信息,计算qqk执行路径上经过的程序基本块到tbs的距离之和作为qqk到tbs距离),计算得到qqk的突变次数e;
[0077]
5.4.4对qqk突变e次,得到新种子集合q
k”,q
k”={qq1',qq2',...,qqe',...qqe'},qqe'为q
k”'中第e个新种子,e为q
k”中新种子的个数,1≤e≤e,方法是:
[0078]
5.4.4.1初始化变量e=1;
[0079]
5.4.4.2初始化新种子集合
[0080]
5.4.4.3定向模糊测试模块使用rui zhong等人在ccs2020发表的文章“squirrel:testing database management systems with language validity and coverage feedback(一种基于语言有效性和覆盖率反馈方法的数据库管理系统测试方法)”中的种子突变策略对qqk进行突变生成新种子qqe',将qqe'加入到q
k”中去;
[0081]
5.4.4.4令e=e+1,如果e≤e,转5.4.4.3;如果e》e,说明对qqk突变e次得到e个新种子均已加入q
k”中去,q
k”={qq1',qq2',...,qqe',...qqe'},转5.4.5;
[0082]
5.4.5把q
k”中的所有新种子(即qq1',qq2',...,qqe',...qqe')喂给s执行,将q
k”中覆盖了s中新的代码段的新种子加入到种子队列q中去,将q”中导致s崩溃或者挂起的新种子加入到cs中,方法是:
[0083]
5.4.5.1初始化变量e=1;
[0084]
5.4.5.2将qqe'喂给s执行,如果qqe'覆盖了s中新的代码段(之前的种子没覆盖的
代码段),则将qqe'加入到种子队列q中去;如果qqe'执行导致s崩溃(根据操作系统发出的信号sigkill进行判断)或者挂起(根据种子执行时间是否超过maxt),则将qqe'加入到cs中去;
[0085]
5.4.5.3令e=e+1,如果e≤e,转5.4.5.2;如果e》e,说明q
k”中所有覆盖了s中新的代码段的种子均已加入q中去,转5.4.6;
[0086]
5.4.6令k=k+1,如果k≤k,转5.4.2;如果k》k且测试时间小于24小时,说明q'中所有种子均已突变完毕但测试时间未满足用户要求,转5.3重新选择优先级队列q'进行下一轮的模糊测试;如果k》k且测试时间大于等于24小时,说明测试时间满足用户要求,输出cs(cs中存放的是触发配置缺陷的测试用例集合,即配置缺陷集合)。
[0087]
与现有技术相比,采用本发明能达到以下有益效果:
[0088]
1、采用本发明能对被测软件中的配置代码进行充分测试。采用本发明在3款开源流行软件mysql、postgresql、sqlite中进行配置污点分析得到配置相关基本块的测试集,本发明对配置相关基本块的覆盖率能够达到42.9%。而已有工作(背景技术二)(rui zhong等人在ccs 2020发表的“squirrel:testing database management systems with language validity and coverage feedback”用语言有效性和覆盖率反馈测试数据库管理系统)仅能达到35.4%的覆盖率。
[0089]
2、采用本发明能为软件社区检测出2个新的配置缺陷,并上报软件社区反馈给开发者确认,防止了潜在的因软件配置缺陷可能导致的经济、用户损失。其中,为mysql社区检测出2个新缺陷(缺陷id为mysql-110730,mysql-110956)。
[0090]
3.本发明在5.4.3步给距离配置相关基本块更近的种子分配更多的突变次数,使得定向模糊测试模块不需要花费大量时间探索配置无关程序路径,相比背景技术二缩短了测试时间。
附图说明
[0091]
图1是本发明的总体流程图;
[0092]
图2是本发明第一步构建的面向配置缺陷的定向模糊测试系统的逻辑结构图。
具体实施方式
[0093]
下面结合附图对本发明进行说明。
[0094]
如图1所示,本发明包括以下步骤:
[0095]
第一步,构建面向配置缺陷的定向模糊测试系统,面向配置缺陷的定向模糊测试系统如图2所示,由配置污点分析模块、距离计算模块、配置与距离插桩模块、定向模糊测试模块组成。
[0096]
配置污点分析模块与距离计算模块、配置与距离插桩模块相连,读取用户输入的待检测软件源码和目标配置集合,对待检测软件源码和目标配置集合进行污点分析,得到目标配置集合中所有目标配置的影响范围以及配置与程序基本块映射关系集合ms,将ms发送给距离计算模块和配置与距离插桩模块。
[0097]
距离计算模块和配置污点分析模块、配置与距离插桩模块相连,从配置污点分析模块接收ms,从ms筛选得到目标基本块集合tbs,根据用户输入的待检测软件源码生成调用
图和控制流图,通过迪杰斯特拉算法计算待检测软件源码的每个基本块到目标基本块的距离,得到距离信息集合ds,将ds发送给配置与距离插桩模块。
[0098]
配置与距离插桩模块和配置污点分析模块、距离计算模块与定向模糊测试模块相连,读入用户输入的待检测软件源码,从配置污点分析模块接收ms,从距离计算模块接收ds,根据ms和ds对软件源码进行插桩,得到插桩后的软件s,将s发送给定向模糊测试模块。
[0099]
定向模糊测试模块和配置与距离插桩模块相连,从配置与距离插桩模块接收s,利用用户提供的初始种子库sp和配置文件,对s中的配置代码进行定向测试,输出配置缺陷集合cs。
[0100]
第二步,配置污点分析模块读取用户输入的待检测软件源码和目标配置集合,对待检测软件源码和目标配置集合进行污点分析,得到目标配置集合中所有目标配置的影响范围以及配置与程序基本块映射关系集合ms,将ms发送给距离计算模块和配置与距离插桩模块,方法是:
[0101]
2.1配置污点分析模块读入用户输入的待检测软件源码s0和目标配置集合c,c={c1,c2,...,ci,...,ci},其中ci为c中第i个目标配置,ci是常量字符串,i为c中目标配置的总数,1≤i≤i;
[0102]
2.2配置污点分析模块使用confmapper算法(参见shulin zhou等人在qrs-c 2016发表的文章《confmapper:automated variable finding for configuration items in source code》(一种从软件源码中自动发现配置参数初始变量的方法的第4页)分析s0,从软件源码s0中发现配置参数初始变量,得到c中i个目标配置的初始程序变量,由i个目标配置的初始程序变量(简称为i个配置变量)构成配置变量集合vc,vc={vc1,vc2,...,vci,...,vci},其中vci为ci对应的配置变量;
[0103]
2.3配置污点分析模块使用marek chalupa等人在atva 2020发表的文章“dg:analysis and slicing of llvm bitcode(一种基于low level virtual machine的程序分析和切片方法)”的dg(constructing dependence graphs for program analysis,基于构建依赖图的程序分析)算法,对vc中的配置变量进行污点分析,得到目标配置的影响范围(即污点传播变量在待检测软件源码s0中的位置)集合r,r={r1,r2,...,ri,...,ri},其中ri为ci的影响范围集合,ri={r1,r2,
…
,r
ni
,
…
,r
ni
},其中r
ni
为ri中第ni个污点传播变量在待检测软件源码s0中的位置,ni为影响范围集合ri中元素的个数,1≤ni≤ni;
[0104]
2.4配置污点分析模块定位r中r
ni
所在s0的程序基本块位置(程序基本块是顺序执行的指令序列,每个程序基本块只有一个入口和一个出口,入口就是其中的第—条指令,出口就是其中的最后一条指令),得到目标配置与程序基本块映射关系集合ms,ms={ms1,ms2,...,msi,...,msi},其中msi为ci的映射关系集合,ci与msi中的元素具有一对多的映射关系,msi={ms1,ms2,...,ms
ni
,...,ms
ni
},ms
ni
为ci映射的第ni个程序基本块,方法为:
[0105]
2.4.1初始化变量i=1;
[0106]
2.4.2初始化变量ni=1;
[0107]
2.4.3初始化
[0108]
2.4.4定位r
ni
在s0中的位置,找到r
ni
所在程序基本块的第一条指令inst,以inst所在的文件名和行号ms
ni
表示该程序基本块;
[0109]
2.4.5将ms
ni
加入msi;
[0110]
2.4.6令ni=ni+1,如果ni≤ni,转2.4.4;如果ni》ni,令ni=1,令i=i+1,转2.4.7;
[0111]
2.4.7如果i≤i,转2.4.3;如果i》i,说明ci映射的程序基本块均已放到ms中,转2.5;
[0112]
2.5将ms发送给距离计算模块和配置与距离插桩模块。
[0113]
第三步,距离计算模块从配置污点分析模块接收ms,从ms中筛选得到目标基本块集合tbs,并根据用户输入的待测软件源码生成调用图和控制流图,采用迪杰斯特拉算法计算待测软件源码的每个基本块到目标基本块的最短距离,得到距离信息集合ds,将ds发送给配置与距离插桩模块,方法是:
[0114]
3.1距离计算模块从配置污点分析模块接收ms,从ms中筛选控制软件资源分配的配置(例如buffer size、cache size、timeout等,这类配置往往更容易引发内存错误)对应的程序基本块,令这些程序基本块为目标基本块,得到目标基本块集合tbs,其中tbs={tbs1,tbs2,
…
,tbsm,
…
,tbsm},m为tbs中目标基本块个数,tbsm为tbs中第m个目标基本块,1≤m≤m;
[0115]
3.2距离计算模块使用low level virtual machine(llvm)框架(10.0.0版本及以上,后续所涉及的(llvm)框架版本号相同)中的modulepass工具分析被检测软件源码s0,得到s0中所有程序基本块集合bb,bb={bb1,bb2,...,bb
t
,...bb
t
},t为bb中程序基本块个数,bb
t
为bb中第t个程序基本块,1≤t≤t;
[0116]
3.3距离计算模块使用llvm框架中的optpass工具分析被检测软件源码s0,得到函数调用图cg和控制流图cfg;
[0117]
3.4距离计算模块根据cg和cfg,对bb中所有程序基本块到tbs中目标基本块的距离进行计算,得到距离信息集合ds,ds={ds1,ds2,...,ds
t
,...,ds
t
},其中ds
t
为一个二元组,ds
t
=[bb
t
,d
t
],bb
t
为bb中第t个程序基本块,d
t
为bb
t
到tbs的距离,t为距离信息集合ds中元素的个数,1≤t≤t,方法是:
[0118]
3.4.1初始化变量t=1,m=1;
[0119]
3.4.2初始化距离信息集合
[0120]
3.4.3初始化存放bb
t
到tbsm的距离集合
[0121]
3.4.4使用迪杰斯特拉算法计算bb
t
到tbsm的距离dm',将dm'放进d';
[0122]
3.4.5令m=m+1,如果m≤m,转3.4.4;如果m》m,计算bb
t
到tbs的距离d
t
,d
t
=d'中所有元素的平均值,转3.4.6;
[0123]
3.4.6将d
t
和bb
t
组合成二元组ds
t
,ds
t
=[bb
t
,d
t
],将ds
t
加入ds中;
[0124]
3.4.7令t=t+1,如果t≤t,转3.4.3;如果t》t,说明距离信息集合ds构建完毕,ds={ds1,ds2,...,ds
t
,...,ds
t
},转3.5;
[0125]
3.5将距离信息集合ds发送给配置与距离插桩模块。
[0126]
第四步:配置与距离插桩模块读入用户输入的待测软件源码,从配置污点分析模块接收ms,从距离计算模块接收ds,根据ms和ds对s0进行插桩,得到插桩后的待检测软件s,将s发送给定向模糊测试模块,方法是:
[0127]
4.1配置与距离插桩模块根据ds对s0插桩,得到第一次插桩后的待检测软件s1,方法是:
[0128]
4.1.1初始化变量t=1;
[0129]
4.1.2使用llvm框架的modulepass工具分析被检测软件源码s0,得到ds
t
中的bb
t
在s0中的位置loc
t
;
[0130]
4.1.3从ds
t
中获取bb
t
对应的d
t
;
[0131]
4.1.4使用llvm框架的irbuilder接口在loc
t
处插入存储d
t
值到共享内存中的store指令,简称第一值存储指令(通过这种方式可以在s1运行时获得bb
t
到tbs的距离信息);
[0132]
4.1.5令t=t+1,如果t≤t,转4.1.2;如果t》t,说明ds中的所有程序基本块到tbs的距离信息插桩完毕,得到第一次插桩后的待检测软件s1,转4.2;
[0133]
4.2配置与距离插桩模块根据ms对s1插桩,得到插桩后的待检测软件s,方法是:
[0134]
4.2.1初始化变量i=1;
[0135]
4.2.2初始化变量ni=1;
[0136]
4.2.3使用llvm框架的modulepass工具分析s1,得到ms
ni
在s1中的位置loc
ni
;
[0137]
4.2.4使用llvm框架的irbuilder接口在loc
ni
处插入存储ci到共享内存中的store指令,简称第二值存储指令(通过这种方式可以在s运行时获得ci信息);
[0138]
4.2.5令ni=ni+1,如果ni≤ni,转4.2.3;如果ni》ni,转4.2.6;
[0139]
4.2.6令i=i+1,如果i≤i,转4.2.2;如果i》i,说明根据ms对s1插桩完毕,得到第二次插桩后的待检测软件s,转4.3;
[0140]
4.3将插桩后的软件s发送给给定向模糊测试模块。
[0141]
第五步:定向模糊测试模块根据种子选择策略赋予经过配置代码的种子(模糊测试领域中,种子代表测试用例)最高的优先级,根据能量调度策略给距离配置代码更近的种子分配更多的突变(对测试用例进行随机的比特翻转和字节替换)次数,检测目标软件的配置缺陷,方法是:
[0142]
5.1定向模糊测试模块从配置与距离插桩模块接收插桩后的待检测软件s;
[0143]
5.2定向模糊测试模块利用用户提供的初始种子库sp(初始种子库中包含了用户提供的初始测试用例,以文件的形式保存)生成初始种子队列q,sp={sp1,sp2,...,spj,...spj},其中spj为初始种子库中第j个种子,j为sp中初始种子的个数,1≤j≤j,方法是:
[0144]
5.2.1初始化变量j=1;
[0145]
5.2.2初始化种子队列
[0146]
5.2.3将种子spj发送给插桩后的待检测软件s;
[0147]
5.2.4从用户提供的配置文件中获取用户定义的最大尺寸maxsize,用户定义的最大时长maxt;
[0148]
5.2.5判断spj文件大小是否超过maxsize,如果是,说明spj会影响模糊测试运行时的种子执行速度,令j=j+1,转5.2.3,如果否,转5.2.6;
[0149]
5.2.6判断种子spj执行时间是否超过maxt,如果是,说明spj会导致s挂起,令j=j+1,转5.2.3;如果否,转5.2.7;
[0150]
5.2.7判断种子spj是否会导致软件s的崩溃(根据操作系统发出的信号sigkill进行判断),如果是,说明spj会带来安全隐患,令j=j+1,转5.2.3;如果否,说明spj是一个安全的种子,转5.2.8;
[0151]
5.2.8令种子队列q中第z个种子qz=spj,将qz加入初始种子队列q;
[0152]
5.2.9若j=j,说明初始种子库中的所有种子处理完毕,得到了种子队列q,q={q1,q2,...,qz,...qz},z为q中种子的个数,1≤z≤j,1≤z≤z,转5.3,否则,令j=j+1,转5.2.3;
[0153]
5.3定向模糊测试模块根据种子执行路径上是否含有配置相关基本块(即ms中的程序基本块)对q进行选择,得到种子优先级队列q',q'={qq1,qq2,...,qqk,...qk},qqk为q'中第k个种子,k为q'中种子的个数,1≤k≤k,1≤k≤z,然后从q'中顺序选择一个种子进行模糊测试,方法是:
[0154]
5.3.1初始化变量z=1;
[0155]
5.3.2初始化优先级队列
[0156]
5.3.3将种子qz发送给插桩后的待检测软件s试运行;
[0157]
5.3.4根据插桩信息判断种子qz的执行路径上是否含有配置相关基本块,如果是,令q'中第k个种子qqk=qz,将qqk加入种子优先级队列q',q'中的种子将会被定向模糊测试模块优先选择,令z=z+1,转5.3.5;否则,说明种子qz与配置无关,直接转5.3.5;
[0158]
5.3.5若z=z,说明q中所有执行路径上含有配置相关基本块的种子均已放入q'中,转5.4;否则,令z=z+1,转5.3.3;
[0159]
5.4定向模糊测试模块从q'中选择种子,为选择好的种子分配突变次数e,然后根据种子突变策略对选择的种子进行突变,突变得到的新种子如果覆盖了插桩后的待检测软件s新的代码段,则将新种子加入到种子队列q中去,方法是:
[0160]
5.4.1初始化变量k=1;
[0161]
5.4.2从q'中选择种子qqk;
[0162]
5.4.3定向模糊测试模块使用marcel等人在ccs 2017发表的文章“directed greybox fuzzing(定向灰盒模糊测试)”中的模拟退火算法根据qqk到tbs距离(根据ds对s0插桩后在s运行时获得bb
t
到tbs的距离信息,计算qqk执行路径上经过的程序基本块到tbs的距离之和作为qqk到tbs距离),计算得到qqk的突变次数e;
[0163]
5.4.4对qqk突变e次,得到新种子集合q
k”,q
k”={qq1',qq2',...,qqe',...qqe'},qqe'为q
k”'中第e个新种子,e为q
k”中新种子的个数,1≤e≤e,方法是:
[0164]
5.4.4.1初始化变量e=1;
[0165]
5.4.4.2初始化新种子集合
[0166]
5.4.4.3定向模糊测试模块使用rui zhong等人在ccs2020发表的文章“squirrel:testing database management systems with language validity and coverage feedback(一种基于语言有效性和覆盖率反馈方法的数据库管理系统测试方法)”中的种子突变策略对qqk进行突变生成新种子qqe',将qqe'加入到q
k”中去;
[0167]
5.4.4.4令e=e+1,如果e≤e,转5.4.4.3;如果e》e,说明对qqk突变e次得到e个新种子均已加入q
k”中去,q
k”={qq1',qq2',...,qqe',...qqe'},转5.4.5;
[0168]
5.4.5把q
k”中的所有新种子(即qq1',qq2',...,qqe',...qqe')喂给s执行,将q
k”中覆盖了s中新的代码段的新种子加入到种子队列q中去,将q”中导致s崩溃或者挂起的新种子加入到cs中,方法是:
[0169]
5.4.5.1初始化变量e=1;
[0170]
5.4.5.2将qqe'喂给s执行,如果qqe'覆盖了s中新的代码段(之前的种子没覆盖的
代码段),则将qqe'加入到种子队列q中去;如果qqe'执行导致s崩溃(根据操作系统发出的信号sigkill进行判断)或者挂起(根据种子执行时间是否超过maxt),则将qqe'加入到cs中去;
[0171]
5.4.5.3令e=e+1,如果e≤e,转5.4.5.2;如果e》e,说明q
k”中所有覆盖了s中新的代码段的种子均已加入q中去,转5.4.6;
[0172]
5.4.6令k=k+1,如果k≤k,转5.4.2;如果k》k且测试时间小于24小时,说明q'中所有种子均已突变完毕但测试时间未满足用户要求,转5.3重新选择优先级队列q'进行下一轮的模糊测试;如果k》k且测试时间大于等于24小时,说明测试时间满足用户要求,输出cs(cs中存放的是触发配置缺陷的测试用例集合,即配置缺陷集合)。
[0173]
为了验证本发明检测配置缺陷问题的效果,在一台ubuntu18.04操作系统,搭载8核intel core i7-9700k,32gb内存的计算机上开展本发明与背景技术中的squirrel的对比实验(squirrel为rui zhong等人在ccs2020发表的“squirrel:testing database management systems with language validity and coverage feedback中设计的工具),ubuntu18.04操作系统的内核版本为5.8.0,软件环境为llvm10.0.0+python3.8,主要编码语言为c++语言。实验选择mysql、postgresql、sqlite三款软件作为目标软件进行评估。由于本发明检测的数据库配置缺陷问题是一种新型的缺陷问题,目前没有专门进行检测的技术,故本发明与数据库缺陷检测问题的最前沿技术squirrel(背景技术二)进行比较,结果如表1所示,实验证明,本发明与背景技术二相比,在执行相同的运行时间下,可检测出更多的配置缺陷。其中本发明检测出2个数据库配置缺陷,背景技术二没有检测出配置缺陷,说明本发明比背景技术二的检测有效性和检测效率更高。
[0174]
表1.本发明与背景技术二的检测配置缺陷能力对比
[0175]
技术特征:
1.一种面向配置缺陷的定向模糊测试方法,其特征在于包括以下步骤:第一步,构建面向配置缺陷的定向模糊测试系统,面向配置缺陷的定向模糊测试系统由配置污点分析模块、距离计算模块、配置与距离插桩模块、定向模糊测试模块构成;配置污点分析模块与距离计算模块、配置与距离插桩模块相连,读取用户输入的待检测软件源码和目标配置集合,对待检测软件源码和目标配置集合进行污点分析,得到目标配置集合中所有目标配置的影响范围以及配置与程序基本块映射关系集合ms,将ms发送给距离计算模块和配置与距离插桩模块;距离计算模块和配置污点分析模块、配置与距离插桩模块相连,从配置污点分析模块接收ms,从ms筛选得到目标基本块集合tbs,根据用户输入的待检测软件源码生成调用图和控制流图,通过迪杰斯特拉算法计算待检测软件源码的每个基本块到目标基本块的距离,得到距离信息集合ds,将ds发送给配置与距离插桩模块;配置与距离插桩模块和配置污点分析模块、距离计算模块与定向模糊测试模块相连,读入用户输入的待检测软件源码,从配置污点分析模块接收ms,从距离计算模块接收ds,根据ms和ds对软件源码进行插桩,得到插桩后的软件s,将s发送给定向模糊测试模块;定向模糊测试模块和配置与距离插桩模块相连,从配置与距离插桩模块接收s,利用用户提供的初始种子库sp和配置文件,对s中的配置代码进行定向测试,输出配置缺陷集合cs;第二步,配置污点分析模块读取用户输入的待检测软件源码和目标配置集合,对待检测软件源码和目标配置集合进行污点分析,得到目标配置集合中所有目标配置的影响范围以及配置与程序基本块映射关系集合ms,将ms发送给距离计算模块和配置与距离插桩模块,方法是:2.1配置污点分析模块读入用户输入的待检测软件源码s0和目标配置集合c,c={c1,c2,...,c
i
,...,c
i
},其中c
i
为c中第i个目标配置,c
i
是常量字符串,i为c中目标配置的总数,1≤i≤i;2.2配置污点分析模块使用confmapper算法分析s0,从s0中发现配置参数初始变量,得到c中i个目标配置的初始程序变量,由i个目标配置的初始程序变量即i个配置变量构成配置变量集合vc,vc={vc1,vc2,...,vc
i
,...,vc
i
},其中vc
i
为c
i
对应的配置变量;2.3配置污点分析模块使用dg算法,对vc中的配置变量进行污点分析,得到目标配置的影响范围即污点传播变量在待检测软件源码s0中的位置集合r,r={r1,r2,...,r
i
,...,r
i
},其中ri为c
i
的影响范围集合,r
i
={r1,r2,
…
,r
ni
,
…
,r
ni
},其中r
ni
为r
i
中第n
i
个污点传播变量在待检测软件源码s0中的位置,n
i
为影响范围集合r
i
中元素的个数,1≤n
i
≤n
i
;2.4配置污点分析模块定位r中r
ni
所在s0的程序基本块位置,得到目标配置与程序基本块映射关系集合ms,ms={ms1,ms2,...,ms
i
,...,ms
i
},其中ms
i
为c
i
的映射关系集合,c
i
与ms
i
中的元素具有一对多的映射关系,ms
i
={ms1,ms2,...,ms
ni
,...,ms
ni
},ms
ni
为c
i
映射的第n
i
个程序基本块;2.5将ms发送给距离计算模块和配置与距离插桩模块;第三步,距离计算模块从配置污点分析模块接收ms,从ms筛选得到目标基本块集合tbs,并根据用户输入的待测软件源码生成调用图和控制流图,采用迪杰斯特拉算法计算待测软件源码的每个基本块到目标基本块的最短距离,得到距离信息集合ds,将ds发送给配
置与距离插桩模块,方法是:3.1距离计算模块从配置污点分析模块接收ms,从ms中筛选控制软件资源分配的配置对应的程序基本块,令这些程序基本块为目标基本块,得到目标基本块集合tbs,其中tbs={tbs1,tbs2,
…
,tbs
m
,
…
,tbs
m
},m为tbs中目标基本块个数,tbs
m
为tbs中第m个目标基本块,1≤m≤m;3.2距离计算模块使用llvm框架中的modulepass工具分析被检测软件源码s0,得到s0中所有程序基本块集合bb,bb={bb1,bb2,...,bb
t
,...bb
t
},t为bb中程序基本块个数,bb
t
为bb中第t个程序基本块,1≤t≤t;3.3距离计算模块使用llvm框架中的optpass工具分析被检测软件源码s0,得到函数调用图cg和控制流图cfg;3.4距离计算模块根据cg和cfg,对bb中所有程序基本块到tbs中目标基本块的距离进行计算,得到距离信息集合ds,ds={ds1,ds2,...,ds
t
,...,ds
t
},其中ds
t
为一个二元组,ds
t
=[bb
t
,d
t
],bb
t
为bb中第t个程序基本块,d
t
为bb
t
到tbs的距离,t为距离信息集合ds中元素的个数,1≤t≤t;3.5将距离信息集合ds发送给配置与距离插桩模块;第四步:配置与距离插桩模块读入用户输入的待测软件源码,从配置污点分析模块接收ms,从距离计算模块接收ds,根据ms和ds对s0进行插桩,得到插桩后的待检测软件s,将s发送给定向模糊测试模块,方法是:4.1配置与距离插桩模块根据ds对s0插桩,得到第一次插桩后的待检测软件s1,方法是:4.1.1初始化变量t=1;4.1.2使用llvm框架的modulepass工具分析被检测软件源码s0,得到ds
t
中的bb
t
在s0中的位置loc
t
;4.1.3从ds
t
中获取bb
t
对应的d
t
;4.1.4使用llvm框架的irbuilder接口在loc
t
处插入存储d
t
值到共享内存中的store指令,简称第一值存储指令;4.1.5令t=t+1,如果t≤t,转4.1.2;如果t>t,说明ds中的所有程序基本块到tbs的距离信息插桩完毕,得到第一次插桩后的待检测软件s1,转4.2;4.2配置与距离插桩模块根据ms对s1插桩,得到插桩后的待检测软件s,方法是:4.2.1初始化变量i=1;4.2.2初始化变量n
i
=1;4.2.3使用llvm框架的modulepass工具分析s1,得到ms
ni
在s1中的位置loc
ni
;4.2.4使用llvm框架的irbuilder接口在loc
ni
处插入存储c
i
到共享内存中的store指令,简称第二值存储指令;4.2.5令n
i
=n
i
+1,如果n
i
≤n
i
,转4.2.3;如果n
i
>n
i
,转4.2.6;4.2.6令i=i+1,如果i≤i,转4.2.2;如果i>i,说明根据ms对s1插桩完毕,得到第二次插桩后的待检测软件s,转4.3;4.3将插桩后的软件s发送给给定向模糊测试模块;第五步:定向模糊测试模块根据种子选择策略赋予经过配置代码的种子最高的优先级,根据能量调度策略给距离配置代码更近的种子分配更多的突变次数,检测目标软件的
配置缺陷,方法是:5.1定向模糊测试模块从配置与距离插桩模块接收插桩后的待检测软件s;5.2定向模糊测试模块利用用户提供的初始种子库sp生成初始种子队列q,sp={sp1,sp2,...,sp
j
,...sp
j
},其中sp
j
为初始种子库中第j个种子,j为sp中初始种子的个数,1≤j≤j,方法是:5.2.1初始化变量j=1;5.2.2初始化种子队列5.2.3将种子sp
j
发送给插桩后的待检测软件s;5.2.4从用户提供的配置文件中获取用户定义的最大尺寸maxsize,用户定义的最大时长maxt;5.2.5判断sp
j
文件大小是否超过maxsize,如果是,说明sp
j
会影响模糊测试运行时的种子执行速度,令j=j+1,转5.2.3;如果否,转5.2.6;5.2.6判断种子sp
j
执行时间是否超过maxt,如果是,说明sp
j
会导致s挂起,令j=j+1,转5.2.3;如果否,转5.2.7;5.2.7判断种子sp
j
是否会导致软件s的崩溃,如果是,说明sp
j
会带来安全隐患,令j=j+1,转5.2.3;如果否,说明sp
j
是一个安全的种子,转5.2.8;5.2.8令种子队列q中第z个种子q
z
=sp
j
,将q
z
加入初始种子队列q;5.2.9若j=j,说明初始种子库中的所有种子处理完毕,得到了种子队列q,q={q1,q2,...,q
z
,...q
z
},z为q中种子的个数,1≤z≤j,1≤z≤z,转5.3,否则,令j=j+1,转5.2.3;5.3定向模糊测试模块根据种子执行路径上是否含有配置相关基本块即ms中的程序基本块对q进行选择,得到种子优先级队列q',q'={qq1,qq2,...,qq
k
,...q
k
k
为q'中第k个种子,k为q'中种子的个数,1≤k≤k,1≤k≤z,然后从q'中顺序选择一个种子进行模糊测试,方法是:5.3.1初始化变量z=1;5.3.2初始化优先级队列5.3.3将种子q
z
发送给插桩后的待检测软件s试运行;5.3.4根据插桩信息判断种子q
z
的执行路径上是否含有配置相关基本块,如果是,令q'中第k个种子qq
k
=q
z
,将qq
k
加入种子优先级队列q',q'中的种子将会被定向模糊测试模块优先选择,令z=z+1,转5.3.5;否则,说明种子q
z
与配置无关,直接转5.3.5;5.3.5若z=z,说明q中所有执行路径上含有配置相关基本块的种子均已放入q'中,转5.4;否则,令z=z+1,转5.3.3;5.4定向模糊测试模块从q'中选择种子,为选择好的种子分配突变次数e,然后根据种子突变策略对选择的种子进行突变,突变得到的新种子如果覆盖了插桩后的待检测软件s新的代码段,则将新种子加入到种子队列q中去,方法是:5.4.1初始化变量k=1;5.4.2从q'中选择种子qq
k
;5.4.3定向模糊测试模块使用模拟退火算法根据qq
k
到tbs距离,计算得到qq
k
的突变次数e;5.4.4对qq
k
突变e次,得到新种子集合q
k”,q
k”={qq1',qq2',...,qq
e
e
e
'为
q
k”'中第e个新种子,e为q
k”中新种子的个数,1≤e≤e;5.4.5把q
k”中的所有新种子喂给s执行,将q
k”中覆盖了s中新的代码段的新种子加入到种子队列q中,将q”中导致s崩溃或者挂起的新种子加入到cs中,方法是:5.4.5.1初始化变量e=1;5.4.5.2将qq
e
'喂给s执行,如果qq
e
'覆盖了s中新的代码段即之前的种子没覆盖的代码段,则将qq
e
'加入到种子队列q中;如果qq
e
'执行导致s崩溃或者挂起,则将qq
e
'加入到cs中;5.4.5.3令e=e+1,如果e≤e,转5.4.5.2;如果e>e,说明q
k”中所有覆盖了s中新的代码段的种子均已加入q中,转5.4.6;5.4.6令k=k+1,如果k≤k,转5.4.2;如果k>k且测试时间小于24小时,说明q'中所有种子均已突变完毕但测试时间未满足用户要求,转5.3重新选择优先级队列q'进行下一轮的模糊测试;如果k>k且测试时间大于等于24小时,说明测试时间满足用户要求,输出cs,cs中存放触发配置缺陷的测试用例集合,即配置缺陷集合。2.如权利要求1所述的一种面向配置缺陷的定向模糊测试方法,其特征在于2.4步所述配置污点分析模块定位r中r
ni
所在s0的程序基本块位置,得到目标配置与程序基本块映射关系集合ms的方法是:2.4.1初始化变量i=1;2.4.2初始化变量n
i
=1;2.4.3初始化2.4.4定位r
ni
在s0中的位置,找到r
ni
所在程序基本块的第一条指令inst,以inst所在的文件名和行号ms
ni
表示该程序基本块;2.4.5将ms
ni
加入ms
i
;2.4.6令n
i
=n
i
+1,如果n
i
≤n
i
,转2.4.4;如果n
i
>n
i
,令n
i
=1,令i=i+1,转2.4.7;2.4.7如果i≤i,转2.4.3;如果i>i,说明c
i
映射的程序基本块均已放到ms中,结束。3.如权利要求1所述的一种面向配置缺陷的定向模糊测试方法,其特征在于3.1步所述控制软件资源分配的配置包括buffer size即缓存区大小、cache size即寄存器大小、timeout即超时。4.如权利要求1所述的一种面向配置缺陷的定向模糊测试方法,其特征在于所述llvm框架为10.0.0版本及以上。5.如权利要求1所述的一种面向配置缺陷的定向模糊测试方法,其特征在于3.4步所述距离计算模块根据cg和cfg,对bb中所有程序基本块到tbs中目标基本块的距离进行计算,得到距离信息集合ds的方法是:3.4.1初始化变量t=1,m=1;3.4.2初始化距离信息集合3.4.3初始化存放bb
t
到tbs
m
的距离集合3.4.4使用迪杰斯特拉算法计算bb
t
到tbs
m
的距离d
m
',将d
m
'放进d';3.4.5令m=m+1,如果m≤m,转3.4.4;如果m>m,计算bb
t
到tbs的距离d
t
,d
t
=d'中所有元素的平均值,转3.4.6;3.4.6将d
t
和bb
t
组合成二元组ds
t
,ds
t
=[bb
t
,d
t
],将ds
t
加入ds中;3.4.7令t=t+1,如果t≤t,转3.4.3;如果t>t,说明距离信息集合ds构建完毕,ds=
{ds1,ds2,...,ds
t
,...,ds
t
},结束。6.如权利要求1所述的一种面向配置缺陷的定向模糊测试方法,其特征在于5.2.7步所述判断种子sp
j
是否会导致软件s的崩溃的方法是根据操作系统发出的信号sigkill进行判断,sigkill表示终结进程。7.如权利要求1所述的一种面向配置缺陷的定向模糊测试方法,其特征在于5.4.3步所述qq
k
到tbs距离的获取方法是:根据ds对s0插桩后在s运行时获得bb
t
到tbs的距离信息,计算qq
k
执行路径上经过的程序基本块到tbs的距离之和作为qq
k
到tbs距离。8.如权利要求1所述的一种面向配置缺陷的定向模糊测试方法,其特征在于5.4.4步所述对qq
k
突变e次,得到新种子集合q
k”的方法是:5.4.4.1初始化变量e=1;5.4.4.2初始化新种子集合5.4.4.3定向模糊测试模块使用种子突变策略对qq
k
进行突变生成新种子qq
e
',将qq
e
'加入到q
k”中;5.4.4.4令e=e+1,如果e≤e,转5.4.4.3;如果e>e,说明对qq
k
突变e次得到e个新种子均已加入q
k”中去,q
k”={qq1',qq2',...,qq
e
e
'},结束。9.如权利要求1所述的一种面向配置缺陷的定向模糊测试方法,其特征在于5.4.5.2步所述qq
e
'执行导致s挂起是根据种子执行时间是否超过maxt来判定。
技术总结
本发明公开了一种面向配置缺陷的定向模糊测试方法,目的是解决目前缺陷检测方法准确性有限,测试时间长问题。技术方案为:构建由配置污点分析模块、距离计算模块、配置与距离插桩模块、定向模糊测试模块构成的面向配置缺陷的定向模糊测试系统;配置污点分析模块获取目标配置的影响范围以及配置与程序基本块映射关系集合;距离计算模块计算程序中的每个基本块到目标基本块的距离,得到距离信息集合;配置与距离插桩模块读入待测软件源码、配置与程序基本块映射关系集合以及距离信息集合,对软件源码进行插桩;定向模糊测试模块对插桩后软件中的配置代码定向测试,得到配置缺陷集合。采用本发明能对配置代码进行充分测试,准确性高,测试时间短。测试时间短。测试时间短。
技术研发人员:李姗姗 张元良 李解 王腾 陈立前 方寸谛 谢一帆 胡柳敏 黄响兵
受保护的技术使用者:中国人民解放军国防科技大学
技术研发日:2023.07.03
技术公布日:2023/10/8
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
航空商城 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/