摘 要:
电力工控系统是关系到电网安全稳定运行的重要领域。目前国网黑龙江电力有限公司已经建立起“安全分区、网络专用、横向隔离、纵向认证”的边界安全防护体系。但在工控系统核心位置保护方面,还需考虑以下两个问题:电力工控系统具有闭源特性,内部函数逻辑调用非开源;攻击数据样本极少,难以构建特征库引擎。针对以上问题,从系统底层数据提取、运行状态学习等方面开展研究,设计了涵盖厂站、主站两侧的安全防御体系架构,为闭源电力工控系统安全防御问题提供技术解决路线。
内容目录:
1 闭源电力工控系统安全防御架构
2 厂站底层数据提取模块
2.1 软件关键模块定位技术
2.2 函数执行轨迹特征提取
3 主站安全防御模型
3.1 网络结构设计
3.2 反向传播算法设计
4 安全防御模型构建及架构示例
5 结 语
电力工控系统,特指应用于电力生产和供应过程的工业控制系统,如调度侧的智能电网调度技术支持系统、变电站侧的综合自动化系统以及发电厂侧的分散控制系统等,是关系到电网安全稳定运行的重要领域。电力工控系统一般不公开其内部函数逻辑调用关系及私有化通信协议,具有闭源特性。同时,由于缺少攻击数据样本,难以实现杀毒引擎的构建,导致传统基于特征库匹配的网络安全技术不适用于电力工控系统。
数据采集与监视控制系统(Supervisory Control And Data Acquisition,SCADA)作为下发遥控指令的核心组件,是攻击者的主要目标。2010 年,受“震网”病毒影响的系统包括 SCADA 和可编程逻辑控制器(Programmable Logic Controller,PLC)。文献 [2] 和文献 [3] 介绍了 SCADA 和能量管理系统已有的具体漏洞。文献 [4] 演示了一个攻击示例,攻击者可以通过修改 GOOSE 数据包来实现跳闸操作,触发一系列级联事件,从 而 导 致 灾 难 性 的 电 网 事 故。文 献 [5] 针 对SCADA 系统的入侵防护,提出了基于异常行为检测的 SCADA 系统防护方法。Morris 等人对远程终端单元(Remote Terminal Unit,RTU)攻击类型进行分析,提取了通信协议的异常行为检测特征。文献 [7] 面对电力系统自动化领域唯一的全球通用标准——IEC61850 协议,开展了分析研究,并给出了 IEC61850 静态及动态特征检测方法。
在安全防护异常检测方面,文献 [8] 研究了工控系统异常行为发现方法。文献 [9] 给出了一种面向工业控制网络的异常流量检测方法,该方法采用自回归移动平均模型(Autoregressive Integrated Moving Average Model,ARIMA)对正常流量进行建模分析,并以此模型对网络正常流量进行预测,从而检测异常流量。密西西比州立大学针对电力系统,提出了基于 K-means 聚类的无监督学习异常检测方法。罗耀峰等人在模糊聚类算法中引入了异常检测方法,面向差异化多层网络,研究了深度异常检测方法。
考虑工控系统网络的复杂性,单一的异常检测方法难以满足实际环境下的检测精度要求。对此,有研究者为提高工控系统异常行为检测能力,尝试将多种检测方法进行复合或加权组合。Aburomman 等 人 提 出 了 一 种 SVM-KNN-PSO组合方法,利用粒子群优化算法(Particle Swarm Optimization,PSO)进行权重优化,并结合支持向量机(Support Vector Machine,SVM)和 K 近邻法(K-Nearest Neighbor,KNN)的分类优势,用以开展系统异常检测,结果表明,与单一方法相比,组合方法的检测精度有一定程度的提高。
本文基于国家电网公司建立的“安全分区、网络专用、横向隔离、纵向认证”安全防护体系,重点考虑工控系统底层数据及运行机制的封闭性(闭源性)特点,利用逆向分析技术,从系统底层运行状态学习方法、安全防御模型构建等方面,设计构造不依赖特征库比对的工控系统安全防御体系架构,解决未知恶意行为和恶意代码潜伏问题,为闭源电力工控系统安全防御问题提供技术解决路线。
1闭源电力工控系统安全防御架构
电力工控系统是一个有机整体,分析其安全防御模型,首先需要分析电力工控系统各业务场景及应用模式。充分考虑在系统封闭、代码非开源、协议私有化等闭源条件下,进行安全防护的技术难点。最终确定适用于电力工控系统安全防御业务的应用模式。本文所设计的安全防御架构如图 1 所示。
图 1 闭源电力工控系统安全防御体系架构
从站端监测、主站管控、云端分析 3 个方面增强安全防御体系。其中,站端监测是通过数据采集模块,采集工控系统的底层数据,感知闭源系统在多个阶段产生的数据信息,解析系统底层运行机理。主站管控是通过部署在网络安全管理平台的防御模型,对站端监测到的数据进行异常判断,并依据该判断结果进行告警及威胁处置。云端分析是利用调控云平台中的模型训练模块,增加算力并计算异常判断依据,训练完毕的结果反向下发至主站防御模型中。
如图 1 所示,底层数据提取模块部署在厂站闭源电力工控系统中,实现系统程序进程中各模块、函数之间调用状态的实时采集,实现函数调用关系与关键参数提取。采集的底层数据通过 Agent、网络安全监测装置,发送给网络安全管理平台防御模型。
主站安全防御模型采用机器学习的方法对数据进行智能分析,生成模型判断依据的参数,形成安全稳定运行基线,实现对厂站终端底层信息的实时监测和告警。
模型训练模块部署在调控云平台中,目的是为构建防御模型提供充足的计算资源,并实时分析、验证,不断完善防御模型。完成阶段性学习后,防御模型向厂站下发指令,实现对终端底层信息的实时监测和告警等处置方法。
2厂站底层数据提取模块
系统底层数据提取模块主要用于提取闭源电力工控系统底层运行数据,主要涉及内部函数调用逻辑及参数逆向技术。系统内部函数调用逻辑及参数逆向是用来分析闭源软件的技术,目的是获取一些难以获得的软件信息、算法、被隐藏的许可密码或是文件采用的加密方式等有用信息。具体包含两部分,即软件关键模块定位技术和函数执行轨迹特征提取技术。软件关键模块的获取可以使用动态插桩的方法,定位关键模块可有效减少冗余的函数执行轨迹,更利于分析计算。函数执行轨迹特征提取则针对关键模块实施动态链接库劫持,记录关键模块函数调用信息。
2.1 软件关键模块定位技术
可执行程序在完成其功能的过程中,需要执行多个相应的程序代码,并且执行过程具有一定顺序,这种顺序即程序执行轨迹。依据不同的分析粒度,软件执行轨迹主要分为模块级执行轨迹和函数级执行轨迹(如图 2、图 3 所示)。
图 2 模块级执行轨迹
图 3 函数级执行轨迹
本文采用函数级执行轨迹覆盖度的方法进行关键模块定位。主要流程为:(1)确定所要分析的应用程序具体功能;(2)采集该功能在正常运行过程中的函数执行轨迹,采集执行过程中各个函数的调用次数和函数所属模块;(3)按模块逐一统计函数调用总量次数,得到各个模块的函数执行轨迹覆盖度;(4)根据覆盖度数值,从高到低选择部分模块,作为关键模块。
2.2 函数执行轨迹特征提取
函数执行轨迹特征提取是关键模块定位的前提条件。其过程主要包含函数栈帧分析和动态连接库劫持两个部分。
(1)函数栈帧分析。首先,需要对函数栈帧进行初步分析,确定相关函数参数。之后根据参数在相应函数中传递过程、计算量等信息,初步判断各参数在相应函数中的作用,进而判断相应函数的具体类型。其次,需要进行函数栈帧监控(可以使用具体的插桩工具开展)。通过监控,可以确定所分配的函数参数和变量大小,也可以通过识别 push ebp/mov ebp, esp 的使用情况,确定帧指针的使用情况以及栈帧参数和变量的内存引用情况。用 WinCC50.dll 举例说明,该 DLL 文件中的函数(CCGetWinCCIniPath)栈帧如图 4 所示。从图 4 中可知,黑色框线内的函数中包含 arg_0 和 arg_4 两个参数,对应的是 ebp+8h 和 ebp+0Ch 位 置, 其 中,arg_0 上 面的相关参数为相应的局部变量。
图 4 CCGetWinCCIniPath 函数栈帧
(2)动态连接库劫持。关键模块定位之后,为了获取模块相关函数调用过程,需要采用动态链接库劫持技术(又称为动态链接库Hooking)。动态链接库劫持技术可以有选择性地劫持动态链接库内用户自定义的函数。其过程如图 5 所示,在软件和目标 DLL 文件之间,设置同名的伪装 DLL 文件。每当程序调用关键 DLL 文件中的具体函数时,会被伪装的同名DLL 文件劫持,由于该伪装 DLL 文件是被修改过的,因此可以将程序调用的具体函数记录下来,进而截获相关函数调用过程。
图 5 动态链接库 Hooking 过程
3主站安全防御模型
安全防御模型构建过程可分为数据集构建和卷积神经网络(Convolutional Neural Network,CNN)训练过程。原始数据主要从厂站工控系统或装置中采集提取,并对每条数据标记时间戳,对采集到的原始数据进行数据处理,生成机器学习可识别的训练数据。训练数据应包含正常样例和异常样例,但是异常样例难以获取,因此需要采用主动触发设备异常的方式生成数据。数据收集完成后采用随机抽样的方法将训练数据划分为训练集和测试集,训练集用于调整模型,测试集用于测试模型效果。
主站安全防御模型可采用 CNN 构建。CNN主要包含网络结构设计和反向传播算法设计两个部分。
3.1 网络结构设计
CNN 主要由卷积层、池化层和全连接层构成,分别设计各层,然后将各层叠加,即可构建完整的 CNN。
(1)卷积层。卷积层是 CNN 的核心层,大部分计算工作是在该层完成。在卷积层,处理后的训练数据经过相关卷积计算,利用激活函数将输入数据映射到输出端,即可得到相应的输出特征,多个输出特征再次进行卷积,即可得到多个特征的组合值,定义为第l卷积层的第个特征输出值:
其中,f () down 为激活函数,是在 CNN 神经元上运行的函数,负责将神经元的输入映射到输出端。为第 l层第 i个输出的激活值,其是将上层特征输出值与核矩阵的卷积结果进行累加,再叠加特征偏置量得到的,如式(2)所示:
(2)池化层。在连续的卷积层之间,需插入一个池化层,以有效控制过拟合情况的发生,并且可以降低数据空间的大小,减少网络参数数量,降低计算资源消耗,定义为池化层第 l层第 个输出的激活值,如式(3)所示:
其中, down() 定义为池化函数,将上层特征值输出值 划分为多个 n×n 块,取该 n×n块中的平均特征值作为输出,即有效降低了数据空间维度。β 为权重系数,为特征偏置量。
(3)全连接层。全连接层在 CNN 中起着“分类器”的作用,将学习到的所有特征值映射到“分类器”上。该全连接层的权重 w 是一个巨大的矩阵,除特定块外,其他部分都是零。在该层,二维特征值将会转化为一维特征值并作为该层的输入。对输入进行加权求和,经过激活后得到第 l 卷积层的输出为:
其中,为权重系数,为特征偏置量。
对 于“ 分 类 器” 的 多 分 类 问 题, 可 将 输出期望与实际输出做负对数似然,得到训练总误差:
其中,为样本 n 的真值,为网络输出值。
3.2 反向传播算法设计
反向传播算法主要用于计算梯度下降,是训练神经网络的常用算法。其思想是:训练数据经神经网络输出侧输出结果,是前向传播过程,计算前向传播输出结果与实际结果误差,并将该误差从输出侧向输入侧反向传播,在反向传播过程中,根据误差,调整各参数值,不断迭代直至收敛。
定义为卷积层l的灵敏度,其表示总误差E 随第 l层激活值变化的程度:
卷积层灵敏度大于池化层灵敏度,因此为计算第 l层的灵敏度,需要利用上采样方法,对l+1 池化层灵敏度进行提升,以达到和第 l卷积层灵敏度同量级的程度,通过链式求导可得第 l层第 j 个通道灵敏度为:
其 中,,up() 表示一个上采样操作,将每个特征值在二维方向上进行 n 次复制 n×n,即可提升 l+1 层灵敏度。
总误差 E 对偏移量的偏导,可通过累加 l层所有节点灵敏度得到:
总误差 E 对卷积核参数的偏导,可通过累加所有特征元素得到:
其中,是在计算时,与逐元素相乘的元素。
其中,全连接层的权重w是一个巨大的矩阵,在 l 层,定义 η 为学习率,若其过小,则 CNN整体训练速度会过慢;若其过大,则系统运行将不可收敛。通过调整学习率,调整整体训练时间;通过调整 CNN 各项参数,不断迭代直至收敛后,可以得到 CNN 运行收敛的具体参数。
整个训练过程是:对数据进行上述处理,产生的特征向量作为输入数据对 CNN 进行训练。在 CNN 训练过程中采用若干个卷积核对特征向量拼接成的矩阵进行扫描、池化和全连接。训练过程则是使用 BP 算法修改神经网络中每条链接的权值。训练的过程实际上是对模型的极大似然估计,即最大化,其中,X 为样本,y 是样本标签,θ 为模型参数,因此训练过程就是已知 X 和 y 的情况下,通过优化 θ,使得 L 最大化。
4安全防御模型构建及架构示例
在安全防御模型构建中,训练数据应包含正常样例和异常样例,但是异常样例难以获取,因此做出如下定义:正常运行是指通过软件提供的修改方法正常修改变量数据;非正常运行则是指除正常运行外任何可能的行为。
模型训练过程可视为将模型拟合数据的过程,定义为机器学习模型,其中,x 为输入数据,θ 为模型参数,为模型对输入数据 x 的预测结果。定义损失函数表示模型预测的误差,其中 y 为样本标签,即当 x 为正常数据时,y=0;当 x 为异常数据时,y=1。模型的训练过程:通过寻找合适的模型参数 θ,使得预测误差最小。因此训练过程是解决优化问题,如式(11)所示:
本 文 采 用 卷 积 神 经 网 络 模 型, 损 失 函 数可导,可利用随机梯度下降技术解决该优化问题,完成对神经网络模型的训练。在训练结束后,模型参数 θ 可作为工控系统是否存在异常的依据,从而获得安全稳定运行基线。在训练过程中,从训练集中随机抽取部分数据,定期检验预测正确率,验证训练阶段性成果。当训练成果达到预期时,停止训练,使用测试集测试,当测试效果达到预期时,结束模型构建过程。
本文提出的安全防御模型构建流程如图 6所示。
图 6 安全防御模型构建流程
选取数据库中 124 个正常修改样例和 154个非正常修改样例,以 6∶4 的比例构建训练集和测试集,计算召回率,最终结果如表 1 所示。
表 1 不同核函数下召回率实验结果
对于正常修改样例的检测结果而言,各种核函数都具有优秀的表现,尤其是多项式核函数的召回率达到了 100%;对于非正常样例的检测结果而言,各种核函数差异较大,其中,多项式核函数的召回率最低,其次是径向基核函数;线性核函数的召回率最高。在特征数远大于样本数的情况下,通常选用线性核函数的经验知识。在正常修改状态下,线性核函数召回率达到了 98.3%,非正常修改状态下的召回率也达到了 93.5%。
5结 语
本文以提高电力工控系统安全稳定运行为目的,面向当前电力工控系统闭源性及攻击样本少的特点,设计了面向闭源电力工控系统的安全防御体系架构,为闭源电力工控系统安全防御问题提供了技术解决路线。针对闭源特性问题,分析并给出了用于提取闭源电力工控系统底层运行数据的函数调用逻辑及参数逆向技术;针对攻击样本少,无法构建特征库的问题,提出了基于卷积神经网络的主站安全防御模型构建方法,给出了不依赖特征库的系统安全运行训练方法;最后以示例的方式,给出了安全防御流程架构。
引用本文:王宁 , 王振邦 , 田石刚 , 等 . 面向闭源电力工控系统的安全防御体系架构设计 [J]. 信息安全与通信保密 ,2022(4):18-26.
作者简介
王 宁, 男, 硕士,高级工程师,主要研究方向为电力系统运行控制、新能源运行管理;
王振邦,男,博士,高级工程师,主要研究方向为电力监控系统网络安全;
田石刚,男,硕士,高级工程师,主要研究方向为电力系统及其自动化;
李冶天,男,硕士,高级工程师,主要研究方向为电力系统及其自动化;
孙 迪,男,硕士,高级工程师,主要研究方向为电力系统运行控制、计算机技术;
李 兵,男,硕士,高级工程师,主要研究方向为电力系统及其自动化。
选自《信息安全与通信保密》2022年第4期(为便于排版,已省去参考文献)
声明:本文来自信息安全与通信保密杂志社,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。