CN116841886B - 一种面向配置缺陷的定向模糊测试方法 - Google Patents
一种面向配置缺陷的定向模糊测试方法 Download PDFInfo
- Publication number
- CN116841886B CN116841886B CN202310805942.6A CN202310805942A CN116841886B CN 116841886 B CN116841886 B CN 116841886B CN 202310805942 A CN202310805942 A CN 202310805942A CN 116841886 B CN116841886 B CN 116841886B
- Authority
- CN
- China
- Prior art keywords
- configuration
- module
- distance
- seed
- software
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 230000007547 defect Effects 0.000 title claims abstract description 69
- 238000010998 test method Methods 0.000 title claims abstract description 11
- 238000012360 testing method Methods 0.000 claims abstract description 140
- 238000004458 analytical method Methods 0.000 claims abstract description 68
- 238000004364 calculation method Methods 0.000 claims abstract description 52
- 238000013507 mapping Methods 0.000 claims abstract description 22
- 239000008186 active pharmaceutical agent Substances 0.000 claims description 62
- 238000000034 method Methods 0.000 claims description 61
- 238000003780 insertion Methods 0.000 claims description 51
- 230000037431 insertion Effects 0.000 claims description 51
- 230000035772 mutation Effects 0.000 claims description 19
- 230000006870 function Effects 0.000 claims description 6
- 238000006243 chemical reaction Methods 0.000 claims description 4
- 238000002922 simulated annealing Methods 0.000 claims description 4
- 238000002703 mutagenesis Methods 0.000 claims description 3
- 231100000350 mutagenesis Toxicity 0.000 claims description 3
- 230000004044 response Effects 0.000 claims description 2
- 238000011218 seed culture Methods 0.000 claims 1
- 238000001514 detection method Methods 0.000 abstract description 12
- 238000005516 engineering process Methods 0.000 description 11
- 238000007726 management method Methods 0.000 description 9
- 241000555745 Sciuridae Species 0.000 description 8
- 235000000334 grey box Nutrition 0.000 description 3
- 244000085685 grey box Species 0.000 description 3
- 238000011161 development Methods 0.000 description 2
- 238000002474 experimental method Methods 0.000 description 2
- 238000013101 initial test Methods 0.000 description 2
- 238000004519 manufacturing process Methods 0.000 description 2
- 206010000117 Abnormal behaviour Diseases 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000012790 confirmation Methods 0.000 description 1
- 238000003745 diagnosis Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000011156 evaluation Methods 0.000 description 1
- 238000004880 explosion Methods 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 238000011835 investigation Methods 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000013522 software testing Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/368—Test management for test version control, e.g. updating test cases to a new software version
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种面向配置缺陷的定向模糊测试方法,目的是解决目前缺陷检测方法准确性有限,测试时间长问题。技术方案为:构建由配置污点分析模块、距离计算模块、配置与距离插桩模块、定向模糊测试模块构成的面向配置缺陷的定向模糊测试系统;配置污点分析模块获取目标配置的影响范围以及配置与程序基本块映射关系集合;距离计算模块计算程序中的每个基本块到目标基本块的距离,得到距离信息集合;配置与距离插桩模块读入待测软件源码、配置与程序基本块映射关系集合以及距离信息集合,对软件源码进行插桩;定向模糊测试模块对插桩后软件中的配置代码定向测试,得到配置缺陷集合。采用本发明能对配置代码进行充分测试,准确性高,测试时间短。
Description
技术领域
本发明涉及大型开源软件中的配置缺陷检测领域,具体涉及一种面向配置缺陷的定向模糊测试方法。
背景技术
随着计算机技术的不断进步,互联网作为连接全球的信息交流平台正以前所未有的速度蓬勃发展,软件也成为人类生活中不可或缺的一部分,涉及各个方面和领域。软件配置是指以用户需求和软件的功能、结构及主要特性等为依据,选择和确定相关硬件、软件型号、版本及数量,规划软件放置位置和关联关系,设置软件相关参数值等。配置作为软件提供的与用户交互的接口,既可控制软件行为,又可管理系统资源分配,具有丰富的灵活性。然而,随着软件系统的不断发展,软件规模和复杂度不断增加,软件提供的配置项数量也越来越多。配置在为用户灵活使用软件带来便利的同时,随之而来的配置故障却导致软件服务失效频发,逐渐引起业界的广泛关注。Google公司的Barroso和通过调研发现,配置缺陷已成为导致Google服务失效的第二大原因,占比达到了近29%。
已有大量工作针对软件配置相关的缺陷检测展开研究,主要分为两类:一是配置功能代码缺陷检测,二是配置故障反应能力缺陷检测。前者主要通过动态或静态程序分析检测配置相关代码中的功能实现缺陷或者性能缺陷,但是无法快速生成大量的测试用例;后者通过提取软件的配置约束,注入配置错误来评估软件对于缺陷的反应能力,提升配置故障诊断的效率。事实上,不仅错误配置会导致软件系统的缺陷,有效的配置也可能暴露隐藏的软件缺陷。前人的工作大多关注错误配置值导致的系统故障,如TianyinXu等人在SOSP2013发表的“Do Not Blame Users for Misconfigurations(不要因为错误配置而责备用户)”,实现了面向软件源码的配置约束自动提取,通过注入违反约束的配置值观察被测程序反应。然而配置相关的软件缺陷大都是由合法值引起的。Sun等人在OSDI2020发表的“Testing Configuration Changes in Context to Prevent Production Failures(测试上下文中的配置更改以防止生产故障)”中研究发现46.3%-61.9%的配置缺陷具有完全合法有效的参数值,有效参数导致的配置缺陷的比例与无效参数导致的配置缺陷比例相似,甚至更高。然而,已有的配置缺陷检测工作缺少针对配置的测试用例,配置项数量众多,和测试用例组合状态空间爆炸,穷尽每一个配置项的每一个取值,并与测试用例组合是不切实际的。所以,配置测试不充分的问题一直存在。
近年来,模糊测试(Fuzzing)已经成为了软件测试领域的一个热门研究方向。模糊测试是一种基于随机输入的自动化测试技术,基本思想是快速生成大量随机输入并用其执行被测程序,监测程序状态,如果程序出现异常行为,如崩溃、断言失败等,就认为发现了一个漏洞。定向模糊测试(Directed Fuzzing)是一种对用户事先指定的程序目标位置高效测试的模糊测试技术,是模糊测试的一个分支,代表工作为M等人在Security2017发表的“Directed Greybox Fuzzing(定向灰盒模糊测试,以下简称背景技术一)”,主要基于模拟退火算法和种子能量调度策略,利用迪杰斯特拉算法计算每个种子到目标的距离,然后随着时间的推移给距离目标更近的种子分配更多的能量,以达到对目标位置充分测试的目的。另一方面,Rui Zhong等人在CCS2020发表的“SQUIRREL:Testing Database ManagementSystems with Language Validity and Coverage Feedback(一种基于语言有效性和覆盖率反馈方法的数据库管理系统测试方法,以下简称背景技术二)”,主要基于Fuzzing测试用例自动生成方法,利用执行测试后的覆盖率反馈生成多种测试用例,使得模糊测试朝着提升代码覆盖率的方向演化。但是由于配置的多样性以及配置代码的复杂性(配置代码即以配置在程序中的初始变量为源头进行污点分析得到的代码),背景技术二不理解被测程序中的配置代码特征,也无法优先选择经过配置代码的测试用例,导致无法充分覆盖被测程序中配置代码,检测配置缺陷。
综上所述,大型开源软件配置数量多且依赖复杂,是导致缺陷的主要原因之一。如何对被测程序中的配置代码进行充分测试,检测配置缺陷,避免花费大量时间探索配置无关的程序路径,提高测试的准确性,缩短测试时间是本领域技术人员极为关注的技术问题。
发明内容
本发明要解决的技术问题是针对目前配置相关的缺陷检测方法难以快速生成大量测试用例和现有定向模糊测试方法需要花费大量时间探索配置无关程序路径的问题,提供一种面向配置缺陷的定向模糊测试方法。本发明将定向模糊测试框架和配置污点分析进行融合,一方面将污点分析得到的配置代码作为定向模糊测试中的目标,另一方面对目标程序插桩,白盒化配置信息,从而充分测试配置代码,检测出软件中的配置缺陷,避免花费大量时间探索配置无关的程序路径,提高测试的准确性,缩短测试时间。
为解决上述技术问题,本发明的技术方案为:首先,构建面向配置缺陷的定向模糊测试系统,面向配置缺陷的定向模糊测试系统由配置污点分析模块、距离计算模块、配置与距离插桩模块、定向模糊测试模块组成;然后,配置污点分析模块读入待检测软件源码和目标配置集合,对待检测软件源码和目标配置集合进行污点分析,得到所有目标配置的影响范围以及配置与程序基本块映射关系集合MS,将MS发送给距离计算模块和配置与距离插桩模块;距离计算模块利用MS筛选得到目标基本块集合TBS,计算程序中的每个基本块到目标基本块的距离,得到距离信息集合DS,将DS发送给配置与距离插桩模块;配置与距离插桩模块读入待检测软件源码,从配置污点分析模块接收MS,从距离计算模块接收DS,根据MS和DS对软件源码进行插桩,得到插桩后的软件S,将插桩后的软件S发送给定向模糊测试模块。最后,定向模糊测试模块对S中的配置代码进行定向测试,输出配置缺陷集合CS。
本发明包括以下步骤:
第一步,构建面向配置缺陷的定向模糊测试系统,面向配置缺陷的定向模糊测试系统由配置污点分析模块、距离计算模块、配置与距离插桩模块、定向模糊测试模块构成。
配置污点分析模块与距离计算模块、配置与距离插桩模块相连,读取用户输入的待检测软件源码和目标配置集合,对待检测软件源码和目标配置集合进行污点分析,得到目标配置集合中所有目标配置的影响范围以及配置与程序基本块映射关系集合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,...,ci,...,cI},其中ci为C中第i个目标配置,ci是常量字符串,I为C中目标配置的总数,1≤i≤I;
2.2配置污点分析模块使用Confmapper算法(参见Shulin Zhou等人在QRS-C 2016发表的文章《Confmapper:Automated variable finding for configuration items insource code》(一种从软件源码中自动发现配置参数初始变量的方法的第4页)分析S0,从软件源码S0中发现配置参数初始变量,得到C中I个目标配置的初始程序变量,由I个目标配置的初始程序变量(简称为I个配置变量)构成配置变量集合VC,VC={vc1,vc2,...,vci,...,vcI},其中vci为ci对应的配置变量;
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,…,rni,…,rNi},其中rni为Ri中第ni个污点传播变量在待检测软件源码S0中的位置,Ni为影响范围集合Ri中元素的个数,1≤ni≤Ni;
2.4配置污点分析模块定位R中rni所在S0的程序基本块位置(程序基本块是顺序执行的指令序列,每个程序基本块只有一个入口和一个出口,入口就是其中的第—条指令,出口就是其中的最后一条指令),得到目标配置与程序基本块映射关系集合MS,MS={MS1,MS2,...,MSi,...,MSI},其中MSi为ci的映射关系集合,ci与MSi中的元素具有一对多的映射关系,MSi={ms1,ms2,...,msni,...,msNi},msni为ci映射的第ni个程序基本块,方法为:
2.4.1初始化变量i=1;
2.4.2初始化变量ni=1;
2.4.3初始化
2.4.4定位rni在S0中的位置,找到rni所在程序基本块的第一条指令Inst,以Inst所在的文件名和行号msni表示该程序基本块;
2.4.5将msni加入MSi;
2.4.6令ni=ni+1,如果ni≤Ni,转2.4.4;如果ni>Ni,令ni=1,令i=i+1,转2.4.7;
2.4.7如果i≤I,转2.4.3;如果i>I,说明ci映射的程序基本块均已放到MS中,转2.5;
2.5将MS发送给距离计算模块和配置与距离插桩模块。
第三步,距离计算模块从配置污点分析模块接收MS,从MS中筛选得到目标基本块集合TBS,并根据用户输入的待测软件源码生成调用图和控制流图,采用迪杰斯特拉算法计算待测软件源码的每个基本块到目标基本块的最短距离,得到距离信息集合DS,将DS发送给配置与距离插桩模块,方法是:
3.1距离计算模块从配置污点分析模块接收MS,从MS中筛选控制软件资源分配的配置(例如buffer size、cache size、timeout等,这类配置往往更容易引发内存错误)对应的程序基本块,令这些程序基本块为目标基本块,得到目标基本块集合TBS,其中TBS={tbs1,tbs2,…,tbsm,…,tbsM},M为TBS中目标基本块个数,tbsm为TBS中第m个目标基本块,1≤m≤M;
3.2距离计算模块使用Low Level Virtual Machine(LLVM)框架(10.0.0版本及以上,后续所涉及的(LLVM)框架版本号相同)中的ModulePass工具分析被检测软件源码S0,得到S0中所有程序基本块集合BB,BB={bb1,bb2,...,bbt,...bbT},T为BB中程序基本块个数,bbt为BB中第t个程序基本块,1≤t≤T;
3.3距离计算模块使用LLVM框架中的OptPass工具分析被检测软件源码S0,得到函数调用图CG和控制流图CFG;
3.4距离计算模块根据CG和CFG,对BB中所有程序基本块到TBS中目标基本块的距离进行计算,得到距离信息集合DS,DS={ds1,ds2,...,dst,...,dsT},其中dst为一个二元组,dst=[bbt,dt],bbt为BB中第t个程序基本块,dt为bbt到TBS的距离,T为距离信息集合DS中元素的个数,1≤t≤T,方法是:
3.4.1初始化变量t=1,m=1;
3.4.2初始化距离信息集合
3.4.3初始化存放bbt到tbsm的距离集合
3.4.4使用迪杰斯特拉算法计算bbt到tbsm的距离dm',将dm'放进D';
3.4.5令m=m+1,如果m≤M,转3.4.4;如果m>M,计算bbt到TBS的距离dt,dt=D'中所有元素的平均值,转3.4.6;
3.4.6将dt和bbt组合成二元组dst,dst=[bbt,dt],将dst加入DS中;
3.4.7令t=t+1,如果t≤T,转3.4.3;如果t>T,说明距离信息集合DS构建完毕,DS={ds1,ds2,...,dst,...,dsT},转3.5;
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,得到dst中的bbt在S0中的位置loct;
4.1.3从dst中获取bbt对应的dt;
4.1.4使用LLVM框架的IRBuilder接口在loct处插入存储dt值到共享内存中的Store指令,简称第一值存储指令(通过这种方式可以在S1运行时获得bbt到TBS的距离信息);
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初始化变量ni=1;
4.2.3使用LLVM框架的ModulePass工具分析S1,得到msni在S1中的位置locni;
4.2.4使用LLVM框架的IRBuilder接口在locni处插入存储ci到共享内存中的Store指令,简称第二值存储指令(通过这种方式可以在S运行时获得ci信息);
4.2.5令ni=ni+1,如果ni≤Ni,转4.2.3;如果ni>Ni,转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,...,spj,...spJ},其中spj为初始种子库中第j个种子,J为SP中初始种子的个数,1≤j≤J,方法是:
5.2.1初始化变量j=1;
5.2.2初始化种子队列
5.2.3将种子spj发送给插桩后的待检测软件S;
5.2.4从用户提供的配置文件中获取用户定义的最大尺寸MaxSize,用户定义的最大时长MaxT;
5.2.5判断spj文件大小是否超过MaxSize,如果是,说明spj会影响模糊测试运行时的种子执行速度,令j=j+1,转5.2.3;如果否,转5.2.6;
5.2.6判断种子spj执行时间是否超过MaxT,如果是,说明spj会导致S挂起,令j=j+1,转5.2.3;如果否,转5.2.7;
5.2.7判断种子spj是否会导致软件S的崩溃(根据操作系统发出的信号SIGKILL进行判断,SIGKILL表示终结进程),如果是,说明spj会带来安全隐患,令j=j+1,转5.2.3;如果否,说明spj是一个安全的种子,转5.2.8;
5.2.8令种子队列Q中第z个种子qz=spj,将qz加入初始种子队列Q;
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;
5.3定向模糊测试模块根据种子执行路径上是否含有配置相关基本块(即MS中的程序基本块)对Q进行选择,得到种子优先级队列Q',Q'={qq1,qq2,...,qqk,...qK},qqk为Q'中第k个种子,K为Q'中种子的个数,1≤k≤K,1≤K≤Z,然后从Q'中顺序选择一个种子进行模糊测试,方法是:
5.3.1初始化变量z=1;
5.3.2初始化优先级队列
5.3.3将种子qz发送给插桩后的待检测软件S试运行;
5.3.4根据插桩信息判断种子qz的执行路径上是否含有配置相关基本块,如果是,令Q'中第k个种子qqk=qz,将qqk加入种子优先级队列Q',Q'中的种子将会被定向模糊测试模块优先选择,令z=z+1,转5.3.5;否则,说明种子qz与配置无关,直接转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'中选择种子qqk;
5.4.3定向模糊测试模块使用Marcel等人在CCS 2017发表的文章“DirectedGreybox Fuzzing(定向灰盒模糊测试)”中的模拟退火算法根据qqk到TBS距离(根据DS对S0插桩后在S运行时获得bbt到TBS的距离信息,计算qqk执行路径上经过的程序基本块到TBS的距离之和作为qqk到TBS距离),计算得到qqk的突变次数E;
5.4.4对qqk突变E次,得到新种子集合Qk”,Qk”={qq1',qq2',...,qqe',...qqE'},qqe'为Qk”'中第e个新种子,E为Qk”中新种子的个数,1≤e≤E,方法是:
5.4.4.1初始化变量e=1;
5.4.4.2初始化新种子集合
5.4.4.3定向模糊测试模块使用Rui Zhong等人在CCS2020发表的文章“SQUIRREL:Testing Database Management Systems with Language Validity and CoverageFeedback(一种基于语言有效性和覆盖率反馈方法的数据库管理系统测试方法)”中的种子突变策略对qqk进行突变生成新种子qqe',将qqe'加入到Qk”中去;
5.4.4.4令e=e+1,如果e≤E,转5.4.4.3;如果e>E,说明对qqk突变E次得到E个新种子均已加入Qk”中去,Qk”={qq1',qq2',...,qqe',...qqE'},转5.4.5;
5.4.5把Qk”中的所有新种子(即qq1',qq2',...,qqe',...qqE')喂给S执行,将Qk”中覆盖了S中新的代码段的新种子加入到种子队列Q中去,将Q”中导致S崩溃或者挂起的新种子加入到CS中,方法是:
5.4.5.1初始化变量e=1;
5.4.5.2将qqe'喂给S执行,如果qqe'覆盖了S中新的代码段(之前的种子没覆盖的代码段),则将qqe'加入到种子队列Q中去;如果qqe'执行导致S崩溃(根据操作系统发出的信号SIGKILL进行判断)或者挂起(根据种子执行时间是否超过MaxT),则将qqe'加入到CS中去;
5.4.5.3令e=e+1,如果e≤E,转5.4.5.2;如果e>E,说明Qk”中所有覆盖了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中存放的是触发配置缺陷的测试用例集合,即配置缺陷集合)。
与现有技术相比,采用本发明能达到以下有益效果:
1、采用本发明能对被测软件中的配置代码进行充分测试。采用本发明在3款开源流行软件MySQL、PostgreSQL、SQLite中进行配置污点分析得到配置相关基本块的测试集,本发明对配置相关基本块的覆盖率能够达到42.9%。而已有工作(背景技术二)(Rui Zhong等人在CCS 2020发表的“Squirrel:Testing Database Management Systems withLanguage Validity and Coverage Feedback”用语言有效性和覆盖率反馈测试数据库管理系统)仅能达到35.4%的覆盖率。
2、采用本发明能为软件社区检测出2个新的配置缺陷,并上报软件社区反馈给开发者确认,防止了潜在的因软件配置缺陷可能导致的经济、用户损失。其中,为MySQL社区检测出2个新缺陷(缺陷ID为MySQL-110730,MySQL-110956)。
3.本发明在5.4.3步给距离配置相关基本块更近的种子分配更多的突变次数,使得定向模糊测试模块不需要花费大量时间探索配置无关程序路径,相比背景技术二缩短了测试时间。
附图说明
图1是本发明的总体流程图;
图2是本发明第一步构建的面向配置缺陷的定向模糊测试系统的逻辑结构图。
具体实施方式
下面结合附图对本发明进行说明。
如图1所示,本发明包括以下步骤:
第一步,构建面向配置缺陷的定向模糊测试系统,面向配置缺陷的定向模糊测试系统如图2所示,由配置污点分析模块、距离计算模块、配置与距离插桩模块、定向模糊测试模块组成。
配置污点分析模块与距离计算模块、配置与距离插桩模块相连,读取用户输入的待检测软件源码和目标配置集合,对待检测软件源码和目标配置集合进行污点分析,得到目标配置集合中所有目标配置的影响范围以及配置与程序基本块映射关系集合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,...,ci,...,cI},其中ci为C中第i个目标配置,ci是常量字符串,I为C中目标配置的总数,1≤i≤I;
2.2配置污点分析模块使用Confmapper算法(参见Shulin Zhou等人在QRS-C 2016发表的文章《Confmapper:Automated variable finding for configuration items insource code》(一种从软件源码中自动发现配置参数初始变量的方法的第4页)分析S0,从软件源码S0中发现配置参数初始变量,得到C中I个目标配置的初始程序变量,由I个目标配置的初始程序变量(简称为I个配置变量)构成配置变量集合VC,VC={vc1,vc2,...,vci,...,vcI},其中vci为ci对应的配置变量;
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,…,rni,…,rNi},其中rni为Ri中第ni个污点传播变量在待检测软件源码S0中的位置,Ni为影响范围集合Ri中元素的个数,1≤ni≤Ni;
2.4配置污点分析模块定位R中rni所在S0的程序基本块位置(程序基本块是顺序执行的指令序列,每个程序基本块只有一个入口和一个出口,入口就是其中的第—条指令,出口就是其中的最后一条指令),得到目标配置与程序基本块映射关系集合MS,MS={MS1,MS2,...,MSi,...,MSI},其中MSi为ci的映射关系集合,ci与MSi中的元素具有一对多的映射关系,MSi={ms1,ms2,...,msni,...,msNi},msni为ci映射的第ni个程序基本块,方法为:
2.4.1初始化变量i=1;
2.4.2初始化变量ni=1;
2.4.3初始化
2.4.4定位rni在S0中的位置,找到rni所在程序基本块的第一条指令Inst,以Inst所在的文件名和行号msni表示该程序基本块;
2.4.5将msni加入MSi;
2.4.6令ni=ni+1,如果ni≤Ni,转2.4.4;如果ni>Ni,令ni=1,令i=i+1,转2.4.7;
2.4.7如果i≤I,转2.4.3;如果i>I,说明ci映射的程序基本块均已放到MS中,转2.5;
2.5将MS发送给距离计算模块和配置与距离插桩模块。
第三步,距离计算模块从配置污点分析模块接收MS,从MS中筛选得到目标基本块集合TBS,并根据用户输入的待测软件源码生成调用图和控制流图,采用迪杰斯特拉算法计算待测软件源码的每个基本块到目标基本块的最短距离,得到距离信息集合DS,将DS发送给配置与距离插桩模块,方法是:
3.1距离计算模块从配置污点分析模块接收MS,从MS中筛选控制软件资源分配的配置(例如buffer size、cache size、timeout等,这类配置往往更容易引发内存错误)对应的程序基本块,令这些程序基本块为目标基本块,得到目标基本块集合TBS,其中TBS={tbs1,tbs2,…,tbsm,…,tbsM},M为TBS中目标基本块个数,tbsm为TBS中第m个目标基本块,1≤m≤M;
3.2距离计算模块使用Low Level Virtual Machine(LLVM)框架(10.0.0版本及以上,后续所涉及的(LLVM)框架版本号相同)中的ModulePass工具分析被检测软件源码S0,得到S0中所有程序基本块集合BB,BB={bb1,bb2,...,bbt,...bbT},T为BB中程序基本块个数,bbt为BB中第t个程序基本块,1≤t≤T;
3.3距离计算模块使用LLVM框架中的OptPass工具分析被检测软件源码S0,得到函数调用图CG和控制流图CFG;
3.4距离计算模块根据CG和CFG,对BB中所有程序基本块到TBS中目标基本块的距离进行计算,得到距离信息集合DS,DS={ds1,ds2,...,dst,...,dsT},其中dst为一个二元组,dst=[bbt,dt],bbt为BB中第t个程序基本块,dt为bbt到TBS的距离,T为距离信息集合DS中元素的个数,1≤t≤T,方法是:
3.4.1初始化变量t=1,m=1;
3.4.2初始化距离信息集合
3.4.3初始化存放bbt到tbsm的距离集合
3.4.4使用迪杰斯特拉算法计算bbt到tbsm的距离dm',将dm'放进D';
3.4.5令m=m+1,如果m≤M,转3.4.4;如果m>M,计算bbt到TBS的距离dt,dt=D'中所有元素的平均值,转3.4.6;
3.4.6将dt和bbt组合成二元组dst,dst=[bbt,dt],将dst加入DS中;
3.4.7令t=t+1,如果t≤T,转3.4.3;如果t>T,说明距离信息集合DS构建完毕,DS={ds1,ds2,...,dst,...,dsT},转3.5;
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,得到dst中的bbt在S0中的位置loct;
4.1.3从dst中获取bbt对应的dt;
4.1.4使用LLVM框架的IRBuilder接口在loct处插入存储dt值到共享内存中的Store指令,简称第一值存储指令(通过这种方式可以在S1运行时获得bbt到TBS的距离信息);
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初始化变量ni=1;
4.2.3使用LLVM框架的ModulePass工具分析S1,得到msni在S1中的位置locni;
4.2.4使用LLVM框架的IRBuilder接口在locni处插入存储ci到共享内存中的Store指令,简称第二值存储指令(通过这种方式可以在S运行时获得ci信息);
4.2.5令ni=ni+1,如果ni≤Ni,转4.2.3;如果ni>Ni,转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,...,spj,...spJ},其中spj为初始种子库中第j个种子,J为SP中初始种子的个数,1≤j≤J,方法是:
5.2.1初始化变量j=1;
5.2.2初始化种子队列
5.2.3将种子spj发送给插桩后的待检测软件S;
5.2.4从用户提供的配置文件中获取用户定义的最大尺寸MaxSize,用户定义的最大时长MaxT;
5.2.5判断spj文件大小是否超过MaxSize,如果是,说明spj会影响模糊测试运行时的种子执行速度,令j=j+1,转5.2.3,如果否,转5.2.6;
5.2.6判断种子spj执行时间是否超过MaxT,如果是,说明spj会导致S挂起,令j=j+1,转5.2.3;如果否,转5.2.7;
5.2.7判断种子spj是否会导致软件S的崩溃(根据操作系统发出的信号SIGKILL进行判断),如果是,说明spj会带来安全隐患,令j=j+1,转5.2.3;如果否,说明spj是一个安全的种子,转5.2.8;
5.2.8令种子队列Q中第z个种子qz=spj,将qz加入初始种子队列Q;
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;
5.3定向模糊测试模块根据种子执行路径上是否含有配置相关基本块(即MS中的程序基本块)对Q进行选择,得到种子优先级队列Q',Q'={qq1,qq2,...,qqk,...qK},qqk为Q'中第k个种子,K为Q'中种子的个数,1≤k≤K,1≤K≤Z,然后从Q'中顺序选择一个种子进行模糊测试,方法是:
5.3.1初始化变量z=1;
5.3.2初始化优先级队列
5.3.3将种子qz发送给插桩后的待检测软件S试运行;
5.3.4根据插桩信息判断种子qz的执行路径上是否含有配置相关基本块,如果是,令Q'中第k个种子qqk=qz,将qqk加入种子优先级队列Q',Q'中的种子将会被定向模糊测试模块优先选择,令z=z+1,转5.3.5;否则,说明种子qz与配置无关,直接转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'中选择种子qqk;
5.4.3定向模糊测试模块使用Marcel等人在CCS 2017发表的文章“DirectedGreybox Fuzzing(定向灰盒模糊测试)”中的模拟退火算法根据qqk到TBS距离(根据DS对S0插桩后在S运行时获得bbt到TBS的距离信息,计算qqk执行路径上经过的程序基本块到TBS的距离之和作为qqk到TBS距离),计算得到qqk的突变次数E;
5.4.4对qqk突变E次,得到新种子集合Qk”,Qk”={qq1',qq2',...,qqe',...qqE'},qqe'为Qk”'中第e个新种子,E为Qk”中新种子的个数,1≤e≤E,方法是:
5.4.4.1初始化变量e=1;
5.4.4.2初始化新种子集合
5.4.4.3定向模糊测试模块使用Rui Zhong等人在CCS2020发表的文章“SQUIRREL:Testing Database Management Systems with Language Validity and CoverageFeedback(一种基于语言有效性和覆盖率反馈方法的数据库管理系统测试方法)”中的种子突变策略对qqk进行突变生成新种子qqe',将qqe'加入到Qk”中去;
5.4.4.4令e=e+1,如果e≤E,转5.4.4.3;如果e>E,说明对qqk突变E次得到E个新种子均已加入Qk”中去,Qk”={qq1',qq2',...,qqe',...qqE'},转5.4.5;
5.4.5把Qk”中的所有新种子(即qq1',qq2',...,qqe',...qqE')喂给S执行,将Qk”中覆盖了S中新的代码段的新种子加入到种子队列Q中去,将Q”中导致S崩溃或者挂起的新种子加入到CS中,方法是:
5.4.5.1初始化变量e=1;
5.4.5.2将qqe'喂给S执行,如果qqe'覆盖了S中新的代码段(之前的种子没覆盖的代码段),则将qqe'加入到种子队列Q中去;如果qqe'执行导致S崩溃(根据操作系统发出的信号SIGKILL进行判断)或者挂起(根据种子执行时间是否超过MaxT),则将qqe'加入到CS中去;
5.4.5.3令e=e+1,如果e≤E,转5.4.5.2;如果e>E,说明Qk”中所有覆盖了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中存放的是触发配置缺陷的测试用例集合,即配置缺陷集合)。
为了验证本发明检测配置缺陷问题的效果,在一台Ubuntu18.04操作系统,搭载8核Intel Core i7-9700K,32GB内存的计算机上开展本发明与背景技术中的Squirrel的对比实验(Squirrel为Rui Zhong等人在CCS2020发表的“SQUIRREL:Testing DatabaseManagement Systems with Language Validity and Coverage Feedback中设计的工具),Ubuntu18.04操作系统的内核版本为5.8.0,软件环境为LLVM10.0.0+python3.8,主要编码语言为C++语言。实验选择MySQL、PostgreSQL、SQLite三款软件作为目标软件进行评估。由于本发明检测的数据库配置缺陷问题是一种新型的缺陷问题,目前没有专门进行检测的技术,故本发明与数据库缺陷检测问题的最前沿技术Squirrel(背景技术二)进行比较,结果如表1所示,实验证明,本发明与背景技术二相比,在执行相同的运行时间下,可检测出更多的配置缺陷。其中本发明检测出2个数据库配置缺陷,背景技术二没有检测出配置缺陷,说明本发明比背景技术二的检测有效性和检测效率更高。
表1.本发明与背景技术二的检测配置缺陷能力对比
/>
Claims (9)
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,...,ci,...,cI},其中ci为C中第i个目标配置,ci是常量字符串,I为C中目标配置的总数,1≤i≤I;
2.2配置污点分析模块使用Confmapper算法分析S0,从S0中发现配置参数初始变量,得到C中I个目标配置的初始程序变量,由I个目标配置的初始程序变量即I个配置变量构成配置变量集合VC,VC={vc1,vc2,...,vci,...,vcI},其中vci为ci对应的配置变量;
2.3配置污点分析模块使用DG算法,对VC中的配置变量进行污点分析,得到目标配置的影响范围即污点传播变量在待检测软件源码S0中的位置集合R,R={R1,R2,...,Ri,...,RI},其中Ri为ci的影响范围集合,Ri={r1,r2,…,rni,…,rNi},其中rni为Ri中第ni个污点传播变量在待检测软件源码S0中的位置,Ni为影响范围集合Ri中元素的个数,1≤ni≤Ni;
2.4配置污点分析模块定位R中rni所在S0的程序基本块位置,得到目标配置与程序基本块映射关系集合MS,MS={MS1,MS2,...,MSi,...,MSI},其中MSi为ci的映射关系集合,ci与MSi中的元素具有一对多的映射关系,MSi={ms1,ms2,...,msni,...,msNi},msni为ci映射的第ni个程序基本块;
2.5将MS发送给距离计算模块和配置与距离插桩模块;
第三步,距离计算模块从配置污点分析模块接收MS,从MS筛选得到目标基本块集合TBS,并根据用户输入的待测软件源码生成调用图和控制流图,采用迪杰斯特拉算法计算待测软件源码的每个基本块到目标基本块的最短距离,得到距离信息集合DS,将DS发送给配置与距离插桩模块,方法是:
3.1距离计算模块从配置污点分析模块接收MS,从MS中筛选控制软件资源分配的配置对应的程序基本块,令这些程序基本块为目标基本块,得到目标基本块集合TBS,其中TBS={tbs1,tbs2,…,tbsm,…,tbsM},M为TBS中目标基本块个数,tbsm为TBS中第m个目标基本块,1≤m≤M;
3.2距离计算模块使用LLVM框架中的ModulePass工具分析被检测软件源码S0,得到S0中所有程序基本块集合BB,BB={bb1,bb2,...,bbt,...bbT},T为BB中程序基本块个数,bbt为BB中第t个程序基本块,1≤t≤T;
3.3距离计算模块使用LLVM框架中的OptPass工具分析被检测软件源码S0,得到函数调用图CG和控制流图CFG;
3.4距离计算模块根据CG和CFG,对BB中所有程序基本块到TBS中目标基本块的距离进行计算,得到距离信息集合DS,DS={ds1,ds2,...,dst,...,dsT},其中dst为一个二元组,dst=[bbt,dt],bbt为BB中第t个程序基本块,dt为bbt到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,得到dst中的bbt在S0中的位置loct;
4.1.3从dst中获取bbt对应的dt;
4.1.4使用LLVM框架的IRBuilder接口在loct处插入存储dt值到共享内存中的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初始化变量ni=1;
4.2.3使用LLVM框架的ModulePass工具分析S1,得到msni在S1中的位置locni;
4.2.4使用LLVM框架的IRBuilder接口在locni处插入存储ci到共享内存中的Store指令,简称第二值存储指令;
4.2.5令ni=ni+1,如果ni≤Ni,转4.2.3;如果ni>Ni,转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,...,spj,...spJ},其中spj为初始种子库中第j个种子,J为SP中初始种子的个数,1≤j≤J,方法是:
5.2.1初始化变量j=1;
5.2.2初始化种子队列
5.2.3将种子spj发送给插桩后的待检测软件S;
5.2.4从用户提供的配置文件中获取用户定义的最大尺寸MaxSize,用户定义的最大时长MaxT;
5.2.5判断spj文件大小是否超过MaxSize,如果是,说明spj会影响模糊测试运行时的种子执行速度,令j=j+1,转5.2.3;如果否,转5.2.6;
5.2.6判断种子spj执行时间是否超过MaxT,如果是,说明spj会导致S挂起,令j=j+1,转5.2.3;如果否,转5.2.7;
5.2.7判断种子spj是否会导致软件S的崩溃,如果是,说明spj会带来安全隐患,令j=j+1,转5.2.3;如果否,说明spj是一个安全的种子,转5.2.8;
5.2.8令种子队列Q中第z个种子qz=spj,将qz加入初始种子队列Q;
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;
5.3定向模糊测试模块根据种子执行路径上是否含有配置相关基本块即MS中的程序基本块对Q进行选择,得到种子优先级队列Q',Q'={qq1,qq2,...,qqk,...qK},qqk为Q'中第k个种子,K为Q'中种子的个数,1≤k≤K,1≤K≤Z,然后从Q'中顺序选择一个种子进行模糊测试,方法是:
5.3.1初始化变量z=1;
5.3.2初始化优先级队列
5.3.3将种子qz发送给插桩后的待检测软件S试运行;
5.3.4根据插桩信息判断种子qz的执行路径上是否含有配置相关基本块,如果是,令Q'中第k个种子qqk=qz,将qqk加入种子优先级队列Q',Q'中的种子将会被定向模糊测试模块优先选择,令z=z+1,转5.3.5;否则,说明种子qz与配置无关,直接转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'中选择种子qqk;
5.4.3定向模糊测试模块使用模拟退火算法根据qqk到TBS距离,计算得到qqk的突变次数E;
5.4.4对qqk突变E次,得到新种子集合Qk”,Qk”={qq1',qq2',...,qqe',...qqE'},qqe'为Qk”'中第e个新种子,E为Qk”中新种子的个数,1≤e≤E;
5.4.5把Qk”中的所有新种子喂给S执行,将Qk”中覆盖了S中新的代码段的新种子加入到种子队列Q中,将Q”中导致S崩溃或者挂起的新种子加入到CS中,方法是:
5.4.5.1初始化变量e=1;
5.4.5.2将qqe'喂给S执行,如果qqe'覆盖了S中新的代码段即之前的种子没覆盖的代码段,则将qqe'加入到种子队列Q中;如果qqe'执行导致S崩溃或者挂起,则将qqe'加入到CS中;
5.4.5.3令e=e+1,如果e≤E,转5.4.5.2;如果e>E,说明Qk”中所有覆盖了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中rni所在S0的程序基本块位置,得到目标配置与程序基本块映射关系集合MS的方法是:
2.4.1初始化变量i=1;
2.4.2初始化变量ni=1;
2.4.3初始化
2.4.4定位rni在S0中的位置,找到rni所在程序基本块的第一条指令Inst,以Inst所在的文件名和行号msni表示该程序基本块;
2.4.5将msni加入MSi;
2.4.6令ni=ni+1,如果ni≤Ni,转2.4.4;如果ni>Ni,令ni=1,令i=i+1,转2.4.7;
2.4.7如果i≤I,转2.4.3;如果i>I,说明ci映射的程序基本块均已放到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初始化存放bbt到tbsm的距离集合
3.4.4使用迪杰斯特拉算法计算bbt到tbsm的距离dm',将dm'放进D';
3.4.5令m=m+1,如果m≤M,转3.4.4;如果m>M,计算bbt到TBS的距离dt,dt=D'中所有元素的平均值,转3.4.6;
3.4.6将dt和bbt组合成二元组dst,dst=[bbt,dt],将dst加入DS中;
3.4.7令t=t+1,如果t≤T,转3.4.3;如果t>T,说明距离信息集合DS构建完毕,DS={ds1,ds2,...,dst,...,dsT},结束。
6.如权利要求1所述的一种面向配置缺陷的定向模糊测试方法,其特征在于5.2.7步所述判断种子spj是否会导致软件S的崩溃的方法是根据操作系统发出的信号SIGKILL进行判断,SIGKILL表示终结进程。
7.如权利要求1所述的一种面向配置缺陷的定向模糊测试方法,其特征在于5.4.3步所述qqk到TBS距离的获取方法是:根据DS对S0插桩后在S运行时获得bbt到TBS的距离信息,计算qqk执行路径上经过的程序基本块到TBS的距离之和作为qqk到TBS距离。
8.如权利要求1所述的一种面向配置缺陷的定向模糊测试方法,其特征在于5.4.4步所述对qqk突变E次,得到新种子集合Qk”的方法是:
5.4.4.1初始化变量e=1;
5.4.4.2初始化新种子集合
5.4.4.3定向模糊测试模块使用种子突变策略对qqk进行突变生成新种子qqe',将qqe'加入到Qk”中;
5.4.4.4令e=e+1,如果e≤E,转5.4.4.3;如果e>E,说明对qqk突变E次得到E个新种子均已加入Qk”中去,Qk”={qq1',qq2',...,qqe',...qqE'},结束。
9.如权利要求1所述的一种面向配置缺陷的定向模糊测试方法,其特征在于5.4.5.2步所述qqe'执行导致S挂起是根据种子执行时间是否超过MaxT来判定。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310805942.6A CN116841886B (zh) | 2023-07-03 | 2023-07-03 | 一种面向配置缺陷的定向模糊测试方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310805942.6A CN116841886B (zh) | 2023-07-03 | 2023-07-03 | 一种面向配置缺陷的定向模糊测试方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116841886A CN116841886A (zh) | 2023-10-03 |
CN116841886B true CN116841886B (zh) | 2023-11-17 |
Family
ID=88164724
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310805942.6A Active CN116841886B (zh) | 2023-07-03 | 2023-07-03 | 一种面向配置缺陷的定向模糊测试方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116841886B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116049831A (zh) * | 2022-12-27 | 2023-05-02 | 天翼云科技有限公司 | 一种基于静态分析和动态分析的软件漏洞检测方法 |
CN116126698A (zh) * | 2022-12-29 | 2023-05-16 | 中国人民解放军国防科技大学 | 一种基于蜕变测试的运行时配置更新缺陷检测方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20150370685A1 (en) * | 2014-06-24 | 2015-12-24 | Juergen Heymann | Defect localization in software integration tests |
-
2023
- 2023-07-03 CN CN202310805942.6A patent/CN116841886B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116049831A (zh) * | 2022-12-27 | 2023-05-02 | 天翼云科技有限公司 | 一种基于静态分析和动态分析的软件漏洞检测方法 |
CN116126698A (zh) * | 2022-12-29 | 2023-05-16 | 中国人民解放军国防科技大学 | 一种基于蜕变测试的运行时配置更新缺陷检测方法 |
Also Published As
Publication number | Publication date |
---|---|
CN116841886A (zh) | 2023-10-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110543421B (zh) | 基于测试用例自动生成算法的单元测试自动执行方法 | |
CN106294120B (zh) | 测试代码的方法、设备和计算机程序产品 | |
CN102880546B (zh) | 一种基于xml数据库的软件集成测试方法及系统 | |
Shen et al. | Automating performance bottleneck detection using search-based application profiling | |
JP2017097862A (ja) | セーフティクリティカルソフトウェア自動要求ベーステストケース生成のためのシステムおよび方法 | |
Gong et al. | Automatic detection of infeasible paths in software testing | |
US8265916B1 (en) | Test environment for accumulating cumulative metric data | |
EP3264274B1 (en) | Input discovery for unknown program binaries | |
CN107025169B (zh) | 一种基于贝叶斯网络推理的软件错误分层诊断方法 | |
CN108804304B (zh) | 测试用例生成方法及装置、存储介质、电子设备 | |
US9063778B2 (en) | Fair stateless model checking | |
US9891281B1 (en) | Method and system for automatically identifying test runs contributing to coverage events of interest in verification test data | |
CN111026660A (zh) | 一种基于专家系统知识库的渗透测试方法 | |
CN105468508A (zh) | 代码检测方法及装置 | |
CN116841886B (zh) | 一种面向配置缺陷的定向模糊测试方法 | |
CN110321458A (zh) | 一种基于控制流图的数据流分析方法及装置 | |
CN112346977A (zh) | 量子云计算平台软件功能测评方法和装置 | |
CN110737590B (zh) | 一种离线调试方法 | |
CN104536880A (zh) | 基于符号执行的gui程序测试用例扩增方法 | |
CN102567169B (zh) | 微处理器的测试方法及测试装置 | |
Baranov et al. | Baital: an adaptive weighted sampling platform for configurable systems | |
CN114840856A (zh) | 一种状态感知的物联网可信执行环境模糊测试方法和系统 | |
CN114462043A (zh) | 基于强化学习的Java反序列化漏洞检测系统及方法 | |
CN109992507B (zh) | 基于模拟执行的程序模糊测试方法及装置 | |
CN113688403A (zh) | 一种基于符号执行验证的智能合约漏洞检测方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |