移动恶意软件与反恶意软件的共同进化

本文介绍2018年 IEEE Trans. of Information Forensics and Security 期刊的一篇文章,题目是《Coevolution of Mobile Malware and Anti-Malware》,DOI信息在这里

在这篇论文中,作者使用遗传编程技术,分别构建了恶意软件与反恶意软件的进化模拟过程,其中恶意软件群体的目标是更加易于逃逸检测,反恶意软件群体的目标是达到更高的检测率。之后,作者将二者结合起来,提出恶意软件与反恶意软件的协同进化,以同时生成更多的逃逸攻击恶意软件和更加健壮的反恶意软件。文章思路新颖,论证严密,且经实验证实有较好的效果。

概览

移动恶意软件是当今计算机的严重威胁:新型恶意软件层出不穷,不断带来新的安全风险;现有的反恶意软件技术难以应对未知的风险;此外,随着反恶意软件程序的开发,恶意软件作者同样开始使用多种逃逸检测技术。因此,这篇文章研究了进化计算技术(evolutionary computation technique)的引用,这既是为了开发基于静态分析成功躲避反恶意软件系统的移动恶意软件新变种,也是为了针对它们自动开发更好的安全解决方案。协同进化的军备竞赛(arms race)机制一直被认为是一种潜在的候选方案,以用于开发一个更稳健的系统来对抗新的攻击和进行系统测试。据作者所知,本文是首次应用共同进化计算来解决这一问题。

简介

移动设备已经成为日常生活的重要组成部分,提供诸如读写邮件、上网、视频会议、语音识别等功能。但是,移动设备的流行与广泛使用也吸引了恶意软件作者开发移动恶意软件。为了保护移动设备免受这些威胁,研究人员和安全公司致力于开发有效和高效的反恶意软件系统。

目前的技术存在诸多优缺点。根据分析样本代码的方法,可以把常见的恶意软件检测技术分为两类:静态分析与动态分析。二者也可以结合为混合分析。由于动态分析在功耗方面受到很大的限制,在一些移动设备上可能负担不起,因此文献中提出的大多数方法都依赖于静态分析。然而,这些方法容易受到混淆技术和新型攻击的影响。因此,近年来,攻击者已经聚焦于发掘静态分析工具的漏洞。

虽然近两年新的 Android 移动恶意软件家族数量趋于减少,但新的 Android 移动恶意软件变种数量却有显著增长。反恶意软件如何有效地对抗已知攻击、已知攻击的变种和未知攻击,仍需进一步研究,并形成本研究的主要目标。本研究的次要目标是探索自动开发一种反恶意软件,它对已知的攻击及其变种都具有强大的鲁棒性。由此,文章作者使用协同进化计算技术(coevolutionary computation technique)解决这一问题。研究者认为,通过参考新型恶意软件,可以开发出更好的反恶意软件,因此本研究探讨了共同进化的军备竞赛机制的使用。本研究中的实验主要分为三组:

  • 移动恶意软件的进化
  • 移动反恶意软件的进化
  • 移动恶意软件与反恶意软件的协同进化

研究者通过遗传编程(genetic programming)创建新的恶意软件与已知恶意软件的变种,模拟恶意软件的进化,从而评估现有静态分析工具的性能。目的是自动生成新的恶意软件,以便也能自动加强现有的静态分析工具。由于大多数现有的静态工具在遇到新的未知恶意软件时都会更新它们的签名数据库,因此,将这一过程自动化将确保检测系统对攻击更加强大。

虽然这种方法只能自动生成新的未知攻击,但针对移动反恶意软件提出了一种基于进化的检测系统。在移动恶意软件与反恶意软件的共同进化中,通过自动改进现有的解决方案来扩展这一框架。恶意软件希望能够在达到其目的(如破坏移动设备或谋取经济利益)的同时,通过使用逃逸检测技术面不被检测到。由此产生的大量恶意软件变种使得安全公司提升其解决方案。这一循环恰好符合恶意软件与反恶意软件的协同进化军备竞赛机制。

已有文献为了演化出新的攻击和新的恶意软件,而使用了遗传编程。本研究的目的是利用GP对现有恶意软件的smali代码采用遗传运算,创建一个全自动系统。实验结果表明,GP可以产生能够避开现有反恶意软件系统的有效攻击,而这些系统被认为是最成功的移动安全解决方案之一。此外,与文献中提出的单一或双重应用混淆技术相比,GP表现出更好的性能。

本研究还基于 Android 应用的某些静态特征,如 API 调用和权限,开发了一套检测系统。据文章作者所知,目前文献还没有基于GP的移动恶意软件检测系统。结果显示,此系统对已知攻击产生了较高的检测率,且假阳性率较低。此外,为了使检测系统更加稳健,应用了协同进化计算技术,结果显示能够产生更多的逃逸攻击和稳健的解决方案,这一方法优于现有方案。

文章的主要贡献如下:

  • 提出了一个全自动的模型,它能从现有的恶意软件中生成具有逃逸攻击的移动恶意软件。
  • 基于 Android 应用的静态特征,提出了一种基于GP的恶意软件检测系统,该系统被证明对已知攻击非常有效。
  • 首次提出将协同进化计算技术应用于系统安全,以同时生成更多的逃逸攻击恶意软件和健壮的反恶意软件。

恶意软件的进化

下图展示了恶意软件进化的概念性纲要。其中主要部分是将 apk 文件(即 Android 的程序安装包文件)转化为源代码,本研究使用 Apktool 工具生成 smali 代码,因为它允许修改后重新生成 apk 文件。之后,作者开发了一个工具生成每个 smali 文件的调用图,每个调用图等同于一个树形结构:每个方法表示为一个节点,每个调用关系表示为一条边。在GP中,每个应用都是以个体为代表的,每个个体的树(即调用图)大小不一,因为每个 apk 文件的功能数量不一。

恶意软件进化结构示意图

遗传编程是一种受自然进化启发、基于种群的搜索算法。它从生成一个由个体组成的种群(通常是随机的)开始,这个种群作为目标问题的候选解。之后,对每个个体进行评估,并赋予其一个适合度值,以表明该候选个体解决或接近解决当前问题的程度。在满足终止标准之前,通过使用选择、交叉和突变,像自然进化中一样,反复生成新的种群。这些遗传运算用于在新种群中提供更好的解决方案。具体到本文的研究,每个个体代表GP中的一个 Android 应用,主要目的是通过对其应用遗传运算符,在每一代产生更多的逃逸攻击恶意软件。这些运算被应用到调用图中,然后从它们中重新创建 smali 和 apk 文件。

为了评估新生成的恶意软件,本研究采用了6个安装了不同反恶意软件系统的仿真器和一个基于机器学习的检测系统。反恶意软件系统是针对应用程序的静态属性进行工作的,而基于机器学习的检测系统则是通过在仿真器上运行 10 分钟的时间来提取应用程序的动态特征。

遗传运算

交叉:交换个体的子树

在交叉这一操作中,为保证生成的程序仍然是可运行的,需要保证交叉的两个子树互相兼容。只有具有相同声明、相同的返回类型和相同数量与类型的参数的方法才可以交换。但是,尽管有上述约束条件,在实验中仍发现了大量交叉后不能运行的程序,因此作者设置了较低的交叉率(0.1)。

当交叉应用于应用程序时,需要查看新生成的应用程序是否正常运行、是否暴露出恶意行为。文章开发了一个基于机器学习技术的动态分析工具,该工具使用 DroidBox 获取相关信息,每个程序运行 10 分钟以收集运行信息;使用 Monkey 生成随机输入。

突变:改变选择的个体,以使种群多样化

文章将 6 种逃逸攻击技术作为突变操作,随机改变个体的子树,增加群体的多样性。作者设置了较高的突变率(0.9)。这 6 种技术是:

  • 重命名本地标识符
  • 插入无关代码
  • 数据加密
  • 双重代码重新排序
  • 三重代码重新排序
  • 寄存器重分配

作者没有解释代码重新排序与寄存器重分配的方法与含义,需要进一步学习。

适应度函数

适应度函数定义了个体是否解决问题,或与解决问题的接近程度,因此定义一个合适的适应度函数对GP问题很重要。适应度的分配规则如下:首先进行评估,以确定进化的恶意软件是否可以运行,并是否被基于机器学习的检测系统发现恶意行为。如果答案为否,则将最差的适应度分配给个体。然后,适应度函数使用 6 个反恶意软件系统的输出,根据它们在 AV-TEST 中给出的保护分数( protection score ,由第三方评测机构给出衡量反恶意软件效果的分数)作为选择依据。每个反恶意软件在不同的模拟器上(文章使用的是 GenyMotion )运行,以模拟演化的恶意软件的执行和反恶意软件对它们的反应。每个个体在模拟器上运行 1 分钟,以产生结果。这个时间是通过实验确定的:反恶意软件系统一般在 1 分钟内返回结果,但对大型应用程序的分析可能需要更长时间。如果不能从反恶意软件系统中获得某个个体的输出,那么在该代个体的适应度函数中就不考虑具体的反恶意软件。适应度函数可以表达如下:

$$
Fitness\ Value = \frac{ # \ of\ anti,-malware\ systems\ detecting\ the\ malware}{total\ #\ of\ anti,-malware\ systems}
$$

适应度取值在 0 到 1.0 之间, 0 是最佳适配度,相当于进化后的恶意软件已经欺骗了所有的反恶意软件。当适应度为 1.0 时,意味着该恶意软件或者被所有解决方案检测到,或者无法运行或没有表现出恶意。

数据集

本文使用的恶意软件数据集是 MalGenome 是研究人员使用的第一个移动恶意软件数据集。大多数文献都使用这个数据集来比较其与其他工作的结果。

反恶意软件的进化

下图展示了反恶意软件进化的简单流程。首先,对从 MalGenome 项目和 Google Play 中收集到的应用进行逆向工程。然后,对它们进行分析,并注意恶意应用程序的区别特征。最后,利用遗传编程演化出基于这些特征的恶意软件检测系统。

反恶意软件进化流程图

特征

首先,提取每个应用程序的 API 调用与权限,因为这些是静态分析中检测移动恶意软件最常用的特征。确定每个 API 调用的恶意和良性应用数量的差异,并按降序排序,选出前 100 个 API 调用作为特征用于训练。与 API 调用的分析方法类似,最具辨识度的 40 个权限以同样的方法被选出。除上述 140 个特征外, 6 个静态特征也在训练中使用,因为最近的一项研究表明,追加这些结构性属性,比单纯基于 API 调用的特征更能检测出新的恶意软件:

  • 用于在运行时加载代码的 DexClassLoader 的 API 调用数量
  • 用于加密代码的 Crypto 的 API 调用数量
  • App中的类数量
  • App中 goto 语句数量
  • App中的方法数量
  • App中的权限数量

GP中的每一个个体,代表一个反恶意软件的解决方案。它由一棵树表示,由上面定义的所有 146 个特征作为终结节点(叶子节点),一些运算符作为非终结节点(非叶子节点)。GP中常常使用树表示程序流程,每个子树的根节点表示一种运算或者一个判断语句。例如,下图表示的程序逻辑可以描述为

$$
if(\frac{(F45 * F5) - F74 }{F2} * F25) \leq (\frac{\frac{F59}{F43}-(F57 || F142)}{F1} * (F71&&F34))
$$

遗传编程树形表达示意图

适应度函数

适应度函数基于真阳性率与假阳性率计算出:

$$
Fitness\ Value = True\ Positive\ Rate - k * False\ Positive\ Rate
$$

其中 $k$ 值被人为设定为 4 ,以减少假阳性率,从而更好地将恶意样本识别出。

数据集

与恶意软件进化相同,这里同样使用 MalGenome 数据集。不同的是,反恶意软件进化中,对样本较少的恶意软件家族进行了剔除。主要原因是为了确保每个家族中有足够数量的恶意软件用于训练和测试。对于良性应用,来源是从 Google Play 下载的较受欢迎的应用。这些应用的关键特征是它们已经被下载了至少 500 万次,因此假设它们是良性的。训练中共采用了 500 个应用程序( 250 个恶意, 250 个良性)。

移动恶意软件与反恶意软件的协同进化

共同进化是在多个物种之间相互影响,进化出更好的个体。当这一理念应用于计算机科学时,共同进化是针对那些旨在同时改善多个系统的问题而使用的。对于安全领域,大多数共同进化问题都是竞争性问题,即所谓的军备竞赛(arms race)。在竞争性问题中,资源是有限的,物种之间为了使用更多的资源而相互竞争。当一个物种的适应度增加时,其竞争对手的适应度就会减少,反之亦然。在本研究的实验中,恶意软件与反恶意软件构成竞争。恶意软件试图通过逃逸攻击来对抗反恶意软件,从而生存下来;而反恶意软件则旨在检测已知与新型恶意软件家族或变种。

共同进化的结构如下图所示。共同进化的框架基于恶意软件和反恶意软件的进化,如前文第三和第四节所述。在这个模型中使用了两个子群,第一个子群由恶意软件和反恶意软件组成,它们分别用于恶意软件和反恶意软件的进化。适应度的计算方式存在差异,这里使用了两个适应度函数;一个用于恶意软件进化,另一个用于反恶意软件进化。每个群体被用作评估另一个群体的适应度的输入。因此,在每一代的数据集上动态地进行共同进化。

恶意软件与反恶意软件共同进化的结构图

共同进化计算算法将重复执行,直到获得最佳个体或达到规定的世代数。

恶意软件进化的适应度函数

在协同进化中,除了前文所述的商用反恶意软件系统与基于机器学习的检测系统的输出外,还将每一代反恶意软件演化的输出作为恶意软件演化的输入。因此,可以针对更强大的反恶意软件系统演化出更多逃逸攻击的恶意软件。然而,不能保证在早期世代进化的反恶意软件能够成功地检测恶意软件,这可能会导致对恶意软件群体的负面影响。因此,对反恶意软件子群中个体的适配值应用了一个阈值(文章设置为75%)。如果反恶意软件子群中的个体能有效地检测到恶意软件,那么它就会被包含在恶意软件进化的适应度函数中。

反恶意软件进化的适应度函数

通过使用第四节中给出的相同的恶意与良性软件数据集,来评估反恶意软件子群中个体的适应度。此外,数据集还加入了协同进化恶意软件子群中的个体,以便针对新型恶意软件演化出更健壮的反恶意软件系统。