基于图表示学习的恶意软件分类方法

2022-01-07 03:31张英韬王宝会
新型工业化 2021年10期
关键词:子图调用神经网络

张英韬,王宝会

(1.武汉大学国家网络安全学院,湖北 武汉 430072;2.空天信息安全与可信计算教育部重点实验室(武汉大学),湖北 武汉 430072;3.北京航空航天大学软件学院,北京 102206)

0 引言

互联网技术的高速发展在为人们带来无限便利的同时,也同时成为某些别有用心的人对特定用户群进行攻击的途径。据统计,过去一年中,全世界由于恶意攻击造成的经济损失达6万亿之多[1]。在所有的操作系统中,Windows系统由于其用户界面精美,操作简单,且各类游戏和软件的普及性较高,得到了众多用户的青睐。不幸的是,针对Windows系统的恶意攻击层出不穷,对系统造成极大威胁。尤其是类似于勒索病毒,挖矿程序,DDOS木马,蠕虫病毒等恶意软件。虽然业界涌现了大量的应对方法,但由于这些软件衍生出越来越多的变种、且具有更深的行为特征隐藏性,为恶意软件检测任务带来了前所未有的巨大挑战。

根据现有文献,恶意软件检测方法大致分为两种,首先是基于人工提取特征的方式,其中典型的有基于统计特征的方式[2]。由于该方式往往依赖于过往人工积累的特征码经验,因而易于导致在识别经过加壳处理或经过混淆的恶意软件方面存在困难[3];其二是基于机器学习的检测方法,该方法又分为基于传统机器学习技术和基于深度学习技术。传统机器学习的特征设计往往需要人工干预,如果特征提取工作出现误差,则可能会导致准确性降低,误报率更高[4]。同时在处理序列数据方面有很大不足[5],导致该类模型往往泛化能力较低。典型的如[6-7],其主要运用了SVM,决策树等传统机器学习算法。与之相对应的深度学习方法,由于该方法可以学习更高维度的特征及表达更抽象的语义,因而在近年来成为检测方法的主流[8]。常用的深度学习方法依赖于对API语义的抽取,然而由于这些方法对于的过长序列数据常用截断处理,导致恶意软件可轻易绕过序列检测窗口。幸运的是,随着深度学习的发展,以图的方式来对API调用序列进行建模的方式逐渐受到研究者的青睐。其主要优点是可以在图结构内部建立拓扑关联,并且具有强大的推理能力,可以充分吸收周围节点的特征。有鉴于此,本研究将使用图表示学习方法,根据API相互的调用关系和调用序列,得到该软件的图表示,再输入至图神经网络中进行分类。本文在这项工作中的主要贡献如下:

(1)本文根据PE软件调用API的特点,提出多子图的图表示方法对API序列构图建模,并运用该模型实现恶意软件家族分类,实验的结果验证了本文的合理性和准确性。

(2)本文创新性提出了边嵌入方法,将调用序列中的一些边根据其两头的节点类型生成边节点,对关键性的调用信息进行突出提取,实验证明,该方法增加了准确性。

1 方法设计

根据对恶意软件处理的角度不同,目前恶意软件的检测方法大致可以分为静态检测技术和动态检测技术两类。静态检测是指并不实际的运行样本,而是直接根据样本,使用相应的反汇编软件对样本分析得到其特征信息。动态检测则是将样本放置在沙箱等环境中运行,根据样本对操作系统的资源调度情况的日志进行分析。目前大多数的恶意软件的检测方法都是基于静态检测,通过一些静态的软件反汇编软件,得到该软件的API调用序列,再输入到神经网络中进行学习。然而随着时代的发展,恶意软件为了躲避检测而采用了各种特征隐匿手段以抹除静态特征。但是恶意软件这种混淆检测的方法仍旧无法隐藏其区别于良性软件的动态行为模式,如特定的函数调用序列。因此本研究将选用动态检测方法来对样本进行行为特征提取,并以此嵌入成图进行学习。在本节中我们将对整个模型的核心组成进行介绍。

1.1 数据预处理

整体的数据准备流程如图1所示。其中Cuckoo sandbox[24]是一个开源的恶意文件自动化分析系统,对于上传的文件能记录其在虚拟机动态运行后的进程、网络、文件等行为,对于初步分析恶意软件并获取其动态特征有很大帮助。本文通过在virusshare网站中下载相关恶意软件,将得到的恶意软件上传至virustotal网站进行分类,得到其标签。

同时将恶意软件送入cuckoo沙箱中进行分析,得到的动态运行报告如图2所示。

图1 数据准备

本文对其中的“category”,“api”,“time”,“tid”进行提取,转化为csv格式后,得到了恶意软件的初始特征数据。

1.2 恶意软件的图表示

在得到上述样本的各种标签以及特征后,便开始着手构建恶意软件的图表示。

(1)特征选择。本文选择了对于节点的嵌入方法来表示恶意软件的API节点向量。首先我们继承了Tu等人[9]的工作,根据API函数的调用序列,将各API函数嵌入为图的节点。然后使用节点嵌入的方法将每个节点节点嵌入为独特的向量表示。

图2 行为报告

本文使用的节点嵌入方法是基于Deepwalk[10],并结合了NLP的一种新的基于恶意软件API的图嵌入方法。首先在每个图中随机选取一个节点,对该节点进行随机游走并对已走过的节点进行标记。当走到最后一个节点没有路径的时候退回前一个节点寻找其他路径,每个图截取其中的前n(超参数)个节点组成该文件的路径,在对所有的图进行随机游走之后拼接在一起,得到整个语料库的路径,最后对这个路径进行一种改进的fastText处理得到每个节点的嵌入表示作为其第一层特征。本文使用改进的fastText方法H(驼峰)-fastText主要是基于API大多是类似“GetAsyncKeyState”的复合词,且大多使用驼峰命名法。因此本文将子词变为“”和“”,来进行训练,最大程度提取其语义信息。每个API节点的词向量的计算方式如公式(1)所示:

其中Aw为所有子词的词库,zg为该词语所涉及的子词的向量表示,最终加和得到该节点的向量表示。

在进行图表示时,本文另外对模型的边进行了处理,Wüchner等人[11]在文章中指出,在恶意软件运行的时候,极易调用以下三类的API,ProcessAPI,FileAPI和RegistryAPI,而且特别当这些类型的API连续调用时,基本就是在进行对电脑较为重要的任务。因此如果某一条边的两端顶点为以上三类节点时,将该边提取为一个节点,命名为TypetoType,例如“FiletoFile”。然后将该边节点放回至原DeepWalk得到的序列中并进行Word2Vec处理,其中API节点向量不进行训练,单独训练边向量。

(2)子图表示。随着恶意软件检测方法的发展,恶意软件作者的水平也在提高,他们可能会使用多线程方法来实现其最终目标。目前,恶意软件的图表示主要基于整个恶意软件调用序列,而不同的线程的调用序列可能具有不同的含义。恶意软件在运行时可能会进行大量的正常行为,但会分支出某个线程对系统进行破坏。因此本文提出采用子图,识别出具有恶意行为的线程。

本文的方法首先对每个恶意软件的函数调用序列进行提取,根据调用的时间信息进行排序,得到其不同的函数调用子图,如图3所示。图中将两个不同的API调用序列表示为两个子图,作为接下来的图神经网络的输入。但是在对数据进行处理的时候,出现了一个问题。首先由于每个图输入的子图数量不同,导致在输入至全连接层时的维度并不固定。这样导致整体参数维度不固定而无法训练。因此我们选择了类似Transformer中的Padding方法。对于子图数量少于应有的输入数量的情况,直接输入一个没有任何边的子图进行训练,即邻接矩阵与度矩阵均为0的输入。

(3)基于图神经网络的分类器。在得到每个恶意软件的图表示后,便开始构建我们的图神经网络分类器。如图4所示,首先我们对每个子图单独进行两层图卷积[12],如公式(2)所示:

图3 生成子图

图4 图表示分类方法

在经过卷积后,各个节点均吸收了其邻居节点的特征,此时使用TopK[14]的方法来对图进行池化。TopK的思路是指对该图分类越不重要的节点则丢弃,而保留对分类结果重要的节点,其中池化率K是一个超参数,K∈(0,1)。在进行图卷积的之后,我们设立一个权重值以表示其节点的重要程度并对其进行降序排序。如公式(3)所示:

Mask操作相当于在原始的数据上盖上一层掩膜,从而屏蔽或选择一些特定元素。应用于本文方法中则是屏蔽掉那些被池化的节点的邻接矩阵A和特征向量X。每个子图在进行两次卷积和池化后,得到K1*K2*N个节点(K1,K2∈(0,1),且均为超参数),这些节点有着他们的特征值,以及属于哪个图的标识。为了统一所有图的维度,使用平均池化的方法,如公式(7)所示,对每一层池化后的节点的向量进行读出:

在本文的模型中,经历了多次池化的过程,每一次池化都会丢失一定的节点信息。为了使本文的模型也能收录全部丢弃了的节点的信息,本文对得到的信息进行一次性的聚合,具体方式为将各子图池化后的值拼接起来:

最终,得到了该样本经过图神经网络的学习后的向量表示,然后将该向量输送至前馈神经网络中降维至类别数量,再对其进行Softmax处理得到每个类别的概率。

2 实验

本文进行了多组实验,同时对数据集也进行了多种的处理。为了使我们的实验的结果更加令人信服,本文使用了同种数据对其他的模型(LSTM,CNN等)进行了实验,并将我们的准确率与这些模型进行了对比。

2.1 实验数据

本文使用前文所示的方法共获取数据集总量为13996个。其中各类恶意软件样本分布情况如图5所示。

2.2 实验结果

图5 软件类型分布表

本文一共使用以下指标对我们的实验进行评估,准确率(ACC),召回率(R),精度(P)以及F1_score(F1)。本文做了两类实验,首先是对是否为恶意软件的二分类,其次是具体属于哪个种类的8分类。同时还对自身的实验进行了消融实验,也对其他模型进行了横向对比。

我们的模型为WMALG(Windows Malware Graph),SAGp为本文所使用的的初始模型SAGp[33](Self-Attention Graph pool)。在二分类方面,从表1,表2的实验结果可以看出本文所提出的两种方法均可以有效的提高检测效果。首先相对于经典的机器学习而言,本文所使用的数据集并不是很适合,我们仅提取了两类特征,一是线程数量,另一个为恶意等级为3的API的数量的特征,因此所提供的参考意义不大。但与CNN、LSTM等神经网络模型的实验结果进行对比,分类的各项指标均有着很大提升,而相比于MAG同样使用图神经网络进行分类的模型也有着2.5%左右的提高。在表2的消融实验中,也进一步验证了本文所使用的两种恶意软件图嵌入方法确实有效。而对于8分类而言,表3可以看出本文的方法相对于其他的深度学习模型而言有着较大提升,但受限于数据集的分布不均匀,最终的F1值和ACC值并不是很高。但总体来说,本文所提出的模型对于检测效果的提升是十分有效的。

表1 二分类对比实验

表2 二分类消融实验

表3 八分类对比实验

图6 准确率,召回率以及精度

图7 SAGp 与WMALG 模型的准确率对比

图8 SAGp 与WMALG 模型的Loss 对比

3 结语

恶意软件已经成为了最具威胁性的网络安全问题之一,给个人、企业以及国家的信息安全造成严重威胁。针对此问题,本文提出了一种基于图表示学习的恶意软件检测方法,使用基于多线程的多子图表示方法以及添加边节点的方式将恶意软件表示为图结构,并输入至图神经网络中进行分类。实验证明,本文提出的方法的检测效率对比其他模型有着不小的提升。

猜你喜欢
子图调用神经网络
核电项目物项调用管理的应用研究
神经网络抑制无线通信干扰探究
临界完全图Ramsey数
LabWindows/CVI下基于ActiveX技术的Excel调用
基于系统调用的恶意软件检测技术研究
基于频繁子图挖掘的数据服务Mashup推荐
基于神经网络的拉矫机控制模型建立
复数神经网络在基于WiFi的室内LBS应用
基于支持向量机回归和RBF神经网络的PID整定
不含2K1+K2和C4作为导出子图的图的色数