掌桥专利:专业的专利平台
掌桥专利
首页

一种基于流量的应用层云协议优化识别方法

文献发布时间:2024-04-18 20:00:25


一种基于流量的应用层云协议优化识别方法

技术领域

本发明涉及一种识别方法,具体涉及一种基于流量的应用层云协议优化识别方法,属于云服务网络安全领域。

背景技术

随着互联网的推动,制造业正逐渐发展向开放和互联的趋势。工业控制系统(ICS)作为信息物理系统的核心,保障工业生产的稳定性和可靠性,主要包括SCADA、DCS和PLC三大类。这些系统不仅在日常生产中发挥关键作用,还控制着多个国家的关键基础设施,因此对其的任何干扰或攻击都可能产生深远的后果。另一方面,随着工业互联网的快速发展,ICS中涌现出大量的未知私有协议,加大了安全风险。虽然公开的工控协议如Modbus和Ethernet/IP已相对稳定,但大量私有协议如西门子S7的规范和特性仍大部分未知,这使得传统的安全技术在面对这些私有协议时变得效率低下和不准确。因此,鉴于大部分安全问题发生在使用工业协议的通信过程中,识别这些协议在工业安全监控中至关重要。依靠人工识别协议既耗时又效率低下,需要建立一个在云服务中部署的、自动、高效和准确的工业协议识别平台,以满足现代工业安全需求。

在众多的协议识别方法中,基于固定端口的方法是最早也是最简单的技术,依赖于预定义的端口号来识别应用协议,但这种方法在面对动态端口时会失效。基于有效载荷的识别技术则通过分析网络流量中的数据包内容进行协议识别,具有较高的准确性,但可能受到加密和混淆的挑战。而基于机器学习的协议识别技术,使用网络流量的统计特性,如数据包长度和流持续时间等,进行模型训练。该技术分为有监督学习、无监督学习和半监督学习。SVM和某些神经网络算法在有监督的协议识别中被广泛应用,而K-means和DBSCAN在无监督学习中得到了应用。尽管机器学习方法有其优势,但在识别协议数量增加时可能存在误差和实时性降低的问题。基于程序逆向的方法通过二进制文件的内部进程通信消息进行特征提取,提供了更高的准确性,但由于程序源码获取的难度和特定的环境需求,使其应用受限。

综上所述,各种协议识别方法各有优缺点,而直接应用于工控协议可能会遇到挑战。尤其在工控领域,基于有效载荷的协议识别技术,相对于其他技术,可能具有更高的潜在应用价值。

发明内容

本公开提供一种提出并实现了工业互联网中基于流量的应用层协议特征提取以及识别方法,能够自动、高效、准确地提取出工业协议的特征并将其用于识别。

一种基于流量的应用层云协议优化识别方法,所述方法包括以下步骤:

步骤1、改进现有网络协议频繁项提取方法,先确定最大频繁项长度,后自顶向下挖掘工业协议中频繁项,并通过位置信息筛选,构造工业协议的频繁项特征;

步骤2:基于序列比对的工业协议语义识别方法,多序列比对算法对报文序列进行对齐以及字段划分,针对不同语义字段设计识别方法,在此基础上构建语义特征辅助识别,初步推断协议格式;

步骤3:构建协议内部依赖关系的状态转换图:考虑到协议分组有效载荷中不同字段的值存在分组内依赖,利用图论与概率论对协议内部各字段出现位置、概率以及依赖关系统计及分析之后,构建用于描述协议内部依赖关系的协议状态转换图用以识别。

作为本发明的一种改进,步骤1中,所述改进现有网络协议频繁项提取方法包括:在预处理阶段对协议数据集中的应用层载荷进行提取与处理,得到待挖掘的工业协议序列作为频繁项挖掘算法的输入,然后使用自顶向下的频繁项挖掘算法对工业协议的频繁项集进行挖掘,并按照位置信息对频繁项集进行筛选得到特征字段,然后根据特征字段构建对应工业协议频繁项特征,并将其加入特征库。

作为本发明的一种改进,所述自顶向下的频繁项挖掘算法包括:借鉴N-gram模型划分数据,将分组分解为多个长度相等的序列,设置最小支持度R

作为本发明的一种改进,所述位置信息的频繁项筛选包括:过滤频繁项集中的弱特征,若频繁项在某个位置出现次数大于阈值Threshold,或位置不固定,但各个位置出现次数之和等于或者十分接近该频繁项出现总次数,或自身长度较长,都将视为有效特征,而对于其他较短的频繁字符串,计算其在数据包中出现位置的方差判定是否过滤,小于一定阈值则保留,具体过程为对于任意一个频繁字符串i

作为本发明的一种改进,步骤2中,所述基于序列比对的工业协议语义识别方法包括:序列对齐,字段划分,以及语义识别三部分,序列对齐阶段采用渐进多序列比对算法对协议数据进行对齐,得到对齐的带空位的序列;字段划分阶段则是将对齐后的协议序列按照字节变化率分为静态字段以及动态字段;语义识别阶段则主要是对划分后的序列中的一些重要字段进行识别。

作为本发明的一种改进,所述序列对齐和字段划分包括:改进Smith-Waterman和Needleman-Wunsch的渐进多序列比对算法,使用局部序列比对算法计算分组数据包中两两序列之间的相似度,后根据相似度构建序列间的距离矩阵,使用非加权配对算数平均法指导系统发育树的生成,该算法将每一个序列当作一个集群,并根据每个集群之间的距离进行合并,最终得到一颗树状的分类层次结构,选取两个距离最近的节点使用全局序列比对算法Needleman-Wunsch进行比对,生成对齐的结果序列,并在生成的结果序列的基础上,再加入新的未对比序列进行双序列比对,以此类推,直到所有的序列全部比对完成为止,生成对齐的数据序列,对于字段划分,识别各个序列中相同位置的字节的变化率来对动态字段和静态字段进行划分,如果相同位置字节的变化率接近0,则认为该位置为静态字段,否则为动态字段,并对多个结果序列进行融合,若多个结果序列的相同位置均为静态字段且该位置取值都相同,则该位置仍然是静态字段,反之亦然。

作为本发明的一种改进,所述语义识别包括长度字段、序列号等字段、功能码字段、其他字段四个维度,长度字段阶段,据观察大部分协议的长度字段只可能为1、2、4个字节,应满足L

作为本发明的一种改进,步骤3中,构建协议内部依赖关系的状态转换图包括:利用工业协议数据包内部的依赖关系,以目标协议数据集作为训练集输入,构建一个图模型来描述工业协议的包内依赖关系,来识别协议有效载荷的每个部分的合法值,以及识别一个部分的值相对于另一部分的值如何变化,并通过图论以及概率论相关知识来对图模型进行迭代细化。

作为本发明的一种改进,所述状态转换图包括:分析对协议数据集

根据本公开的实例施中,所述方法包括:在无先验知识的情况下,对数据进行预处理得到应用层有效载荷之后,使用改进的频繁项挖掘算法自上而下挖掘工业协议中的频繁项特征;在渐进多序列比对的基础上,首先对工业协议消息序列进行对齐,并划分出工业协议的静态字段以及动态字段,后对工业协议的关键语义进行识别,比如长度、序列号等字段,最后构建工业协议的语义特征库辅助进行识别;对于一些难以挖掘到频繁项特征、或者频繁项特征不明显的工业协议,考虑到协议分组有效载荷中的不同部分的值可能存在分组内依赖,因此本公开尝试对协议内部各字段出现位置、出现概率以及不同字段之间的依赖关系进行分析,并根据依赖关系构建协议状态转换图,使用协议状态转换图用于该类工业协议的识别;对具有频繁项特征以及不具有频繁项特征的协议使用不同的特征进行识别以及格式分析;为了提高识别的准确率,提出了针对发生了“粘接”的数据包的识别方法,并通过实验以及相关指标验证所提取的工业协议特征具有独立性、准确性、完整性以及可靠性。

相对于现有技术,本发明的优点如下:在单协议识别环境中,大部分协议的查全率均达到98%以上,并能较好识别“粘接”包;多协议环境中,查全率达到了99.73%,精确率则达到了99.54%;对比开源的nDPI库,本发明所提出的方法在标准端口通信的情况下效果略低于nDPI,但是由于不使用端口号进行匹配,所以即使端口变更对识别效果也无影响,并且具有较高的稳定性,各特征之间也具有较高的独立性;在识别速度方面,使用频繁特征字符串进行识别的S7协议吞吐量可以达到40MB/s,而使用协议状态转换图进行识别的OPCUA协议吞吐量则可以达到80MB/s;由于在多协议识别环境中需要对多个协议的特征进行遍历,因此速度会相对单协议识别有所降低,但即便如此,吞吐量也能达到接近10MB/s;使用本公开提出的方法所提取的工业协议特征具有较高的准确性、完整性以及可靠性,能够准确,高效地进行工业协议识别。

附图说明

图1为三种算法频繁项挖掘时间对比

图1(a)是依照本公开的TD-FIM算法与AutoReEngine和CFI在支持度为0.9的情况下对10种工业协议频繁项挖掘耗时对比图,

图1(b)是依照本公开的TD-FIM算法与AutoReEngine和CFI在支持度为1的情况下对10种工业协议频繁项挖掘耗时对比图,

图2是依照本公开提出的基于序列比对的工业协议语义识别的方法示意图,

图3是依照本公开提出的渐进序列比对算法,

图4是依照本公开提出的使用比对推断法进行校验码识别,

图5是依照本公开提出的SR-BSA算法对Modbus/TCP协议语义识别结果,

图6是依照本公开提出的SR-BSA算法与IPART和SIBACT对Modbus/TCP协议语义识别结果对比,

图7为OPCUA报文合并操作示意图,图7(a)是依照本公开的PSTGraph的对OPCUA协议数据集合进行合并的初始有向数图,图7(b)是依照本公开的PSTGraph的对OPCUA协议数据集合合并后的节点,

图8是依照本公开的PSTGraph的对OPCUA协议的状态转换图(前16个字节),

图9是依照本公开的PSTGraph在不同噪声比下的假阴性率和假阳性率,

图10是依照本公开的PSTGraph与其他LCS的假阴性率和假阳性率对比图,

图11为模型构建时间,图11(a)与(b)是依照本公开的PSTGraph在数据规模增大下与LCS模型构建速度对比图,

图12是依照本公开的检测方案单协议检测下对各工业协议的查全率,

图13是依照本公开的检测方案单协议检测下对各工业协议的精确率,

图14是依照本公开的检测方案在多协议识别环境中的召回率以及精确率。

具体实施方式

大部分工业协议具有标识自身的特殊字段,分析协议中的这些特殊字段,便可以将该协议与其他协议进行区分。这些特殊字段往往都是在协议中频繁出现的,因而可通过改进现有的频繁项挖掘算法获取协议的频繁项特征。本公开选取每个协议数据包的前80个字节来进行频繁项的挖掘,该长度几乎能够涵盖所有协议的头部数据。

实施例:一种基于流量的应用层云协议优化识别方法,所述方法包括以下步骤:

步骤1、改进现有网络协议频繁项提取方法,先确定最大频繁项长度,后自顶向下挖掘工业协议中频繁项,并通过位置信息筛选,构造工业协议的频繁项特征;

步骤2:基于序列比对的工业协议语义识别方法,多序列比对算法对报文序列进行对齐以及字段划分,针对不同语义字段设计识别方法,在此基础上构建语义特征辅助识别,初步推断协议格式;

步骤3:构建协议内部依赖关系的状态转换图:考虑到协议分组有效载荷中不同字段的值存在分组内依赖,利用图论与概率论对协议内部各字段出现位置、概率以及依赖关系统计及分析之后,构建用于描述协议内部依赖关系的协议状态转换图用以识别。

具体如下:步骤1:在频繁项挖掘部分,首先进行数据划分,借鉴了N-gram模型,对数据进行划分,首先需要确定一个初始的频繁项长度k,然后将数据集中所有的序列分别划分为n-k+1个长度为k个字节的子序列。

例如对于序列

(1)对于数据集Z中的所有消息进行扫描,选取其中最短的消息序列的长度l

(2)取k=(left+right)/2进行数据划分,并统计长度为k个字节的频繁字符串。

(3)如果当前未找到频繁项,则更新右边界right=k-1,回到第(2)步。

(4)如果当前长度为k的频繁项数目大于等于2且部分频繁项之间存在交叠,或者组成元素的字符完全相同,则更新左边界left=k+1,同时为了减少查找次数,可以将存在交叠字段的频繁项进行合并,并以合并后的最长序列长度更新右边界right,然后回到第(2)步,否则直接进入第(5)步。

考虑到存在不可靠的频繁字符串,引入了基于位置信息的频繁项筛选,可以确定的特征字段包括:在某个位置出现次数大于阈值Threshold;某个频繁项出现位置虽然不固定,但是各个位置出现次数之和等于或者十分接近该频繁项出现总次数;虽然出现位置不固定,但是一般只有有限几个位置,且很少在一个数据包里重复出现;虽然出现位置多变,但是自身长度较长,本公开也将其保留,一个通用的判断算法如下:对于任意一个频繁字符串i

P(i

其中P

然后对于每一个频繁字符串i

然后将标准方差集σ中的所有元素进行归一化处理,也就是说将所有的σ

其中σ

为了验证本公开提出的改进的基于频繁项挖掘的协议特征提取算法是有效的,选取了10种工业协议来进行实验的验证。

从时间效率分析,为了验证TD-FIM算法是高效且准确的,将其与AutoReEngine以及组合频繁项(CFI)对比。图1是TD-FIM、AutoReEngine和CFI分别对上述10种工业协议进行频繁项挖掘所花费时间的对比结果,其中图1(a)是在支持度为0.9的情况下进行挖掘,图1(b)是在支持度为1的情况下进行挖掘。从图中可以看出,在支持度分别设置为0.9和1时,TD-FIM算法与CFI挖掘时间远远小于AutoReEngine,因为AutoReEngine有大量的时间都花在了候选频繁项匹配上。CFI虽然同样使用Apriori算法,但是由于采用AC自动机进行模式匹配,所以能够有效减少匹配时间。

从图中可以看出,TD-FIM算法在多数情况下都是要优于CFI所提出的方法,其中在支持度为1时,对于这10种工业协议,TD-FIM的挖掘时间都相比CFI要更少一些。其中Fins/TCP、IEC104等协议由于数据量较小,而导致挖掘时间差距不太明显,但是仍然可以看出TD-FIM算法挖掘时间更少。

在支持度为0.9的时候,在对BACnet协议的频繁项进行提取时,TD-FIM算法所花费的时间相较于CFI算法要多一些,但是差距非常小,主要原因在于BACnet协议的频繁项长度较短,因此CFI只需扫描几次数据集便可结束算法。由于数据集中有较多的数据相似,并且最长的频繁项相较支持度为1时长,因此TD-FIM定位的初始长度k相对较大,增加了扫描次数,进而导致挖掘时间较支持度为1时显著增加。

总体而言,TD-FIM算法效率远高于AutoReEngine,并且要优于CFI算法。AutoReEngine花费了大量时间在候选频繁项构造以及模式匹配上,导致其挖掘时间较长。虽然相较于AutoReEngine,CFI算法使用AC自动机极大的加速了模式匹配的速度。但是在绝大多数情况下,TD-FIM算法效率都是要高于CFI的,尤其是在频繁项较多,长度较长的场景下优势更加明显。

从提取效果分析,在挖掘频繁特征字符串时,将最小支持度设置为0.9,通过对实验数据集中的各个协议进行人工分析及验证之后,我们发现该算法提取的频繁项是准确无误的。

同时使用AutoReEngine与CFI算法对工业协议进行频繁项提取,并与TD-FIM算法进行比较。可以发现,其他两种算法未能提取出来的字符串都是较长的频繁特征字符串的子字符串。因此,相比于其他两种算法,TD-FIM算法采用自顶向下的方式进行频繁项挖掘,并在此过程中记录已经挖掘到的频繁项及其位置,然后将相关位置都置为空字符,在去冗余的同时也不会影响较短频繁项的挖掘。可以看出,即使不是完全字符串,本公开所提出方法也能够提取出来。

步骤2:目前在协议识别领域主要是对协议格式进行划分,很少有研究将协议的语义特征纳入考虑。而协议的一些语义特征,比如长度字段等,往往能够指导协议的识别。并且其中的语义特征能够让研究者对协议格式有一个大致的认知,因此本公开针对工业协议设计了基于序列比对的语义识别方法,命名为SR-BSA。

工业协议语义特征的识别主要包括序列对齐,字段划分,以及语义识别这三部分。序列对齐阶段采用渐进多序列比对算法对协议数据进行对齐,得到对齐的带空位的序列。字段划分阶段则是将对齐后的协议序列按照字节变化率分为静态字段以及动态字段。语义识别阶段则主要是对划分后的序列中的一些重要字段进行识别。在经过大量调研工作之后,本公开明确了需要识别的一些重要字段,并针对一些不同类型的字段设置了不同的识别方法。并且对于一些长度可变的字段也具有较好的识别效果。图2为本公开提出的基于序列比对的工业协议语义识别的方法示意图。

本公开使用PI项目提出的基于Smith-Waterman和Needleman-Wunsch的渐进多序列比对算法,但是针对算法进行了一定的改进。本公开根据报文长度先对数据集进行分类,如果多个报文都具有相同或者相近的长度,则可以将其归为一类,同时,为了避免一些长度相同但是格式不同的报文被强行进行比对,需要设定距离阈值,对于超过距离阈值的序列,需要重新分类。对于得到的多个依据长度划分的分组,各自使用渐进多序列比对算法进行序列对齐。渐进多序列比对算法主要步骤如下:

a)生成初始距离矩阵

首先使用局部序列比对算法计算分组数据包中两两序列之间的相似度。然后根据相似度构建序列间的距离矩阵。在这一步使用的是Smith-Waterman算法,其中相似度的计算以及距离的计算如下:

首先,对于任意两个序列A和B。设其长度分别为m和n。建立行为m+1、列为n+1的得分矩阵。然后使用公式4对矩阵进行初始化。

接下来,从左上角开始,使用动态规划算法进行矩阵填充,每个单元格按照公式5进行分值填充,定义A

比对过程中的最大值就是两个序列的相似度,本公开中将其定义为SW(A,B)。则两个序列A,B之间的距离D

对于多个序列,按照上述步骤逐对计算任意两个序列之间的距离,并将其填入距离矩阵,便能够得到最后的距离矩阵,用于指导系统发育树的生成。

b)构造系统发育树

在构建系统发育树时,首先将每个序列作为一个单独的分类集群,并生成待聚类的集群集合。然后使用UPGMA算法,计算集合中任意两个集群之间的距离,并选择其中距离最小的两个集群C

c)渐进多序列比对

在已经构建了系统发育树的情况下,根据系统发育树的指导,选取两个距离最近的节点使用全局序列比对算法Needleman-Wunsch进行比对,生成对齐的结果序列。并在生成的结果序列的基础上,再加入新的未对比序列进行双序列比对,以此类推,直到所有的序列全部比对完成为止,生成对齐的数据序列,如图3所示。

在这一步,使用Needleman-Wunsch进行双序列比对时,初始化以及矩阵填充方式与Smith-Waterman相似,但是初始化函数以及填充函数则稍有不同,分别如公式8和9所示,在此不再进行赘述。

d)字段划分

通过多序列比对对报文进行比对之后,能够在最大程度上将长度相近的分组中的各个序列对齐。然后可以通过计算序列中相同位置的字节的变化率来将协议划分为由一系列静态字段和动态字段构成的结果序列。具体来说,通过识别各个序列中相同位置的字节的变化率来对动态字段和静态字段进行划分,如果相同位置字节的变化率接近0,则认为该位置为静态字段,否则为动态字段。然后对多个结果序列进行融合,具体融合方式为,如果多个结果序列的相同位置都是静态字段且该位置取值都相同,则该位置仍然是静态字段,否则该位置为动态字段。至此,便可以得到由一系列静态字段和动态字段组合而成的拼接序列。

划分完毕后,进入工业协议语义识别阶段,目的是对上述渐进多序列比对阶段中生成的拼接序列中的重要动态字段进行识别,本公开会针对一些较为重要的语义字段进行识别。

a)长度字段

根据观察,本公开假设所有协议只可能会用1,2,4个字节表示长度属性。因为有些协议的长度字段并不包含报文头部的长度,因此长度字段的值不一定等于数据包的实际长度,而是会存在一定的差值,实际上也确实如此。但是,对于同一种协议,即使报文的绝对长度不一定相等,但是长度字段所表示的值与报文的绝对长度之间的差值应该为一个固定值,本公开基于此来进行报文长度字段的挖掘。也就是说,长度字段应当满足两个约束条件:

L

L

其中,L

下面以长度字段按照大端存储的识别方法为例,进行说明:

(1)对于数据集Z中的所有报文,首先找到其中最短的报文长度PLEN

(2)选取位置j及其前一个字节,按照大端模式分别计算每条报文i的载荷长度与这两个字节的差值

(3)选取位置j及其前三个字节(如果不足三个字节则进入第(4)步),同样按照大端模式分别计算每条报文的载荷长度与这四个字节取值之间的差值

(4)最后,得到长度字段起始位置为l

整个长度字段识别过程如算法1所描述。

/>

b)序列号等字段

部分工业协议中,为了对会话进行跟踪或者保证传输顺序,会使用序列号来进行标识,根据协议号特点,本公开设计了序列号字段识别算法,下面进行说明:

(1)首先将协议会话集合S按照IP地址及端口号分为上行流量以及下行流量,然后根据时间戳分别进行排列。

(2)从分组的首部开始,逐字节比较分组中各个序列该位置的取值,如果该位置的取值符合按照时间顺序递增的规律,则该字段为候选的序列号字段。部分协议的序列号是2个字节或者4个字节构成的,因此需要以双字节或者四字节的方式重复该步骤,介绍工业协议序列号的特点时曾提到,序列号出现的位置基本都是靠近段首的,因此为了减少不必要的运算,本公开只针对前20个字节进行识别。

(3)由于序列号识别较为容易受到报文载荷的影响,可能会将非序列号字段误识别为序列号字段,所以会对同一种协议的多个会话中的候选序列号字段进行分析,筛选出共有的字段作为最终的序列号字段。具体流程如算法2所描述。

计数器字段一般也会随着时间增长,但是与序列号字段不同的是,计数器字段增长的值都是固定的,也可以视为一种特殊的序列号,因此同样可以使用上述算法进行识别,对于同时被识别为序列号以及计数器的字段,则将其视为计数器字段。会话ID与计数器性质相同,一般也是递增的,但是会话ID在同一个请求与响应中一般都是相同的,在此不再对二者的识别进行赘述。

c)功能码字段

功能码字段一般用于指示消息功能,向接收方指示将执行哪种操作。本公开参考借鉴信息论,通过计算当前字段取值分布的熵,以及在当前字段值和字段之后载荷长度两者的条件熵,来进行功能码字段的推测。方法描述如下:

首先计算当前字段的熵H(x),其表示如下:

H(x)=-∑p

其中x表示当前待识别字段,p

则y相对于x的整体条件熵表示为:

H(y|x)=∑p

如果当前字段x为功能码字段,为了满足特点(1),则其熵H(x)应该很低但不为0,为了满足特点2),则其条件熵H(y|x)需要足够低且可以为0。如果当前字段x满足上述两个条件,则推测当前字段的语义类型为功能码。

d)其他字段

在待识别的其他字段中,文本字段的识别可以通过当前字段是否是连续可打印ASCII码字符进行识别。而剩下的一些字段取值一般都是有限的或者是在某一个区间内,并且都有各自的特征,因此本公开针对这些字段,制定了一个比对推断法,其定义及描述如下:

1)根据要识别的语义字段的特征,尽可能的生成当前字段所有可能的取值并将其保存为一个可能取值的集合Q,如果待识别字段是时间戳字段,则Q代表的是一个范围。

2)遍历当前工业协议中待识别的所有字段,并计算每个字段的取值,然后将该取值与Q中的所有取值进行比较。

3)如果匹配成功,则当前字段为候选的待识别语义字段,然后通过其他数据进行验证,如果均验证通过,则当前字段为待识别语义字段。

如图4,以校验码字段的识别为例进行说明:首先需要计算常用的校验码算法,例如,奇偶校验,CRC校验,异或校验等,并将结果进行保存。然后与上一步得到的动态字段一一进行比对验证,如果匹配成功且使用其他数据验证也通过,则当前字段为校验码字段。其他字段的识别也与此类似,在此便不再进行赘述。

为了验证本公开分析得到的协议语义格式是正确的,选取了工业控制系统中较为常见的Modbus/TCP协议作为测试对象。

图5展示了SR-BSA算法通过一系列步骤识别出的Modbus/TCP协议的语义特征和真实协议结构的对比。在图中使用数字标记字段所处的位置,文字则描述了字段的含义。从图中可以看出,Modbus/TCP协议的会话ID,长度字段,功能码字段等均与协议真实结构相匹配。其中协议号字段固定为0x0000,因此被识别为静态字段。而Unit ID和最后的数据部分被识别成了动态字段,也符合协议的真实情况。

SR-BSA推测出来的Modbus/TCP语义特征同IPART和SIBACT识别出的语义特征进行了对比,结果如图6所示。从IPART逆向得到的Modbus/TCP协议格式可以看出,IPART对于一些长度可变的字段识别能力较为有限,由于没有考虑相邻字节之间的数量关系,导致会话ID被识别为会话ID以及动态字段的组合,并且长度字段也只有一个字节,与协议真实结构存在一定出入。对于SIBACT方法,虽然作者提出了对序列号或者计数器字段的识别方式,但是其却仍将会话ID识别为了动态字段,并且和IPART一样,SIBACT对于一些长度可变的字段识别能力也较为有限。

因此,相比于IPART和SIBACT,本公开所提出的SR-BSA,能够较好地识别出工业协议的语义并定位其位置,对于部分长度可变的字段也有很好的识别效果。

使用频繁项特征以及协议的语义特征能够较好地识别大部分工业协议,但仍有部分协议频繁项特征不明显,而导致识别准确率偏低,考虑到部分协议中数据包中的有效载荷的一部分值可能会决定该数据包有效载荷的另一部分值,即存在依赖关系,利用图论知识构造状态转换图并命名为PSTGraph,用于描述数据包内依赖关系以加强协议识别。

步骤3:为了构建图,先对协议数据集

以下介绍PSTGraph的构建及更新,使用第四章提出的基于序列比对的方式来对协议进行语义识别,并将识别出来的对图的构建无关的语义字段位置信息进行记录,将其记为

首先遍历数据集

设当前协议报文在当前偏移位置i取值为

对初始树图进行层序遍历,并对当前层的所有节点进行入度和出度的统计,如果当前层任意一个节点

特别地,如果当前层只有一个节点,即协议在当前偏移位置取值为常量。本公开将该层称为常量层。如果常量层处于协议的开始或者结尾部分,则不影响节点的合并。而如果常量层出现在协议的中间位置,则可能会影响其他节点的合并。因此本公开针对常量层提出以下合并思路:如果常量层与上一层或者下一层只有一个在协议数据包中的偏移位置相邻,则与相邻部分进行合并。例如,如果常量在图中的层数对应协议数据中的偏移量为7,常量层的上一层对应协议数据的偏移量为6,下一层为10,则与上一层合并。如果常量层与上下两层所对应的偏移量都相邻,则设

本公开通过计算节点的概率分布添加边,并根据概率选择有效的节点与边。

对于图中的每一层的任意一个节点

并且有:

也可以被称为置信度,意思为在/>

描述了两个节点/>

因此,对于图中处于不同层的两个节点

如果

如果

如果

如果两个节点中没有任何一个条件概率超过阈值,则不进行边的添加。可以轻松证明通过该种方式进行添加,本公开最终得到的状态转换图PSTGraph是无环的。使用该方案,可避免遍历时图中节点之间的边数量太多而导致图过于庞大及误将噪声协议识别为目标协议。

在上一步中曾指出,有效节点的选择需要根据阈值来进行,因此阈值的确定是非常重要的。在这种情况下,需要选取一个合适的阈值,能够将一组值划分为两个子集,一个为有效子集,一个为无效子集。本公开借鉴ProGraph[57]提出的最小描述长度(minimum-description-length,MDL)方法来进行阈值的选择。方法描述如下:

对于一组在[0,1]之间的n个浮点数,在本公开中这n个浮点数表示的是节点在当前层出现的概率或者不同层的两个节点之间的条件概率分布。由于是概率分布,因此这n个值相加之和为1。首先将这n个值转换为整数,具体方法是分别将它们与一个较大的数(例如10

最终MDL会返回对应的浮点数a

算法3总结了协议状态转换图的图形模型构建流程。算法第1-3行描述的是对初始树图的构建,以及原始节点的合并,进而得到合并后的无边的图。第4-9行描述的是计算图中每一层的各个节点出现的概率,并将出现概率大于阈值的节点视为有效节点。第10-15行则对于不同层的两个节点分别计算条件概率,如果二者其中至少有一个超过最小置信度,则在两者之间添加边,边的方向由两者中较大的概率决定,最后返回有效节点以及图PSTGraph。

图构建完毕后,使用PSTGraph识别协议的流程如下:对于一个给定的输入数据包,按照图的层次结构对协议数据包进行遍历,检查输入数据包与图对应的节点取值是否在有效节点中,如果所有位置的值都通过检查,便进行边的检查,如果数据包对应位置的节点有出边,则检查该节点出边所指向的节点的值是否和数据包的值相等,如果相等,则通过检查,如果所有的边都通过检查,便认为输入数据包是目标协议。

需要注意的是,最终构建出来的PSTGraph模型不一定与协议规范所规定的协议格式完全匹配,因为本公开提出的模型仅包含训练集中出现的值。因此最终构建的PSTGraph可能难以涵盖工业协议所有类型的消息。如果想要得到构建更加高效精确的协议状态转换图,还需要获取更为全面且多样的数据。

为了验证效果,本公开针对OPCUA协议构建协议状态转换图。其中根据训练集构建的OPCUA协议的PSTGraph如图8所示,为了便于展示,只选取了16个字节进行图的构建。在图中,由于数据集是纯净的,因此,在进行边的添加时,本公开选取的最小置信度为1,即目标节点完全依赖于源节点。

图中矩形方框代表的是节点在图中的层数以及该节点在协议中对应的偏移,例如I/0,1,2,3表示当前位置为图中的第一层,对应协议中偏移量为0,1,2,3的四个字节。椭圆中的值代表当前层的有效节点的取值,而箭头则表示了节点之间取值的依赖关系,例如,在图中,如果当前数据在0,1,2,3偏移处取值为0x48454c46,则偏移量为8的位置取值只能是0x00,偏移量为9,10,11处的取值只能为0x000000。

在不使用其他辅助识别手段的情况下,本公开仅使用PSTGraph对OPCUA协议进行识别,并使用未在训练集中出现的数据来进行验证,测试集数据包含1500个OPCUA报文和29200份其他报文。同时,训练集中已注入噪声,用于验证本公开所提出的方法的健壮性。定义假阴性为数据包属于目标协议,但是被错误地分类为不属于该协议,而假阳性反之。

图9展示了使用噪声比例不同的训练集构建的协议状态转化图对测试集的数据进行识别的假阴性率以及假阳性率。本公开将噪声比例定义为训练集中噪声数据包与真正属于该协议的数据包的比例。

观察图9可得,随着噪声比的增加,识别时的假阴性率与假阳性率也逐渐增加。但是当噪声比小于6%时,假阴性率以及假阳性率都较低,低于1%。而当噪声比进一步增大时,则上升较多,当噪声比为12%时,假阴性率与假阳性率分别达到了5.1%与3.7%,主要是由于训练集中出现概率较低的合法值会被排除在外,而部分噪声的值则会被误认为合法值。但是仍然处于一个可接受的范围内。因此即使在有噪声的情况下,使用PSTGraph进行协议识别也实现了较低的错误率。

在协议分类结果上,将本公开提出的PSTGraph与最长公共子序列(LongestCommon Subsequence,LCS)进行了比较。由于可以有许多LCS,分别选择以下两种LCS的变体进行协议的识别:

(1)LCS-base:选择超过最小长度阈值与最小覆盖率阈值的LCS用于识别。

(2)LCS-refined:使用SANTaClass[59]提出的启发式子序列处理算法对所选的LCS进行细化:如果一个LCS是另一个LCS的子序列,则保留出现次数较多的那个;如果两个LCS具有相同的出现次数,则保留较长的一个。

在LCS方法的实现中,本公开选取协议数据包的前32个字节进行LCS提取。根据评估,当最小长度阈值为4个字节,最小覆盖阈值为5%时LCS效果最好,本公开将可能的LCS进行保存用于识别。两种方式均使用纯净的训练集进行操作。

图10展示了三种方法的假阴性率与假阳性率,可以看出,LCS-base的假阴性率较低,只有1.3%,但是假阳性率却达到了7.7%,主要原因是在提取LCS时,LCS-base虽然使用长度以及覆盖率来过滤不可靠的LCS,但仍会存在少量的不可靠LCS影响识别,如果使用更严格的过滤指标,则会导致较高的假阴性率。而改进后的LCS-refined能够将假阳性率降低到1%以下,但是却会导致超过25%的假阴性率,主要原因是使用启发式子序列处理时可能会丢弃许多重要的LCS,进而导致识别失败。相比而言,本章节所提出的PSTGraph,比LCS具有更低的假阳性率与假阴性率:对于OPCUA协议,由于解决了上述LCS的问题,只有0.1%的假阴性率以及0.03%的假阳性率,而整体的误识别率不超过0.2%,因此PSTGraph在识别效果上显著优于LCS-base以及LCS-refined。

本公开同样尝试对PSTGraph的模型构建速度进行测试,图11(a)显示了PSTGraph的模型构建速度,可以看到模型构建时间与数据量成正比,并且模型构建速度能够达到8MB/s。图11(b)则展示了两种LCS的模型构建速度,由于LCS模型构建速度较慢,因此只使用少量数据进行构建。

无论是LCS-base还是LCS-refined,其模型构建时间并不是呈线性增长的,并且当数据量越大时,构建模型所花费的时间增长的越来越快,当数据量达到1MB时,模型构建时间甚至达到了100s。因此相比于LCS,PSTGraph构建模型时的吞吐量是较高的,后者吞吐量只有100-200KB/s。因而,在识别正确率上,PSTGraph具有优势,在数据增长规模上,PSTGraph为线性复杂度,可以用于海量数据包识别场景。

此外,对于TCP的粘包问题,本公开提出以下方案用于规避,将在之后的评价指标中得以体现。

Plain-ICPID(Plain Industrial Control Protocol IDentification)默认数据包未发生“粘接”,采用首次适配原则,将数据包与特征库中的协议特征逐个匹配,如果与某个协议的特征匹配成功,则停止匹配,如果与特征库中的所有特征都未能匹配成功,则认为该数据包不属于特征库中的任何一种工业协议。

Dual-ICPID(Dual Industrial Control Protocol IDentification)则假设部分数据包发生了“粘接”,采用二次匹配的方式。第一次匹配同Plain-ICPID,不同于Plain-ICPID的是,在进行第一次匹配时,如果当前数据包只与某个协议的特征字符串或者状态转换图匹配成功,与长度字段无法匹配,则将该协议加入可能的协议列表中,然后继续对下一个协议特征进行匹配,如果匹配成功则停止匹配,并清空可能的协议列表。如果第一次匹配失败,且可能的协议列表为空,则数据包不属于特征库中的任何协议;如果可能的协议列表不为空,则假设该数据包发生了“粘接”,使用Plain-ICPID所描述的识别方式对数据包进行第二次匹配,本次识别只使用可能的协议列表中的协议特征进行匹配。同样采用首次适配原则,若第二次匹配也失败,便认为该数据包不属于协议库中的任何一种协议,将其归类为其他协议。之所以采用二次匹配是为了减少误报率。

最后,对本公开整体做评价指标。本公开整体流程为,对输入数据进行预处理,频繁特征字符串匹配,长度字段匹配,协议状态转换图匹配,输出协议类别及格式。数据集中,除了待识别的11种工业协议,还掺杂有一些其他应用的混杂流量。图12是在单协议识别环境中,根据实验得到的Modbus/TCP等11种工业协议的查全率。结果显示,对于这11种协议,无论是使用Plain-ICPID还是Dual-ICPID,除了Modbus/TCP和IEC104协议之外,其他协议的查全率都在98%以上,部分协议比如S7等甚至能够达到100%的正确率。图13是根据实验得到的识别各工业协议时的精确率。通过结果可以看出,无论使用Plain-ICPID还是Dual-ICPID,对于具有较长频繁字符串以及长度字段的大多数工业协议识别精确率都较高,均能够达到99.5%及以上。而EGD协议以及DNP3协议由于未能挖掘到长度字段,因此只能根据频繁字符串进行识别,因此精确率相对其他协议可能会稍低一些,但由于其特征字符串位置固定,且都处于数据包开始位置,特征明显,因此识别精确率也能够达到99%以上。在多协议识别环境中,同样使用Plain-ICPID以及Dual-ICPID对上述11种工业协议进行识别,不同于单协议测试,在多协议测试过程中,由于同时存在多个工业协议的特征,因此能够对多个工业协议进行识别。图14是在多协议识别环境中Plain-ICPID和Dual-ICPID两种方法总的查全率和精确率。根据实验结果可以看出,无论是Plain-ICPID还是Dual-ICPID,在多协议识别环境下,都具有较高的查全率以及精确率,但是相比Plain-ICPID,Dual-ICPID的查全率以及精确率都要更高。

通过误识别率可以看出,在多协议识别环境中,本公开所提出的方法提取出的各工业协议的特征之间,具有较高的独立性,不会因为增加对新协议的识别特征而降低对原有协议识别的准确率。而使用Dual-ICPID进行识别时,能够在仅降低很小精确率的情况下大幅提升查全率,说明Dual-ICPID是能够有效识别工业协议的。

相关技术
  • 一种罗丹宁功能化MOFs吸附剂及其制备方法和应用
  • 一种氮硼共掺杂磁性碳基吸附剂及其制备和应用
  • 一种水热法制备Ni/Co基MOF材料的方法
  • 一种用于去除核素铀的磁性吸附剂的制备及应用方法
  • 氨基化磁性水热碳-MOFs吸附剂及其制备方法和应用
  • 氨基化磁性水热碳-MOFs吸附剂及其制备方法和应用
技术分类

06120116526782