基于遗传算法的Modbus TCP协议模糊测试技术研究*
2020-12-02
(海军工程大学舰船综合电力技术国防重点实验室 武汉 430033)
1 引言
随着工业互联网的不断发展,以及信息化和工业化的不断融合,传统工业控制系统[1]与互联网的联系越来越紧密。原本只设计在内网通信的工控系统逐渐接入互联网,这在增加工业控制系统的开放性、互连性和提高生产力的同时,也使得传统工控系统将面临着越来越多来自互联网的安全威胁[2]。与常规软件漏洞挖掘相比,使用模糊测试[3~5]来挖掘工控协议漏洞的困难在于工控协议是状态机,并且数据包的正确性具有很强的约束性。如果构造的异常数据包与工控协议格式不一致,工控设备很容易将其丢弃,将没有机会触发漏洞。因此,模糊测试工具应该具有一些基本的智能,而遗传算法(Genetic Algorithm,GA)[6]非常适合此任务,本文提出一种基于遗传算法的Modbus TCP协议模糊测试方法。
2 基于遗传算法的Modbus TCP协议模糊测试用例生成方法
2.1 编码
编码的目的是将问题空间的参数转换成遗传算法可以处理的形式,编码的方法会对交叉等接下来几个步骤产生直接的影响。因此,选择合适的编码方法会有效提高计算效率。常见的编码方式包括:二进制编码和格雷编码等。二进制编码是遗传算法中经常使用的编码方式。它的缺点是不适用于多维、高精度连续函数优化问题,还可能存在较大的汉明距离,也被称为汉明悬崖,因此本文选择格雷编码方式。
2.2 适应度函数
遗传算法在计算搜索最优解时,不依赖外部的信息,只依靠构造的适应度函数。因此,如何构造合适的适应度函数是遗传算法的核心问题。
传统针对Modbus TCP协议[7]的模糊测试方法,未考虑根据可编程逻辑控制器(Programmable Logic Controllers,PLC)[8]接收到模糊测试用例后的响应报文,对模糊测试用例的生成过程进行及时调整,导致产生大量冗余数据[9~10]。
为了能根据模糊测试结果对遗传算法的进化方向进行及时调整,使用返回的异常码来指示测试用例的代码覆盖率,并为不同的异常码[11]分别赋予不同的权重,如式(1)所示,异常码为4时权重最大为w4,其次是异常码2、异常码3和异常码1,分别赋予权重w2、w3和w1,若生成的测试用例被工控设备正常响应,即构造的测试用例属于正常数据包,则该测试用例被赋予的分数最小为w0。
首先,创建一个测试用例队列,用于存储每次遗传算法计算出的最佳测试用例,以及在接收该测试用例后被测PLC响应报文中的异常码。初始队列由上位机与PLC进行正常通信时捕获的Modbus TCP协议数据包组成。
然后,在生成个体px后,将测试用例队列中所有与个体px功能码相同的个体组成一个集合Py。计算px与集合Py中个体pj每个字节的距离,再将每个字节的距离进行累加,计算出px与个体pj的距离,之后对计算出的距离加1,此处加1是为了避免距离为0。再取倒数,并乘以根据py的异常码计算得出的权重wj,如式(2)所示。
之后,再将px与集合Py中每个个体的距离相加,并除以集合Py的数量n,得出个体px和初始种群的平均距离,如式(3)所示。
最后,将最终计算出的平均距离作为该个体的适应度值,如式(4)所示。
2.3 选择
在完成上一步个体适应度值的计算后,为了筛选出具有优良基因的个体继续生存繁衍,本文的使用“轮盘赌选择算子”从父代种群中挑选出双亲。
轮盘赌算子的计算步骤如下:
步骤1):如式(5)所示,依据公式计算出个体的适应度值,计算出种群中所有个体被遗传的概率Pro(msgi)。
步骤2):如式(6)所示,计算出种群中所有个体的累计概率Qi。
步骤3:之后在[0,1]区间内生成随机值rand。若r<Q1,则选择个体1,否则选择满足式(7)的个体k,将挑选出来的个体进入子代种群进行下一步操作。
步骤4):不断重复步骤3,得到的个体形成一个新种群。
2.4 交叉与变异
适用于二进制编码个体的交叉算子有单点交叉和两点交叉等。本文选择采用单点交叉,即在两个父代个体编码后的二进制基因序列上随机选择一个位点,将这个交叉位点后部的两个父代基因序列进行交换,以产生新的下一代个体。
变异本文采取较为简单的实现方式。由于编码后的基因序列都是二进制数据串,因此本文采用基本位变异算子。变异算法如算法1所示,首先获取个体的编码后的基因序列的长度length。然后再结合变异概率Pm计算出需要变异的基因序列的数目count。再在0~length-1之间生成一个随即数k,用以指定将要进行变异的基因序列的位置,对第k位基因进行取反,变异过程循环执行count次。最后输出变异后的个体基因序列Msg。
为了保留适应度值高的个体,并剔除适应度值低的个体,本文使用自适应遗传算法[12]计算交叉概率Pc和变异概率Pm,如式(8)所示。
其中fmax表示种群中所有个体适应度值的最大值;favg表示种群中所有个体适应度值的平均值;f表示两个将要交叉个体的适应度值中的较大值;f'表示将要变异的个体的适应度值。
3 实验测试与结果验证
3.1 实验环境
如图1所示,本文提出的Modbus TCP协议模糊测试系统是在模糊测试工具Peach的基础上进行二次开发而成。模糊测试用例生成模块在生成测试用例后,将测试用例传入Peach Fuzzer的格式解析模块,通过状态控制模块控制交互发布模块将生成的模糊测试用例输入被测PLC,同时代理监控模块检测被测PLC是否出现崩溃,若出现异常则通过日志记录模块进行记录,并终止测试,若未出现异常,则通过交互发布模块获取PLC响应报文,并利用状态控制模块调用格式解析模块对响应报文进行解析,最后将解析结果反馈给公有协议模糊测试用例生成模块,用以指导下一个模糊测试用例的生成。
图1 Modbus TCP协议模糊测试系统架构图
3.2 实验效果验证
在进行Modbus TCP协议模糊测试实验时,本文对两款支持Modbus TCP协议的国内外厂商的PLC进行了模糊测试,实验结果如表1所示。在对信捷XG1-16T4 PLC进行模糊测试实验时发现了一个0-Day漏洞,该漏洞在提交国家信息安全漏洞共享平台(China National Vulnerability Database,CNVD)后,获得一个原创CNVD漏洞编号;在对施耐德M241 PLC进行模糊测试实验时,成功挖掘到一个拒绝服务漏洞,下面将分别介绍两次实验。
表1 公有协议模糊测试实验结果
1)实验1
实验1中的被测工控设备是信捷XG1-16T4 PLC,这款PLC是无锡信捷电气股份有限公司的一款中型PLC,支持Ethernet通讯、X-NET现场总线、MODBUS通讯等功能。在对信捷XG1-16T4 PLC进行模糊测试时,发现了一个原创CNVD漏洞,漏洞编号CNVD-2020-04095。攻击者可利用该漏洞向502端口发送过长的数据包,会导致502端口拒绝服务,须断电重启才能恢复PLC正常工作。
图2 信捷正常运行与拒绝服务
如图2所示,初始时信捷XG1-16T4 PLC正常运行,有PWR和RUN指示灯亮绿灯。在经模糊测试触发异常后,信捷XG1-16T4 PLC拒绝服务,此时PWR指示灯亮绿灯,ERR指示灯亮红灯。拒绝服务后需要将其断电重启才能恢复工作。图3为信捷PLC拒绝服务后通过Peach的监控窗口监控到的信息。因为信捷该型号PLC的固件被加密,所以无法通过逆向分析固件准确地定位漏洞的位置。
2)实验2
实验2中的被测工控设备是施耐德M241,该款PLC支持以太网、CANOpen和串行通讯。在使用本文提出方法对施耐德M241进行实验时,模糊测试大约2h,触发异常,该异常导致施耐德M241拒绝服务,须断电重启才能恢复工作。具体原因还在分析中。
图3 触发崩溃
3.3 同类工具比较
为验证本文提出的公有协议模糊测试方法具有更高的模糊测试效率,本文在上位机上部署Peach[13]与 Sulley[14],对相同的工控设备进行模糊测试,并对三种方法的模糊测试结果进行比对。
表2 模糊测试工具对比结果
图4 测试用例接收率
根据表2中结果可知,与已有模糊测试工具Peach和Sulley相比,在使用本文提出方法进行实验时,虽然生成的模糊测试用例数比Peach和Sulley少,且模糊测试时间比Peach和Sulley短,但是却成功触发两个拒绝服务漏洞。将本文所提出方法、Peach和Sulley三者进行生成测试用例接收率进行比较,如图4所示,可见截取的前一个小时里本文所提出方法的测试用例接受收率远高于Peach和Sulley的测试用例接受收率。因此,通过表2和图4的结果可知,本文提出方法能有效提高针对Modbus TCP协议的模糊测试效率。
4 结语
本文提出了基于遗传算法的Modbus TCP协议模糊测试方法,在使用遗传算法生成Modbus TCP协议的模糊测试用例时,建立了一个种子队列用于存储遗传算法生成的测试用例和测试用例的异常码,之后从相似度和异常码两个方面来计算生成个体的适应度值,以调整生成测试用例的方向,最后本文将实验结果与已有同类工具从挖掘到的漏洞数量、所需的时间、发送模糊测试用例数和测试用例接收率四个方面进行比较,比较结果验证了本文所提方法的有效性。