DroidCat:基于App层面的Android恶意软件检测与分类
本文介绍2019年发表在IEEE Trans on Information Forensics and Security的一篇文章,题目是《DroidCat: Effective Android Malware Detection and Categorization via App-Level Profiling》,DOI信息在这里。
本文作者提出DroidCat,一个先进的动态App分类技术,以对现有的方法进行补充。DroidCat在不涉及权限、App资源或系统调用的情况下,能够完美地处理应用代码中的反射(reflection)。使用基于方法调用和组件间通信(inter-component communication,ICC)Intent的各种动态特性,实现了比依赖于系统调用的静态方法和动态方法更好的鲁棒性。
摘要
Android已经成为97%移动恶意软件的目标平台,这些恶意软件偷窃个人信息、滥用特权资源,或者安装其它恶意软件。随着Android市场的快速增长,区分恶意软件和良性App非常重要(即,进行恶意软件检测)。此外,对于威胁评估和防御规划,区分不同种类的恶意软件(即,按家族划分的恶意软件分类)同样重要。
研究领域主要有两类Android恶意软件检测/分类的方法:静态和动态。静态方法利用静态代码分析来检查App是否包含异常信息流或调用结构、是否匹配恶意代码模式、是否请求过多的权限,与/或调用恶意软件经常调用的API。静态方法的优点是可靠和可扩展的,可用于筛选大量App,但它们不能总是精确地检测恶意软件,原因有三。
- 首先,由于Android的事件驱动特性(例如生命周期回调和GUI处理),运行时控制/数据流并不总是静态可估计的。它们依赖于运行时环境。这使得静态分析无法揭示许多恶意软件活动。
- 其次,代码中存在的一些权限和/或API并不总是意味着它们实际上在运行时经常被执行或调用,从而导致攻击。纯粹检查权限和/或API的存在可能导致静态分析错误地报告恶意软件。特别是在API级别23之后,Android增加了动态权限支持,这样App可以在运行时请求、获取和撤销权限。这种新的运行时权限机制意味着静态方法无法在运行时发现异常权限何时被请求和授予。
- 最后,静态方法在检测通过动态代码构造(例如,通过反射调用敏感API)执行的恶意行为方面能力有限。这些限制使得静态分析容易受到广泛采用的探测规避方案(如代码混淆和变形)的影响。
相比之下,动态方法提供了一种互补的方法来检测和分类恶意软件。机器学习已经越来越多地融入到这些技术中,从这些特征中训练分类模型来区分恶意和良性App。但是,当App混淆使用系统调用时,仍然可以逃避基于系统调用的恶意软件检测器。敏感的API使用并不一定表示恶意意图,异常的资源使用也并不总是对应于异常的行为。通常,依赖于系统调用序列和/或依赖关系的、基于行为的方法可能很容易被系统调用混淆技术(例如,模仿攻击和错觉)击败。因此,需要一个更全面的动态App分类器来捕获不同的行为概要文件,从而对针对特定特征的攻击具有鲁棒性。
在本文中,作者开发了一种新的App分类技术──DroidCat,基于App层面与监督学习。DroidCat的开发不仅可以检测Android恶意软件,还可以有效地对Android恶意软件进行分类(分别称为恶意软件检测和恶意软件分类)。与现有的基于学习的动态方法不同,DroidCat基于多样的App行为概要来训练它的分类模型,其中包含一些功能,这些功能涵盖了运行时App的互补。DroidCat概要描述组件间通信(ICC)调用和所有方法的调用,包括由用户代码、第三方库和Android框架定义的方法(而不是监视系统调用)。此外,它完全能够处理反射,而不使用基于App资源或每个任务的功能。因此,DroidCat对于针对系统调用或利用反射的攻击非常健壮。DroidCat对于针对特定敏感API的攻击也很健壮,因为它们不是方法调用的唯一目标。
DroidCat中使用的特征是基于136个良性和135个恶意App的动态特性研究确定的。在研究中,作者追踪了每一个App的执行情况,定义并评估了122个行为指标,以彻底描述两组App之间的行为差异。评估结果显示,DroidCat具有很高的稳定性:在恶意软件检测和分类方面,DroidCat分别实现了97.4%和97.8%的F1精度。
综上所述,文章做出了以下贡献:
开发了DroidCat,这是一种新颖的Android App分类方法,基于一组崭新的、多样化的功能,这些功能通过简短的App层概要,在运行时捕获App行为。这些特征是通过一项动态特性研究发现的,该研究揭示了良性和恶意App在方法上的行为差异。
通过三项补充研究对DroidCat进行了评估。在2009年至2017年期间,对34,343个不同的App采用了两种最先进的同类方法作为基准。结果表明,DroidCat在稳定性、分类性能和鲁棒性方面都优于基线,在效率上具有较好竞争力。
对DroidCat进行了深入的案例研究,研究其对单个恶意软件家族的性能以及影响其分类能力的各种因素。文章的研究结果证实了DroidCat始终保持着较高的整体性能,并且在文章调查的大多数家族中都显示出了其强大的性能。文章还确定了DroidCat最有效的学习算法和动态特性,并证明了DroidCat对动态输入覆盖率的低敏感性。
激励性示例
下图是5个来自于真实木马病毒家族FakeInst样本的代码片段,此家族的样本向收费号码发送短信。可以看出,除第3行的数据加密之外,这个恶意软件大量使用反射,以调用包括Android API在内的方法,以便访问设备ID等特权资源(第1-11行)。此外,为了利用SMS服务(第13-18行),它通过反射(第27-29行)得到恶意消息传递所需的文本和号码,然后调用sendSms(第30行),后者再次通过反射调用ad.notify.SmsItem::send(第20-23行)。
虽然使用字符串常量的简单反射(例如,第22、27、28行)可以通过静态分析以额外的代价消除混淆,但是更复杂的情况可能不会(例如,第4、5、15、16行,其中类名和方法名从数据库对象mdb中检索)。因此,与API和敏感流相关的、基于静态代码的特性将不会从App中提取,基于这些特性的技术也不会检测到安全威胁。此外,该样本中的恶意行为只显示在其代码中,而不反映在其resource/asset文件中(如配置和UI布局);因此,绕过代码分析的方法可能也不会成功。此外,恶意软件开发者也很容易混淆App资源。在这些情况下,作者认为健壮的动态方法是抵御此类恶意软件样本的必要补充。
背景
Android 应用程序
程序员主要使用Java开发Android App,之后将它们构建为App包文件(即APK)。每个APK文件可以包含3个软件层:用户代码、Android库与第三方库。Android App通常由4大组件构成:Activitiy处理UI与用户与显示屏的交互,Service处理与App相关的后台进程,Broadcast Receiver处理App与Android系统的交互,Content Provider处理数据存储与管理的问题。
ICC
组件(多数是Intent)通过ICC对象互相交互。如果发送者与接收者均为同一个App的Intent,则将这个ICC归类为内部的,否则为外部的。如果一个Intent在其内容中明确指定了接收者,则将ICC归类为明确的,否则为隐式的。
生命周期方法与回调
每个App组件都遵循一个规定的生命周期,该生命周期定义了如何创建、使用和销毁该组件。相应地,开发人员可以重写多个生命周期方法(例如,**onCreate()、onStart()和onDestroy())来定义事件发生时的程序行为。开发人员还可以重写其他事件处理程序(例如onClick()**),或者定义新的回调函数,以便在发生事件时实现额外的逻辑。
安全相关API
有一些敏感的API可以获取用户的个人信息,比如位置和联系人。例如,Location.getLatitility()和Location.getLongitude()检索GPS位置坐标。作者认为这些API是潜在敏感信息流的来源(source)。还有一些输出API通过网络或存储从当前组件发送数据,作者认为它们是潜在敏感信息流的接收点(sink)。如果App的执行轨迹具有从来源到接收点的任何路径,由于敏感数据可能泄漏,这个App可能是恶意的。
特征发现与计算
来自于App执行轨迹的特征是文章方法的核心。从轨迹中可以提取许多特征,但不是所有特征都是一个好的分类标准。文章首先从一个相对较小的数据集(136个良性样本与135个恶意样本)里面,定义并测量了122个指标作为可能的特征,进行了系统的动态特性研究。通过对两组App的比较,确定了哪些指标是好的差异化因素,并将其纳入的特征集。这项探索性研究的中心目标是为DroidCat寻找使用的特征。
衡量基准
文章提出了三条标准:
- 最低支持的SDK版本为4.4(即API 19)或以上;
- 待测试的APK文件能够在Monkey的输入下成功运行;
- App在Monkey的输入控制下,能够覆盖运行50%的用户代码。作者使用了DroidFax,它包括一个直接与APK一起工作的代码语句覆盖率度量工具,能够使用用户代码中的每个语句来跟踪运行时的覆盖率。
对于带有良性标签的样本,从样本池中随机选择一个App,并判断其是否满足以上三条标准。如果满足,则将其提交至VirusTotal以进一步确认其为良性。对于恶意样本,文章从MalGenome数据集中找到了135个符合上述条件的App,并同样提交至VirusTotal确认其为恶意样本。
指标定义
基于收集到的执行轨迹,文章通过定义结构(structure)、ICC和安全性(security)这三个正交维度上的122个指标来表征App行为。直观地看,这些指标捕捉到的App行为越多,它们对App行为的表征就越完整。这些指标不仅度量特定方法调用或ICC的存在性,而且度量它们的相对出现频率和分布。
结构维度
包含关于方法调用的分布、它们的声明类与调用者-被调用者链接的63个指标。其中31个指标描述了所有方法调用在三个代码层(即用户代码、第三方库和Android SDK)或不同组件之间的分布。其他32个指标描述了一种特定方法的分布—回调(callback,包括生命周期方法和事件处理程序)。
ICC维度
包含7个指标,用于描述ICC分布。由于有两种方法分类ICC(内部与外部、明确与隐式),列举所有可能的组合可以得到4个指标。其它3个指标依赖于与ICC关联的Intent数据定义:Intent包含的数据仅有URI或extras字段,或二者全部包含。
安全维度
包含52个指标,用于描述来源、接收点的分布以及它们之间通过方法级控制流的可达性。可达性用于区分所有有风险的来源/接收点。如果一个来源到达至少一个接收器,它就被认为是一个危险的来源。类似地,有风险的接收器可以从至少一个来源访问。这两种情况都表明存在安全漏洞,因为敏感数据在从来源流向接收点的过程中可能会泄漏。
指标(特征)计算
为计算Android App的122个指标,文章使用Soot将每个App的APK文件与Android SDK库一起转化为Jimple代码(Soot的中间代码表示形式),之后在Jimple代码中插入探针,以在运行时层面监控每个方法调用(包括针对SDK API和第三方库函数的调用)与每个ICC Intent的轨迹。此外,还为类和方法标记了附加信息,以方便度量计算。例如,文章标记了每个检测类的组件类型、每个检测回调的类别以及每个相关SDK API的来源或接收点属性。
为确定一个类的组件类型,使用类等级分析(Class Hierarchy Analysis,CHA)识别所有父类。如果某个类继承自四大组件类型如Activity,则其组件类型标签就确定为这一类型。文章使用DroidFax中的方法类型映射列表来标记回调的类别和API的来源/接收点属性。
异常处理和反射是两种广泛使用的Java构造。因此,文中的检测完全跟踪两种特殊类型的方法和ICC调用:通过反射发出的方法和由于异常控制流(例如,来自catch代码块和finally代码块的调用)而产生的方法和ICC调用。
之后,在Android模拟器上运行每个App的APK来收集执行轨迹,其中包括所有方法调用和执行的ICC。注意文章没有监视OS级别的系统调用,因为作者希望DroidCat对任何针对系统调用的攻击都具有健壮性。同样,这一方法也没有限制于敏感API。之前的工作表明,即使没有使用恶意系统调用或敏感API,一些恶意App仍然可以通过ICC操纵其他App进行攻击。因此需要跟踪ICC,进一步揭示良性和恶意App之间的行为差异。
为了描述App的动态行为,我们需要运行每个App足够长的时间,使用各种输入来覆盖尽可能多的程序路径。手工输入App的输入非常低效。为了快速触发App的不同执行轨迹,我们使用Monkey随机生成输入。为了平衡效率和代码覆盖率,我们将Monkey设置为每个App10分钟。一旦运行时监视器收集到App的轨迹,122个指标中的大多数可以直接通过轨迹跟踪统计数据计算出来。涉及到风险来源/接收点的度量是通过构建的动态调用图计算的,以便于可达性计算。
指标(特征)选择
为了找出两组App之间有明显差别的度量标准,文章测量了每个基准App上的每个指标,然后分别计算了所有良性和恶意基准的平均值。如果一个指标的平均值差异大于或等于5%,则认为这两组的行为特征与该指标有很大不同(substantially disparate)。如果一个指标的差异大于或等于2%,则认为这两组的行为特征与该指标明显不同(noticeably different)。作者启发式地选择各种阈值进行了实验,发现这两个阈值(5%和2%)相当好地代表了恶意和良性样本之间的两个主要区分级别。
从结构(structure)、ICC和安全性(security)三个维度,文章提出了三点观察结果:
- 恶意软件倾向于更多地从用户代码或第三方库调用SDK API,并定义更多的UI回调,这说明用户在这些API上的操作可能会触发过多/意外的计算。
- 恶意软件可能使用更显式的ICC来攻击特定的外部组件,或者更频繁地通过ICC传播潜在的恶意URI。
- 恶意App比良性App表现出更少的日志记录操作。它们执行更危险的源代码,这可能导致敏感数据的泄漏。
DroidCat方法
基于上述特性研究,作者开发了DroidCat,一种利用系统分析和监督学习的App分类方法,来判断给定的App是良性的还是属于特定的恶意软件家族。如下图所示,我们的方法分为两个阶段:培训和测试。在培训方面,DroidCat将良性和恶意App都作为输入。对于每个App,它都将上述70个指标作为行为特性计算。然后利用这些特征,利用随机森林算法训练监督机器学习的多类分类器。对于测试阶段,给定一个任意的App,DroidCat计算相同的行为特性集,然后将这些特性提供给分类器,以确定该App是良性的还是恶意软件家族的成员。
作者使用Python的Scikit-learn工具实现DroidCat的学习部分,并将整个DroidCat系统与数据集开源。
文章结构图
结语
本文方法新颖,叙述严密,且有充分的调研工作支撑,是一篇优秀的Android动态检测论文,非常值得学习。