摘要:
恶意应用程序对安卓平台的安全性构成威胁。这些应用程序的数量和多样性不断增加,使传统的防御措施基本失效,因此安卓智能手机常常无法免受新型恶意软件的攻击。在本文中,我们提出了一种用于检测安卓恶意软件的轻量级方法--DREBIN,它可以直接在智能手机上识别恶意应用程序。由于资源有限,无法在运行时监控应用程序,因此 DREBIN 会执行广泛的静态分析,尽可能多地收集应用程序的特征。这些特征被嵌入到一个联合向量空间中,从而可以自动识别出表明恶意软件的典型模式,并用于解释我们方法的决策。在对 123,453 个应用程序和 5,560 个恶意软件样本进行的评估中,DREBIN 的表现优于几种相关方法,它能检测到 94% 的恶意软件,且误报率极低,每次检测所提供的解释都揭示了所检测恶意软件的相关属性。在五款流行的智能手机上,该方法的平均分析时间为 10 秒,因此适合直接在设备上检查下载的应用程序。
1.引言
安卓是如今最受欢迎的智能手机平台之一。在不同市场上有数十万款应用程序,为用户提供丰富的功能。不幸的是,运行安卓的智能手机越来越受到攻击者的目标,并且受到恶意软件的感染。与其他平台不同,安卓允许从未经验证的来源(如第三方市场)安装应用程序,这使得攻击者很容易将带有恶意软件的应用程序捆绑和分发。根据最近的一项研究,仅在2012年就发现了超过55,000个恶意应用程序和119个新的恶意软件系列。显然,需要阻止安卓市场和智能手机上恶意软件的扩散。
安卓平台提供了几项安全措施,增强了恶意软件的安装,最主要的是安卓权限系统。为了在设备上执行某些任务,如发送短信,每个应用程序都必须在安装过程中向用户明确请求权限。然而,许多用户倾向于盲目地向未知应用程序授予权限,从而破坏了权限系统的目的。因此,在实践中,恶意应用程序很难受到安卓权限系统的限制。
因此,在应用程序安装之前,已经有大量研究致力于研究分析和检测安卓恶意软件的方法。这些方法大致可分为使用静态和动态分析的方法。例如,TaintDroid、DroidRanger和DroidScope是可以在运行时监视应用程序行为的方法。虽然在识别恶意活动方面非常有效,但运行时监视会带来重大开销,并且不能直接应用于移动设备。相比之下,静态分析方法,如Kirin、Stowaway和RiskRanker,通常只会产生较小的运行时开销。虽然这些方法高效且可扩展,但主要建立在手工制作的检测模式之上,这些模式通常不适用于新的恶意软件实例。此外,大多数这些方法不提供对其决策的解释,因此对从业者而言是不透明的。
在本文中,我们介绍了一种用于检测安卓恶意软件的轻量级方法 DREBIN,它能自动推断检测模式(什么意思),并能直接在智能手机上识别恶意软件。DREBIN 可执行广泛的静态分析,从应用程序的代码和清单中收集尽可能多的特征。这些特征以字符串集(如权限、API 调用和网络地址)的形式组织起来,并嵌入联合矢量空间。例如,发送高级短信的应用程序会被投射到向量空间中与相应权限、意图和 API 调用相关联的特定区域。这种几何表示法使 DREBIN 能够利用机器学习技术自动识别表明恶意软件的特征组合和模式。对于每个检测到的应用程序,都可以提取相应的模式,映射成有意义的描述,然后提供给用户作为检测的解释。因此,除检测外,DREBIN 还能对已识别的恶意软件样本进行深入分析。
对来自不同市场的 123,453 个应用程序和 5,560 个最新恶意软件样本的实验证明了我们方法的有效性: DREBIN 的性能优于相关方法 [13, 26, 33],也优于 10 种流行反病毒扫描软件中的 9 种。该方法能检测到 94% 的恶意软件样本,误报率仅为 1%,相当于 100 个已安装的应用程序中才有一个误报。在普通电脑上分析一个应用程序平均不超过 1 秒钟,在流行的智能手机上分析一个应用程序平均不超过 10 秒钟。据我们所知,DREBIN 是第一种直接在智能手机设备上对安卓恶意软件进行有效且可解释的检测的方法。
总之,我们在本文中对 Android 恶意软件的检测做出了以下贡献:
- 有效检测。我们介绍了一种结合静态分析和机器学习的方法,该方法能够识别安卓恶意软件,且准确率高、误报率低,不受人工制作的检测模式的影响。
- 可解释的结果。所提出的方法可提供可解释的检测结果。检测到的恶意软件实例的特征模式可以从向量空间中追溯回来,并为检测过程提供启示。
- 轻量级分析。为了提高效率,我们采用了线性分析和学习技术,能够在合理的时间内检测智能手机上的恶意软件并分析大量应用程序集。
在此我们需要指出的是,DREBIN 建立在静态分析的概念之上,因此无法排除移动设备上存在混淆或动态加载的恶意软件。我们将在第 4 节中具体讨论我们方法的这一局限性。不过,正如我们的评估所表明的那样,由于对特征进行了广泛的分析,我们的方法提高了攻击者利用恶意应用程序感染智能手机的门槛,并加强了安卓平台的安全性。
本文接下来的内容安排如下: 第 2 节介绍了 DREBIN 及其检测方法。第 3 节介绍实验情况以及与相关方法的比较。第 4 节和第 5 节分别讨论了局限性和相关工作。第 6 节为本文的结论。
2 方法论
为了检测智能手机上的恶意软件,DREBIN 需要对应用程序进行全面而轻量级的表示,以便确定恶意活动的典型迹象。为此,我们的方法使用了广泛的静态分析,从不同来源提取特征集,并在可表达的向量空间中进行分析。图 1 展示了这一过程,下文将对其进行概述:
a) 广泛的静态分析。第一步,DREBIN 会静态检查给定的 Android 应用程序,并从应用程序的清单和 dex 代码中提取不同的功能集(第 2.1 节)。
b) 嵌入向量空间。然后将提取的特征集映射到联合矢量空间,在这里可以对特征的模式和组合进行几何分析(第 2.2 节)。
c) 基于学习的检测。特征集的嵌入使我们能够使用高效的机器学习技术来识别恶意软件,如线性支持向量机(第 2.3 节)。
d) 解释。在最后一步中,将识别出有助于检测恶意程序的特征,并向用户展示,以解释检测过程(第 2.4 节)。
在下面的章节中,我们将更详细地讨论这四个步骤,并提供必要的分析技术背景。
2.1 应用程序的静态分析
作为第一步,DREBIN 对给定的 Android 应用程序进行轻量级静态分析。虽然看起来简单明了,但静态特征提取需要在受限环境中运行并及时完成。如果分析耗时过长,用户可能会跳过正在进行的过程,并拒绝接受整个方法。因此,必须选择可以高效提取的特征。
因此,我们将重点放在应用程序的清单和拆解后的 dex 代码上,这两者都可以通过对应用程序内容的线性扫描获得。为了进行通用和可扩展的分析,我们将所有提取的特征表示为字符串集,如权限、意图和 API 调用。具体来说,我们提取了以下 8 组字符串。
2.1.1 清单中的特征集
为 Android 开发的每个应用程序都必须包含一个名为 AndroidManifest.xml 的清单文件,该文件提供了支持应用程序安装和后续执行的数据。使用 Android Asset Packaging Tool(Android 资产打包工具)可在设备上有效检索该文件中存储的信息,并提取以下功能集:
S1 硬件组件: 第一个特征集包含所需的硬件组件。如果应用程序请求访问智能手机的摄像头、触摸屏或 GPS 模块,则需要在清单文件中声明这些功能。请求访问特定硬件显然会产生安全影响,因为使用某些硬件组合往往会反映出有害行为。例如,可以访问 GPS 和网络模块的应用程序可以收集位置数据并通过网络发送给攻击者。(申请硬件组件不算是权限吗)
S2 请求权限: 权限系统是 Android 引入的最重要的安全机制之一。权限由用户在安装时主动授予,允许应用程序访问与安全相关的资源。正如之前的研究[13, 33]所示,恶意软件往往比无害应用更频繁地请求某些权限。例如,目前很大一部分恶意软件都会发送高级短信,因此会请求发送短信权限。因此,我们将清单中列出的所有权限集合到一个特征集中。
S3 应用程序组件: 应用程序中有四种不同类型的组件,每种组件都定义了不同的系统接口:活动、服务、内容提供者和广播接收器。每个应用程序都可以在清单中声明每种类型的多个组件。这些组件的名称也会被收集到特征集中,因为这些名称可能有助于识别恶意软件中的知名组件。例如,所谓的 DroidKungFu 系列的几个变种共享特定服务的名称[见 24]。
S4 过滤意图: 安卓系统上的进程间和进程内通信主要是通过意图来完成的:意图是作为异步消息交换的被动数据结构,允许不同组件和应用程序之间共享事件信息。我们收集清单中列出的所有意图作为另一个特征集,因为恶意软件通常会监听特定的意图。恶意软件涉及的意图信息的一个典型例子是 BOOT_COMPLETED,它用于在重启智能手机后直接触发恶意活动。
2.1.2 从反汇编代码中获取特征集
Android 应用程序是用 Java 开发的,并编译成经过优化的 Dalvik 虚拟机字节码。这种字节码可以被高效反汇编,并为 DREBIN 提供应用程序中使用的 API 调用和数据信息。为了缩短运行时间,我们基于安卓平台的 dex 库实现了一个轻量级反汇编器,它可以输出应用程序中包含的所有 API 调用和字符串。我们利用这些信息构建了以下特征集。
S5 受限 API 调用: 安卓权限系统限制对一系列关键 API 调用的访问。我们的方法会在反汇编代码中搜索这些调用,以便深入了解应用程序的功能。一个能揭示恶意行为的特殊情况是,使用受限 API 调用时未请求所需的权限。这可能表明恶意软件正在使用 root 漏洞,以超越 Android 平台施加的限制。
S6 已用权限: 在 S5 中提取的整套调用信息将作为确定请求并实际使用的权限子集的基础。为此,我们采用了 Felt 等人[15]提出的方法来匹配 API 调用和权限。与 S5 不同的是,由于多个 API 调用可受单个权限的保护(例如,sendMultipartTextMessage() 和 sendTextMessage() 都要求向应用程序授予 SEND SMS 权限),因此该功能集可为应用程序的行为提供更全面的视图。
S7 可疑 API 调用: 某些 API 调用允许访问智能手机的敏感数据或资源,经常在恶意软件样本中发现。由于这些调用可能特别导致恶意行为,因此我们将提取这些调用并将其收集到一个单独的特征集中。我们特别收集了以下类型的 API 调用:
- 访问敏感数据的 API 调用,如 getDeviceId() 和 getSubscriberId()
- 用于网络通信的 API 调用,如 setWifiEnabled() 和 execHttpRequest()
- 发送和接收短信的 API 调用,如 sendTextMessage()
- 执行外部命令的 API 调用,如 Runtime.exec()
- 常用于混淆的 API 调用,如 Cipher.getInstance()
S8 网络地址: 恶意软件会定期建立网络连接,以检索命令或外泄从设备收集的数据。因此,在反汇编代码中发现的所有 IP 地址、主机名和 URL 都包含在最后一组特征中。其中一些地址可能涉及僵尸网络,因此会出现在多个恶意软件样本中,这有助于改进检测模式的学习。
2.2 向量空间中的嵌入
恶意活动通常反映在所提取特征的特定模式和组合中。例如,发送溢价短信的恶意软件可能在集合 S2 中包含 SEND SMS 权限,在集合 S1 中包含硬件组件 android.hardware.telephony。理想情况下,我们希望制定布尔表达式来捕捉这些特征之间的依赖关系,并在检测到恶意软件时返回 "true"。然而,从真实世界的数据中推断布尔表达式是一个很难的问题,也很难有效解决。
作为补救措施,我们希望利用机器学习概念来捕捉特征之间的依赖关系。由于大多数学习方法都是在数值向量上运行的,因此我们首先需要将提取的特征集映射到一个向量空间。为此,我们定义了一个联合集 S,其中包含 8 个特征集中的所有可观测字符串
我们通过为每个特征集的所有字符串添加一个唯一的前缀,确保不同特征集的元素不会发生碰撞。在我们的评估中,特征集 S 包含了大约 545,000 个不同的特征(也就是说这8种特征共有54000种)(见第 3 节)。
利用 S 集,我们定义了一个 |S| 维向量空间,其中每个维度都是 0 或 1。通过构建一个向量 φ(x),可以将应用程序 x 映射到这个空间,这样,对于从 x 中提取的每个特征 s,相应的维度都设为 1,而所有其他维度都为 0。 从形式上看,对于一组应用程序 X,这个映射 φ 可以定义如下
其中,指标函数 I(x,s)简单定义为
在这一表征中,具有相似特征的应用彼此靠近,而主要具有不同特征的应用则相距甚远。此外,该空间中的方向可用于描述特征组合,最终使我们能够学习可解释的检测模型。
举例来说,一个恶意应用程序会发送高级短信,因此需要请求某些权限和硬件组件。该应用程序的相应向量 φ(x) 是这样的
乍一看,映射φ 似乎不适合对应用程序进行轻量级分析,因为它将数据嵌入了一个高维向量空间。幸运的是,从应用程序中提取的特征数量与其大小呈线性关系。也就是说,包含 m 字节代码和数据的应用程序 x 最多包含 m 个特征字符串。因此,无论向量空间的维度如何,向量 φ(x) 中只有 m 个维度是非零的。因此,只需存储从应用程序中提取的特征,即可稀疏表示向量 φ(x),例如使用哈希表 [6] 或 Bloom 过滤器 [3]。
2.3 基于学习的检测
第三步,我们应用机器学习技术自动学习如何区分恶意和良性应用程序。机器学习的应用使我们无需为提取的特征手动构建检测规则。
虽然有多种学习方法可用于学习两个类别之间的分离,但只有少数方法能够生成高效且可解释的检测模型。我们考虑用线性支持向量机 (SVM) [8, 14] 来完成这项任务。给定两个类别的向量作为训练数据,线性 SVM 会确定一个超平面,该超平面能以最大边际将两个类别分开(见图 2)。其中一类与恶意软件相关,而另一类则与良性应用相对应。未知应用程序的分类方法是将其映射到向量空间,并确定它是属于超平面的恶意(+)侧还是良性(-)侧。
图 2. SVM 的示意图
从形式上看,线性 SVM 的检测模型简单地对应于指定超平面方向的向量w∈ ,其中相应的检测函数 f 由以下公式给出
并返回φ ( x )关于w的方向。也就是说,对于给定的阈值t,f ( x ) > t表示恶意应用,而f ( x )≤t对应于良性应用。
为了有效地计算函数f,我们再次利用映射φ的稀疏表示。给定一个应用x,我们知道只有从x中提取的特征在φ ( x )中有非零元。其它所有维数都为零,不参与f ( x )的计算.因此,我们可以将检测函数f简化为如下形式
我们最终得出了一个简单的总和,而不是一个复杂的学习模型,只需将应用程序 x 中每个特征 s 的权重 ws 相加,就能高效地计算出总和。这种表述方式使我们能够在智能手机上应用学习到的检测模型,也使我们能够解释支持向量机获得的结果。
离线学习
在我们的实施过程中,我们不在智能手机上学习检测模型。相反,我们在专用系统上离线训练支持向量机,只将学习到的模型 w 转移到智能手机上,用于检测恶意应用程序。
2.4 解释
实际上,检测系统不仅要指出恶意活动,还要对检测结果做出解释。基于学习的方法通常有一个缺点,即它们是黑箱方法[34]。在 DREBIN 的案例中,我们解决了这个问题,并扩展了基于学习的检测,使其能够识别有助于检测的应用程序特征。此外,可解释的检测还能帮助研究人员检查恶意软件的模式,更深入地了解其功能。
凭借线性 SVM 的简单检测功能,我们能够确定每个单一特征 s 对函数 f (x) 的贡献。在计算 f (x) 的过程中,我们只需存储最大的 k 个权重 ,将应用转移到超平面的恶意侧。由于每个权重
都分配给了某个特征 s,因此就可以解释为什么某个应用程序被归类为恶意或非恶意。在计算函数 f (x) 的过程中,将最大的 k 个权重
保存在一个堆中,可以有效地实现这种方法 [6]。
在根据权重提取出前 k 个特征后,DREBIN 会自动构建句子来描述这些特征的基本功能。为了实现这一目标,我们为每个特征集设计了句子模板,这些模板可以使用相应的特征来完成。表 1 列出了这些模板。对于恶意软件中经常出现的特征,如发送短信权限,我们提供了单独的描述。
表 1. 解释模板。
对于大多数特征集来说,根据表 1 中的模板造句都很简单。例如,对于硬件特征,我们利用其命名方案来构建有意义的句子。例如,如果一个应用程序使用了 android.hardware.camera 功能,DREBIN 就会向用户呈现 "应用程序使用了硬件功能相机 "的句子。
同样,我们也会对请求的权限和使用的权限进行解释。对权限的解释可以从安卓文档中获得,其中至少对所有系统权限提供了适当的描述。我们对这些说明稍作修改,以便向用户提供有意义的解释。不过,由于应用程序开发人员可以定义自定义权限,因此我们也提供了一个通用句子,在没有适当说明的情况下,该句子也会呈现给用户。对于基于特定权限使用的受限 API 调用,我们也采用了同样的方法。对于所有其他功能集,模板会直接填入功能名称或相应的占位符。
图3. 结果为GoldDream家族的一员
图 3 是 DREBIN 生成的解释示例。所示样本属于 GoldDream 系列。DREBIN 正确识别出该恶意软件与外部服务器通信并发送短信。该程序在安装过程中请求了 16 项权限。许多用户会忽略这些长长的权限列表,从而成为此类恶意软件的受害者。与传统的基于权限的方法不同,DREBIN 直接将用户的注意力吸引到显示恶意活动的相关方面。此外,DREBIN 还会给用户打分,告诉他做出决定的可信度。因此,用户能够决定所显示的功能是否符合他的期望。
除了对用户有益之外,生成的解释还能帮助研究人员发现常见恶意软件家族的相关模式。我们将在下一节详细讨论这方面的内容。
3 评估
在详细介绍了 DREBIN 之后,我们现在开始对其功效进行实证评估。具体而言,我们进行了以下三个实验:
1. 检测性能。首先,我们在一个包含 5,560 个恶意软件样本和 123,453 个良性应用程序的数据集上评估了 DREBIN 的检测性能。我们将其性能与相关方法和反病毒扫描程序进行了比较(第 3.2 节)。
2. 可解释性。在第二个实验中,我们详细分析了 DREBIN 针对不同恶意软件系列提供的解释,并验证这些解释是否与恶意软件的实际特征相关(第 3.3 节)。
3. 运行时性能。最后,我们对 DREBIN 的运行性能进行评估。为此,我们使用五种常见的智能手机型号和普通台式电脑进行了不同的运行时间测量(第 3.4 节)。
3.1 数据集
在所有实验中,我们都考虑了真实 Android 应用程序和真实恶意软件的数据集。特别是,我们获得了一个包含 131,611 个应用程序的初始数据集,其中既有良性软件,也有恶意软件。样本收集时间为 2010 年 8 月至 2012 年 10 月。具体而言,该数据集包含来自 GooglePlay 商店的 96,150 个应用程序、来自中国其他市场的 19,545 个应用程序、来自俄罗斯其他市场的 2,810 个应用程序以及来自其他来源(如 Android 网站、恶意软件论坛和安全博客)的 13,106 个样本。此外,数据集还包括安卓恶意软件基因组项目[39]中的所有样本。
为了确定恶意应用程序和良性应用程序,我们将每个样本发送到 VirusTotal 服务,并检查十种常见反病毒扫描程序(AntiVir、AVG、BitDefender、ClamAV、ESET、F-Secure、Kaspersky、McAfee、Panda、Sophos)的输出结果。我们会将至少两个扫描程序检测到的所有应用程序标记为恶意程序。这一程序可确保我们的数据(几乎)正确地分为良性样本和恶意样本--即使十款扫描程序中有一款错误地将良性应用程序标记为恶意程序。
最后,我们从数据集中删除了被标记为广告软件的样本,因为这类软件处于恶意软件和良性功能之间的边缘地带。最终数据集包含 123,453 个良性应用程序和 5,560 个恶意软件样本。据我们所知,这是用于评估安卓恶意软件检测方法的最大恶意软件数据集之一。
表 4(c) 提供了数据集中前 20 个恶意软件系列的概况,其中包括目前在应用市场上活跃传播的几个系列。请注意,表中仅列出了前 20 个恶意软件系列,我们的数据集中还包含 1,048 个恶意样本。
3.2 检测性能
在第一个实验中,我们评估了 DREBIN 和相关静态检测方法的检测性能。在该实验中,我们将数据集随机分为已知分区(66%)和未知分区(33%)。DREBIN 的检测模型和相关参数是在已知分区上确定的,而未知分区仅用于测量最终的检测性能。我们重复这一过程 10 次,并得出平均结果。这种分区可确保报告的结果仅涉及 DREBIN 学习阶段未知的恶意应用程序。对于Kirin[13]和 RCP [33]等相关方法,实验过程略有不同,因为并非所有方法都需要单独的训练步骤。
3.2.1 与相关方法的比较
我们首先将 DREBIN 的性能与检测安卓恶意软件的相关静态方法进行比较。我们特别考虑了 Kirin [13]、RCP [33] 和 Peng 等人的方法[26],其中我们使用 SVM 而不是 Naive Bayes 分类器实现了后者。实验结果如图 4(a)所示,即不同检测方法阈值下的检测率(真阳性率)与假阳性率的 ROC 曲线。
DREBIN 的表现明显优于其他方法,在 1%的误报率(相当于安装 100 个应用程序时出现一次误报)下,检测到 94% 的恶意软件样本。而其他方法的误报率在 10%-50% 之间。由于kirin和 RCP 都只考虑了请求权限的一个子集,因此它们在检测恶意应用程序方面有明显的局限性。在本实验中,即使是考虑了所有权限的 Peng 等人的方法,也无法足够准确地检测出恶意软件。DREBIN 的良好性能源于用于模拟恶意活动的不同特征集。这些特征集不仅包括请求的权限,还包括应用程序的其他相关特征,如可疑的 API 调用、过滤意图和网络地址。
3.2.2 与反病毒扫描仪的比较
尽管 DREBIN 与相关方法相比表现出更好的性能,但在实际应用中,它终究要与常见的反病毒产品竞争。因此,我们也将其与数据集上的十种选定反病毒扫描程序进行了比较。每种扫描程序的检测性能都来自 VirusTotal 服务。我们进行了两次实验,首先考虑我们数据集中的所有恶意软件样本,然后只考虑由 Malgenome 项目[39]提供的样本。我们将 DREBIN 的误报率设定为 1%,我们认为这个误报率对于实际操作来说已经足够低了。
实验结果如表 2 所示。反病毒扫描仪的检测率差异很大。最好的扫描程序能检测到 90% 以上的恶意软件,但有些扫描程序发现的恶意样本不到 10%,这可能是由于它们不是专门检测安卓恶意软件的。在完整的数据集上,DREBIN提供了93.9 %的检测率,优于10个扫描仪中的9个。这一观察结果非常引人注目,因为根据我们的测试设置,每个恶意软件样本至少要有两个扫描程序才能检测到。因此,每个样本都必须有一定的已知时间,而且大多数反病毒扫描仪都应配备相应的特征码。然而,事实证明,DREBIN 自动生成的检测模型比许多扫描程序手动制作的签名更有效。在 Malgenome 数据集上,反病毒扫描程序的检测率更高,因为这些样本公开的时间更长。因此,几乎所有反病毒扫描程序都能为该数据集提供适当的签名。
在我们的良性应用程序数据集上,反病毒扫描仪的误报率在 0% 到 0.3% 之间,因此略低于 DREBIN 的性能。尽管可用的安卓应用程序数量庞大,但普通用户只会在设备上安装几十个应用程序。例如,根据市场调研公司尼尔森1 的数据,2011 年美国每部智能手机平均安装 32 个应用程序,2012 年为 41 个。因此,我们认为在实际操作 DREBIN 时,1% 的误报率还是可以接受的。
3.2.3 恶意软件家族的检测
测试方法的检测性能时应考虑的另一个重要方面是数据集中恶意软件家族的平衡[32]。如果某些恶意软件系列的样本数量远远多于其他恶意软件系列,那么检测结果主要取决于这些恶意软件系列。为了解决这个问题,我们可以对每个系列使用相同数量的样本。然而,这将导致分布与实际情况大相径庭。因此,我们分别评估了 20 个最大恶意软件家族的检测性能。每个系列的名称和样本数量见表 4(c),DREBIN 对每个系列的检测性能见图 4(b)。
DREBIN 能够可靠地检测出所有家族,平均准确率为 93%,假阳性率为 1%。特别是,所有系列的检测率都超过了 90%,其中有三个系列可以完美识别(H、O、P)。只有一个恶意软件系列无法被 DREBIN 可靠地检测到。这个系列就是 Gappusin (R),我们将在下一节研究它的低性能。需要指出的是,只要样本数量足够多,并允许 SVM 泛化其特征,恶意软件系列的大小与其检测率之间似乎并不存在依赖关系。
3.2.4 检测未知恶意软件系列
DREBIN 使用已知恶意软件来学习其检测模型。为了研究这个问题,我们进行了两个额外的实验,限制了训练集中特定恶意软件家族的样本数量。在第一个实验中,我们不提供任何样本,这相当于完全未知的恶意软件菌株。在第二个实验中,我们将随机选择的 10 个族样本放回训练集中,从而模拟一个新族的起始传播。
图5。未知家族的检测。
两次实验的结果如图 5 所示,图中显示了每个族在训练集中 0 个和 10 个可用样本时的检测率。如果没有可供学习的样本,DREBIN 就很难检测到一个系列,因为 SVM 无法发现任何判别模式。不过,只需要很少的样本就能概括大多数恶意软件家族的行为。只需在训练集中添加 10 个样本,平均检测性能就能提高 25% 以上。在这种情况下,甚至可以完美地检测出三个系列。其原因在于,某个家族的成员往往只是经过轻微修改的重新包装的应用程序。由于 SVM 的泛化功能,即使只知道很小的样本集,也能检测到一个系列的变化。
总之,DREBIN 能有效检测安卓恶意软件,其性能优于相关检测方法和几种反病毒扫描程序。虽然 DREBIN 无法从一开始就发现未知的恶意软件,但每个系列只需要少量样本就能实现可靠的检测。
3.3 解释
除了检测性能外,DREBIN 的优势还在于其解释所获结果的能力。这使我们能够检查所提取的有助于检测的特征是否符合常见的恶意软件特征。在本节中,我们首先考察了四种流行的恶意软件系列,并分析了高权重特征是如何对其行为得出结论的。然后,我们将详细检查 DREBIN 的误报和漏报情况。
3.3.1 对恶意软件家族的解释
表3 . FakeInstaller、DroidKungFu、Goldmaster和GingerMaster 4个家庭的主要特征
为了研究 DREBIN 提供的解释,我们考虑了四个著名的恶意软件家族,即 FakeInstaller、GoldDream [23]、GingerMaster [22] 和 DroidKungFu [24]。对于这些系列中的每个样本,我们都确定了对分类决策贡献最大的特征,并将结果平均到一个系列的所有成员上。表 3 显示了每个恶意软件家族的前五大特征。为清晰起见,我们列出了确切的特征,而不是第 2.4 节中介绍的解释性句子。
- FakeInstaller 是目前最普遍的恶意软件。该家族成员将恶意代码隐藏在流行应用程序的重新打包版本中。在安装过程中,恶意软件会向恶意软件作者拥有的高级服务发送昂贵的短信。即使乍一看,提取到的三个特征也表明该恶意软件使用了短信功能,只要应用程序请求使用短信功能的权限,android.hardware.telephony 就会被隐式添加到清单文件中。
- DroidKungFu 试图利用早期 Android 版本中的几个漏洞来获取 root 访问权限,并从设备中窃取敏感数据。system/bin/su 功能反映了它获取 root 访问权限的意图。调用 getSubscriberId() 表明恶意软件试图访问敏感数据。BATTERY_CHANGED_ACTION 和 SIG_STR 这两个意图由广播接收器组件过滤,该组件是许多 DroidKungFu 样本的一部分。一旦发生特定事件(例如低电量状态),这两个意图就会触发后台启动恶意服务。
- GoldDream 是一款木马程序,它会监控受感染的设备,收集敏感数据并记录接收到的短信信息。Telephony.SMS RECEIVED 功能直接提示我们可以读取短信。恶意软件收集到足够的数据后,会将数据发送到外部服务器,该服务器的主机名在特征列表中排名第二。此外,该恶意软件还能安装和删除软件包以及发送短信,这也反映在提取的特征中。
- GingerMaster 也是一种木马程序,它通常与良性应用程序捆绑在一起,试图获取 root 访问权限、窃取敏感数据并将其发送到远程服务器。与 DroidKungFu 系列类似,该恶意软件一旦收到 BOOT_COMPLETED 或 USER_PRESENT 意向,就会立即启动恶意服务。同样,这种行为的很大一部分可以通过查看顶部特征来重构。
为了研究不同特征集对一般恶意软件检测的贡献,我们提取了数据集中所有恶意软件系列的前 5 个特征。结果见表 4。虽然请求的权限出现在所有系列的顶部特征中,但很明显,仅凭这一组特征还不足以确保可靠的检测。特别是,每个特征集都至少在表中出现过一次,这清楚地表明所有特征集都是检测安卓恶意软件所必需的。
表4 .特征集对恶意软件家族检测的贡献
3.3.2 误检和漏检
最后,我们对被 DREBIN 错误归类为恶意软件的良性应用程序进行检测。与恶意软件类似,这些样本大多使用 SMS 功能并访问敏感数据,这反映在相应特征的高权重上。此外,这些样本往往只表现出很少的良性行为,因此会触发误报。幸运的是,DREBIN 能够输出可解释的结果,这有助于用户判断看起来可疑的功能是否真的是恶意的,还是应用程序的预期目的所需的。
当 DREBIN 将 Gappusin 系列[19]的样本归类为良性样本时,也出现了类似的情况。虽然在很多情况下都能提取出符合 Gappusin 系列描述的特征--其中包括外部服务器的主机名--但恶意特征太少,无法将样本识别为恶意软件。Gappusin 主要充当其他恶意程序的下载器,因此没有表现出常见的恶意功能,如窃取敏感数据。
3.4 运行时性能
虽然移动设备的计算能力正在迅速提高,但与普通台式电脑相比仍然有限。因此,直接在这些设备上运行的检测方法必须非常高效地完成任务。
为了分析 DREBIN 的运行时间,我们开发了一个独立的 Android 应用程序,它可以接收学习到的检测模型,并能直接在智能手机上执行检测过程。下载的模型大小只有 280 kbytes 左右。利用该应用程序,我们使用从 Google Play 商店随机挑选的 100 个流行应用程序,测量了 DREBIN 在不同设备上的运行时间。在本次实验中,我们选择了涵盖各种广泛硬件配置的设备,包括四款智能手机(Nexus 4、Galaxy S3、Xperia Mini Pro 和 Nexus 3)、一款平板电脑(Nexus 7)和一台普通台式电脑(PC)。
结果如图 6 所示。在五款智能手机上,DREBIN 平均能在 10 秒钟内分析一个给定的应用程序。即使在 Xperia Mini Pro 等较老的机型上,该方法也能在平均不到 20 秒的时间内分析应用程序。总体而言,所有设备上的分析时间都不超过 1 分钟。在台式电脑(2.26 GHz Core 2 Duo 处理器,4GB 内存)上,DREBIN 的分析性能非常出色,每个应用程序的分析时间为 750 毫秒,因此不到一天就能扫描 100,000 个应用程序。
图6 Drebin的运行时性能
图 7 显示了台式电脑和 Galaxy S3 智能手机的详细运行时间分析,图中每个应用程序的运行时间与分析代码的大小相对应。令人惊讶的是,在这两种设备上,DREBIN 的运行时间都是亚线性的,也就是说,其性能以分析字节数 m 的 O(√m)递增。
图7 对Drebin进行了详细的运行时分析
通过评估,我们得出结论:DREBIN 不仅能可靠地检测恶意应用程序,而且还能在明显满足实际要求的时间内完成这项任务。
4 局限性
前面的评估证明了我们的方法在Android平台上检测近期恶意软件的有效性。然而,由于 DREBIN 建立在静态分析的概念之上,缺乏动态检测,因此一般无法禁止恶意应用程序的感染。尤其是静态分析无法检测到的转换攻击,例如基于反射和字节码加密的攻击(见 30),会妨碍准确检测。为了缓解缺乏动态分析的问题,DREBIN 提取了与混淆和加载代码相关的 API 调用,如 DexClassLoader.loadClass() 和 Cipher.getInstance()。这些功能至少能让我们发现隐藏代码的执行--即使我们无法对其进行进一步分析。与其他功能相结合,尽管使用了一些混淆技术,DREBIN 仍能识别恶意软件。
为了避免手工制作检测模式,我们利用机器学习生成检测模型。虽然学习技术为自动推断模型提供了强大的工具,但它们需要有代表性的数据作为训练基础。也就是说,DREBIN 检测模型的质量严重依赖于具有代表性的恶意和良性应用程序的可用性。虽然收集良性应用程序很简单,但收集最近的恶意软件样本需要一定的技术努力。幸运的是,离线分析方法,如 DroidRanger [40]、AppsPlayground [29] 和 RiskRanker [21],可能有助于自动获取恶意软件,并为长期更新和维护 DREBIN 的代表性数据集奠定基础。
使用机器学习的另一个限制是可能出现模仿和中毒攻击[如 25、27、35]。虽然混淆策略(如重新打包、代码重排或插入垃圾代码)不会影响 DREBIN,但在学习和检测阶段之间对活动和组件进行重命名可能会损害识别特征[30, 38]。同样,攻击者可能通过在恶意应用程序中加入良性特征或伪造不变式,成功降低 DREBIN 的检测得分 [25,27]。虽然在一般情况下不能排除这种针对学习技术的攻击,但对学习数据的彻底消毒(见 7)和在代表性数据集上的频繁再训练可以限制其影响。
5相关工作
Android恶意软件的分析和检测在过去几年中一直是一个活跃的研究领域。已经提出了一些概念和技术来对抗这种恶意软件的数量和复杂性的增长。在Felt et al [ 16 ]和Zhou & Jiang [ 39 ]的研究中提供了当前恶意软件景观的概述。
5.1 利用静态分析进行检测
检测安卓恶意软件的第一种方法受到静态程序分析概念的启发。目前已提出了几种方法来静态检测应用程序并反汇编其代码[如 12、13、15、21]。例如,麒麟(Kirin)[13] 方法检查应用程序的权限,以发现恶意活动的迹象。同样,Stowaway[15] 通过分析 API 调用来检测权限过高的应用程序,RiskRanker[21] 则静态识别具有不同安全风险的应用程序。常用的静态分析开源工具有 Smali [17] 和 Androguard [10],它们能以极小的工作量剖析应用程序的内容。我们的方法 DREBIN 与这些方法相关,采用了类似的功能来识别恶意应用程序,如权限、网络地址和 API 调用。不过,它在两个核心方面与以前的工作有所不同: 首先,我们放弃了手工制作检测模式,而是应用机器学习来分析从静态分析中提取的信息。其次,我们对 DREBIN 的分析效果和效率进行了优化,使我们能够直接在智能手机上检测应用程序。
5.2 利用动态分析进行检测
第二个研究方向是运行时检测安卓恶意软件。最著名的是分析系统 TaintDroid [11] 和 DroidScope [37],它们能够在受保护的环境中动态监控应用程序,前者侧重于污点分析,后者则能够在平台的不同层进行内省。虽然这两个系统都能提供有关应用程序行为的详细信息,但它们在技术上过于复杂,无法在智能手机上部署并直接检测恶意软件。
因此,动态分析主要用于离线检测恶意软件,如扫描和分析大量安卓应用程序。例如,DroidRanger[40]、AppsPlayground[29]和CopperDroid[31]等方法已成功应用于研究不同安卓市场中存在恶意行为的应用程序。谷歌目前也在运行一个名为 "Bouncer "的类似检测系统。此类动态分析系统适用于过滤安卓市场上的恶意应用程序。然而,由于安卓平台的开放性,应用程序也可能从网页和内存条等其他来源安装,这就需要在智能手机上运行检测机制。
ParanoidAndroid [28] 是少数几个采用动态分析并能发现智能手机上恶意活动的检测系统之一。为此,智能手机的虚拟克隆会在专用服务器上并行运行,并与设备的活动同步。这种设置可以在不干扰真实设备功能的情况下监控克隆设备上应用程序的行为。然而,功能的复制涉及到大量的工作,而且目前有数百万部智能手机,大规模运行 ParanoidAndroid 在技术上并不可行。
5.3使用机器学习进行检测
人工制作和更新安卓恶意软件检测模式的难度促使人们应用机器学习。目前已提出了几种利用学习方法自动分析应用程序的方法[如 2、26、33]。例如,Peng 等人的方法[26] 将概率学习方法应用于应用程序的权限,以检测恶意软件。同样,Crowdroid[4]、DroidMat[36]、Adagio[20]、MAST[5]和 DroidAPIMiner[1]等方法也使用机器学习技术分析了从安卓应用程序中静态提取的特征。与我们的工作最接近的是 DroidAPIMiner [1],它在最近的恶意软件上提供了与 DREBIN 类似的检测性能。然而,DroidAPIMiner 建立在 k 近邻分类器的基础上,会产生大量运行时开销,妨碍在智能手机上运行该方法。此外,DroidAPIMiner 在设计上并不提供检测结果的解释,因此对实践者来说是不透明的。
总体而言,以往使用机器学习的工作主要集中在对恶意软件的准确检测上。其他方面,如检测的效率和可解释性,则没有得到考虑。我们针对这些方面提出了一种方法,可对恶意应用程序进行有效、高效和可解释的检测。
6结论
安卓恶意软件是一种新的威胁,但增长迅速。反病毒扫描仪等传统防御手段越来越无法应对应用市场上恶意软件的数量和多样性。虽然最近的一些方法,如 DroidRanger [40] 和 AppPlayground [29],支持从这些市场中过滤此类应用程序,但它们带来的运行时开销对于直接保护智能手机来说是难以承受的。作为一种补救措施,我们引入了 DREBIN,一种用于检测安卓恶意软件的轻量级方法。DREBIN 结合了静态分析和机器学习的概念,能更好地跟上恶意软件的发展步伐。我们的评估证明了这一方法的潜力,DREBIN 的性能优于相关方法,在识别恶意应用程序时误报率极低。
实际上,DREBIN 为安卓平台的安全提供了两个优势: 首先,它能有效扫描大量应用程序,如来自第三方市场的应用程序。在普通计算机上,每个应用程序的平均运行时间为 750 毫秒,分析 100,000 个未知应用程序只需要不到一天的时间。其次,DREBIN 可以直接应用于智能手机,当有新的应用程序下载到设备上时就会触发分析。因此,DREBIN 可以保护从网站和第三方市场等不可信来源安装应用程序的用户。
虽然 DREBIN 在我们的评估中有效地识别了恶意软件,但它表现出了静态分析固有的局限性。虽然它能检测到混淆或动态执行的迹象,但该方法无法访问检索到的代码。类似的情况在分析 JavaScript 代码时已经成功解决[见 9],每当加载新代码时动态触发 DREBIN 的静态分析似乎是未来工作的一个有前途的方向。
数据集
为了促进恶意软件检测领域的研究,并能够比较不同的方法,我们在http://user.cs.uni-goettingen.de/ ' darp / drebin下将工作中使用的恶意Android应用程序以及所有提取的特征集提供给其他研究人员。