基于模糊测试技术的电力工控系统漏洞挖掘算法
2024-05-03贺晋宏冯楠付强付敏罗义钊
贺晋宏 冯楠 付强 付敏 罗义钊
摘要:针对工控系统运行环境封闭带来的传统漏洞检测无法导出系统组件进行分析的问题,根据工控网络协议特征,结合测试用例变异因子,针对Modbus_TCP公开协议提出一种改进的电力工控系统漏洞测试挖掘方法。所提方法利用变异因子与工控协议特征依赖关系,改造协议测试用例。通过将测试用例的特征值和数据域的长度值因子及其数值的选择进行合并,并做归一化处理.进而简化协议测试过程中变异因子的执行次数。针对Modbus_TCP工控协议的模糊测试结果表明,改进后的Fuzzing测试表现出了更高的测试用例接收率和测试效率,测试样例的平均接收率至少提高50。
关键词:电力行业;工业控制系统;漏洞挖掘;Fuzzing测试;开源;异常分析和监测;数据生成;变异率
中图分类号:TM73 文献标志码:A 文章编号:1000-1646(2024)01-0103-06
随着自动化技术的高速发展,工业控制系统逐步与现代网络互联,设备兼容需求的增大,数据共享也带来了网络漏洞的风险。
电力作为国家的关键性基础行业,在发、变、输、配电,以及综合调度等多个环节均涉及设备应用的工业控制系统。由于工业自动化设备集成度高、生产厂家众多,开发主要考虑功能接口,而深入、安全、有效的健壮性测试和工控漏洞检测尚有空缺,使得系统在接入公网后存有安全隐患。为了电网系统的安全有效运行,对电力工控系统的安全缺陷进行漏洞挖掘,使工控系统能及时得到完善,已成为当下工控领域确保其安全运行的热门研究方向。传统漏洞挖掘技术主要有逆向分析和模糊测试两种模式。由于工控系统环境封闭、系统组件导出困难,因此逆向分析难以奏效。近些年不少学者提出Fuzzing模糊化测试,从某种程度上推动了漏洞挖掘技术的发展。尤其是自2007年以来,较多开源和商业的Fuzzing工具被研制出来,并向产品化应用转化。然而,绝大多数Fuzzing技术与框架应用于电力工控系统时仍存在较多问题,工控协议难以开展智能化漏洞挖掘。所以,为进一步提高电力工控系统所涉及的协议漏洞挖掘效率,本文利用Sulley开源测试软件,将下位机层面工业控制器协议的漏洞挖掘作为研究重点。通过对软件中的Fuzzing框架流程进行改进,提出了针对Modbus_TCP工控协议的漏洞挖掘策略。
1 基于Sulley的Fuzzing框架及改进
1.1 Fuzzing框架
Fuzzing是一款开源的通用网络协议模糊测试框架,其在简化数据表示、传输、测试用例执行及目标监视方面均具有极强的优越性,在计算机系统中,根据被分析數据的特点,模糊测试包括web页面测试、协议测试、文件格式测试等,协议由5个基本模块构成,Fuzzing模糊测试流程如下:
1)目标识别。在识别目标程序时,尽可能参考以往存在的安全漏洞以及研发者的研发习惯。
2)输入识别。程序缺陷往往源自于对用户输入偏好的了解不足,这里输入向量由文档名称、结构和消息头构成。
3)模糊测试数据的产生。确定需要输入的资料数据(输入向量)。
4)模糊测试数据的解析。存在缺陷的数据输入到被选定的目标程序,如打开存有缺陷的文档。
5)异常监视。主要记录引起崩溃的数据包以及目标程序。
1.2 模糊测试器
Sulley作为一种模糊测试器,功能强大,不仅可以简化数据,还可以在程序崩溃时提供崩溃报告,其基本功能为:
1)数据生成。该模块用于构造测试用例所需的数据块,包括:数据表示、块定义、块辅助函数以及积木等。
2)会话管理。该模块的作用是将由数据生成的模块产生一系列Request,连接成一个有向无环图。在Fuzzing测试被启动后,Sulley遍历会话路径,对每一节点Request依次做变异处理,以达到深度Fuzzing测试。
3)事后监视。保存生成的变异数据,监视对应结果变化。
基于Sulley进行Fuzzing流程,可实现数据生成、测试用例执行及过程监控自动化过程,但作为一种通用网络协议模糊测试框架,将其直接应用于电力工控系统协议测试时,存在协议格式解析代价大、测试用例相关性大、测试效率低等问题。
1.3 基于溯源的状态数据改进分析
事实上,仅有成熟的Fuzzing框架不足以支持工控系统漏洞的发掘,而将Sulley植入到更强大的硬件系统才能更好地完成Fuzzing功能。因此,通过分析基于开源Sulley的Fuzzing框架在电力工控系统协议测试时存在的问题,本文将从两个方面对基于Sulley的Fuzzing框架进行改进,具体如下:
1)传统Fuzzing框架中,框架本身对数据包无追溯功能,这使得整个Fuzzing无法访问指定的数据内容,无法满足数据回放。因此,将传统一对一的受举报收发方式修改为多对一的收发方式。
2)传统Fuzzing框架不具备数据分析能力,因此需要在接收到上一数据包时,相应地增加框架本身对协议中遇到的数据处理、失误判断、设备的存活响应等状态数据进行分析。
上述所提及改进部分将在Fuzzing流程执行模块中体现,包括通信模块的产生、流程设计和协议数据分析等。
2 基于改进Fuzzing框架的ModbusTCP协议漏洞挖掘策略
2.1 Modbus_TCP协议分析
Modbus_TCP的报文由报文头、功能码、数据三部分组成,如图1所示。其中,MBAP报文头按照标识符内容可分为事务、协议、长度及单元四个域。事务标识符用于事务处理配对,保证Modbus_TCP通信数据包按序发送接收;协议标识符用于系统内的多路复用,默认值为0;长度表示次字段域后数据包的字节数;单元标识符用于Modbus_TCP与Modbus串行链路,从设备的通信表示远程从设备的识别码。
Modbus_TCP协议按照报文类型分为3种:请求、响应以及异常响应。请求报文和响应报文具有类似的协议数据单元(PDU),由功能码和数据域构成,数据域由功能码决定,包括地址偏移、线圈数、寄存器数等信息。异常响应报文的协议数据单元包含差错码和异常码,其中请求功能码的数值加上“0x80”即为差错码数值。
对Modbus_TCP协议进行模糊测试时,需要对其数据包进行析构,并基于Sulley框架生成相关测试数据。数据的定义是根据协议包格式中不同字段功能定义的,分别表达了该数据报文所包含的信息。基于Sulley对Modbus_TCP协议数据包的析构方式,如表1所示。
根据上述拆分的数据包,指定、重整待发送内容。例如对生成的Fuzzing数据进行分块、划分编号、对相关字段进行变换,然后发送指定编号范围的数据块。在发送数据之前,分析发送数据内容格式,判断其合法性。若判断为合法,则根据待发送内容,预生成期望的响应内容。将接收到的响应数据与期望数据取值范围进行对比,查看接收数据取值是否存在异常。若接收数据与预期数据功能码或取值范围不一致,则记录相应的异常报文信息,且根据记录日志分析异常产生的原因、位置并进行显示。基于改进的Fuzzing框架,Modbus_TCP数据分析过程流程图,如图2所示。
图2中的数据分析部分具体包括:对事务处理标识符、协议标识符、长度字段、单元标识符、功能码合法性的分析。若数据正常,则要生成预期响应数据,生成标准如下:1)事务处理标识符与发送端一致;2)协议标识符设置为0;3)长度字段取值根据请求功能码进行范围设置;4)单元标识符与发送端一致;5)依据功能码对数据域格式范围进行设置。
2.2 基于概率的变异因子取值选择
工控协议的测试用例涉及协议特征值和数据域长度值,这两个数值的生成与变异因子和变异因子数值的选择相关。为减少选择次数,将数据域长度值的变异因子及其数值的选择合并,进行归一化处理。根据归一化处理连续取值区间的特性,本文采用3层卷积神经网络计算变异因子的概率。具体过程如下:
1)假设首先输入第i条报文Xi,i∈N,协议分析层根据卷积神经网络学习数值分布规律。
2)设概率用符号ρ表示,输出卷积神经网络的概率关系矩阵,矩阵存储257个数据值作为输出值概率ρi,概率之和ρ0+ρ1+…+ρ256=1,概率模型矩阵为
2.3 关联规则特征学习及测试用例策略生成
Modbus_TCP协议特征具有相互依赖的关系,长度域包含单元标识、功能码、数据域长度等信息。在模糊测试时,需构造正常用例监控被测对象状态。首先从Modbus_TCP节点进行遍历搜索,并采用协议特征生成变异因子,最后生成测试用例。其中,协议之间的依赖关系体现为字节关系。整个流程所涉及的关键点分析包括:叶子节点请求数据集的分析,可变字节间的强关联规则挖掘,本文主要采用循环搜索和最小支持度的候选集和裁剪。
3 Modbus_TCP协议测试分析
基于上述提出的改进Fuzzing框架策略,对配电室电力工控系统中的PLC控制器进行Fuzzing测试,该控制器由HoneyWell厂商提供,实验环境如图3所示,型号为PLC S7-1500,本文使用S7-1500的CPU自带端口部署Modbus_TCP协议。
通过与未改进的传统网络模糊测试器对比,在模糊测试过程中,共发现了3个协议漏洞,具体的请求响应异常数据如表2所示。
Modbus协议中存在三种功能码,已经定义好的公共码、自定义码及预留码。其中,公共码对应有开关量输入和模拟量输入。常见功能码有:表示读线圈的十进制功能码为01,读多个存储器的十进制功能码为03等,具体可参考Modbus_TCP公共协议说明书。此外,异常响应是根据请求数据包内容产生预期响应数据,并将两者进行对比,当出现异常时,即功能码+0x80,表示为错误码。表2中,前2个异常是写单个线圈功能码为0x05时,通过Modbus_TCP协议规约文档,得到协议程序处理0x05功能码的流程。若接收的输出数据非0x00和0xFF00,则应返回关于“读保持寄存器”的异常码0x03的响应,并显示上位机请求数据出现异常。第3个异常情况是读取线圈的0x01功能码的过程,数据域显示为空,对于该非合法数据,Modbus_TCP协议规约应返回异常功能码为0x03,该用例可引发Modbus_TCP协议指针出现异常。由此可以看出,根据协议特征构造的测试用例可检测工控系统的协议漏洞,获得系统异常信息。此外,实验中写寄存器功能码还出现了拒绝服务风险的警告,这说明该设备存在漏洞。
此外,实验统计了5、10、15、20个样本数据下改进Fuzzing和传统Fuzzing测试方法生成的测试用例数量,如图4所示。测试用例数是程序崩溃或样本执行完产生的样例总数。
从图4中可以看出,随着样本数量的增加,本文方法生成的测试数据明显少于未改进算法生成的测试数据。另外,传统Fuzzing生成的测试用例数会随着样本数量的增加而上升得更为平稳,这是由于传统方法中用户往往提供的样本存在低质量数据,导致变异产生数据冗余,对输入样本进行了修剪。
改进Fuzzing和传统Fuzzing测试方法在接收率方面的对比如图5所示。由于本文所提的改进方法更依赖样本数量,使得策略生成具有强关联规则,因此产生的用例更具有针对性。结果显示,实验数据显示的最大差距600s时约为60%,最小差距1200s时约为55%,平均接收率至少提高50%。
4 结束语
本文对Sulley开源Fuzzing框架原理及其模糊测试流程进行了分析,针对数据生成和测试方法进行拓展,提出了一种针对电力工控系统协议的Sulley改进Fuzzing框架,并设计了Modbus_TCP协议Fuzzing测试用例。该框架策略可用于电力工业控制系统中协议层的漏洞发掘,具有测试数据灵活、效率高等优点,为协议Fuzzing的产品化应用打下了基础。
本文结合变异因子和协议特征构造了工控网络协议测试用例,提出了适合Modbus_TCP公开协议的模糊测试方法。根据变异因子和工控协议特征的依赖关系改进传统Fuzzing测试,通过构造协議测试用例,将协议测试用例的特征值和数据域长度值的变异因子及其数值的选择合二为一,通过归一化处理,简化选择操作,有效减少协议测试过程中变异因子的执行次数。仿真实验结果表明,对工控公有协议进行模糊测试,改进后Fuzzing测试显示出更高的测试用例接收率:结合请求与响应的协议特征关系,经监听获得了被测对象的3个异常信息,相比于未经改进的Fuzzing测试检测效率更高;而在测试样例的接收率方面,平均接收率至少提高50%。下一步研究中可考虑采用多元联动(即同时变换多个相关字段),引入数据行为和状态机的方式来生成数据。一方面提高数据关联性;另一方面可超越黑盒测试的限制,进一步提高数据的生成效率,从而解决随机产生数据所带来的状态爆炸等问题。
(责任编辑:杨树 英文审校:尹淑英)