胡启宬,何树果,朱 震
(北京升鑫网络科技有限公司 青藤云安全人工智能实验室,北京101111)
政府和企业日益采用复杂和庞大的信息系统,如何确保其自身的网络空间安全成为重要课题。入侵检测是一类通过事件分析,对可疑或具有潜在威胁的行为进行检测,并及时主动地发出警告的安全保障技术。传统的入侵检测技术有基于模式匹配、状态匹配、统计特征、启发式签名规则等多个分类,新一代技术更是融入了机器学习、异常检测等人工智能等相关方法,检测效果得以大幅提升。
信息系统的入侵者在实施攻击的时候,一般会采取包含信息侦察、横向移动、凭证获取、权限提升等一系列战术,这些战术又对应数百种多变的攻击技术[1]。如果使用基于模式匹配或者启发式签名的方法进行入侵检测,会高度依赖威胁情报收集和安全专家知识的转化,既缓慢且成本高昂;基于机器学习和异常检测的方法则可以在一定程度上降低这一成本,既能对已知威胁达到较高的检测准确率,还能对未知威胁进行检测。
根据互联网工程任务组对通用入侵检测框架的定义[2],入侵检测系统中应当包含如下组件:事件产生器、事件分析器、响应单元和事件数据库。事件产生器在计算机上按照给定的粒度收集系统中发生的事件,并向事件分析器和事件数据库提供事件。常见的事件产生器,例如记录内核层面跟踪日志并将其发送至指定服务器的事件探针,其使用的数据结构一般为日志序列,诸如使用模式匹配、启发式签名等方法进行预定义规则的匹配。同时,使用日志序列处理存在一些缺点,如可提供日志关联性少、强顺序约束不抗混淆等,导致检测效果的降低。使用图作为事件数据的载体,则能够缓解上述问题,以起源图为代表的图数据结构和相关算法正被广泛讨论[3]。
本文提出将日志序列转化为图结构,即系统日志对象连接图,并对该图中的顶点寻找向量形式嵌入表示,具体编码方法基于图神经网络思想;以进程对应顶点的嵌入表示为对象,训练异常检测模型,为计算机进程行为寻找基线,提供新的进程行为嵌入数据点异常评分机制;此外,通过单独分离出进程间的派生信息,在嵌入表示空间内建立状态概率转移模型,描述计算机进程行为之间的相联关系。本文的主要贡献有:
(1)提出系统日志对象连接图和将日志序列转化为该图的方法;
(2)提出在系统日志对象连接图(多重有向属性图)中的顶点寻找向量形式嵌入标识的编码方法;
(3)提出在上述嵌入表示的向量空间内建立多阶状态转移和异常检测模型,以描述系统内进程行为基线;
(4)提出一种异常评分机制,在上述进程行为基线的基础上,通过计算相对于基线的偏离程度进行入侵检测。
图作为一种能够高效地表达实体之间关联关系的数据结构,在入侵检测、威胁发现、攻击溯源等信息安全相关领域内被广泛研究和讨论。文献[4]、[5]的研究中提出使用量化数据流图描述系统中逻辑实体之间的数据流动情况,并分别使用启发式一阶逻辑谓词和提取统计特征的方法有监督地训练分类模型,从而检测出恶意进程。Ning等人[6]提出的超警报关联图将“表象-前提-结果”三元组组成的超警报类型以因果关系关联起来,文献[7]在此基础上更进一步,通过归约和转化提取出攻击策略图,并提出相似性度量方案以测量攻击策略之间的相似程度。Fredj等人[8]提出将告警事件按序列顺序建立状态转移图,并以此建立吸收马尔可夫链模型,从而依据链上的关键节点自动发现入侵者的攻击策略。文献[9]、[10]提出内核对象依赖图,并在此基础上分别使用加权公共行为图、关键路径和无监督聚类算法以识别恶意软件,并将其分类为某一恶意软件家族。Liu等人[11]提出了一种将日志条目作为图的顶点,顺序关联作为边缘的图,并提出了在该图上运行的顶点嵌入算法,该嵌入算法以边缘的权重为概率进行随机游走,并通过类似于Word2vec的方式为每一条日志条目寻找向量嵌入,以此发现异常的日志事件。文献[12]首次提出起源图概念,并且作者以此提出了一种攻击溯源算法。Liu等人[13]提出了一种运行在起源图上的自动优先排序的因果关系跟踪器,用于攻击溯源,该溯源算法通过事件在因果关系和拓扑上的稀有性确定其优先级,以更低的代价识别攻击轨迹。Hossain等人[14]针对数据泄露和数据破坏类的攻击行为提出了溯源模型,该模型通过为起源图中的实体分别定义信任度和保密度标签,并定义标签的初始化和继承策略,用一系列启发式规则进行威胁检测。在文献[15]中,作者为起源图中的实体分配主体标签或数据标签,计算和检测包括恶意软件执行、特权提升、数据导出等一系列攻击行为。
上述的方法在一定的范围内拥有良好的检测效果,但是仍然存在一些不足之处。例如,依赖于有标签的数据集完成模型的训练或者算法的初始化,获取代价十分昂贵;仅能够检测已知的威胁,主要是出现在训练集中的样本,即使部分模型有一定的泛化能力,但仍无法检测出未知的威胁。
系统日志对象连接图是用于表示计算机系统内部逻辑对象及之间关联的数据结构。逻辑对象包括进程、文件、网络套接字等,在系统日志对象连接图中表示为顶点;而对象之间的关系则在系统日志对象连接图中表示为两顶点之间的边缘。形式化定义系统日志对象连接图G=<V,E>,其中V为顶点的集合,E为边缘的集合;此外,定义一属性函数Attr(e,f),为图中的元素e(可以是顶点或边)的属性字段f赋值。
在系统日志对象连接图中,顶点v∈V的类型Attr(v,′type′)和边缘e∈E的类型Attr(e,′type′)由事件产生器所能捕获的事件类型而决定。在本文的实验中使用的事件发生器运行在Linux系统上,其支持的事件所导出的顶点和边缘的类型如下:Attr(v,′type′)∈{进程,文件/管道,文件系统,网络套接字,服务,内核模块},Attr(e,′type′)∈{进程派生,进程访问,文件/管道创建,文件读写,文件属性修改,文件软硬链接创建,挂载文件系统,从/向套接字读取/写入数据,修改系统服务状态,加载/卸载内核模块};对于事件生成器生成的日志条目,将日志中事件的主体和客体转化为对象顶点,将事件中的行为动作转化为将主客体对象顶点连接起来的行为边缘。例如,日志条目“于t时刻,进程p从文件m中读取了一段数据”可以转化为进程对应的顶点p和文件对应的顶点m之间的一条边缘r,且Attr(r,′type′)=t,如果两顶点间已经存在边,则需建立一条新的边(多重边)。
表1 中详细地列举了系统日志对象连接图中的对象顶点和行为边缘的属性字段和各个字段所对应的取值范围的说明。
表1 系统日志对象连接图属性和取值
根据2.1节中所描述的方法,将时间窗口内的日志序列转化为系统日志对象连接图,定义系统日志对象连接图中类型的顶点为主体,其他类型的顶点为客体,可以得到直观的结论,即一个主体与若干个主体及客体相连接,而客体则仅与主体相连接;描述主体行为需要使用与主体相连接的若干阶邻居节点的属性,即主体顶点的嵌入向量应当与其n阶邻域中的顶点相关。为达到进程行为向量化描述的目的,需要对图中的每个顶点,尤其是进程对应的顶点,寻找与其邻居节点的嵌入相关的向量化嵌入,即:
式中,hu为顶点u的向量化嵌入表示为顶点u的k阶邻域节点集合,F为嵌入函数,该嵌入函数将顶点u的k阶领域内的顶点和边缘中包含的信息进行聚合,以获得顶点u的嵌入表示;当顶点u的类型为进程的时候,hu即为该对应进程行为的向量化嵌入表示。因此,需要进一步寻找和确定式(1)中的嵌入函数F。
图神经网络是一类支持图数据结构的深度学习方法。传统的深度学习方法诸如CNN、RNN等需要使用规律排列的数据(例如图像和字符序列);而图神经网络GNN使用并不规律排列的结构信息和特征信息,为图中的顶点产生嵌入向量。图神经网络中的消息传递神经网络(Message Passing Neural Network,MPNN)[16]框架和GN[17]框架都基于Weisfeiler-Lehman图核[18]中设计的迭代式标签传递的思想,即每经过一次消息传递的迭代,节点的嵌入中就多包含一阶邻域的信息。MPNN定义的消息传递与更新步骤可以分别表示如下:
式(2)中M(i)为第i次迭代使用的消息聚合函数,该函数将顶点u的k阶邻域内的顶点嵌入和顶点对组成的有效边缘(u,v)∈E的信息进行聚合,并输出对于顶点u的第i+1代消息;式(3)中U(i)为第i次迭代使用的消息更新函数,该函数以顶点u的i代嵌入向量和第i+1代消息作为输入,输出为顶点u的i+1代嵌入向量对于顶点的初始嵌入向量应当包含顶点u的′type′、′loc′和′perm′属性的信息,边缘携带的信息e(u,v)应当包括边缘(u,v)的′type′、′flow′和′stat′属性;例如将上述属性字段按照其逻辑含义和数据类型分别进行独热编码、skip-gram编码、字典映射编码、top-N编码等。
常用的图神经网络模型例如GCN[19]、Graph-SAGE[20]、LGCN[21]等可视为由MPNN框架通过选择不同消息聚合函数M和消息更新函数U实例化而来。一般来说,消息聚合函数会选择例如求和、求平均、拼接、求最大值、随机游走并按期望排列、长短期记忆网络(Long Short-Term Memory,LSTM)、集合池化、Janossy池化[22]等,并同时附以点乘权重矩阵和归一化等步骤;而消息更新函数会选择例如向量拼接、线性加和、取最大值、跳跃连接,并同时附以归一化、点乘公共的可训练权重矩阵、按照度区分点乘不同的可训练权重矩阵、使用非线性激活函数等。
本文在MPNN框架上进行泛化,将嵌入函数F定义为类似公式(2)、(3)描述的迭代式聚合更新的过程:
式(4)中,每次迭代使用相同的消息传递函数,该函数在本文中定义为向量拼接函数(用“⊕”代表)。同理,每次迭代使用相同的消息更新函数,该函数在本文中定义为取平均函数Λ,W(i)为第i次迭代中的权重矩阵,如果将该矩阵设置为可训练矩阵,则可以在有监督信号的情况下通过反向传播进行类似常规深度学习的训练;反之将其固定,则可以进行无监督信号的编码,一次消息聚合和更新过程为一次迭代,记为函数f。式(5)表明了迭代n次的过程,即每次迭代的输出作为下一次迭代过程的输入,所需的嵌入函数F则为更新过程f的n次复合函数。
使用2.2节中提出的嵌入函数,将系统日志对象连接图中的进程顶点根据其行为嵌入为向量形式,在向量空间内,行为相似的进程嵌入到举例相近的位置,行为相差较大的进程则距离较远。
为了给稳定运行的计算机系统建立一个描述其常规行为模式的模型,即行为基线,本文提出在嵌入向量空间中建立类似马尔可夫模型的p阶状态转移模型,能够刻画嵌入向量在该空间中的分布情况以及进程间的关联模式,如派生模式等。对于稳定运行的系统中的进程行为,本文有如下假设:进程本身的行为应当与同源进程(具有相同′loc′属性的进程)的行为一致,并且应当频繁出现;频繁出现的进程行为在整个嵌入空间内应当具有稳定的分布,即随着时间推移不会突变;进程之间的关联关系应当是稳定的,表现为从同源进程间转移的概率不随时间推移而变化。
给定m个进程u1,u2,…,um,以及它们在向量空间中的嵌入h1,h2,…,hm,使用基于密度的聚类算法,如具有噪声的基于密度的聚类方法(Density-Based Spatial Clustering of Applications with Noise,DBSCAN)将向量嵌入聚为t个簇C1,C2,…,Ct,注意有部分嵌入不被包含在任意一个类中,因为它们被聚类算法标记为噪声点;对于有关联关系的进程ur和us,例如ur是us的父进程,或者ur访问us,记ur|→us;定义向量A与矩阵B:
式(6)中,向量A的t个分量依次记录了C1,C2,…,Ct在嵌入空间内的取值概率,前文提到假设频繁出现的进程行为在整个嵌入空间内应当具有稳定的分布,向量A则描述了这种分布情况;式(7)中,矩阵B的i行j列对应的数值是具有关联关系ur|→us的数量占任意关联关系ur|→*的数量的比例,前文所假设的进程之间的关联关系应当是稳定的,而矩阵B则描述了这种关联关系。在此基础上定义p阶状态转移矩阵:
式中,T(p)矩阵中包含的元素代表p阶的进程关联关系树中的转移概率,特别地,当p=0时,T(0)=A,是进程行为嵌入本身的概率分布;当p=1时,T(1)=BA,代表长度为1的进程链的概率分布。p阶状态转移模型通过多阶的进程关联情况来描述系统中的进程基线行为。
为了达到检测入侵的目的,在2.3节中所述三个假设的前提下,使用偏离行为基线的程度作为检测入侵行为的量化指标;本节提出一个相对基线偏离程度的评分机制,作为入侵检测在异常行为方面的参考依据。
对于进程行为嵌入分布(p=0)来说,其偏离基线的程度应当取决于其是否处于任意一个簇C1,C2,…,Ct之内;在基于密度的聚类算法中,可以发现离群点,例如根据DBSCAN中的扫描半径和最小包含点数两个参数,可以导出周边密度小于预设的噪声点;或者可以在向量嵌入空间中直接使用基于距离的异常检测算法,例如局部异常因子(Local Outlier Factor,LOF)算法,该算法根据局部可达密度导出离群因子。
对于进程行为关联关系(p≥1)来说,其偏离基线的程度应当取决于相对低阶的状态转移矩阵。例如,对于一个具有连续关联关系的进程序列、u1|→u2、u2|→u3、…um-11|→um,需 要 使 用p=m-1阶 状 态 转 移模型刻画,与之对应的m-1个状态转移矩阵分别为T(1),…,T(m-1),可以在此基础上定义该进程序列的偏离分数S:
在操作系统为CentOS的服务器上部署对应的事件探针作为事件生成器,并且使用2.1节中描述的方法将事件日志序列转化为系统日志对象连接图。在事件收集阶段,服务器上正常运行Redis服务和MySQL服务,并在实验条件下确保相对隔离。事件收集结束后,在系统日志对象连接图上运行2.2节中的进程行为嵌入方法,模型中参数选择为n=1、W固定为恒等变换I,其他参数选择详见2.2节中的叙述;接着使用如2.3节所述的模型为系统中进程的行为建立基线,其中参数选择为p=0;同时,在该进程行为嵌入数据集上训练LOF模型,参数选择邻居数量为20、距离函数为欧氏距离,该模型在测试阶段为新的嵌入向量偏离基线的程度进行打分。
实验模拟入侵者向上述服务器发起攻击,其中使用预装若干渗透测试工具的Kali Linux,以CentOS服务器为目标,模拟如下一系列攻击场景:
(1)SSH口令暴力破解:使用hydra工具配合口令字典,向服务器的ssh端口连续发起登录;
(2)未授权登录:利用Redis的漏洞,向服务器存储公钥的目录下写入准备好的公钥,保存后入侵者可以直接登录该服务器;
(3)Redis主从复制远程代码执行:利用Redis的漏洞,使用redis-rogue-getshell工具向服务器运行Redis的端口发起远程代码执行攻击;
(4)添加后门账户:在服务器上使用useradd添加恶意账户,使用输出重定向添加账户口令,以便入侵者的后续登录;
(5)权限提升:准备LinPEAS的攻击载荷,并在命令行中使用Python调用执行。
在此期间,使用在模型训练阶段得到的嵌入函数和LOF模型,为实时产生的系统日志对象连接图中的进程顶点实行嵌入和偏离基线程度打分,并做出告警。
在入侵测试阶段,五个攻击场景因进程与行为基线有较大偏差而全部被检测出来。对于每个场景的具体解释如下:
(1)Sshd进程与同源进程的历史行为不同,因为派生和被派生情况与基线不一致;
(2)Redis-server进程建立了与基线行为不同的网络连接(与攻击者机器的网络连接),且异常地将写入工作目录下的文件移动到/root/.ssh目录;
(3)Redis-server进程出现了与其历史基线不同的行为,即派生了被远程命令执行调用的进程;
(4)Useradd进程本身在基线中没有频繁出现,与Useradd有相似行为的进程没有对/etc下的多个文件进行创建文件硬链接和删除文件等操作;
(5)Python进程出现与同源进程的历史基线不一致的行为,包括进行了异常的网络连接、向磁盘不常用位置写入文件、派生bash进程以及使用了该写入的文件。
为了更加直观地表现进程行为嵌入基线和在测试中进程行为偏离基线的情况,本文将进程嵌入向量进行降维和可视化:首先使用增量主成分分析(Incremental Principle Component Analysis,IPCA)算法将嵌入向量降至16维,然后使用t分布随机邻居嵌入算法(t-distributed Stochastic Neighbor Embedding,t-SNE),接着将其降至2维以便在平面上展示,绘制结果如图1所示。图中的圆点代表训练阶段的进程向量嵌入降维后的分布情况,可以发现,行为相似的进程的嵌入所对应的二维数据点较为明显地聚在相近的位置,反之行为差异较大的进程之间的距离较远,整体来看,这些圆点组成了系统在训练期间的进程行为基线;图中的“X”形点代表在入侵测试阶段被告警的异常进程,即五个与攻击相关的进程在降维后的空间内所在的位置。可以发现,这些数据点都距离基线中的任何一个簇的距离都较远,周边点的密度都较小,从而佐证了其偏离基线的结论。
图1 进程行为嵌入降维后的分布情况
本文提出并验证了一种使用图神经网络思想的入侵检测方法,提出将日志序列转化为系统日志对象连接图这一数据结构的方法。使用消息传递神经网络框架定义了嵌入函数,从而对系统日志对象连接图中的顶点进行向量形式嵌入,以达到向量化描述进程行为的目的。根据向量化的进程行为,使用多阶转移模型来描述主机上的进程行为模式,即行为基线,并在该基线上定义了偏离程度分数来进行入侵检测。在实验阶段,通过在一台服务器上训练模型,并且使用多种不同的攻击手段攻击该服务器,成功验证了本文方法的有效性。