机器学习在恶意软件检测中的应用
1、引言
随着社会发展越来越依赖于计算机系统和网络技术,恶意软件对于当今社会的威胁越来越大。恶意软件检测一直是网络安全学术界和工业界长期致力于解决的关键问题。
传统的恶意软件方法依赖威胁情报库,即将软件的特征与情报库中的情报做信息匹配。然而,这种威胁情报库的维护成本很大,并且需要大量的专家知识,而且随着恶意软件向着载荷小、隐蔽性高、危害性大、变体繁杂等方向持续进化,特别是现在很多黑客组织直接采用脚本生成大批量的恶意软件从而进行大规模恶意软件攻击,传统依赖于规则匹配的方法很难再适用于当下的网络安全环境。
近几年,随着大数据和机器学习的大规模发展,越来越多的网络安全人员尝试使用机器学习的方式学习恶意软件与正常软件的特征,从而让恶意软件检测工作摆脱威胁情报和专家知识,并且能够从容应对大规模的恶意软件攻击。
2、背景
随着计算机系统和网络技术的大规模应用,恶意软件的危害也变得尤为突出。网络蠕虫、勒索软件等入侵事件愈演愈烈,黑客组织往往采用脚本生成大量同类恶意软件的变体从而进行大规模的网络攻击,导致社会各界损失惨重。
根据Gantz等人的研究[1],仅2014年隐藏在盗版软件中的恶意软件,就造成了接近5000亿美元的经济损失,这还只是众多类型恶意软件的冰山一角。
根据AV-TEST的统计[2],在2019到2020年期间,各大安全厂商上报的恶意软件中,就有超过1.14个恶意软件没有被最新的威胁情报记录在案,而仅仅是在2020年的第一季度,就发现了超过4.3亿个新型恶意软件。
显然,在当今的网络环境下,恶意软件攻击是复杂多变的。仅仅依靠传统的规则特征匹配不仅需要大量的专家知识维护情报库,而且往往对新出现的恶意软件变体无可奈何。
应用机器学习算法,根据恶意软件的行为特征来检测恶意软件似乎是解决这一问题的可能途径。
事实上,早在1995年就有人产生过将机器学习应用于恶意软件检测的想法[3]。但是因为要训练一个好用的机器学习模型,必须要有足够数量和质量的数据集做支撑,但在当时还没有大数据的概念,恶意软件的可用样本也比较少,难以让模型真正有效地学习到相应的特征。
近几年,由于恶意软件的数量激增,研究人员可以收集到大规模的恶意软件样本,并由此对机器学习甚至是深度学习模型的训练提供良好的数据支撑。(双押了)
并且除了统计机器学习模型外,深度学习如卷积神经网络、循环神经网络、图神经网络等算法的蓬勃发展,也为研究人员提供了更好的选择。
在这种背景下,越来越多的安全研究人员设计针对恶意软件检测的特征工程,并把多种机器学习算法应用于恶意软件检测,最终达到了非常好的效果。
值得一提的是,由于机器学习方法不依赖于专家知识和威胁情报,而且是通过学习恶意软件的特征来给出评判结果,所以这种方式可以在成本小的前提下对于变体恶意软件具有良好的判别力。
3 方法
虽然恶意软件检测问题涉及多种文件格式和操作系统,但在大多数情况下,同样的特征工程和方法也适用于其他恶意软件领域,例如适用于windows系统可执行文件(PE)的检测算法也同样适用于恶意PDF文件,Linux或Android平台的恶意软件。本文将基于机器学习的恶意软件检测方法按照所需要的特征和模型分为主要的四类,并分别概述具有代表性方法。
3.1 基于统计特征的方法
被广泛使用的特征工程项目LIEF[4]根据解析二进制文件的头部和节的相关信息提取多维特征,包含文件字节码特征、导入表信息、文件各个部分的熵值等信息,共同组成一个特征向量,作为被检测文件的画像。基于这种特征提取方式,研究人员大多采用一些统计机器学习模型如决策树、支持向量机、集成学习等进行有监督训练,并最终达到区分良性软件与恶意软件的目的,此类方法的大致流程如图-1所示。
图-1 基于统计特征的方法流程图
3.2 基于指纹图的方法
此类方法的大致流程如图-2所示。由于软件样本本身是二进制文件,而一个字节(八位二进制数)的大小范围为0-255,也就是一个像素的取值范围。所以在特征提取阶段可以将二进制可执行文件按照八位一个像素值转化为一个“指纹灰度图”,这样恶意软件检测问题就变成了一个对指纹图的学习和分类问题。而在深度学习领域,计算机视觉领域的卷积神经网络(Convolutional Neural Networks, CNNs)十分擅长对图片进行学习。
所以,安全人员将指纹图输入到各种卷积神经网络,并输出恶意软件置信度,最终判断输入样本是否为恶意软件。代表工作MalConv[5]就是利用这种方式可以在大规模恶意软件检测任务中达到90%以上的检测准确率。
图-2 基于指纹图的方法流程图
3.3 基于API调用序列的方法
相对于基于统计特征和指纹图的方法,基于API调用序列的方法旨在让模型真正学到软件所暴露的恶意行为,并以此为特征来判别恶意软件。
这类方法的流程图如图-3所示。首先在特征提取阶段,相比于基于统计特征和指纹图这些直接在文件中提取特征的方法,基于API调用序列的方法往往要真正地运行软件样本,并监控软件所对应的进程,提取该软件在运行过程中所调用的系统API,用这些API所组成的序列作为特征来表示软件运行过程中的各种操作,进而表示软件的行为。
为了更加有效的获取API调用序列,研究人员往往在沙箱中运行软件样本,成熟的沙箱系统如Cuckoo[6]提供了安全的软件执行环境,并且会自动化地监控软件运行所对应进程的API调用信息。在获取到API调用序列之后,就要考虑如何让模型“理解”这段序列并做出判断。
一个合理的解决方案是把API调用序列中的每个API看做是一个词,那么整个序列就可以看做是一句话,这样就可以使用自然语言处理领域的多种模型来解决这个问题。在自然语言处理领域,以循环神经网络(Recurrent Neural Networks, RNNs)为代表的的多种模型取得了巨大的成功。
安全人员尝试借鉴自然语言处理领域的各种特征编码和模型来分析API调用序列,并在大规模恶意软件检测任务中可以达到97%以上的检测准确率[7]:
图-3 基于API调用序列的方法流程图
3.4 基于程序执行流程图的方法
这类方法的流程如图-4所示。控制流图是非常熟知的特征,研究人员通过反汇编将二进制软件样本转化为汇编代码,并从中提取控制流图,从而转化为一个图分类问题。
近年来图神经网络(Graph Neural Networks,GNNs)的蓬勃发展为解决这类问题提供了新的思路。代表工作[8]和[9]都使用了图神经网络来分析控制流图,并在大规模数据集中可以达到95%以上的准确率。
图-4 基于程序执行流程的方法流程图
4 挑战
虽然机器学习在恶意软件检测方面已经取得了非常可观的效果,但是由于机器学习本身的一些原因,这些方法还是存在一些问题,而这也导致了在工业界机器学习并没有进行大规模的普遍使用,这里介绍三个主要的问题。
第一个比较核心的问题就是机器学习模型的鲁棒性问题,因为这种模式毕竟是数据驱动的,在数据集上得出的结论往往会与现实世界有偏差,极高准确率下的检测结果往往是由于模型对于数据的过拟合造成的,这样的模型一旦投入生产反而会成为黑客组织攻击的对象。所以如何提高模型鲁棒性泛化性也是学术界一直在探讨的热点问题。
第二个问题是机器学习可解释性的问题。众所周知,很多机器学习模型是按照端到端的模式设计的,这样的模型对于使用者和维护者来说就是一个黑盒,人们无法理解模型到底是凭借什么做出的决策,又该朝着什么方向去优化,这使得机器学习往往在网络安全产品层面给人一种泡沫感。
第三个问题是概念漂移的问题。由于恶意软件是随着时间不断进化的,所以通过现有数据集训练好的机器学习模型可能在未来某个时候会不再适用,而重新训练模型往往伴随着巨大的成本。所以如何在低成本的条件下让模型持久使用也是一个亟待解决的问题。
5 小结
在大数据时代下,传统基于规则的恶意软件检测方法能力有限,将机器学习应用于恶意软件检测会在不依赖专家知识的条件下取得较好的效果。然而由于机器学习本身的一些问题目前并没有很系统的解决方案,所以现阶段这种模型也只是小规模地应用在工业界,绝大多数网络安全产品往往采用传统方法与机器学习方法相结合的模式。
因此,现阶段其实处在一个技术过渡与发展的时期,恶意软件检测是一个复杂而长期的问题,充满着机遇与挑战。
参考文献
[1] Gantz J F, Lee R, Florean A, et al. The link between pirated software and cybersecurity breaches. how malware in pirated software is costing the world billions[R]. IDC, Tech. Rep, 2014.
[2] Fakten & Analysen zur Bedrohungslage: der AV-TEST Sicherheitsreport 2019/2020
[3] Kephart J O, Sorkin G B, Arnold W C, et al. Biologically inspired defenses against computer viruses[C]//IJCAI (1). 1995: 985-996.
[4] Thomas R. Lief-library to instrument executable formats[J]. 2017.
[5] Raff E, Barker J, Sylvester J, et al. Malware detection by eating a whole exe[C]//Workshops at the Thirty-Second AAAI Conference on Artificial Intelligence. 2018.
[6] Cuckoo Sandbox
[7] Zhang Z, Qi P, Wang W. Dynamic malware analysis with feature engineering and feature learning[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2020, 34(01): 1210-1217.
[8] Yan J, Yan G, Jin D. Classifying malware represented as control flow graphs using deep graph convolutional neural network[C]//2019 49th annual IEEE/IFIP international conference on dependable systems and networks (DSN). IEEE, 2019: 52-63.
[9] Ling X, Wu L, Deng W, et al. MalGraph: Hierarchical Graph Neural Networks for Robust Windows Malware Detection[J].