本发明涉及网络安全,具体涉及一种面向工业控制协议的高效灰盒模糊测试方法及其系统。
背景技术:
1、随着信息技术的飞速发展,工业控制系统在全世界得到广泛的应用。根据美国国家标准技术研究院给出的定义,ics是一个涵盖了多种类型的控制系统通用术语,作为ics组件通讯的重要手段,ics协议为工业控制系统提供了通信和控制的框架,是确保工业过程的高效性和安全性关键因素。但ics协议在实现上存在着不同类型的漏洞,因此ics协议一直是黑客攻击的目标之一。
2、模糊测试是目前主流的漏洞挖掘技术之一,其易于部署,具有良好的扩展性和适用性。根据测试样例的产生方式,模糊测试技术分为两类:基于变异和基于生成。基于变异的模糊测试无需语法指导,对种子进行bit级别随机变异产生输入;而基于生成的模糊测试适用于输入高度结构化的场景,需要基于一定语法构建输入。目前,两种类型的模糊测试工具中,都已经被广泛应用并发现大量的漏洞。然而,这些工具并没有充分考虑到ics协议软件的特性,导致效率低下,主要体现在如下两点:
3、1)ics协议的格式是高度结构化的,有着严格的语法约束。图1给出了工控协议modbus tcp的报文结构,具有3个字段;mbap报文头、功能码和数据字段,每个字段都有着规定的大小。如果构造的输入无法满足其格式要求,将直接在ics协议软件的格式解析阶段被过滤,导致无法进入到深层次的协议状态。
4、2)ics协议中不同字段具有不同的重要程度。ics协议报文一般包含若干个字段,每个字段对于覆盖率或漏洞探索的重要性有着明显差异。然而,目前的ics协议模糊测试技术平等地调度协议报文中每一个字段,忽略了它们的差异性。
技术实现思路
1、针对现有技术中的上述不足,本发明提供的面向工业控制协议的高效灰盒模糊测试方法及其系统通过覆盖率反馈引导和协议字段选择策略解决效率低下的问题。
2、为了达到上述发明目的,本发明采用的技术方案为:
3、第一方面,提供一种面向工业控制协议的灰盒模糊测试方法,其包括步骤:
4、s1、提取工业控制协议中的不同字段及状态转移关系;
5、s2、初始化共享内存与位图,所述位图包括表示本次模糊测试触发的程序分支信息的单次位图和表示全局分支信息的全局位图;
6、s3、根据位图中的分支信息和启发式字段调度策略,选取本轮变异的字段,采用不同的变异算子对选取字段进行变异,生成测试样例;
7、s4、启动被测系统,发送测试样例给插桩后的被测系统进行测试,并在测试完成后关闭被测系统;
8、s5、监控被测系统在测试时是否出现崩溃,若是,记录崩溃信息,进入步骤s6;否则,获取测试过程中被测系统的分支覆盖率,判断本次模糊测试是否产生新分支,若是,更新全局位图后进入步骤s6,否则直接进入步骤s6;
9、s6、判断迭代次数或者崩溃次数是否满足预设条件,若是,输出覆盖率、崩溃信息及其对应的测试样例,否则更新变异字段的变异次数及在产生新分支时,更新分支覆盖率,之后返回步骤s3。
10、上述技术方案的有益效果为:本方案采用插桩后的被测系统,其能够在测试时统计程序运行时的分支覆盖率,在覆盖率反馈下对协议进行字段层面的启发式调度,赋予有探索潜力的字段更多的变异机会,本方案充分考虑了工业控制协议报文字段特性,有效地提高了测试样例的质量。
11、本方案在每次模糊测试迭代开始时启动被测系统,并在结束时终止进程,从而确保无噪声的工业控制协议模糊测试,这样可以保证每次发送的测试样例在相同的初始服务器状态下开始执行,以避免之前发送的消息将服务器带到新状态,探索到大量额外的分支,导致对本次迭代的协议字段产生不正确的评估。本方案与网络链路的高延迟相比,频繁启动和终止进程消耗的时间并不会成为性能瓶颈。
12、进一步地,根据分支覆盖率和启发式字段调度策略,选取本轮变异的字段包括:
13、根据分支覆盖率,获得每个字段覆盖的新分支总数,并基于字段覆盖的新分支总数计算每个字段的字段得分:
14、
15、其中,f为字段;scoref为字段f的字段得分;m为比例常数;pf为字段f覆盖的新分支总数;tf为字段f被选中进行变异的次数;k为负反馈常数;
16、根据字段得分,计算每个字段获得调度机会的数学期望:
17、
18、其中,fi为第i个字段;e(fi)为本次调度选择第i个字段的数学期望;score[fi]为fi的字段得分;cnt为字段的总数;
19、根据每个字段的数学期望,选取预设数量的本轮变异字段。
20、上述技术方案的有益效果为:本方案通过新分支覆盖的数量和变异的次数来评估数据字段的有效性,这样可以使用较少计算资源发现更多分支覆盖的字段,同时还可以减少变异随机性对评估结果的干扰;结合数学期望进行变异字段的选择,可以最大化覆盖反馈评估在调度中的影响,同时避免调度饥饿现象。
21、进一步地,所述变异算子包括翻转、算术运算、特殊值替换和拼接,所有字段的变异算子不完全相同;所有的字段变异后生成一个测试样例。
22、进一步地,对被测系统进行插桩的方法包括:
23、识别被测系统的程序中所有的基本块,插入一个主键值cur_location;
24、源基本块和跳转目标基本块的键进行异或操作,并将运算结果映射到共享内存中的一个字节索引;
25、每执行一次基本块跳转,共享内存根据对应的字节索引取出的值加1,之后将当前块的主键值右移,以区分不同的跳转方向。
26、上述技术方案的有益效果为:采用上述方式对被测系统进行插桩后,在插桩的支持下,可以在每个测试样例的执行中获得分支覆盖率,以便于后面动态更新模糊测试时每个字段的字段得分。
27、进一步地,共享内存与位图的管理方法包括:
28、当为初始化阶段时,申请共享内存和位图,并获得句柄;
29、当进入模糊测试时,启动被测系统时通过环境变量传递共享内存句柄;被测系统测试时将分支覆盖的哈希结果写入共享内存;被测系统测试完成后,从共享内存中获取当前分支覆盖结果,之后将新的分支覆盖写入全局位图。
30、上述技术方案的有益效果为:本方案通过共享内存完成跨进程通信,并通过维护了一个全局位图来持久化存储被测系统发现的分支覆盖率。
31、进一步地,判断本轮模糊测试是否产生新分支的方法为:当单次位图中触发的分支不在全局位图中,则表明发现新分支;
32、更新全局位图为:将本次模糊测试发现的新分支记录到全局位图中。
33、第二方面,提供一种面向工业控制协议的灰盒模糊测试系统,其包括:
34、输入模块,用于提取工业控制协议中的不同字段及状态转移关系;
35、初始化模块,用于初始化共享内存与位图,所述位图包括表示本次模糊测试触发的程序分支信息的单次位图和表示全局分支信息的全局位图;
36、变异模块,用于根据位图中的分支信息和启发式字段调度策略,选取本轮变异的字段,采用不同的变异算子对选取字段进行变异,生成测试样例;
37、执行模块,用于启动被测系统,发送测试样例给插桩后的被测系统进行测试,并在测试完成后关闭被测系统;
38、监控模块,用于监控被测系统在测试时是否出现崩溃,若是,记录崩溃信息;否则,获取测试过程中被测系统的分支覆盖率,判断本次模糊测试是否产生新分支,若是,更新全局位图后进入终止判断模块,否则直接进入终止判断模块;
39、终止判断模块,用于判断迭代次数或者崩溃次数是否满足预设条件,若是,输出覆盖率、崩溃信息及其对应的测试样例,否则更新变异字段的变异次数及在产生新分支时,更新分支覆盖率,之后返回变异模块。
40、进一步地,所述监控模块包括:
41、共享内存,当被测系统上传的反馈信息为分支覆盖率时,用于存储被测系统写入的分支覆盖的哈希结果;
42、覆盖信息进程,用于单次位图中触发的分支不在全局位图中时,将发现的新分支记录到全局位图中;
43、崩溃处理模块,用于接收被测系统经过执行模块上传的程序崩溃信息,并记录程序崩溃信息,同时保持程序崩溃信息对应的测试样例。
44、本发明的有益效果为:
45、(1)提高了对工控协议程序测试的代码覆盖率。本发明使用编译期插桩获取工业控制协议程序的分支覆盖率,并通过分支覆盖率动态维护不同协议报文字段的评估分数,实现了在相同时间内达到更高的代码覆盖率。
46、(2)发现更多的工控协议程序的漏洞。本发明根据覆盖率反馈,对可能探索到更多程序分支的字段给出更好的评估结果,并使用启发式算法为得分更高的字段提供更多选择机会,能够识别关键字段并执行高效的调度策略,发现更多的工控协议程序的漏洞。