申 培,刘福龙,桑海伟
(1.河钢数字技术股份有限公司, 石家庄 050035; 2.河钢集团有限公司,石家庄 050023;3.贵州师范学院 数学与大数据学院, 贵阳 550018)
恶意代码是指具有一定破坏性或者具有恶意企图的一组程序或指令集合[1-2]。最常见的病毒、蠕虫、木马等在广义上都属于恶意代码;而从狭义上来看,恶意代码单指后门程序或一系列软件指令等,设计者研究并发现系统或应用程序的漏洞,设计恶意代码并将其植入系统或者应用程序中,引诱用户执行。1983年,Fred Cohen编写了可以自我复制和传播的代码,被公认为第一个计算机病毒程序[3]。1986年,一对巴基斯坦兄弟开发了计算机病毒Brain,该病毒迅速传播,并成功破坏了成千上万的计算机系统。1993年,VBA(visual basic for applications)语言应用到微软 Office文档开发中,被认为是第一个基于文档攻击的恶意代码。1999年,Melissa Virus被普遍认为是第一种借助电子邮件发送的病毒。2004年,卡比尔病毒被公认为第一种手机病毒。2017年,Wanna Cry勒索病毒波及150个国家的30万名用户,造成损失高达80亿美元。近年来,恶意代码随着网络迅速发展也在不断演化,Cybersecurity Ventures 报告称,2021年包括恶意代码在内的网络犯罪造成大约6万亿美元的损失。第49次中国互联网络发展状况统计报告指出,截至2021年12月,我国网民规模达10.32亿,高达62.0%的网民表示过去半年在上网过程中未遭遇过网络安全问题。
由于恶意代码近年来呈现爆发式增长,研究人员对恶意代码展开了深入研究。只有充分掌握恶意代码的运行机理,才能更好地进行检测和防范。
目前,恶意代码攻击技术主要包括代码注入、缓冲区溢出、端口复用和协同攻击等技术。2021年,新华三收录的漏洞总数为20 203条,其中超危漏洞2 591条,高危漏洞8 451条,安全问题不容忽视。
代码注入技术是指将恶意代码植入到结构化的程序中,当该程序执行时,恶意代码同时会被加载并运行。代码注入攻击一般是用户输入缺乏安全验证机制和相应的过滤机制导致,发布的Web应用程序大都面临代码注入威胁,包含(XSS)和SQL注入等代码注入式攻击,严重威胁数据完整性和用户隐私等[4-6]。随着Android智能手机的迅速普及,Android系统受到代码注入的设备数量和软件数量呈现出爆发式增长,因此,移动恶意代码注入并攻击移动终端也是近年来研究的热点[7-8]。
缓冲区是指一段连续可读写的操作系统内存空间,当数据超出缓冲区的大小范围时便会引发缓冲区异常。恶意代码就是基于此原理,将更多的数据放入缓冲区,使其缓冲区发生异常,导致缓冲区溢出漏洞[9]。缓冲区溢出会导致程序崩溃,甚至有些恶意代码借此手段获得系统的控制权限,对系统进行任意操作,引发数据丢失、篡改或其他严重后果。通常,缓冲区溢出首先是攻击者注入攻击代码,紧接着引诱程序跳转到注入的攻击代码,最后执行该攻击代码[10-11]。该漏洞通常是由于系统对用户输入信息未做安全检测等原因引发。
端口复用是指在一个端口上建立了多个连接,使应用程序不能正常访问。其中最常见端口复用攻击方法,如木马程序就是基于此进行设计。木马程序首先拦截网络上应用程序的端口,然后借助其端口进行通信,使该端口下正常程序不能正常提供服务。木马设计者为了逃避恶意代码检测程序,一般会对通信内容进行加密[12-13],其中一种有效解决方式就是编写应用程序的时候独占端口。
协同攻击是近年来出现并不断演化的攻击技术。与传统攻击技术不同,分布式协同攻击因具有高效、健壮、隐蔽等特点,给检测和防御工作带来了挑战。协同攻击技术使用多线程等技术,一般恶意程序会启动多个进程,并攻击其他进程。在对其攻击行为的层次性和关联性的分析基础上,学者将协同攻击行为划分为基于时间和基于空间的2种行为,结合适当的攻击表达方法[14-18]。
恶意代码检测可作为一个代码的分类问题看待,算法的核心为检测代码与恶意代码之间是否具有相似性,进而判断是否为恶意代码。传统的恶意代码分析方法分为基于静态分析的恶意代码分析和基于动态分析的恶意代码分析方法,以及目前兴起的基于深度学习的检测分析方法。
恶意代码的静态分析针对生成的汇编文件或者二进制文件进行形式或者结构分析,是在非执行状态下信息进行分析与检测,主要从汇编或者二进制文件结构和其调用等程序流程来提取恶意代码的特征。
2.1.1特征码匹配技术
基于特征码进行恶意代码检测的基本原理是通过分析人员手动或其他自动化方法提取恶意代码的静态特征,并将其存入恶意代码特征数据库中,待检测代码提取的特征与特征数据库中特征进行匹配,进而通过相似性等来确定该代码是否属于恶意代码[19]。随着网络的发展,恶意代码的反检测技术也在不断改进,其中混淆以及加密技术等使得基于特征匹配检测方法的检测难度越来越大。文献[20-21]等利用汇编代码和马尔可夫模型手段等,改变了之前通过单一内容特征码进行检测,实现了多复合特征码。实验表明,基于复合特征可以大幅度提高检测的准确率,检测准确率可达99.9%。
2.1.2基于签名的恶意代码检测方法
基于签名的恶意代码检测与特征匹配检测方法有些类似,其原理也是基于模式匹配,不同的是基于签名的恶意代码检测与特征匹配提取静态特征不同,其主要提取恶意代码唯一的特征签名。该特征签名包括文件名和代码内容等属性,用来标识恶意代码。同样将提取的特征签名信息加入到恶意代码签名数据库中,待检测代码提取特征签名后与数据库中已有的特征签名进行匹配,进而判断是否属于恶意代码。但是特征签名的获取通常需要专家手工提取来获得,影响其推广使用。检测是与数据库中已知恶意代码的签名进行匹配来判断其是否属于恶意代码[22]。近年来,恶意代码通常利用伪造或者篡改数字签名等方式,使检测准确率极大降低。
2.1.3基于文件结构特征的检测技术
不同格式的文件具有不同的结构信息,基于文件结构特征可以在一定程度上判断文件是否被篡改。尤其是在文件上传时,恶意代码伪装成图片格式上传到服务器。为此,学者们提出基于文件的结构信息进行恶意代码检测。比如不同类型的图片具有特定格式信息,对结构信息进行分析可以在一定程度上判断目标文件是否为恶意代码。文献[23-24]基于此进行研究,提出了对可执行文件的结构进行分析,进而判断是否属于恶意代码。近年来,有学者提出使用卷积神经网络进行识别[25],该模型构建了9个特征进行恶意代码识别,可实时识别,准确率高达95.59%。
2.1.4基于控制流程图的静态检测技术
恶意代码在程序流程控制和函数调用中具有一定特征,基于此,Yamaguchi等[26]提出基于控制流程图进行特征提取,算法判断程序在代码运行中可能会运行的流程和执行的路径等,提取恶意代码程序执行流程特征,待检测代码与其特征进行匹配判断。文献[27-28]提出了基于语义跟踪和行为语义分析的检测方法。文献[29-30]提出基于控制流图特征和机器学习恶意代码检测方法,借助机器学习算法构建分类器,进行病毒检测,在DroidKungfu恶意代码数据集上进行验证,检测准确率超过90%。
静态检测方法的优点是检测速度快,但存在不同性质和特征的众多程序,特征提取只能提取部分特征和性质,易发生误报或者漏报[19]。
动态检测方法根据代码运行过程中的表现形式进行分析判断,其检测方法一般是将恶意代码放在特定的、安全的环境中运行,然后检测运行过程中发生的系统调用、产生的数据流量以及运行中对权限申请等情况,并记录运行过程中内存空间使用、网络流量变化情况以及其他物理特征等信息,得到恶意代码运行特征。
2.2.1基于行为的恶意代码检测技术
恶意代码行为是指在网络系统中具有恶意添加、篡改甚至删除等行为的代码。基于行为的恶意代码检测方法中最常见的是基于应用程序接口调用序列的分析。文献[33-34]提出了利用半监督聚类算法和DNA序列比对算法等检测方法。Kolosnjaji等[36]提出了利用深度学习方法实现恶意代码自动分类,该方法与SVM以及隐马尔可夫模型在检测准确度上都有一定提升。
2.2.2基于流量的恶意代码检测技术
基于流量载荷特征的检测技术的原理是解析数据分组的有效负载对进行恶意流量进行检测。根据解析结果提取恶意代码相应特征、构建特征规则库,待检测代码基于特征规则对数据分组中的载荷进行匹配[37]。Anderson等[38]提出了基于流量上下文和背景知识的TLS指纹构建方法和TrafficAV模型的流量检测方法,对网络系统和移动端恶意代码行为进行检测和分析。
2.2.3基于磁盘和内存的恶意代码检测技术
基于磁盘取证分析分析恶意代码运行过程中虚拟机中磁盘文件变化情况,进行对可疑行为的识别和标记。随着磁盘容量越来越大,以及近年来数据加密、数据隐藏等反取证技术的兴起,其检测难度越来越大[59]。基于内存的恶意代码检测针对各种内核对象进行分析,提取恶意代码引发的一系列异常行为。一些恶意程序会通过APIHOOK技术[54]和替换系统服务DKOM[55]以修改内存数据结构的方式隐藏自身,导致一般的取证工具难以发现其运行过程[56-57]。徐佳[40]提出了基于内存镜像分析的方法进行恶意代码,Chin-Wei等[41]和Aja等[58]提出了一种基于VMI和利用虚拟机的内存取证技术。
2.2.4基于物理的检测技术
一些恶意代码在运行时会申请更多的内存等资源,通过检测硬件信息使用情况可以发现异常信息。基于此,学者们提出了根据恶意代码在运行状态下硬件使用情况,判断恶意代码的运行特征。比如在无线传感网中节点通讯状况以及web系统中CPU频率的变化、发热量情况等硬件物理特征变化情况。杨光[44]和潘绯等[60]基于物理特征的认证对无线传感网中节点行为进行分析,识别其中的恶意节点。Bridges等[42]基于CPU耗电特征,提出一种无监督恶意代码检测方法。Sayadi等[43]利用机器学习方法,研究硬件特征与恶意代码之间的关系,对恶意代码进行实时检测。
动态分析技术基于程序执行中流程、行为、流量和物理等特征,对恶意代码的加密、混淆、多态等技术具有较好的抑制作用。但是面对不断变化的恶意代码,动态检测方法无法及时发现恶意代码。
机器学习算法不需要手动提取恶意代码特征,自动提取、挖掘恶意代码特征之间的关系,能够提取更多的深层次特征,因此对未知的恶意代码也可以实现自动化分析。恶意代码的检测可以理解为分类问题。其检测技术步骤如下:首先,对恶意代码样本进行分类,与正常的程序一起作为样本,进行模型训练;然后,对样本数据进行预处理,提取样本特征,设计机器学习算法模型;最后,基于训练的分类模型对未知样本进行恶意代码检测。近年来,学者们将机器学习应用到恶意代码检测领域,2011年,Nataraj[45]将恶意代码文件段转化为8位灰度图像,最后通过卷积神经网络CNN对灰度图像进行判别。2014年,Syed等[46]将恶意软件的行为信息可视化为彩色图,取得了更好的效果。2018年,Kan等[47]基于反汇编等方法,利用分类网络对恶意代码进行检测和分类。文献[48]提出了一种深度学习和动态方法相结合的检测方式,明显提升了准确率,但计算成本较高。Cui等[49]提出了一种基于深度学习方法的变种检测算法。Vu等[50]将恶意软件二进制文件转化为彩色图像,利用卷积变换网络实现恶意代码的自动识别。
与此同时,2006年开始针对机器学习模型测试数据的“投毒”到2014年对抗样本的提出,机器学习对恶意代码的发展也起到了推动作用。基于此对抗网络也在恶意代码检测中发挥了重要作用[51-53]。
综上所述,恶意代码检测大致分为动态检测和静态检测2种。采用机器学习或深度学习算法对数据进行进一步处理或者学习是未来重要的研究方向。
当前,恶意代码攻击趋于智能化。随着人工智能在诸多领域都取得了较好成效,恶意代码设计者也借助人工智能技术来提升恶意代码的反检测能力。传统的人工提取特征不能及时对复杂多变的恶意代码进行及时检测,人工分析难度越来越大,借助深度学习进行特征提取是未来重要研究方向之一。
恶意代码最早是基于二进制文件,近年来非二进制文件中出现的恶意代码越来越多。邮件等也是恶意可执行文件的载体,随着防护意识的提升,接收并执行带有恶意病毒的可执行程序的成功率越来越低。但针对Word文档和其他Office文件的攻击越来越频繁[61]。与二进制可执行文件不同,恶意文档具有涉及领域更广、影响范围更大、攻击手段更灵活多样等特点,因此对于非二进制恶意代码检测也是未来重要的研究领域。
不断发展的恶意代码攻击及其防范技术是“矛”与“盾”的关系。随着新型恶意代码和攻击方式的出现,单一的防范技术与手段在现实任务中将难以胜任。因此,多个技术路线和多个方法的高效融合式应用十分必要。在确定的硬软件环境与资源下,构建高效率与高精度的恶意代码检测能力是一个开放性问题。在具体任务中,传统方法与基于机器学习的方法相结合、2个或多个代码静态分析与动态分析方法联合的情况下,方法的具体融合方式、如何取得最优效率与性能平衡、如何在极低漏报率的前提下维持低误报率都是值得深入持续研究的问题。此外,恶意代码和攻击的分级及基于此的差异化防范也是值得研究的具有实际意义的问题。
阐述了恶意代码的发展现状,概括了恶意代码的代码注入、缓冲区溢出、端口复用和协同攻击技术,对机器学习的兴起对攻击技术的影响和发展做了阐述。恶意代码的静态检测方法效率比较高,但是随着恶意代码的不断发展,特征提取难度越来越大,容易发生误报;动态检测技术可以弥补静态检测适用范围小、无法有效识别恶意代码灵活构造等问题,但资源消耗大,检测效率低。随着机器学习的发展,基于机器学习方法构造恶意代码可使得传统的动静态检测方法失效,而基于机器学习的恶意代码检测方法也可以有效提升检测准确率。动静态结合以及融合机器学习方法进行检测是未来发展趋势。