基于改进小生境遗传算法的PLC协议模糊测试方法

马航 ,  董卫宇 ,  邵启龙 ,  唐之卓

信息工程大学学报 ›› 2025, Vol. 26 ›› Issue (03) : 345 -351.

PDF (2050KB)
信息工程大学学报 ›› 2025, Vol. 26 ›› Issue (03) : 345 -351. DOI: 10.3969/j.issn.1671-0673.2025.03.013
网络空间安全

基于改进小生境遗传算法的PLC协议模糊测试方法

作者信息 +

Fuzz Test for PLC Protocol Based on Improved Niche Genetic Algorithm

Author information +
文章历史 +
PDF (2098K)

摘要

针对现有可编程逻辑控制器(PLC)协议模糊测试自动化程度与程序覆盖率不足的问题,提出一种基于改进小生境遗传算法的黑盒测试方法。首先,通过分析PLC协议以功能码为核心的“请求—响应”特征,论证其与小生境遗传算法的适配性;其次,提出以功能码划分小生境和“子种群选优、全种群进化”的进化策略,改进小生境遗传算法;最后,结合个体相似度与被测设备响应状态的适应度计算方法,最终实现自动引导测试用例更全面探索程序空间的目的。实验结果表明,相比Peach及基本遗传算法的方法,该方法生成的测试用例触发异常响应占比更多,漏洞发现能力更强,在施耐德、三菱、通用电气(GE)的3款PLC中均触发故障,发现1个未公开漏洞。

Abstract

To address the issues of insufficient automation and program coverage in existing programmable logic controller (PLC) protocol fuzz testing, a black-box fuzz testing method is proposed. Firstly, the characteristics of PLC protocol, which are characterized by a “request-response” pattern with function code as the core, are analyzed to demonstrate its adaptability to niche genetic algorithms. Secondly, a method of dividing niches based on function codes and an evolution strategy of “subpopulation selection and full population evolution” are proposed to improve the niche genetic algorithm. Then, a fitness calculation method combining individual similarity and the response status of the device under test is designed, aiming to automatically guide test cases to more comprehensively explore the program space. Experiments show that compared with Peach and the method using a simple genetic algorithm, the generated test cases trigger a higher proportion of abnormal responses and have stronger vulnerability discovery capabilities. Faults are triggered in three PLCs from Schneider, Mitsubishi, and General Electric (GE), and one undisclosed vulnerability is found.

Graphical abstract

关键词

PLC协议 / 模糊测试 / 小生境 / 遗传算法

Key words

PLC protocol / fuzz test / niche / genetic algorithm

引用本文

引用格式 ▾
马航,董卫宇,邵启龙,唐之卓. 基于改进小生境遗传算法的PLC协议模糊测试方法[J]. 信息工程大学学报, 2025, 26(03): 345-351 DOI:10.3969/j.issn.1671-0673.2025.03.013

登录浏览全文

4963

注册一个新账户 忘记密码

随着工业自动化的发展,特别是在工业以太网和TCP/IP等通信协议引入后,工业控制系统与外部网络的连接更为紧密,网络安全问题日益凸显。2023年,全球针对工控系统攻击的破坏程度和规模呈扩大趋势,影响到能源、交通、军工、制造、医疗等多个领域[1]。可编程逻辑控制器(Programmble Logic Controller, PLC)作为工业现场控制的关键设备,一直是被攻击的主要对象之一。PLC一般通过Modbus等标准协议或厂商自定义的私有协议与控制主机通信,其协议安全性是设备安全的重要保障,对PLC协议开展脆弱性分析尤为必要。
模糊测试是协议安全性分析的主流方法之一,其优势在于自动化、便捷性,而效果取决于对程序代码的覆盖率。现有PLC协议模糊测试方法在上述两个方面均存在一定的改进空间。一方面,白盒测试需要源代码分析等前期工作[2],相对复杂,且无法用于私有协议;另一方面,基于协议逆向等技术的黑盒测试[3-6]一定程度上解决了测试用例合法性问题,但并未考虑对程序的覆盖度。此外,近年来出现的基于机器学习的生成式测试[7-11],虽然简单易行,但不足之处是生成的测试用例可能与样本雷同,对程序代码区域的覆盖不够全面。
同时实现工具的便捷性与对程序的有效覆盖通常较为困难。但若只针对特定的测试对象,则有可能根据其具体特征设计较为有效的方法。PLC协议具有两项典型特征:一是消息交互多为主、从设备之间的“请求—响应”信息;二是每条报文通常实现特定功能,并在报文中以“功能码”字段显性表征,协议处理程序一般也以此划分为不同区域。
遗传算法(Genetic Algorithm, GA)[12]作为一种经典的全局寻优算法,与模糊测试有较好的适配性,具体体现在:其自动寻优能力可提高自动化程度,多目标优化能力可探索不同程序分支,内含并行性可提高运行效率等。其中,小生境遗传算法[13]采用多个子种群分区进化,多样性更好。
本文改进小生境遗传算法,提出了以功能码为标准的子种群划分方法,设计相应的进化策略,应用于PLC协议模糊测试。遗传算法的自动寻优能力实现了工具便捷性,而以功能码划分搜索空间则从策略上保证了对协议处理程序各主要区域的覆盖。在对施耐德、三菱、通用电气(General Electric, GE)3种PLC设备协议的测试中验证了方法的有效性,挖掘未公开漏洞1个。

1 相关工作

1.1 PLC协议模糊测试技术

白盒测试方法如文献[2]通过分析源码确定报文不同字段对程序分支的影响,引导生成覆盖率更高的测试用例,该方法依赖程序源码且需要前期分析工作。黑盒方法利用语法树生成测试用例[3],或依据协议规约增强变异的针对性[4],解决了测试用例合法性问题,但未考虑对程序的覆盖。针对私有协议的黑盒测试采取逆向方法推断报文格式和字段语义[5-6],但方法较为复杂且效果受限于逆向算法的有效性。基于神经网络的黑盒测试[7-11]从现有流量样本学习预测生成新测试用例,省去了逆向工作,自动化程度较好,但测试用例相似度较高,探索新区域的能力较差。

1.2 遗传算法

遗传算法是一种模拟自然界生物进化过程的全局寻优算法,其对待求解问题建模表示为八元组[14],如式(1)可表示为

SSGA=(C,  E, P0,  M,  Φ,  Γ,  Ψ,  T)

式中:SSGA表示基本遗传算法;CEP0MΦΓΨT等分别表示编码、适应度函数、初始种群、种群规模、选择、交叉、变异和终止条件。

小生境是生物学中“物以类聚”的现象,指同一物种内部聚集的不同群落,即“子种群”,各自相对独立。小生境遗传算法适用于多峰函数的优化。

1.3 基于遗传算法的协议模糊测试

遗传算法用于模糊测试的主要目的是测试用例的生成和优化,在应用方法上,“进化组织”和“适应度函数设计”是关键。

在进化组织方面,文献[15]以造成异常的可疑漏洞点为核心,把个体聚类成不同子种群,分别探索程序的不同区域,然而初始异常点并不能反应程序中所有的潜在漏洞,因而会导致漏报。文献[16]根据适应度把种群分为高、低两个种群,高适应度种群保证了收敛速度,低适应度种群保留了个体的多样性,然而通过多样性提高程序覆盖率具有不确定性。文献[17]改进了选择算子。文献[18]用自适应随机测试算法(Adaptive Random Testing, ART)改进初始种群,增强了多样性。文献[19]把小生境遗传算法用于文件传输协议(File Transfer Protocol, FTP)模糊测试中,体现了多峰函数优化思想。其小生境采用自然划分的方法,没有特定的依据。这种方式初始阶段各子种群分布特征相同,适合在没有明确约束条件的情况下使用,不足是随机性强收敛时间较长。

在适应度函数设计方面,文献[15-16,20]把个体相似度、对规约的满足度作为适应度的指标之一,目的是生成合法、新颖的测试用例。文献[21]依据被测设备响应设定了5级适应度,依次为“返回故障”、“返回非法地址”、“返回非法数据”、“返回非法功能码”、“返回正常”,指导生成更多能触发异常的用例,经过分析,以上5种状态还可以进一步扩展。

2 方法原理

2.1 设计思路

首先,采集设备流量构建遗传算法初始种群,如果是私有协议,只推断其功能码字段,不做进一步分析;其次,测试用例按功能码划分子种群构建小生境,输入被测设备,以响应状态和个体相似度为依据确定适应度;最后,按照“全种群进化、子种群选优”的方式生成新一代种群。以此循环迭代,使生成的测试用例能探索更多的程序区域,总体工作流程如图1所示。

2.2 小生境遗传算法与模糊测试适配性分析

考虑如图2所示的单变量多峰函数寻优问题,其最优解不止一个。模糊测试对程序覆盖的期望正是这样:并不是要找到某一个对某一条路径探索最深的“最佳测试用例”,而是要找到所有的对不同程序区域探索最深的多个测试用例。基本遗传算法会收敛于某一个“峰”附近,忽略其他部分,小生境遗传算法中各子种群相对独立进化,可分别探索各自场景下的最优个体,更加适合模糊测试的需求。

2.3 对小生境遗传算法的改进

2.3.1 子种群划分方法改进

如何划分子种群,使不同子种群“如约”探索程序的不同区域,避免重复性、随机性和片面性是需要解决的关键问题。基于对PLC协议处理程序的特点分析,提出以功能码作为划分依据。

1)PLC协议一般无复杂的状态转换,而是以“请求—响应”模式工作,报文结构多以功能码为核心。Modbus报文基本格式,包含7字节协议头,1字节功能码,后续为数据。表1为Modbus主要功能报文详细格式。私有协议GE-SRTP、三菱Melsoft也以功能码为重要元素,如表2所示。本文对私有协议采取文献[6]的方法,仅确定功能码字段,不做全面的逆向分析,操作较为简单且准确度高。

2)PLC协议处理程序一般以功能码为程序分支判断条件分区域处理,图3为Modbus官方标准[22]功能码01处理程序流程图。以功能码划分子种群与程序代码区域划分基本一致,可近似认为不重不漏。

2.3.2 “子种群选优、全种群进化”策略

“子种群选优”:为了分别探索协议各功能码处理程序,不同功能码的测试用例需隔离在本种群内部竞争优化,不与其他功能码测试用例互相比较。

“全种群进化”:从测试用例多样性角度考虑,个体的交叉和选择在全种群中进行。这是因为工控协议报文虽然功能码各不相同,但其他部分构成方式和字段属性一致,如表1可见后续字段的构成有较大的共性,相互可以交叉。另外,依据文献[23],不同类型报文交叉产生的非常规报文有利于触发异常,模糊测试需要探索的正是此类在正常情况下很少发生甚至依据规约不可能发生的交互。

2.4 适应度函数设计

以被测设备响应状态和个体相似度两方面因素共同构建适应度函数,计算公式如式(2),可表示为

F= αFDUT.state+ βFSimI

式中:FDUT.state表示测试用例输入被测设备(Device Under Test, DUT)后的状态;I表示个体;Sim(I)表示测试用例个体相似度;α = 0.7;β = 0.3。

被测设备状态是首要考虑的因素。在文献[21]的基础上,把设备状态扩展为4类7种,分别赋予不同的适应度值,从S1到S7依次递减,如表3所示。

个体相似度计算采用文献[15]的方法,基于相似度的适应度的计算应用文献[20]的方法。

2.5 遗传算法的决策变量、编码方式和约束条件

以二进制报文为个体,报文中MBAP协议头和功能码不变,之后的所有字节均参与进化,作为决策变量。

编码采用格雷码,其优势在于相邻两个整数的编码值只有1个码位不同,保证了变异过程的连续性。如数字3和4的普通二进制编码为0x011和0x100,3个码位均需翻转,而格雷码相应的编码为0x010和0x011,仅翻转1位。

在硬约束方面主要手段是淘汰非法报文,通过被测设备的响应判定,如一条报文发送给被测设备后无响应,则再发送一条正常的标准查询报文,如果被测设备仍无响应,则判定触发了故障,如果被测设备正常响应,则判定该报文非法,予以丢弃。软约束通过适应度函数的惩罚性因子实现,主要约束个体的相似度,以符合最低规范标准的报文为基准,相似度趋于最大或最小时适应度都降低,前者保证了多样性,后者保证了合法性。

2.6 算法实现

2.6.1 初始小生境种群建立算法

个体I(Individual)表示为:I = { func, rqst, rsp, st, fit },在Python中定义为字典,五元素分别是功能码、请求报文、响应报文、设备状态、适应度值。种群P(Population)为个体的集合,定义为Python列表,各功能码子种群P[f_code],每个子种群30个个体。步骤如下:

1)从功能码0开始,把原始流量报文和功能码赋予个体;

2)把原始报文输入被测设备,得到响应报文和设备状态,赋予个体;

3)根据个体的相似度和设备状态计算适应度值,赋予个体;

4)个体加入种群,直到够30个为止;

5)重复操作其他功能码,直到最大功能码Max_code。

如算法1所示。

算法1 初始小生境种群建立算法

输入:采集的原始报文(Original Messages)

输出:遗传算法小生境种群(P [f_code])

1. for (f_code = 0; f_code < Max_code; f_code++)

2. for (i = 0; i < 30; i++)

3. Original_Message [f_code][i] → I [i].rqst

4. f_code → I [i].func

5. I [i].rqst → DUT

6. DUT.response → I [i].rsp

7. DUT.state → I [i].st

8. Fintess(I) → I [i].fit

9. P [f_code].append(I [i])

10. end for

11. end for

2.6.2 种群进化算法

步骤如下:

1)以轮盘赌策略(Roulette Wheel Selection)从总种群中随机选择个体x1、x2,设其分别属于小生境1、2。

2)以概率Pc (本文取0.8)对x1、x2交叉,得到y1、y2,交叉点在功能码之后随机选取。

3)以概率Pm (本文取0.1)对y1、y2变异,得到个体z1、z2。功能码及之前的字段不变异。

4)由于功能码未发生变化,因此可以从{x1, y1, z1}和{x2, y2, z2}中各选适应度高的一个分别加入小生境1和2的下一代种群。循环步骤1),直到所有下一代小生境个体数量达到30。

5)将下一代输入被测设备,根据响应计算适应度,循环步骤1),直到退出条件。

如算法2所示。

算法2 种群进化算法

输入:当代种群P

输出:下一代种群Pnext

1. while (1)

2. while ((number of Pnext[f_code]) < 30 )

3. Roulette Wheel select x1, x2from P

4. y1, y2 = Crossover(x1, x2)@Pc

5. z1, z2 = Mutate(y1, y2)@Pm

6. Fitness_max(x1, y1, z1) → Pnext[f_code]

7. Fitness_max(x2, y2, z2) → Pnext [f_code]

8. end while

9. Pnext→ DUT

10. end while

3 实验验证

比较本文方法与经典协议模糊测试工具Peach、应用SGA的模糊测试方法三者生成测试用例的有效性和漏洞发现能力。

3.1 实验环境

被测设备为施耐德M340、三菱Q12H、GE Rx7i这3款PLC,上位机为Ubuntu 18.04 LTS,处理器为Intel i7-1165G7,内存16 GB。

3.2 实验结果

采用本文方法复现施耐德M340拒绝服务漏洞2个,触发三菱设备、GE设备拒绝服务各1次。

1)施耐德M340。触发2次拒绝服务,重启可恢复,分别经过约2.08 h和3.18 h,测试结果如图4所示,设备运行灯灭,故障灯闪烁。分析报文后证实与CVE-2018-7853、CVE-2018-7857相符。

2)三菱Q12H。触发设备异常,设备运行灯灭,故障灯闪烁,重启后可恢复,测试时间约0.6 h,结果如图5所示。

3)GE Rx7i。触发设备拒绝服务,重启设备后可恢复,测试时间1.38 h,设备正常灯持续闪烁,如图6所示。该漏洞经确认获取国家信息安全漏洞共享平台编号。

3.3 测试用例有效性分析

实验统计了3种工具对三菱PLC测试时在遗传算法第10代、100代时(Peach为生成相同数量测试用例时)生成的测试用例中4种情况的占比,异常响应占比越多,测试用例的有效性越好,而故障则可能直接与漏洞相关。

遗传算法初始种群个体为1 200个(40个子种群),如表4所示,Peach生成的各类用例占比前后期无明显变化,且不合法用例较高,在60%左右,这是因为Peach依据规约编写报文格式,而私有协议多数字段无法确定属性;造成异常响应的报文仅占15%左右;未造成设备故障,且比例未随时间变化,无进化能力。基本遗传算法和本文方法的表现均比Peach更好,因为二者从现有流量进化生成新报文并经过适应度比较,都没有不合法用例。

随着进化代数增加,二者异常响应报文均明显增加,但是本文方法比基本遗传算法在第10代、100代时分别多4、13个百分点。另外基本遗传算法未能触发设备故障,本文方法触发了1次,这是因为较多地生成了通常流量中不常见功能码的报文,具体原理分析见下一节。

3.4 漏洞发现能力分析

对3台设备分别用3种方法测试相同时间,其漏洞发现能力如表5所示。本文方法和基本遗传算法帧数相同,Peach比二者多30%左右,只有本文方法触发了设备故障。

本文方法能够发现漏洞点,而基本遗传算法未能触发的主要原因是改进小生境算法的应用。因为遗传算法初始种群由采集的实际流量生成,现实中PLC一般只用到几种常见功能,如表6为加拿大网络安全研究所某Modbus数据集[24]一段流量中Modbus各功能码占比情况,整个流量中只有0x01~0x06这6种功能码,且前4种占99.70%,这是符合工业生产现场规律的,但Modbus功能码有25种,基本遗传算法以此数据集生成的种群代表性不全面,进化迭代也是“近亲繁殖”,对程序的探索能力非常有限。本文方法对每个功能码都一视同仁,均保证其构建30个个体的子种群。如果采样流量样本中无该功能码报文,则通过人工操作上位机执行命令生成并采集,保证了对所有功能码程序处理区域的覆盖。事实上,不常用功能码出现漏洞的可能性往往更大。

另外,“全种群进化”的设计也促进了生成更多引发异常的个体。以复现CVE-2018-7853漏洞为例,如图7所示,子代为触发漏洞的报文,漏洞发生在定制功能码0x28,需要读取指定的内存块。传统模糊测试如果采用算术加减变异,从父代1到子代需要(0x5A~0x05)次,从父代2需要(0x70~0x28)× 0x04次。而遗传算法的交叉操作则更容易实现,因为各部分字段已经具有一定的合法性。

4 结束语

针对PLC协议模糊测试的自动化与覆盖率优化需求,提出基于功能码划分的小生境遗传算法改进方法。通过以功能码构建子种群隔离进化、全种群交叉变异策略,结合设备响应状态与个体相似度的适应度函数设计,实现了对协议处理程序多区域的高效覆盖。实验结果表明,该方法在施耐德、三菱、通用电气等设备中触发服务故障并发现1个未公开漏洞,验证了其漏洞挖掘能力。

但当前方法在编码方式上仍存在优化空间,例如未结合协议字段语义特性设计针对性编码规则,可能影响测试效率。未来工作可从两方面展开:一是研究协议字段结构与遗传算法编码的深度适配,提升变异有效性;二是扩展本文方法至其他工控协议测试场景,结合协议状态机特征优化子种群划分策略,进一步增强方法的通用性。

参考文献

[1]

东北大学谛听网络安全团队.2023年工业控制网络安全态势白皮书[EB/OL].(2024-02-19)[2024-07-31].

[2]

YOO HSHON T. Grammar-based adaptive fuzzing: evaluation on SCADA Modbus protocol[C]∥Proceedings of the 2016 IEEE International Conference on Smart Grid Communications. Piscataway, USA: IEEE, 2016:557-563.

[3]

张亚丰,洪征,吴礼发,基于范式语法的工控协议Fuzzing测试技术[J].计算机应用研究201633(8):2433-2439.

[4]

冯文倩.基于异常字段定位的Modbus TCP协议漏洞挖掘方法研究[D].北京:北京工业大学,2020:1-55.

[5]

KIM S, JO W, SHON T. A novel vulnerability analysis approach to generate fuzzing test case in Industrial Control systems[C]∥Proceedings of the 2016 IEEE Information Technology, Networking, Electronic and Automation Control Conference. Piscataway, USA: IEEE, 2016:566-570.

[6]

杨亚辉,麻荣宽,耿洋洋,基于工控私有协议逆向的黑盒模糊测试方法[J].计算机科学202350(4):323-332.

[7]

LIN P YTIEN C WHUANG T C, et al. ICPFuzzer: proprietary communication protocol fuzzing by using machine learning and feedback strategies[J]. Cybersecur20214(1):No.28.

[8]

王田原,武淑红,李兆基,PGNFuzz:基于指针生成网络的工业控制协议模糊测试框架[J].计算机科学202249(10):310-318.

[9]

姜亚光,陈曦,李建彬,基于LSTM的S7协议模糊测试用例生成方法[J].计算机工程202147(7):183-188.

[10]

宋岩,胡志成,郝丽,基于生成对抗式网络的Modbus协议安全性测试方法[J].电网与清洁能源201935(8):8-15.

[11]

黄河,陈君,邓浩江.基于循环神经网络的Modbus/TCP模糊测试算法[J].计算机工程201945(7):164-169.

[12]

HOLLAND J H. Adaption in natural and artificial systems[M]. Cambridge MA, USA: MIT Press,1975:1-10.

[13]

蒋昀昕.自适应小生境遗传算法的研究[D].淮安:安徽理工大学,2008:1-47.

[14]

SATYADAS AKRISHNAKUMAR K. Genetic algorithm modules in MATLAB: design and implementation using software engineering practices[J]. Genetic Algorithms in Engineering and Computer Science199512(9):321-344.

[15]

张冠宇,尚文利,张博文,一种结合遗传算法的工控协议模糊测试方法[J].计算机应用研究202138(3):680-684.

[16]

WAN MZHANG S YSONG Y, et al. Case optimization using improved genetic algorithm for industrial fuzzing test[J]. Intelligent Automation & Soft Computing202128(3):857-871.

[17]

杨雄,吴东.遗传算法密码分析中改进选择算子研究[J].信息工程大学学报202223(3):344-350.

[18]

李志博,李清宝,张俭鸽.面向测试数据生成的遗传算法初始种群分布问题研究[J].信息工程大学学报202021(2):236-241.

[19]

章淑琴.基于遗传算法的模糊测试技术研究[D]. 武汉:华中科技大学,2011:1-55.

[20]

文宇恒.基于协议逆向和模糊测试的PLC漏洞挖掘方法研究[D].杭州:浙江大学,2023:1-79.

[21]

项力,马锐锋.基于遗传算法的Modbus TCP协议模糊测试技术研究[J].舰船电子工程202040(10):149-153.

[22]

The Modbus organization. Modbus application protocol specification: V1.1b [S].Westford,USA:Modbus-IDA,2006:1-51.

[23]

VOYIATZIS A GKATSIGIANNIS KKOUBIAS S. A Modbus/TCP fuzzer for testing internetworked industrial systems[C]∥Proceedings of the 2015 IEEE 20th Conference on Emerging Technologies & Factory Automation. Piscataway, USA: IEEE, 2015.DOI:10.1109/ETFA.2015.7301400 .

[24]

Canadian Institute for Cybersecurity. CIC mo-dbus dataset 2023[EB/OL].(2023-08-01)[2024-08-07].

基金资助

河南省重点研发专项(221111210300)

PDF (2050KB)

367

访问

0

被引

详细

导航
相关文章

AI思维导图

/