基于权限和API调用检测Android恶意软件的机器学习方法

本文介绍2013年IEEE 25th International Conference on Tools with Artificial Intelligence的一篇会议论文,题目是《Machine Learning for Android Malware Detection Using Permission and API Calls》,DOI信息在这里

这篇文章比较简单,可作Android安全入门阅读资料,也很适合推荐给有一定工程背景、刚开始阅读各类文献的同学。

摘要

谷歌的Android移动电话平台是手机操作系统先驱之一。开源的Android平台允许开发者充分利用这个移动操作系统,但也由于恶意应用(APP)带来了严重的问题。一方面,Android的流行吸引了大多数开发者将其应用发布于这个平台;另一方面,也为一些用户开发恶意程序并将其嵌入谷歌Android市场或其它的应用市场提供了方便。这篇文章中,作者提出了一种结合权限和API(Application Program Interface,应用程序接口)调用、使用机器学习方法检测恶意Android APP的方法。通过将权限和API调用作为每个APP特征的方法,可以训练一个判断APP是否具有潜在恶意的分类器。此方法的另一个固有优势是,它不需要引入任何动态的系统调用追溯,仅使用简单的静态分析,寻找每个APP需要的系统函数。此外,对于每个APP,权限和API调用总是可用的,因此这个方法可广泛应用于所有移动APP。在对真实世界APP的实验中,使用了超过1200个恶意样本和1200个良性样本,以验证算法的性能。

简介

恶意软件(Malware)是指各种形式的破坏程序,如病毒、蠕虫、间谍软件、特洛伊木马、rootkit和后门。恶意软件的一个常见特性是,它们是专门设计来破坏、破坏、窃取或造成一些其他不良或非法行为的。恶意软件实际上可以感染任何运行用户程序(或APP)的计算机,并且,在个人计算机上对恶意软件的传播和预防已经有了很好的研究。但对于智能手机设备,我们在移动平台上发现恶意软件的解决方案远远落后于移动APP日益普及的步伐。

Android面临的威胁包括网络钓鱼、银行木马、间谍软件、机器人、Root漏洞、短信欺诈、付费拨号程序和假冒安装程序。也有关于下载木马程序在安装后下载恶意代码的报道,这意味着这些程序在谷歌Android市场上发布时,谷歌的技术无法轻易检测到。

综上所述,恶意软件APP通常使用以下三种渗透技术在Android系统上安装、激活和运行:

  • 重包装(Repackaging)。这些类型的方法通常从流行的合法APP开始,并作为恶意软件滥用它们。开发者通常会下载流行的APP,将它们拆解、添加自己的恶意代码,然后重新组装并上传到官方或其他市场。
  • 更新(Updating)技术检测难度较大。恶意软件开发者可能仍使用重新打包,但他们没有将代码打包到APP中,而是包含了一个更新组件,可以在运行时下载恶意代码。
  • 下载(Downloading)是传统的攻击技术,恶意软件开发者需要诱导用户下载感兴趣的APP。

对现有的Android恶意软件及其不同的渗透技术的描述揭示了我们面临的严峻的技术挑战。不幸的是,最近的研究表明,现有的流行的移动安全软件仍然落后。大多数恶意软件检测方法都基于传统的内容签名,例如恶意软件签名定义列表,并将每个APP与已知恶意软件签名数据库进行比较。这种检测方法的缺点是,用户只受最近更新的签名检测到的恶意软件的保护,而不受新的恶意软件(即零日攻击)的保护。随着恶意APP数量的快速增长,之前一项关于恶意模式的研究得出的结论是:“基于签名的方法永远赶不上恶意软件产生和发展的速度”。随着恶意APP的快速增长和目前安全软件令人失望的结果,迫切需要开发有效的解决方案来检测智能手机平台上的恶意
APP。

与使用静态签名不同,一种有效的替代方案是使用基于特征和行为的方法,通过观察移动APP的统计和/或动态行为和特性来检测恶意软件。最受欢迎的行为是基于静态请求权限的恶意软件检测方法,它检查资源的类型,如Wi-Fi网络,用户位置、用户联系信息、APP请求安装(Android为开发人员提供了超过130的权限控制的资源的APP可以请求)。纯基于权限的方法虽然简单,但效果一般,性能不可靠。这主要是因为开发人员可以自由地请求他们想要的任何权限,这样他们就可以模拟良性APP所请求的权限。另一方面,观察动态行为的APP,如动态API调用,比基于权限的方法更能精确地捕获APP的运行时活动。但分析APP的运行时动态行为并不简单,需要复杂的技能和平台,导致成本开销和耗时。

基于以上的观察,文章提出了一种基于机器学习技术,分析和分类Android APP的框架。该框架依赖于请求权限和静态API调用行为的组合,并从这些行为中提取特性并构建分类器来检测恶意APP。

Android APP结构

本部分针对关键文件简单介绍Android APP结构。这些描述作为了解Android APP的基础,通过这些信息可以为文中提出的算法提取有用的模式(pattern)。简要介绍两点:

  • APK(Android APP包文件)。每个Android APP被编译、包装为一个单独的文件,其中包括该APP的所有代码(.dex)、资源、清单(Manifest)文件。APP包文件可以任意命名,但扩展名必须为apk。
  • Android清单文件(即AndroidManifest.xml)。它是Android项目结构中的重要文件之一,包括APP的所有必要信息。当APP运行时,Android系统首先寻找的是清单文件。它实际上是一个路线图,以确保每个APP都能在Android系统中正常工作。

值得注意的是,Android系统不允许APP访问AndroidManiefest文件中没有指定的资源、权限和功能。所以AndroidManifest.xml提供了解APP的特性和安全设置的第一手信息。

Android安全方法

Android安全模型高度依赖于基于许可的机制。Android 9.0中,大约有150个权限管理对不同资源的访问。Android APP需要权限才能工作。因此,将Android APP安装到移动设备的关键步骤是允许APP请求的所有权限。在一个APP被安装之前,系统提示列表的权限请求的APP,要求用户确认设置安装。尽管权限请求能够防止滥用资源的APP,但是用户很少能够拥有知识来确定权限是否有害。例如,请求网络访问,包括Wifi和短消息服务(SMS),对于普通APP来说是很正常的,而一些恶意软件滥用这些服务来窃取带宽或其他有用信息。因此,用户很难通过仅使用权限请求来确定APP是否是恶意软件。

在系统级别,谷歌宣布,对每个上传到其市场的APP应用安全检查机制。Android操作系统的开放设计允许用户安装从不可信来源下载的任何APP。然而,权限列表仍然是用户检测APP是否有害的最小防御。这样,如果用户看到APP不必要地请求用户的个人联系权限(如电话簿),他们可以选择不安装这个APP。

谷歌将Android权限分为四个威胁级别:

  • Normal。最低风险的权限,APP需要获取泥沙盒之外的数据或资源,但侵害到用户隐私或其它APP运行的风险很小。如果APP声明了此权限,也不会提示安装这个APP的用户授权,系统会直接默认它具有这个权限。
  • Signature。仅当试图使用权限的APP与定义权限的APP签署了相同的证书时才授予这些权限。系统在安装时默认授权。
  • Dangerous。风险更高的权限。APP需要涉及用户隐私信息的数据或资源,或可能影响用户存储数据或其它APP操作的区域。例如,读取用户联系人的权限是很危险的。如果APP声明它需要一个危险的权限,用户必须显式地向该APP授予权限。在用户批准该权限之前,APP不能提供依赖于该权限的功能。
  • Special。有一些权限的行为与Normal、Dangerous的权限不同。例如,SYSTEM_ALERT_WINDOW和WRITE_SETTINGS特别敏感,所以大多数APP不应该使用它们。如果APP需要这些权限之一,它必须在清单中声明权限,并发送一个intent请求用户的授权。系统通过向用户显示一个详细的管理界面来响应这个intent。

确定恶意APP的一个简单方法是检查APP是否请求处于Dangerous或更高级别的权限。尽管Android采用授权模型来控制对其组件的访问,但没有明确的证据表明基于权限或权限组合来检测恶意APP的效果如何。应该注意,在安装过程中向用户显示的权限是请求的权限,而不是必需的权限。请求的权限由开发人员手动声明。然而,APP并不一定需要所有声明的权限。

除了谷歌保护Android免受恶意APP攻击的方法,许多安全软件公司也推出了自己的安全APP。

Android权限设置

每个Android应用程序包(APK)在根目录下都有一个AndroidManifest.xml清单文件。该文件包括对于Android系统和用户来说的基本信息。Android系统必须拥有并处理这些信息,才能运行APP的任何代码。清单文件执行以下操作,这些操作与APP的行为和安全设置密切相关。

清单文件声明APP必须具有哪些权限才能访问受保护的API部分并与其它APP交互。它还声明了想要与此APP组件交互的其它APP所需的权限。这些权限是用于任何实验的原始数据,因此需要使用AndroidMainfest.xml文件。使用Apktool(这是一个对APK文件进行逆向工程的工具)能够生成APK文件的AndroidMainfest.xml。一旦有了AndroidMainfest.xml,就可以解析它,并从其中提取APP请求的权限。

比较发现,在恶意和良性的APP中,经常请求网络、读取电话状态、访问网络状态和写入外部存储权限。但恶意APP倾向于更频繁地请求与短信相关的权限。此外,恶意APP倾向于请求比良性APP更多的权限。

可将APP请求的权限以向量形式表示,以便于机器学习。设二进制向量$P$代表一个APP申请的权限,若$P_i=0$,则该APP没有请求第$i$个权限;反之请求了第$i$个权限。这些特性可以用来区分良性和恶意APP,检测准确率适中。在本文中,结合权限和Android API调用来提高检测精度。

Android API调用

Android平台提供了一个框架API,APP可以使用它与底层的Android系统交互。框架API由一组核心包和类组成。

因为大多数APP都要使用大量的API,这促使我们使用每个APP的API调用作为特性来区分恶意和良性APP。为了实现这一目标,可以创建一个框架来逆向APK文件并提取每个APP的API调用。在此之后,可以采用与上述基于权限的表示相同的技术。设二进制向量$A$代表一个APP的API调用,若$A_i=0$,则该APP没有调用第$i$个API;反之调用了第$i$个API。

为了证明API调用确实有助于区分良性和恶意APP,文章对恶意和良性APP作出调研。结果清楚地表明,良性APP使用的API调用比恶意APP多,恶意APP使用的API调用平均数量为454.5,而良性APP使用的API调用平均数量为1595.9。

研究方法

在本节中,文章提出了一个基于特性的学习框架,用于Android恶意软件检测。该框架考虑了APP的特性,包括权限和API调用,以描述Android APP的行为。

文章提出的框架由四个主要部分组成。第一个部分是APP分析器,它解压缩APP的APK文件并提取AndroidManifest.xml和类文件,这是描述APP所必需的。第二个部分的目的是根据每个APP的请求权限和API调用来描述其特性。第三个部分是特征生成器,进行特征提取,包括从AndroidManifest.xml中提取的权限特征和从类文件中提取的API调用特征。这个过程的结果是,每个APP都被转化为用二进制表示的权限和API调用特性实例(instance),并且类标签指示该APP是良性的还是恶意的。最后一部分从采集的数据中对分类模型进行训练。

框架结构示意图

因为这个框架已经将应用程序转换为通用的实例,所以可以简单地使用任何学习算法从训练数据中得出分类模型。文中的实验检测了几种不同的分类方法,包括支持向量机(Support Vector Machine,SVM)、决策树(文中使用的是J48算法)和集成学习算法Bagging。实验结果证明Bagging较优。

实验结果

结语

本文简要讲了基于权限与API调用检测Android恶意APP的思路和方法,并通过实验证明了将权限与API调用结合起来能够取得更好的效果。