APP下载

基于R-DFA状态机的工控系统异常流量检测

2019-03-12周宇郑荣锋刘嘉勇

现代计算机 2019年5期
关键词:状态机工控数据包

周宇,郑荣锋,刘嘉勇

(1.四川大学电子信息学院,成都 610065;2.四川大学网络空间安全学院,成都610065)

0 引言

在工业控制系统ICS发展过程中,采取的是封闭隔离形式,具有固定的业务流程,是自动闭环的处理方式,并采用大量私有协议,但是随着ICS开放性的提升和协议逆向技术的发展,安全的私有协议渐渐变成暴露在网络上极易受到攻击的公有协议。

ICS需要符合其特殊性的入侵检测系统,Golden⁃berg和Wool分别提出了针对Modbus和S7协议的基于状态机的入侵检测方法[1-2],但只是在HMI到PLC方向的下行信道建立DFA(有限状态自动机),不能检测PLC到HMI方向的数据。Zhang J[3]等人提出了基于工控流量数据周期性的特点进行异常检测,并将请求数据的响应时间也加入参考条件,但并没有检测上行信道的数据。Xu J、Feng D[4]提出了SF-FSM模型(包含响应参数的有限状态机)将下行信道PLC响应HMI的数据作为状态机的参数,但如果通过中间人构造响应数据,则此状态机就会失效。

针对上述的问题,提出了R-DFA模型,R-DFA模型是特殊的有限自动机,其输入参数包含请求数据信息,响应数据信息和响应时间信息三元组。最后为了弥补一般自动机的状态转移只依赖前一个状态的缺点,在R-DFA模型后面添加周期状态序列模型以提高准确率。考虑到S7协议语义公开,便于提取特征,本文实验环境基于S7协议的工控系统,实验结果表明R-DFA模型具有较高的准确率,也能够有效的对上行异常流量进行检测。

1 异常流量检测方法

1.1 数据预处理

本文将工控系统的一个PLC和一个上位机的通信称为一个信道,R-DFA模型异常流量检测是建立在单一信道中。数据预处理有两个目的,一是获得所有信道信息,建立信道白名单模型,过滤异常的信道,二是提取出单一信道,并从单一信道中提取次信道的工控规则信息数据,为后续训练R-DFA模型。

数据预处理分为二步:

(1)通过三元组(s_port,m_IP,s_IP)分离通信信道。其中s_port为S7协议的端口号,s_IP为PLC的IP,m_IP为上位机的IP,并将正常信道的三元组进行记录,组建会话白名单;

(2)在一个信道会话中提取会话规则,过滤掉对规则无用的包,例如心跳包(PLC定时对HMI发送的工控现场实时的数据,ROSCTR为0x07)等,过滤这些包根据S7 PDU的Header中的ROSCTR字段来过滤,仅仅保留 ROSCTR字段为 0x01(JOB packet)和 0x03(ACK packet)的数据包。

1.2 数据包特征提取

先对S7协议字段和语义进行分析,根据先验知识确定S7协议中的关键字段来作为特征,提取出一个能代表这个数据包和PLC状态的唯一特征,并记录。

图1 S7协议PDU结构

本文将S7协议的数据包特征定义为S7 PDU除去Header字段包含的Protol Data Unit Reference字段的其他所有数据的集合。提取后数据包字段特征进行md5产生一个32位的数据,本文称为特征指纹,用特征指纹来代替原始的特征数据,这样既能够用特征指纹表现出不同数据包的唯一性,也能够忽略请求数据包和响应数据包的不同所表现出来的特征长度的区别。

1.3 RR--DDFFAA模型

工业控制系统网络一般具有明显的规律性,可以将工控系统一个信道的工作流程定义为一个有限自动机,R-DFA和普通的DFA一样定义一个五元组(S,s0,∑,δ,F)。

S是一个有限非空的状态集合,需要用PLC的实际状态来定义,第二个参数s0为状态机的初始状态,是S的一个元素,所以S为:

∑为输入的信号,是本文状态机的特点,一般的工控系统的状态机的输入信号都是单向的请求(JOB)数据包,这样不能检测出由PLC向上位机HMI的注入攻击,例如响应注入攻击。∑的元素∑i是一个三元组为(Preq,i,Presp,i,ΔTi),因此S为:

Preq是从JOB(request)数据包中提取的特征指纹,Presp是从ACK(response)数据包中提取的特征指纹。ΔT是JOB包和ACK包的到达时间差,称为响应时间。使用信道流量上下行的特征作为输入信号,能够建立一个信道上下行的关系,有效的检测出响应注入攻击,响应时间ΔT的加入是为了防止攻击者构造响应数据包,从而欺骗上位机HMI。

δ为状态转移函数,能够通过现在的状态si,三维输入参数Si,转移到下个状态si+1。F为状态机的最后一个状态。

定义了状态机的各项参数后,开始建立状态机模型。建立一个二维的状态转换表,第一行为前一个状态,第一列为后一个状态,如果两个状态能够转化则对应表中位置写入输入信号参数,异常检测模型根据状态转换表来确定状态转换是否异常。

例如假设一共有三种状态,建立的状态转换表如表1所示。

表1 状态转换表

可以看出,s1可以通过三维输入信号(Preq,2,Presp,2,ΔT)转换为s2,且s1只能转换为s2状态,如果s1收到其他输入信号,会触发异常状态转化函数,从而报出异常。s1状态转化为稳定的s2状态过程如图2所示。

图2 s1到s2稳定状态转换过程

异常状态转化函数能够根据不同的错误输入信号触发不同的异常状态,例如Preq错误则报请求异常,Presp和DT错误,则报响应异常。此状态机模型理论上能够有效检测出以往的工控状态机模型无法检测的响应注入攻击。

1.4 周期状态序列模型

状态机模型虽然能够检测出异常攻击,但状态机的状态转换是依赖于上一个状态的,因此状态机模型有一定的局限性,当发生图3情况时,状态机模型可能会出错。

图3 状态机模型无法检测的状态顺序

在图4中,s2和s3都能转化为s1状态或者从s1转化而来,都保存在了状态转化表中。只使用状态机模型进行异常检测,则上图中错误的顺序也会被状态机认为是正确的,产生漏报。为了解决这种问题,完善异常检测模型,本文又在状态机模型之后添加了周期状态序列模型。

周期状态序列模型由下面步骤建立。

(1)找到单一信道中工控数据流量的最小正周期n,根据JOB数据包的特征指纹顺序建立一个周期内的状态序列模型;

(2)周期状态序列模型会在一开始进行检测时进行计数标记,确保预测的状态和状态机模型将要正确转化的下一个状态一致;

(3)当状态机模型转化为下一个状态时,就会与当前周期状态序列模型所预测的状态进行比对,以确保当前转化状态的正确性。

周期状态序列模型的位于状态机模型后面,当一个周期的状态预测完成后,周期状态序列模型又会从周期初始状态开始预测,循环反复,减低了异常检测系统的负担。

如果只用周期状态序列模型进行异常检测,无法确定工控系统即时的状态,而且少了输入信号量的检测,模型检测不出响应注入等攻击。将状态机模型和周期状态序列模型结合起来,能够避免图3的漏报,也能够有效地提高异常检测系统的准确性。

图4 周期状态序列的检测

11.. 55异常检测系统

以R-DFA为核心的异常检测系统由以下步骤建立:

(1)通过正常流量建立会话白名单,提取目标信道的数据包,过滤掉其中的心跳包。

(2)提取目标信道上下行流量的特征,根据目标信道的通信规则建立状态转换表,训练R-DFA模型。

(3)根据目标信道通信规则,提取出周期,建立周期序列模型。

(4)将以上的模型按照图5顺序组合起来,对实时的流量进行检测,对不正常的行为发出警告。

图5 异常流量检测系统

异常警告可以告知检测出的异常行为发生在异常检测系统的哪个阶段,也能将对应的异常的行为记录。这样能够通过异常警告的记录获得流量中异常行为个数,从而验证本文异常检测系统的性能。表2为异常警告阶段会记录的异常行为及其阶段。

表2 异常警告记录的行为和对应阶段

2 实验与结果分析

2.1 实验环境和实验数据

为了检测以上方法的可行性,在本地搭建一个小型的工控系统仿真环境进行实验。本文的实验场景如图5示的西门子工控实验平台的网络拓扑图。现场设备包含两个S7-200和一个S7-300的PLC。S7-300控制发电机的转速,S7-200控制蜂鸣器。其中工程师站能够根据设定的流程逻辑编写PLC对应的程序。

在控制设备和现场设备之间有换机,能够镜像工控网络中的流量到工控异常检测服务器中,并用抓包工具捕获PLC与HMI的实时数据。

实验先通过正常的工控流量数据在服务器中训练出本文提出的异常检测模型,然后将训练完成的异常检测模型监听镜像端口的实时数据,验证异常检测模型的效果。

图6 工控网络仿真拓扑图

在本次实验中,选取S7-300与上位机的通信信道,此信道能够体现出工控系统的流量数据的特征。

本文实验数据是通过Python的Scapy库嗅探正常流量和异常的攻击流量,使用正常流量来建立模型,使用恶意的攻击流量验证异常流量检测系统的性能。本文使用以下的攻击方式进行攻击,并捕获异常流量,表3为获取实验数据集,数量和实际攻击的单位都是数据包个数。

序列攻击:修改数据包的传送顺序,导致工控逻辑出现异常,从而影响正常的工控系统的运作。

snap7连接:通过在工控网络中用另外一台设备编写S7的程序,利用PLC不会对HMI设备认证的缺点,控制PLC达到攻击的目的。

手动操作:手动的从HMI向PLC发送一些数据包,使其与正常情况的状态不符合,例如在本实验场景中,HMI向PLC发送的不正常的请求包。

响应构造:通过中间人攻击,构造PLC到HMI的响应包,让HMI误以为PLC已经改变状态,达到欺骗HMI的目的。

异常响应:直接通过中间人构造异常的响应数据包,从而从上行信道对HMI的主机进行攻击。

表3 实验数据集

2.2 实验检测

利用表3的正常数据流,建立信道白名单模型,RDFA模型和周期序列模型,并将三者根据图5串联起来,形成异常检测系统,对表3的异常数据流进行检测,本实验使用工具是Python3。

其中R-DFA模型的三元输入参数中的响应时间DT需要一个可靠的取值范围,在本文实验环境中,正常的S7数据流量的响应时间如图7所示。

图7 正常流量的响应时间

可以看出在本文的实验环境中工控数据响应时间集中在0.002s到0.005s之间,但也会有些超过0.005s,这些响应时间也是正常的,原因可能是网络延迟。

为了规避正常的网络延迟的情况,实验使用核密度估计ΔT的概率密度估计,从而定义其取值范围,核密度估计是一种用于估计概率密度函数的非参数方法,正常 n 个样本点 Δ T1,Δ T2,…,Δ Tn为独立同分布的,设其概率密度函数为f,则其核密度估计为:

K为核函数,根据实验,K选用Epanechnikov函数,此核函数的均方误差是最优的。h为带宽,根据实验得出带宽的最优值为0.001。实验使用Python 3的scikit-learn机器学习库对图6的正常响应时间数据集进行训练得出ΔT的核密度估计,如图8所示,选用ΔT 的范围为(0.0017,0.0095)。

图8 响应时间核密度估计

2.3 结果分析

将每个异常数据集的数据包分为两类,正常数据包(normol)和异常数据包(abnormol),经过实验后得到以下的数据,TP为真阳性,即abnormol被识别为ab⁃normol;TN 为真阴性,即 normol被识别为 normol;FP 为假阳性,即normol被识别为abnormal;FN为假阴性,即abnormal被识别为normal。

本实验采用精确召回率调和平均数(F)、召回率(Rec)、精确率(Pre)来衡量:

对异常数据集进行异常检测实验结果如表4所示,表5还包括此类攻击被检测到的阶段和对应的异常警报。

表4 异常攻击流量检测结果

根据表4的结果,可以看出基于R-FSM异常检测系统性能良好,对常见的攻击的异常检测精确率Pre,召回率Rec和精确召回率调和平均数F都在90%以上,也能够检测出PLC对上位机方向上行行道的流量异常,也有很高的精确率Pre,召回率Rec和精确召回率调和平均数F。

3 结语

本文在普通的DFA模型上添加了PLC到HMI的数据信息,能够检测出普通工控DFA模型无法检测的响应注入的问题,并在DFA模型后添加了周期状态序列模型,解决了DFA状态转移仅仅依靠前一个状态的不足。在本地基于S7协议仿真实验中,异常检测模型运行效果良好,能够准确地识别出工控网络的异常流量。另外此方法也应该能够用在不是S7协议的工业控制系统中,这需要后续的研究和确定。

猜你喜欢

状态机工控数据包
工控编程编译工具应用现状分析及展望
工控系统脆弱性分析研究
基于蜜罐的工控网络安全防护技术研究进展
二维隐蔽时间信道构建的研究*
基于Verilog 的有限状态机编程方式及研究
FPGA状态机综合可靠性探究 ①
民用飞机飞行模拟机数据包试飞任务优化结合方法研究
基于有限状态机的交会对接飞行任务规划方法
C#串口高效可靠的接收方案设计
基于VHDL的一个简单Mealy状态机