一种基于覆盖引导的工控协议模糊测试优化方法

未命名 07-27 阅读:97 评论:0


1.本发明属于工控安全技术领域,具体涉及一种基于覆盖引导的工控协议模糊测试优化方法。


背景技术:

2.随着工业信息化、智能化的飞速发展,工业控制系统由封闭的网络、私有的协议和操作系统向开放的网络、通用的tcp/ip协议以及操作系统过渡,新兴技术在提高工业企业的生产和管理效率的同时,工控安全也面临着安全漏洞不断威胁加速渗透、攻击手段复杂多样等新挑战。模糊测试是一种挖掘工控系统潜在漏洞的有效技术手段。其基本思想是通过向待测目标输入大量随机化的畸形数据,检测待测目标的运行状态并及时反馈异常,从而挖掘待测目标存在的安全漏洞。
3.传统的模糊测试方法主要存在以下不足:(1)模糊测试采用完全随机的变异策略,盲目生成测试用例而没有考虑工控协议的执行流程,产生大量无效测试用例,模糊测试效率低下;(2)代码覆盖率低,现有模糊测试方法倾向于无效地遍历搜索空间,产生了大量的重复执行路径;(3)测试用例失效率高,现有模拟测试工具生成的畸形数据包大多数可能无法被待测目标识别,导致待测目标不会对这些请求做出响应。


技术实现要素:

4.为此,本发明所要解决的关键技术问题在于现有技术应用于工控协议模糊测试方法虽然能对网络协议的工控设备进行适应性的模糊测试,但存在变异策略核心算法单一,测试用例失效率高、冗余度高等问题。覆盖引导模糊测试旨在通过最大化生成的测试用例的代码覆盖率来探索目标所有的二进制代码,以提高漏洞检测能力。
5.本发明在基于传统覆盖引导模糊测试的基础上,结合变异测试,通过比较待测程序(pro gram under test,put)和变异put的输出结果,来筛选高质量的测试用例,同时引入覆盖引导跟踪的概念,通过对put(待测程序)二进制文件中的当前覆盖边界进行编码,以便在测试用例中产生新覆盖时自我报告,消除覆盖引导模糊器不必要的跟踪,提高了模糊测试效率。本发明的另一目的是提供一种基于故障检测感知的覆盖引导模糊测试框架,使用变异测试来改进传统覆盖引导模糊测试技术在检测错误方面的能力,该框架由输入、变异引擎、测试引擎、模糊引擎和种子队列输出组成。
6.为达到上述目的,本发明的技术方案如下:一种基于覆盖引导的工控协议模糊测试优化方法,该方法主要包括如下步骤:
7.s1:选取put以及系统配置文件,设定变异测试配置和模糊测试配置;
8.所述变异测试设置包括一组用于模糊测试之前创建变异体的变异器mutator和一个在模糊测试期间用于变异的选择策略mutates。而模糊测试设置指的是初始种子i的选取。
9.s2:设计变异引擎,根据系统配置文件指定的变异策略生成put的变异体,收集put
的变异版本以及相应的变异信息,并构建变异池m供后续使用;
10.所述变异信息包括变异发生的位置以及使用的变异体等,变异引擎提供两种模式用于变异体生成:用于构建变异池的离线模式和用于动态选择的在线模式。离线模式用于准备故障检测感知模糊测试,并且只执行一次避免不必要的开销,在线模式在执行期间持续工作,根据选择策略选定变异体作为测试引擎的输入。
11.s2中提到变异体就是执行变异策略后的put,也就是说变异体是变异后的待测程序,执行put和变异put的意思就是分别将测试输入输入到put和变异put中,观察两者的执行结果。
12.s3:设计测试引擎,从变异池m中选取n个变异体作为测试输入,分别执行插桩put和变异体程序,收集各自执行结果信息,并进行对比,生成代码覆盖率和变异统计信息,将代表代码覆盖率和变异统计信息两者将作为反馈信息供后续使用;
13.所述测试引擎采用了一种基于故障检测感知的覆盖分析方法,相比于传统的覆盖分析方法,在覆盖率和测试结果的基础上引入了状态这一因素,状态用于衡量测试输入i是否引发了程序执行漏洞。状态的引入有利于提高代码路径的覆盖率,具体来说,如果一个i在最后一次执行中的变异值为非零,说明i有能力检测到错误,则i将被保存在种子队列q中,而无法有效检测出错误的i将被保存在种子队列f中。
14.s4:设计模糊引擎,根据所述反馈信息计算出变异体相较于put的变异值p
mut
∈[0,1],变异值将作为计算变异概率的输入,并影响测试用例种子的生成,生成的测试用例种子又会作为测试引擎的输入;
[0015]
所述模糊引擎采用了一种改进的变异概率评估算法,对于上述有错误检测能力的测试输入i,在已有的错误显示标记的基础上,该算法将放大i的变异概率来奖励这些发现错误的测试输入,并且令不显示错误的测试输入以相反的方式加以惩罚(变异表示从父种子生成子输入的过程)。相较于现有的变异概率计算方法,该算法保留了测试输入的故障检测能力,有利于生成覆盖率更高的测试用例。
[0016]
s5:设计如图2所示模糊测试框架,模糊测试框架(本发明提到的模糊测试框架是基于现有的主流框afl的基础上进行修改的,因此这里提到的模糊测试框架是在afl的基础上提出来的)在执行测试过程中将维护两个种子队列并作为输出,包括有效种子队列q和失败输入种子队列f。队列q根据变异值的增减调整种子个体在队列中的位置,队列长度由(双线符号代表自然数,p
limit
代表队列长度,即表示队列长度为自然数)设置,队列中的种子数量溢出时会丢弃队列尾部的个体;队列f也不会被完全抛弃,但其中个体生成子输入的概率将会变小。
[0017]
模糊引擎将队列首部的种子个体作为模糊测试用例,输入到afl++(american fuzzy loop plus plus)(afl++为afl的一种变体)的解析器模块中,最后通过发包器输入到测试引擎中;通过执行引擎(执行引擎是模糊测试框架的一部分)监视put的执行状态,执行程序在每次模糊迭代中轮询子进程的状态。当put崩溃时,模糊测试停止;当put进入错误状态时,获得返回代码并记录异常,并分支出一个新的实例来恢复模糊过程,从而实现根据put的错误反馈来实时调整测试用例的生成过程。
[0018]
进一步地,所述步骤s2中变异引擎是模糊测试框架中的组成部分,变异引擎提供两种模式:用于变异创建的离线模式和用于动态变异选择的在线模式。离线模式用于准备
故障检测感知模糊测试。变异体是根据配置中指定的变异体创建的,每个变异体保留put的变异版本以及相应的变异信息(例如变异位置和使用的变异体),并构建变异体池以供后续使用。离线模式只执行一次,避免重复创建造成不必要的开销。相反,在线模式在测试执行期间持续工作。变异引擎根据配置中指定的选择策略定期从变异池中选择一个变异子集。将选定的变异体发送到测试引擎进行变异测试。通过选择策略,通常只选择几个变异体来确保模糊测试的效率。
[0019]
进一步地,所述步骤s3中测试引擎执行put和变异体并对比测试结果的操作包括以下子步骤:
[0020]
s301:将选定的put定义为p,put的功能性定义为b={b1,b2,...,bn},则在给定测试输入i的情况下,put的一个功能性输出可以表示为o=b[p,i],则输出集合o={o1,o2,...,on},另外,变异池记为m,变异体子集定义为m

={mut1,mut2,...,mutn},输出集合为o

,muti′
表示第i

个变异体,i

=1,2,

,n,n为变异体的个数(输出集合o代表执行测试输入后put的输出结果的集合,输出集合o

代表执行测试输入后变异体的输出结果的集合)。
[0021]
s302:根据测试输入执行put和变异体。为了提高变异测试的执行效率,我们通过策略性地选择变异体子集来减少要执行的变异体数量,并在多线程中同时执行选定的变异体和put,并分别收集测试结果o和o

,如果在测试过程中出现崩溃,则执行失败,不会记录输出结果;此外,变异测试的时间也会加以限制,假设put的测试时间为t,则变异体的测试时间上限为t

=t
×
(1+r),0≤r≤1,r表示额外执行时间倍率,为一个常数,用于控制变异体测试时间的阈值。
[0022]
s303:比较put和变异体的测试结果。如果一个变异体muti′
的输出结果与put的不一致,那么muti′
就会被测试输入i淘汰,只有输出结果完全已知的变异体才能存活,计算被淘汰的变异体数量k和存活的变异体数量s,将k和s记录为变异统计信息。
[0023]
进一步地,步骤s4的变异值的计算以及测试用例种子生成的过程主要包括以下子步骤:
[0024]
s401:变异值的计算公式如下所示:
[0025][0026]
变异值可以用来反映测试输入检测漏洞的能力,测试输入淘汰的变异体个数越多,则p
mut
越大,代表测试输入的检测漏洞能力越强。
[0027]
s402:将执行后的测试输入存入种子队列中,根据奖惩机制增大非零变异值的种子的变异概率,并降低那些没有检测出漏洞的种子的变异概率,这里的变异概率表示从父种子生成子输入的几率。设(代表正整数)作为调整变异概率的参数,增加概率则将变异概率乘以factork,反之则将变异概率除以factork。
[0028]
本发明结合变异测试来引导模糊测试检测漏洞,解决了传统覆盖引导方案中仅以更高的覆盖率作为评估基准的错误认知,提出变异值与覆盖率结合的新标准在循环迭代更新中筛选能检测更多漏洞的测试用例,同时,覆盖引导跟踪通过将跟踪限制为仅覆盖率增加的测试用例来跟踪更少的测试用例,提高了模糊测试效率。本发明设计的模糊测试优化方法极大提高了覆盖引导模糊测试的漏洞检测能力和测试效率。
附图说明
[0029]
图1为本发明基于覆盖引导的工控协议模糊测试优化方法的流程图;
[0030]
图2为本发明提出的模糊测试框架图;
[0031]
图3为种子队列更新示意图。
具体实施方式
[0032]
为使本发明的目的、技术方案及优点更加清楚、明确,以下将参照附图和具体实施方式对本发明的技术方案进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
[0033]
如图1所示,本发明实现基于覆盖引导的工控协议模糊测试优化方法主要有以下5个步骤:
[0034]
s1:图2描述了本发明提出的整个模糊测试框架,首先选取put以及系统配置文件作为输入,并将输入种子保留为输出,系统设置包括变异测试设置和模糊测试设置,变异测试设置指包括一组用于模糊测试之前创建变异体的变异器和一个在模糊测试期间用于变异选择策略。而模糊测试设置指的是初始种子以及分配资源的设置。
[0035]
s2:变异引擎根据配置指定的变异策略生成put的变异体,我们使用变异测试工具pitest创建put的变异体,然后为每个变异体保留put的变异版本以及相应的变异信息,并构建变异池以供后续使用,为确保模糊测试的效率,最后只在变异池中选取10个变异体作为测试引擎的输入;
[0036]
变异引擎是模糊框架中的组成部分,变异引擎提供两种模式:用于变异创建的离线模式和用于动态变异选择的在线模式。离线模式用于准备故障检测感知模糊测试。变异体是根据配置中指定的变异体创建的,每个变异体保留put的变异版本以及相应的变异信息(例如变异位置和使用的变异体),并构建变异体池以供后续使用。离线模式只执行一次,避免重复创建造成不必要的开销。相反,在线模式在测试执行期间持续工作。变异引擎根据配置中指定的选择策略定期从变异池中选择一个变异子集。将选定的变异体发送到测试引擎进行变异测试。
[0037]
s3:测试引擎将初始种子作为测试输入分别执行插桩put和变异体,收集执行结果信息,并进行对比,生成变异统计信息;测试引擎执行put和变异体并对比测试结果的操作包括以下子步骤:
[0038]
s301:将选定的put定义为p,put的功能性定义为b={b1,b2,...,bn}(n代表变异体的数量),则在给定测试输入i的情况下,put的一个功能性输出可以表示为o=b[p,i],则输出集合o={o1,o2,...,on},另外,变异池记为m,变异体子集定义为m

={mut1,mut2,...,mutn},输出结果为o

,n为变异体的个数。执行结果exec表示为一个三元组《s,o,e》,其中s为put执行状态,s∈(success,failure),success表示执行成功,failure表示执行失败,e为执行过程中发生的崩溃。
[0039]
s302:根据测试输入执行put和变异体。为了提高变异测试的执行效率,我们选择变异体子集以较少要执行的变异体的数量,并在多线程中同时执行选定的变异体和put,并分别收集测试结果o和o

,如果在测试过程中出现崩溃,则执行失败,不会记录输出结果;此外,变异测试的时间也会加以限制,假设put的测试时间为t,则变异体的测试时间上限为,
t

=t
×
(1+r),0≤r≤1,r表示额外执行时间倍率,为一个常数,用于控制变异体测试时间的阈值。
[0040]
s303:比较put和变异体的测试结果。如果一个变异体mut的输出结果与put的不一致,那么mut就会被测试输入i淘汰,只有输出结果完全已知的变异体才能存活,计算被淘汰的变异体数量mutk和存活的变异体数量muts,将其记录为变异统计信息。
[0041]
测试引擎作为模糊测试框架的核心,扩展了传统覆盖引导的模糊器的测试执行部分。测试引擎接受来自模糊引擎的输入,在每次测试输入执行结束后,测试引擎收集到达的覆盖率以及变异统计来构建反馈信息,并发送给模糊引擎,以指导输入的生成。除了用收到的测试输入执行插桩的put,测试引擎还需要针对模糊引擎选择的变异体执行相同的测试输入。
[0042]
s304:在执行测试的过程中,优化的轻量级插桩工具将仅限于跟踪增加覆盖率的测试用例,生成代码覆盖信息,最后执行引擎将代码覆盖信息和变异统计信息作为反馈信息发送给模糊引擎;
[0043]
覆盖引导跟踪通过覆盖在每个未覆盖的基本块的开头插入预选的软件中断实现仅跟踪增加覆盖率的测试用例。首先触发中断的测试用例将会被标记为覆盖率增加,并执行完整的跟踪代码覆盖,中断信息将被记录下来;对于测试用例覆盖范围内的每个新访问的基本块,从记录中删除相关的中断。随着这个过程的重复,只有执行新覆盖的测试用例才会触发中断,从而将它们标记为覆盖增加。
[0044]
s4:模糊引擎根据反馈信息计算出变异值p
mut
∈[0,1],变异值作为评估标准影响测试用例种子的生成;变异值的计算以及测试用例种子生成的过程主要包括以下子步骤:
[0045]
s401:变异值的计算公式如下所示:
[0046][0047]
变异值可以用来反映测试输入检测漏洞的能力,测试输入淘汰的变异体个数越多,则p
mut
越大,代表测试输入的检测漏洞能力越强。
[0048]
s402:将执行后的测试输入分别存入种子队列队列q和f中,根据奖惩机制增大非零变异值的种子的变异概率,并降低那些没有检测出漏洞的种子的变异概率,这里的变异概率表示从父种子生成子输入的几率。设作为调整变异概率的参数,增加概率则将变异概率乘以factork,反之则将变异概率除以factork。具体算法如下所示:
[0049]
[0050]
其中base、factor、factork均为正常数(这三者都代表一个常量,base用于衡量n的基准线,相当于将n初始化为了一个值,factor和factork都是用于扩大n的常量)。
[0051]
模糊引擎能利用从测试引擎返回的反馈信息实现故障检测感知的模糊化,根据上述奖惩机制更新队列q和f,这样能保证有漏洞检测能力的测试输入将会被变异很多次,以此产生更多的子输入。
[0052]
s5:模糊测试框架会维护两个种子队列,分别是有效种子队列q和失败输入种子队列f。如图3所示,队列q根据变异值的增减调整种子个体在队列中的位置,队列长度由设置,数量溢出时会丢弃队列尾部的个体;队列f也不会被完全抛弃,但其中个体生成子输入的概率将会变小;重复执行这个过程指导两个种子队列都达到最大阈值,再继续执行下一步。
[0053]
模糊引擎将队列首部的种子个体作为模糊测试用例,输入到解析器模块(解析器模块是afl++框架的一部分,是主流模糊测试框架的通用部分)中,最后通过发包器输入到测试引擎中;通过的执行引擎监视put的执行状态,执行程序在每次模糊迭代中轮询子进程(每一次测试输入执行的过程都属于一个子进程)的状态。当put崩溃时,模糊测试停止;当put进入错误状态时,获得返回代码并记录异常,并分支出一个新的实例来恢复模糊过程,从而实现根据put的错误反馈来实时调整测试用例种子的生成过程。
[0054]
显然,上述实施例仅仅是为清楚地说明所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引伸出的显而易见的变化或变动仍处于本发明创造的保护范围之中。

技术特征:
1.一种基于覆盖引导的工控协议模糊测试优化方法,其特征在于,该方法包括以下步骤:s1:选取待测程序put以及系统配置文件,设定变异测试配置和模糊测试配置;其中,所述变异测试设置包括一组用于模糊测试之前创建变异体的变异器mutator和一个在模糊测试期间用于变异的选择策略mutate
s
;而模糊测试设置指的是初始种子i的选;s2:设计变异引擎,根据系统配置文件指定的变异策略生成put的变异体,收集put的变异版本以及相应的变异信息,并构建变异池m供后续使用;所述变异信息包括变异发生的位置以及使用的变异体,变异引擎提供两种模式用于变异体生成:用于构建变异池的离线模式和用于动态选择的在线模式,离线模式用于准备故障检测感知模糊测试,并且只执行一次避免不必要的开销,在线模式在执行期间持续工作,根据选择策略选定变异体作为测试引擎的输入,其中,变异体就是执行变异策略后的put;s3:设计测试引擎,从所述变异池m中选取n个变异体作为测试输入,采用测试引擎分别执行put和变异体,收集各自执行结果信息,并进行对比,生成代码覆盖率和变异统计信息,将代表代码覆盖率和变异统计信息两者将作为反馈信息供后续使用;所述测试引擎采用了一种基于故障检测感知的覆盖分析方法,相比于传统的覆盖分析方法,在覆盖率和测试结果的基础上引入了状态这一因素,状态用于衡量测试输入i是否引发了程序执行漏洞,状态的引入有利于提高代码路径的覆盖率,具体来说,如果一个i在最后一次执行中的变异值为非零,说明i有能力检测到错误,则i将被保存在种子队列q中,而无法有效检测出错误的i将被保存在种子队列f中;s4:设计模糊引擎,根据所述反馈信息计算出变异体相较于put的变异值p
mut
∈[0,1],变异值将作为计算变异概率的输入,并影响测试用例种子的生成,生成的测试用例种子又会作为测试引擎的输入;所述模糊引擎采用了一种改进的变异概率评估算法,对于上述有错误检测能力的测试输入i,在已有的错误显示标记的基础上,该算法将放大i的变异概率来奖励这些发现错误的测试输入,并且令不显示错误的测试输入以相反的方式加以惩罚;s5:设计模糊测试框架,模糊测试框架在执行测试过程中将维护两个种子队列作为输出,包括有效的种子队列q和失败输入的种子队列f;队列q根据变异值的增减调整种子个体在队列中的位置,队列长度由设置,其中代表自然数,队列中的种子数量溢出时会丢弃队列尾部的个体;队列f不会被完全抛弃,但其中个体生成子输入的概率将会变小;模糊引擎将队列首部的种子个体作为模糊测试用例,输入到afl++的解析器模块中,最后通过发包器输入到测试引擎中;通过模糊测试框架中的执行引擎监视put的执行状态,执行程序在每次模糊迭代中轮询子进程的状态,当put崩溃时,模糊测试停止;当put进入错误状态时,获得返回代码并记录异常,并分支出一个新的实例来恢复模糊过程,从而实现根据put的错误反馈来实时调整测试用例的生成过程。2.根据权利要求1所述的基于覆盖引导的工控协议模糊测试优化方法,其特征在于,所述步骤s3中采用测试引擎分别执行put和变异体具体包括:s301:将选定的put定义为p,put的功能性定义为b={b1,b2,...,b
n
},则在给定测试输入i的情况下,put的一个功能性输出可以表示为o=b[p,i],则输出集合o={o1,o2,...,
o
n
},另外,将变异体子集定义为m

={mut1,mut2,...,mut
n
},其输出集合为0

,mut
i

表示第i

个变异体,i

=1,2,...,n,n为变异体的个数;s302:根据测试输入执行put和变异体,为了提高变异测试的执行效率,通过策略性地选择变异体子集减少要执行的变异体数量,并在多线程中同时执行选定的put和变异体,并分别收集测试结果o和o

,如果在测试过程中出现崩溃,则执行失败,不会记录输出结果;此外,变异测试的时间也会加以限制,假设put的测试时间为t,则变异体的测试时间上限为t

=t
×
(1+r),0≤r≤1,r表示额外执行时间倍率,为一个常数,用于控制变异体测试时间的阈值;s303:比较put和变异体的测试结果,如果一个变异体mut
i

的输出结果与put的不一致,那么mut
i

就会被测试输入i淘汰,只有输出结果完全已知的变异体才能存活,计算被淘汰的变异体数量k和存活的变异体数量s,将k和s记录为变异统计信息。3.根据权利要求2所述的基于覆盖引导的工控协议模糊测试优化方法,其特征在于,所述步骤s4中根据所述反馈信息计算出变异体相较于put的变异值p
mut
∈[0,1],变异值将作为计算变异概率的输入,并影响测试用例种子的生成具体包括:s401:变异值的计算公式如下所示:变异值可以用来反映测试输入检测漏洞的能力,测试输入淘汰的变异体个数越多,则p
mut
越大,代表测试输入的检测漏洞能力越强;s402:将执行后的测试输入存入种子队列中,根据奖惩机制增大非零变异值的种子的变异概率,并降低那些没有检测出漏洞的种子的变异概率,这里的变异概率表示从父种子生成子输入的几率,设作为调整变异概率的参数,其中代表正整数,增加概率则将变异概率乘以factor
k
,反之则将变异概率除以factor
k


技术总结
本发明公开了一种基于覆盖引导的工控协议模糊测试优化方法,该方法在基于传统覆盖引导模糊测试的基础上,结合变异测试,通过比较待测程序和变异PUT的输出结果,筛选高质量的测试用例,同时引入覆盖引导跟踪的概念,通过对待测程序二进制文件中的当前覆盖边界进行编码,以便在测试用例中产生新覆盖时自我报告,消除覆盖引导模糊器不必要的跟踪,提高了模糊测试效率,极大提高了覆盖引导模糊测试的漏洞检测能力和测试效率。漏洞检测能力和测试效率。漏洞检测能力和测试效率。


技术研发人员:丁旭阳 朱智光 谢盈 曹震 张小松
受保护的技术使用者:电子科技大学
技术研发日:2023.03.10
技术公布日:2023/7/25
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐