面向新型电力系统的智能终端后门检测方法

2024-01-03 06:22谢萱萱李俊娥李福阳许逸凡刘林彬陈锦山
电力建设 2024年1期
关键词:后门字符串端口

谢萱萱,李俊娥,李福阳,许逸凡,刘林彬,陈锦山

(1.空天信息安全与可信计算教育部重点实验室 (武汉大学国家网络安全学院),武汉市 430072;2.国网福建省电力有限公司电力科学研究院,福州市 350000)

0 引 言

“双碳”目标下,随着分布式能源的大规模接入和源网荷储的协同消纳,海量智能终端接入新型电力系统[1],系统暴露面日益扩大,信息物理系统(cyber physical system,CPS)的耦合效应使得网络攻击对电网安全稳定运行的威胁也日益增大[2]。

分析现有的典型网络攻击事件[3-5]可知,后门常被攻击者用来绕过安全机制。攻击者可以在系统中留下后门以保持秘密通道,再次入侵时便可绕过身份验证等安全机制[4]。并且后门还具有隐藏自身或其他恶意代码、清除访问痕迹等功能[6-8],使得攻击潜伏期更长、更隐秘,更不易被检测到。例如,SSH后门被BlackEnergy利用来连接C&C服务器,下载KillDisk组件清空系统日志和删除覆盖相关文件,并清除攻击痕迹[9]。新型电力系统中,由于网络空间的开放性,智能终端的后门更容易被攻击者利用。因此,对电力智能终端开展后门检测可以及时发现和清除隐患,极大程度上避免遭受攻击,保障电力系统安全运行。

现有后门检测方法包括可执行路径分析法、特征码对比法、行为检测法、基于虚拟机的检测方法和基于机器学习的检测方法等[10]。由于智能终端计算和存储资源有限,下文按照资源开销大小将各类方法进行分类综述。

现有方法中,可执行路径分析法、特征码对比法和行为检测法的资源开销较少。可执行路径分析法主要是通过建立每个系统调用的执行路径,以检测异常系统调用。例如,文献[11]基于细粒度控制流完整性(control flow integrity,CFI),提出了基于状态机和CFI约束规则的检测模型,可检测内核级代码复用攻击。这类方法适用性窄,且实现较为复杂。特征码对比法使用静态特征(如字节序列、字符串和汇编指令等)进行后门检测。例如,文献[12]通过文件检测和可加载内核模块(loadable kernel modules,LKM)检测后门的文件修改行为和内核可疑行为;文献[13]基于文件特征、内核关键数据结构等进行后门检测;文献[14]基于API调用序列提出基于马尔科夫链的恶意软件检测方法。这类方法检测效率高,但单特征检测方法的准确率不高。行为检测主要是用于检测恶意代码的功能行为。例如,文献[15]利用恶意代码必须改变控制流或数据结构的特点,根据虚拟内存访问模式对恶意行为分类,可检测内核Rootkit后门;文献[16]针对Rootkit隐蔽性强的问题,提出基于Rootkit隐藏行为特征的取证方法,可对未知恶意代码进行取证;文献[17]提出一种基于网络流量差异的分析方法,可检测具有网络连接特征的后门。这类方法检测准确率高,但误报率也高。

基于虚拟机的检测方法和基于机器学习的检测方法资源开销较大。基于虚拟机的检测将被监控系统和检测系统安装在不同的虚拟机中运行,通过检测操作系统内核对象视图的变化来判断系统是否感染后门。例如,文献[18]通过在虚拟机中跟踪内核系统调用,采用非线性、相空间算法以标记感染和未感染主机之间的差异;文献[19]基于虚拟机自省技术,提出一种Rootkit检测方法,可定位Rootkit文件并清除;文献[20]通过跟踪内核活动来过滤Rootkit的LKM。文献[21]提出一种基于虚拟机架构的计数追踪检测方法,将理想状态和实际的内核函数调用情况进行对比,实现异常检测。这类方法计算和存储资源开销大,且需要虚拟机进行辅助。基于机器学习的检测则是利用机器学习算法进行模型训练和检测。例如,文献[22]基于硬件性能计数器和机器学习检测Rootkit后门;文献[23-26]将恶意代码转换为二维图像,使用深度学习模型进行纹理分析以检测Rootkit后门或恶意代码;文献[27-28]将机器学习和虚拟机内存取证等结合,可检测内核Rootkit后门;文献[29]考虑攻击流量自相似特征,提出了一种基于长短期记忆网络的检测方法;文献[30]提出了基于改进生成对抗网络和极端随机树的攻击检测模型。但这类方法模型训练时间长、计算和存储资源开销大、数据集要求高。

综上所述,现有后门检测技术用于电力智能终端后门检测时存在如下不足:

1)电力智能终端后门样本量少,无法使用基于大样本数据的后门检测方法,例如基于虚拟机和机器学习的检测方法;

2)现有特征码对比法可用于电力智能终端后门检测,但其通常基于单一特征进行检测,无法完整表征后门异常行为,准确率不高;

3)现有检测方法多是基于单一检测技术,每种检测技术有各自的优缺点和适用场景,单一检测技术的准确率不高。

针对电力智能终端后门样本量少和基于单一特征的检测方法准确率不高的问题,本文基于现有后门样本详细分析其特性、行为及代码特征,从字符串特征和函数调用序列特征两方面入手,构建多特征融合的后门特征库,实现对后门的多方位静态检测;针对静态检测方法不适用加密、多态、变形等后门变体或加壳程序的问题,本文提出基于运行状态的检测方法,从文件状态、网络状态和隐藏行为三方面实现对后门异常行为的动态检测,进一步提高后门检测的覆盖率与准确率。

1 终端后门样本分析与方案概述

对电力智能终端类型及其使用的操作系统进行调研,结果如附录A表A1所示。由附录A表A1可知,电力系统主站系统类终端大多使用Unix、Linux及Windows系列操作系统;末端节点装置类终端大多使用Linux、VxWorks等嵌入式操作系统,部分使用μC/OS-II或WinCE。因此本文主要针对Unix/Linux操作系统的后门进行分析,研究其后门类型、代码特征和运行机制。

1.1 Unix/Linux系统典型后门样本

Unix/Linux操作系统中后门种类较多,现有研究大多针对Rootkit后门展开,而针对具有网络连接特征的后门研究较少,因此本文选取几类典型的具有网络连接特征的后门样本,分析代码特征及运行机理,为后续后门检测提供理论支撑。

1)Ping-back是最简单的ICMP shell后门,代码量不到100行,却具备Unix/Linux ICMP后门的完整功能。程序运行后只要接收到对应大小的ICMP包即可激活,实现相应的功能。

2)ICMP-backdoor具有ICMP shell后门和Bind shell后门的功能,还具有从网络中下载ELF文件并执行的功能。

3)Prism是轻量级的用户态后门,具有两种模式。STATIC模式下将主动连接到指定的IP和端口;ICMP模式下通过接收含有特定口令的ICMP包激活连接,反向shell连接到攻击者的主机,使攻击主机获得后门主机的控制权。Prism还可以清除iptables规则,从而避免自身的网络报文被过滤。

4)Liinux是Bind shell后门与Rootkit后门结合的复合型后门,含有网络连接模块及Rootkit模块,具有实现程序转移及反向shell连接功能,并且可以通过vfs hook实现进程的隐藏和root权限的保持。

5)RatHole是C/S类型的网络连接型后门,由运行于攻击主机的连接程序Rat和运行于后门主机的后门程序Hole组成,Rat和Hole程序间通过口令验证连接,不需要root权限运行程序就可实现后门功能。

上述后门样本的详细信息如表1所示。

表1 后门样本的类型、特征及行为Table 1 Types,characteristics and behaviors of backdoor samples

1.2 方案概述

通过1.1节的分析可知,不同种类的后门有不同的功能,多种后门相互配合可以实现和保持攻击者对后门主机的访问和控制。例如Rootkit后门主要通过隐藏其文件、端口和进程等方式实现对后门攻击行为的隐藏。因此,对电力智能终端后门的检测,需要考虑到后门特性及电力系统的特点。

针对电力智能终端后门样本量少的问题,本文不考虑使用需要大样本数据集的机器学习等算法,而是基于搜集到的现有后门样本,详细分析其特性、行为及代码特征,以进行针对性地检测。

由于电力智能终端运行时,其运行的程序和执行的功能是固定的,因此其系统状态具有以下特点:1)文件状态周期性变化,即文件访问对象固定、文件创建和删除操作周期性出现,且一般只针对固定目录;2)网络状态基本保持不变,即端口开放固定,网络流量周期性变化,通信对象固定、无异常网络访问;3)运行进程基本保持不变,即进程运行列表基本不变,端口开放情况基本不变。

因此,本文提出一种面向新型电力系统的智能终端后门检测方法,方案如图1所示。

图1 面向新型电力系统的智能终端后门检测方案Fig.1 The intelligent terminal backdoor detection scheme for modern power system

图1中,基于代码特征的静态检测是针对系统运行代码进行静态检测,包括字符串检测和函数调用序列检测,能快速检测到代码中异常的功能字符串、函数调用序列等,检测准确率也较高。但是,基于特征码的静态检测方法依赖样本特征库的完备程度,也不适用加密、多态、变形等后门变体或加壳程序。

因此,本文针对电力智能终端行为固定的特点,进一步提出了基于系统运行状态的动态检测方法,通过实时监控智能终端运行时系统的文件、网络等状态,检测系统是否发生异常行为,将对后门的检测转变为对后门恶意行为的检测。该方法不仅适用智能终端上线前和更新后,也适用运行阶段。

上述两种方法对后门的检测涵盖智能终端的上线前、运行时和更新后多阶段,并且检测方式和适用阶段不同,可互为补充,以提高后门检测准确率。基于代码特征的静态检测方法可以在智能终端上线前对其运行代码做细致的安全检测,及时发现后门,避免上线后造成损失。基于运行状态的动态检测方法则是在终端处于运行态时,实时监控系统的运行状态,可发现后门的恶意行为,适用静态方法无法检测到的加密、多态、变形等后门变体,以及不在代码特征库样本范围内的后门。

2 基于代码特征的后门检测方法

2.1 异常行为的代码特征分析

由1.1节及表1可知,电力智能终端后门可能引起的异常行为包括反向shell、异常网络连接请求、异常文件操作、异常指令等几类。这些行为在代码层面通常会呈现出一些特征,按照其存在形式,可分为字符串特征和函数调用序列特征。

字符串特征指后门代码中的关键字符串,如Linux命令等;函数调用序列特征指程序调用的系统函数序列,如网络端口监听、外部文件下载执行等异常行为对应的调用序列。分析后门样本并总结得到智能终端后门异常行为的典型代码特征,如表2所示。

表2 智能终端后门异常行为及其代码特征Table 2 Abnormal behavior and code characteristics of intelligent terminal backdoor

1)字符串特征。

字符串特征是指智能终端后门为实现某些异常行为而在二进制文件中留下的字符串,包括命令字符串和特定字符串。

命令字符串主要包括shell字符串和Linux命令字符串。shell字符串主要出现在反向shell连接异常行为中,可利用shell字符串对Unix/Linux的命令程序和服务进行检测,查看其内部是否被植入了反向shell的代码。Linux命令字符串主要包括文件管理、文件传输、磁盘管理、网络通信、系统管理及设备管理等各类Linux命令,它是异常指令的代码特征。

特定字符串则是分析后门样本中得到的提示或签名信息或其他可疑字符串。

2)函数调用序列特征。

函数调用序列特征是指智能终端后门为实现某些异常行为而调用的函数的序列。表2中的函数调用序列特征说明如下。

dup2 + dup2 + dup2 + exec族调用序列可以重定向shell的标准输入、标准输出和标准错误输出流,广泛出现在所有的后门程序中,主要实现反向shell功能。

socket + bind + listen + accept调用序列实现网络端口的监听,主要出现在Bind shell后门中,也是网络连接中服务器端的函数调用序列。

socket + connect调用序列实现主动向外连接,主要出现在ICMP shell后门中,也是网络连接中客户端的函数调用序列。

open + open + read + write调用序列可以实现文件的转移,出现在Liinux后门中。

read + write + fexecve调用序列实现外部文件的下载和执行,主要出现在ICMP-backdoor中。

后门程序在实现相应的功能时,通常是多种函数调用序列组合使用。例如,Bind shell后门通过端口监听接收攻击主机发起的连接,再进行反向shell连接,其函数调用序列特征则为监听端口+反向shell连接,即socket + bind + listen + accept + dup2 + dup2 + dup2 +exec族;ICMP shell后门通过解析ICMP包激活,向外连接至攻击主机,并进行反向shell连接,其函数调用序列特征则为向外连接+反向shell连接,即socket + bind + listen + accept + dup2 + dup2 + dup2 +exec族;ICMP-backdoor从网络下载ELF文件并执行,其函数调用系列特征则为向外连接+外部文件执行,即socket + connect + read + write + fexecve。

2.2 异常行为代码特征检测

2.2.1 代码特征库

基于2.1节的异常行为代码特征,根据特征对应的异常行为的危害程度,为每个特征设定危险等级,以此构建代码特征库,包括字符串特征库和函数调用序列特征库。

1)字符串特征库。

字符串特征库内存储的信息包括字符串特征、字符串特征解释、字符串特征对应的异常行为和字符串特征的危险等级等。字符串特征库字段构成如表3所示。

表3 字符串特征库结构Table 3 Structure of string feature database

2)函数调用序列特征库。

函数调用序列特征库内存储的信息包括函数调用序列特征、函数调用序列特征解释、函数调用序列对应的异常行为和函数调用序列的危险等级。函数调用序列特征库字段构成如表4所示。

表4 函数调用序列特征库结构Table 4 Structure of function call sequence feature database

2.2.2 字符串特征检测

字符串特征检测的对象是可执行程序。为了更快速全面地进行检测,本文采用模式匹配的方法对可执行程序代码进行字符串特征检测。字符串特征检测方法如算法1所示,其基本思路为,识别可执行程序的所有字符串,利用哈希算法,快速查找字符串是否在特征库中。

算法1字符串特征检测1234567Input:stringFeatureLib,exeFile//字符串特征、可执行文件Output:detectionResult//检测结果strFeature←hash(stringFeatureLib);//将特征库离散分布printableString←isPrint(exeFile);for string in printableStringif exist(string,strFeature) then//快速判断是否存在detectionResult←append(getInfo(feature,str));endifendfor

2.2.3 函数调用序列特征检测

函数调用序列特征与字符串特征性质不同,字符串特征的字符必须是连续和固定的,字符串内不能有其他的字符,而函数调用序列强调的是序列,即使序列中出现了其他函数调用,也不会影响到序列本身,因此检测方法也不同。

函数调用序列检测的对象是待检测程序的函数调用序列列表,为了实现完整准确的检测,本文采用模糊匹配方法,搜索程序的函数调用序列是否包含特征序列。

函数调用序列特征检测方法如算法2所示,其基本思路为,判断特征序列的函数在程序调用序列中是否全部出现,且顺序是否一致。

算法2函数调用序列特征检测1234567891011121314151617Input:funcSeqList,funcSeqFeaLib//函数调用序列列表、函数调用序列特征库Output:detectionResultfor funSeq in funcSeqListfor funcSeqFea in funcSeqFeaLib index←0; preNum←-1; clear(isVisited[]); curNum←findInUnvisited(funcSeqFea[index],fun-Seq); while curNum>preNumdo isVisited[curNum]←true;preNum←curNum;index←index+1; curNum←findInUnvisited(funcSeqFea[index],funSeq); endwhile if index>=size(funcSeqFea)then detectionResult←append(getInfo(funcSeqFea,fun-Seq));endif endforendfor

3 基于运行状态的后门检测方法

上述基于异常行为代码特征的静态检测无法检测加密、多态、变形等后门变体或加壳程序。此外,后门的某些行为没有特定的字符串,也无法以规范的函数调用序列表示,如后门的隐藏行为。因此,为了充分发现电力系统中的后门,需要进一步基于系统行为进行动态检测。

传统的基于系统行为的动态检测方法,通常需要修改系统代码,如hook系统调用函数,需要编译并加载新的功能模块,当用于系统上线前检测,由于电力系统代码非开源,这种方法显然不适用。因此,本文提出基于系统运行状态的后门检测方法,无需修改系统代码即可进行后门异常行为检测。

3.1 文件状态监测

文件状态监测对象是数据文件。为了保持对指定文件的状态监测,又不过多占用计算资源,本文采用定时循环检测的方式,以固定时间为周期,每一个周期针对文件状态库里的文件进行一轮监测。文件状态监测方法如算法3所示。

算法3文件状态监测1234567891011Input:fileStateLibOutput:monitorResultfilename,fileAddr,fileMD5,checkNum,checkTime←read(fileStateLib);//文件名、文件地址、文件MD5值、检测次数、检测时间for i←0 tosize(fileStateLib) oldFileMD5←fileMD5[i]; newFileMD5←calculateMD5OfFile(fileAddr[i]); if newFileMD5!=fileMD5[i]then//文件被修改monitorResult←append(getInfo(filename[i],fileAddr,newFileMD5)) endif checkNum[i]←checkNum[i]+1; checkTime[i]←getTime();endforwrite(fileStateLib,checkNum,checkTime);

3.2 网络状态监测

3.2.1 网络状态

网络状态主要指端口开放、网络流量及网络访问情况。电力系统运行时,其运行的程序和执行的功能是固定的,因此其网络状态基本保持不变,即端口开放固定,网络流量周期性变化、无异常网络访问。在网络状态的监测中,需要监测系统中有无可疑进程打开端口,网络流量是否突然增大或减少,有无外部地址的网络连接。

1)端口开放状态可量化为端口开放总数及开放的端口号列表。

2)网络流量状态较为复杂,可分为两个阶段。第一个阶段是日常运行阶段,此阶段末端节点定时给主站上送测量值和信号量,网络流量恒定。第二个阶段是发布控制命令阶段,此阶段主站给末端节点下发命令,由末端节点执行相应操作,并将执行情况上送给主站,会有网络流量的激增,随后缓慢下降到日常运行状态。

3)网络访问状态可量化为网络访问信息四元组,即

3.2.2 网络状态监测

1)端口开放状态读取与监测。

为了实时监测端口开放的状态,并且不占用过多计算资源,本文采取双重检测的方式对端口开放状态进行检测。端口开放状态检测算法的具体步骤为:

步骤1:读取系统初始状态记录模块中的记录端口开放总数PortNumber和记录端口开放列表PortList,进入循环定时监测。

步骤2:每隔一个周期,读取并计算一次系统实时端口开放总数,并与PortNumber进行比较。

步骤3:如果相同,则等待下一个周期的检测。

步骤4:如果不相同,则依次读取系统开放的每个端口,查找其是否在PortList中,如果不在,则输出端口号及提示信息。

2)网络流量状态读取与监测。

由于电力系统运行的不同阶段中,网络流量的特点不同,因此本文分阶段对网络流量状态进行监测,将其分为日常运行和下发控制命令两个阶段执行。

因网络流量变动性较大,对日常运行状态下的平均网络流量dailyAvgTraffic和最大网络流量dailyMaxTraffic的记录要在运行平稳时选取,对控制命令下发阶段的最大网络流量exeMaxTraffic和恢复至日常运行状态的时间recoveryTime的记录要在下发不同的指令时进行统计选取。网络流量状态的读取,可使用Linux下iftop命令查看并读取,也可在电力系统交换机内进行监测。

网络流量状态监测方法如算法4所示,其基本思路为:首先判断系统当前状态,若是控制命令下发阶段,则检测网络流量最大值和流量恢复平稳所消耗时间是否正常;若是日常运行阶段,则检测最大网络流量和平均网络流量是否正常。

算法4网络流量状态监测12345678910111213Input:netTrafficLib,stateTimeOutput:monitorResultdailyAvgTraffic,dailyMaxTraffic,exeMaxTraffic,recover-Time←read(netTrafficLib);//日常网络平均流量、日常网络最大流量、控制命令下发阶段网络最大流量、恢复至日常状态的时间maxTraffic←getMaxTraffic(stateTime);if controlCommand() then//控制命令阶段 time←getRecoverTime(stateTime); if maxTraffic>exeMaxTrafficortime>2∗recover-Time thenmonitorResult←append(getInfo(‘command’,maxTraf-fic,time)); endifelsethen//日常状态 aveTraffic←getAverageTraffic(stateTime); if maxTraffic>dailyMaxTrafficoraveTraffic>2∗dailyAvgTraffic thenmonitorResult←append(getInfo(‘daily’,maxTraffic,aveTraffic)); endifendif

3)网络访问状态读取与监测。

网络访问状态的监测对象是系统网络访问状态信息。对网络访问状态的读取,可使用Linux下的netstat命令,查看并记录所有网络连接信息。网络访问状态监测算法的具体步骤为:

步骤1:读入系统初始状态记录模块中的所有网络连接四元组信息进入循环定时监测。

步骤2:每隔一个周期,读取系统当前的所有网络连接的四元组信息;针对一条系统网络连接信息,判断该条信息是否在网络访问状态库中。

步骤3:如果在,则检测下一条系统网络连接四元组信息。

步骤4:如果不在,则系统出现异常网络连接,输出告警信息。

步骤5:如果当前为最后一条网络连接数据,则程序终止,等待下一个周期的网络访问状态监测,否则进行下一条网络连接信息的检测。

3.3 隐藏行为检测

隐藏行为包括文件隐藏、端口隐藏和进程隐藏[14]。此类行为通常出现在Rootkit后门中,电力系统正常运行时不应存在隐藏行为,因此对隐藏行为的检测可以发现系统的Rootkit后门。

3.3.1 文件隐藏检测

文件隐藏通常与后门文件转移行为相联系,通过修改文件或文件夹名称,可将文件转移至隐藏文件夹下,或直接隐藏文件。

1)在文件/文件夹名称前加上“.”即可在普通查看文件的方式下实现文件的隐藏,更具迷惑性的则直接以“..”或“...”作为文件或文件夹的名称。对这类文件隐藏方式的检测,可采用ls-al命令显示所有文件及文件夹,遍历查找所有以“.”开头的文件和文件夹。

2)修改ls命令程序,使ls命令在列出文件时对部分文件进行隐藏。修改ls程序后会改变该命令程序的md5值,因此可在文件状态监测时发现此种形式的隐藏文件。

3.3.2 端口隐藏检测

端口隐藏通常是后门在进行网络监听时,用于隐藏自身进程及监听的端口,以躲避运维人员的检测。

用户查看端口一般使用netstat命令,该命令通过读取并解析/proc/net/udp和/proc/net/tcp文件获取TCP和UDP连接信息,后门可通过hook显示函数,如显示TCP连接信息的tcp_seq_show()函数,在显示函数结果中删除需要隐藏的端口,即可达到端口隐藏的目的。

因此,检测隐藏端口要避免使用netstat命令,可通过如telnet连接、nmap工具、nc指令等对所有端口进行遍历来进行。在对目标终端进行端口遍历侦听后,得到开放端口列表,利用3.2.2节中的端口开放状态检测算法,找出隐藏端口,输出相关信息。

3.3.3 进程隐藏检测

进程隐藏是Unix/Linux的Rootkit后门最主要的功能。Rootkit实现进程隐藏的主要方式liangz及对应的检测方法如下所述。

1)通过修改或替换ps、top等进程查看工具隐藏/proc/pid目录下的进程信息。此种方式与修改ls命令隐藏文件类似,会改变ps命令程序的md5值,因此可在文件状态监测时发现此种形式的进程隐藏,也可读取并遍历/proc/pid中存储的进程信息,与ps命令执行结果进行对比,判断是否存在进程隐藏行为。

2)通过sys_get dents()系统调用进行hook,拦截对/proc/pid虚拟文件系统的访问和读取,实现进程对用户的隐藏。对于此类进程隐藏方式的检测,可通过比较用户级进程列表和内核进程列表的差异来获取隐藏的进程信息。其中,用户级进程列表可利用ps或cat/proc命令获取;内核进程列表可利用Linux提供的kprobe调试技术获取。

综上,隐藏行为的分类、隐藏方式及对应的检测方法如表5所示。

表5 隐藏行为的隐藏方式及检测方法Table 5 Hidden way and detection method of hidden behavior

4 实验与分析

本文选取1.1节后门样本作为恶意样本,同时选取Linux常见的命令程序作为良性样本进行对比分析,验证检测方法的有效性和准确性。恶意样本包括Ping-back、ICMP、Prism、Liinux和RatHole共5类,由于Prism后门具有多种功能,因此编译出4种形式,分别是Prism(ICMP模式)、Prism-static(Static模式)、Prism-iptables (ICMP模式+iptables功能)、Prism-static-iptables(STATIC模式+iptables功能),RatHole后门选取Hole程序作为样本。良性样本包括/bin文件夹下的所有Linux命令程序,共119个。

4.1 代码特征检测实验

4.1.1 字符串特征检测结果

字符串特征检测方法的实验结果如表6所示,可见,针对不同后门样本,算法能检测出相应的异常字符串。

表6 字符串检测结果Table 6 Results of string feature detection

4.1.2 函数调用序列特征检测结果

函数调用序列特征检测方法的实验结果如表7所示,可见,针对不同后门样本,算法能检测出相应异常行为的函数调用序列,但无法检测出隐藏行为。这是因为这类行为没有特定的字符串,也无法以规范的函数调用序列表示,需要使用基于系统运行状态的动态检测方法进行检测。

表7 函数调用序列检测结果Table 7 Results of function call sequence detection

4.2 运行状态监测实验

后门样本的系统运行状态监测结果如表8所示。由于条件限制,本文实验未能模拟整个电力系统环境,未得到电力系统日常运行及下发命令阶段的网络流量情况,故未在表中列出。

表8 运行状态监测结果Table 8 Results of running status monitoring

由表8可见,实验中对后门运行状态的监测,可以检测出各类异常运行状态,如网络访问情况和隐藏行为等,结果符合预期。

4.3 结果分析与对比

4.3.1 结果分析

本文方法的准确率和误报率如表9所示。其中,准确率为后门样本检出的结果数量/后门样本总数量;误报率为非后门样本检出结果数量/样本检出结果数量。

表9 异常行为代码特征检测准确率及误报率Table 9 Accuracy and false positives rate of abnormal behavior code feature detection

从表9可见,由于代码特征检测方法无法检测进程隐藏这类隐藏行为,其准确率为82.1%,误报率为1.5%。而综合代码特征和运行状态的检测方法,准确率提升到98.5%,误报率降低至0.8%,结果较为理想。

4.3.2 与现有工作的对比

现有方法中,由于可执行路径分析和基于虚拟机的检测法无法计算准确率,因此选取其余方法进行对比实验,结果如表10所示。

表10 与现有方法的对比Table 10 Comparison with existing methods

因智能终端计算和存储资源有限,本文以计算和存储资源开销判定一个方法是否适用于电力系统。现有方法中,可执行路径分析法适用性窄、实现复杂,基于虚拟机的检测法资源开销大,基于机器学习的检测法需要大样本数据集、资源开销大,因此这3种方法均不适用电力系统场景。需要说明的是,由于缺少样本数据,基于机器学习的检测方法实验使用的不是电力智能终端后门样本数据。

由表10可知,在适用于电力智能终端的方法中,本文方法检测结果优于其他对比方法。

5 结束语

后门具有隐蔽性和潜伏性,是攻击者达成攻击目的的重要途径。若电力系统智能终端存在后门,将极大地威胁电力系统的安全稳定运行。本文总结了电力智能终端及其使用的操作系统,分析了智能终端后门的异常行为及代码特征,针对电力智能终端的运行特点,提出了基于代码特征和运行状态的、动静结合的后门检测方法。本文方法从字符串特征和函数调用序列特征两方面,对电力系统二进制代码进行静态检测,弥补了单特征检测准确率不高的缺陷;然后从文件状态、网络状态和隐藏行为三方面,对电力智能终端后门异常行为进行动态检测,进一步提高后门检测准确率。

实验结果表明,由于代码特征检测方法无法检测进程隐藏这类隐藏行为,其准确率为82.1%,误报率为1.5%。而综合代码特征和运行状态的检测方法,准确率提升到98.5%,误报率降低至0.8%,结果较为理想。

本文研究针对Unix/Linux操作系统,下一步将扩展至嵌入式Linux和Windows操作系统,即覆盖所有的电力系统智能终端。此外,搜集更多不同类型的后门样本,完善后门的异常行为、代码特征和运行状态等,进一步提升后门检测方法的覆盖率和准确率。

附录A

表A1 电力系统智能终端及其使用的操作系统Table A1 Power industrial control terminal and its operating system

猜你喜欢
后门字符串端口
一种端口故障的解决方案
基于文本挖掘的语词典研究
工业物联网后门隐私的泄露感知研究
端口阻塞与优先级
这个班还不错
初识电脑端口
新帕萨特右后门玻璃升降功能失效
新途安1.4TSI车后门车窗玻璃不能正常升降
8端口IO-Link参考设计套件加快开发速度
一种新的基于对称性的字符串相似性处理算法