吴俊昌,罗圣美,巫 妍,程绍银,蒋 凡
(1.中国科学技术大学信息安全测评中心,安徽合肥230027;2.中兴通讯,江苏南京210012)
近年来,移动互联网迅猛发展,对智能终端的需求也在与日剧增。根据Gartner提供的数据,智能终端数量在2011年第三季度已达1.49亿[1],并且在今年其总量已经超过个人电脑的数量[2]。Google Android[3]已经成为移动终端[4~6]最主流的操作系统,其市场占有率为52.5%[1],已经超过其他智能终端系统占有率的总和。
丰富的智能终端应用程序也是智能终端流行的一大原因。为了便于应用程序开发者发布应用程序和用户下载安装应用程序,出现了很多应用程序商店,其中最著名的两个应用程序商店为Google的Android Play[7]和苹果的App Store[8]。同时还存在诸多第三方应用程序商店,比如机锋市场等。相比较苹果应用程序的管理,Android的应用程序就显得十分混乱,这也导致Android系统上的恶意应用程序频发,让用户能够放心安全地使用应用程序成为亟待解决的问题。
PiOS[9]使用程序切片的技术检测iOS上应用程序中的隐私泄漏问题,该方法只针对隐私泄漏问题,没有涉及其他恶意行为。SCanDroid[10]对Android应用程序的源码和Android Manifest文件进行分析,生成应用程序的证书,以此来描述应用程序权限的使用情况,但是在一般情况下很难得到应用程序的源码,对于只有二进制代码的应用程序不适用。Enck W等人[11]实现了Dalvik字节码反汇编工具ded,将字节码转换为源码,通过现有的Java源码分析工具,分析应用程序中存在的安全问题,该方法需要两次代码转换,转换过程会导致信息丢失,不利于应用程序的安全性分析。Droid-MOSS[12]计算应用程序模糊散列值,与官方的应用程序比较,检测在第三方应用商店上被重新打包的应用程序,并没有检测应用程序是否为恶意的,对重新打包的应用程序没有分析其是否增加了恶意行为。与上述方法相比,本文方法不需要应用程序的源码,直接通过对应用程序字节码指令进行模拟执行,构建出函数的摘要,在函数摘要上使用污点传播算法,分析出存在恶意行为的路径。
针对使用Android系统提供的内部机制所开发的恶意应用程序,本文提出一种基于程序分析的方法,对未知的应用程序进行恶意行为检测,进而分析应用程序的安全性。通过对应用程序在不同粒度上的模拟执行,对应用程序进行分析。在指令级别上的模拟执行计算函数摘要,针对不同的函数设计原子函数摘要和组合函数摘要来满足分析需要。在函数级别上的模拟执行进行应用程序的恶意行为检测,通过恶意行为检测完成对应用程序的安全性评估。
Android系统为了简化应用程序的开发以及各种软硬件资源和权限的管理,设计了很多的机制,例如广播与监听机制、服务机制等等。从开发和管理的角度上说,这些机制的确使开发和管理变得简单;但是,从用户安全的角度上说,这些机制却将使用应用程序的用户暴露于极大的安全隐患之中。
在Android系统中存在各种各样的广播,比如电池的使用状态的改变、电话的接听和短信的接收都会产生一个广播,应用程序开发者可以监听这些广播并做出相应的处理。应用程序在安装时便会向Android系统注册所使用的广播监听器,Android系统接收到广播时便通知注册了该广播的应用程序执行相应的广播监听器。
恶意应用开发者可以在开发的应用程序中注册比较常用的广播监听器,比如电话和短信的广播,当监听到Android系统发送这类广播时,就可以在广播处理事件中做一些有害于用户的行为,例如获取用户的通讯录信息,并通过网络发送出去。使用这种方法的应用程序的恶意行为比较隐蔽,只有在监听到特定广播才会触发,而此时已对用户造成了损失。
服务是不可见的,主要是在后台运行。服务机制一般用于支持比较耗时或者长时间运行的操作。服务分为两种:本地服务和远程服务。本地服务一般用于应用程序内部一些耗时的任务,比如查询升级信息等,并不占用应用程序比如Activity[13]所属线程,而是单开线程后台执行。远程服务一般是用于Android系统内部的应用程序之间的,可以被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,直接调用已有的即可。相比于本地服务,远程服务更具危险性。
服务可以提供很多方式供恶意应用程序开发者开发恶意应用。例如,一个恶意应用程序在运行时并不需要任何与外界交互的权限,比如发送短信或访问网络的权限,而只要通过一个具有以上权限的服务,就可以将非法收集到的用户隐私信息发送出去。
在Android系统中主要存在三种本地代码:shell命令、本地库文件(.SO)以及字节码文件(.JAR和.DEX)。Android系统为shell命令提供了exec接口;为将本地库加载到当前应用程序内存中提供了load和load Library两个接口,本地库文件可以使用NDK(Native Development Kit)[14]开发;为字节码的使用提供了DexClassLoader[15]类来处理字节码文件的执行。
本地代码的执行具有极大的灵活性,且方式多样。应用程序开发者可以在发布应用程序时,不将存在恶意代码的文件放入安装文件中,而是在用户使用时再将这些代码文件从网络上下载,这加大了对应用程序进行检测分析的难度。
针对上述Android系统提供的机制存在的安全问题,本文给出了一种恶意行为的检测方法。本方法不需要安装应用程序,直接在PC上对应用程序的字节码文件进行静态分析,主要包括如下四个步骤:程序结构恢复、函数调用图重构、函数摘要构建以及恶意行为检测,如图1所示。程序结构恢复是在内存中对当前应用程序中类的结构的恢复,恢复的结构信息主要包括类的继承关系、类中的属性以及类中的方法等;函数调用图重构是针对Android系统以消息为驱动方式以及使用面向对象的Java编程语言设计的,完成函数调用的唯一性确定以及控件消息处理事件的调用,重构出近似于函数运行时的调用图;函数摘要构建是结合恢复的程序结构和重构的函数调用图,对函数中字节码指令进行模拟执行,求解出函数的输入与输出之间的语义逻辑关系;恶意行为检测通过在已计算出的函数摘要信息上使用静态污点传播算法,检测函数调用路径上的恶意行为。
Figure 1 Analysis detecting method图1 分析检测方法
Android应用程序主要使用Java语言开发。Java是一种面向对象的语言,存在大量的类和对象。但是,与一般的Java程序相比,Android应用程序不存在主入口函数main,例如存在界面的Android应用程序的主入口函数一般是一个Activity组件的onCreate函数,该信息可以从Android Manifest.xml文件中获取。Android Manifest.xml文件中定义了本应用程序需使用的Activity组件、Service组件、Receiver组件以及所需要的权限列表等。这些组件的启动函数都可以作为分析的入口。
在Android系统中,应用程序的运行是以消息为驱动的。在对应用程序进行分析检测的时候,对于应用程序分析过程中存在消息响应的控件,在该控件对象生成时,就对该控件的消息处理事件进行分析。因为大部分的事件是与用户交互形成的,而这些控件对象初始化之后,就已经具备了完成相应消息处理事件所必须的信息。
Android应用程序一般是用Java语言开发的,存在着大量的类和对象。在对函数进行分析的过程中,需要确定被调用函数以及属性的归属,这些都需要程序结构的支撑。
结构的恢复需要依赖应用程序安装包中的.DEX文件。对该文件进行反汇编,目前已有很多可以使用的Dalvik字节码的反汇编工具,例如baksmali[16]、IDA Pro[17]等,本文使用功能强大的IDA Pro作为反汇编工具。不需人工参与,通过编写自动化的python脚本,可以从反汇编的结果中获取所有类的属性列表、函数列表以及所有函数的字节码信息,并在内存中恢复这些程序结构。
类中的方法和属性的恢复是通过对方法名和属性名进行解析完成的。IDA Pro对方法名和属性名反汇编出的命名是规则的。方法名一般格式为:包名$类名$内部类名.函数名@返回值及形参列表类型。返回值及形参列表的类型一般用一个字母表示一种类型,例如void用V表示。属性名一般格式为:包名$类名$类部类名_属性名。根据这些命名规则,可以解析出方法和属性的类名,再根据解析出的类名将这些方法和属性划分到各自原本的类中。
默认情况下,所有类的父类为Object类,而构建类的继承关系,主要是构建类直接继承过来的父类。直接继承的父类需要通过分析特定的指令获取,Dalvik字节码中有两个指令(INVOKE_SUPER和INVOKE_SUPER_RANGE)指定调用父类中同名的函数,从而可以分析出该函数所在类的父类。Dalvik字节码指令是通过INVOKE_XXX指令进行函数调用的,可以根据这类指令信息构建出整个应用程序的函数调用图。
Android系统中存在组件的生命周期、消息的驱动以及类的继承等,使得“程序结构恢复”阶段构建函数时得出的函数调用图不完整或存在错误,因此必须进行修复和重构。
Android应用程序由Activity、Service以及Receiver等组件组成,这些组件是Android应用程序所特有的,每个组件各有一个完整的生命周期,不同组件的生命周期差别很大,在整个生命周期使用的函数都是由系统进行调用的,它们在函数调用图中是没有前驱节点的,在系统实际运行中遵循一定的调用顺序,该调用顺序可以从Android应用程序开发文档中获取。以Activity[13]为例,如图2a所示,一个Activity组件启动时,调用该Activity的onCreate函数初始化一些Activity的基本数据;调用onStart后一个Activity即可显示;on Resume和onPause分别是继续和暂停当前Activity;onStop是停止当前Activity,此时Activity已不再显示;最后使用onDestroy销毁一个Activity。从Activity的生命周期可以分析出,Activity的函数执行序列一般是onCreate、onStart、onPause、on Resume、onStop、on Destroy,如图2b所示。所以可以重新构建出Activity生命周期在运行时的函数调用图。
Figure 2 Reconstruction of function calls in Activity图2 Activity中的函数调用重构
Android应用程序存在大量的控件,例如按钮、输入框等。控件的事件处理函数是由Android系统确定调用的,在对应用程序进行分析的过程中需要适当地调用这些函数。例如,按钮控件有个点击事件,即onClick事件,当用户点击按钮时才会触发,而在静态分析过程中不存在与用户的交互,可以根据前述方法,将点击事件处理函数在按钮初始化。
函数摘要是对函数的一种抽象解释。Android应用程序中存在类的继承、接口的实现等面向对象编程特征,基于这些特征可以将函数的摘要分为两类,即原子函数摘要和组合函数摘要。
定义1 原子函数摘要:所摘要的函数不存在子函数调用,或者虽然存在子函数调用,但这些子函数调用都是可以唯一确定的。
定义2 组合函数摘要:所摘要的函数存在子函数调用,且至少有一个子函数调用在该函数体内不能唯一确定。
函数摘要构建是在指令级别上对函数体中的指令进行模拟执行的过程。算法1是函数摘要构建的算法,语句5~8处理函数调用指令,从重构的函数调用图call Grpah中获取被调函数function信息,并在局部参数local Variables中查找该被调函数的实参,存放到实参列表arguments中,最后将实参列表arguments和被调函数function信息保存到函数摘要summary,即在函数摘要中构建一条函数调用信息(下称函数调用点);语句9~14处理函数间的调用关系,将被调函数对形参fun-Parameters的影响传递给主调函数中的实参arguments;语句15~16处理函数返回指令(包括抛出异常的指令),合并所有影响形参值的变量信息,将结果保存到形参中;语句17~19处理既不是函数返回指令又不是函数调用指令的指令,对这种指令根据Dalvik字节码的语义进行模拟,并更新相应局部变量的状态。例如,指令new-instance v6,〈t:Sms〉是新建一个Sms对象,将该对象放入v6中。在模拟执行过程中,则会构建一个与Sms相对应的对象保存Sms的信息。
算法1 函数摘要构建算法
Android应用程序没有像Java应用程序存在一个统一的入口函数main,在对存在多个组件的Android应用程序进行分析时会带来不便。为了解决这个问题,在对应用程序进行分析之前,对应用程序先构建一个虚拟的main函数,将每个组件按其生命周期构建函数的执行序列,同一个组件共享同一个this对象。
恶意行为检测是建立在已经构建好的函数摘要基础上的。从上述虚拟main函数开始,在计算的函数摘要上进行函数级别上的模拟执行,在执行过程中组合摘要中的占位函数需要结合已恢复的程序结构和函数调用时所传入的this对象来确定。
在检测过程中,需要用到源函数模式库和危险函数模式库,以及恶意行为模式库,这些模式库都是来源于人工分析的经验积累。源函数模式库包含引入污染数据的函数,这可以是访问手机中的隐私数据,比如用户的通讯录等,也可以是启动手机的某个功能模块,比如地理位置定位系统等。危险函数模式库包含可以与外界交互的函数,例如访问网络、发送短信等。恶意行为模式库包含源函数与危险函数相结合后所产生的危害行为模式,例如启动地理位置定位系统与发送短信结合,则可能属于远程控制设备的行为。
检测恶意行为的步骤主要如下:
(1)设置分析入口。广播与监听机制和服务机制有特定的入口函数,可将其构建到虚拟main函数中。然而本地代码执行机制并没有固定的入口函数,则根据已重构好的函数调用图,在某个图中如果存在本地调用特征的函数,则将这个函数调用的真实入口加入到虚拟main函数中。
(2)标记污染信息。从虚拟main函数开始,根据每个函数已构建的函数摘要,将函数调用点的函数信息与源函数模式库匹配,标记出污染变量中的污染信息。
(3)污染信息传播。将污染信息通过函数的实参传入被调函数中,计算传入信息对被调函数各个函数调用点的影响,依次递归进行。
(4)恶意行为匹配。在过程(3)中结合危险函数模式库,若匹配到一个危险函数时,并且污染信息也传播到这个危险函数,再根据恶意行为模式库中的恶意行为信息进行匹配,如果匹配成功,则报告一条危险行为及其相关信息。
根据上述方法,本文实现了一个原型系统。系统包含2.2万行Java代码和1 650行python代码,可以直接对Android应用程序安装包的字节码进行静态分析。主要包含三个模块:预处理、核心分析引擎以及检测结果,如图3所示。
Figure 3 Detection prototype system of system mechanism’s malicious behavious图3 系统机制的恶意行为检测原型系统
预处理模块将Android应用程序安装包中的字节码信息导入数据库中。快速过滤部分,通过分析应用程序安装包中的Android Manifest.xml文件中的权限列表,快速筛除肯定不存在恶意行为的应用程序。由于不同应用程序的安装包存在相同的字节码文件,在将字节码信息导入数据库之前,首先计算DEX文件的MD5值,如果数据库中不存在该MD5值的应用程序,才会将应用程序的字节码通过IDA Pro进行反汇编,再导入到数据库中。反汇编和导入数据库功能使用脚本自动实现的,不需要人工参与。
核心分析引擎通过对导入数据库中的字节码信息进行分析,恢复出应用程序结构以及近似运行时的函数调用图,并进一步构建出每一个函数的摘要信息,最后通过恶意行为检测分析出应用程序的恶意行为。
检测结果模块根据恶意行为检测获取的信息,剔除恶意行为中存在与用户交互的恶意行为,将没有与用户交互的恶意行为作为最终的检测结果(即Android系统机制相关的恶意行为)输出。
我们使用了文献[18]中使用的恶意应用程序数据库,含有1 260个恶意应用程序样本。我们将这些恶意程序样本导入数据库,由于样本中存在DEX文件的MD5值相同,最终导入数据库的恶意样本数为866个。使用上述原型系统对数据库中的样本进行分析,其中有650个样本在使用系统机制时添加恶意行为;而有216个样本在使用系统机制时没有添加恶意行为,但是不排除在非系统机制代码部分添加了恶意行为,但是本文不关注这个方面,分析结果如图4所示。
Figure 4 Detection results图4 检测结果在应用程序中的分布
在这650个样本中,总共检测出4 313条恶意行为,广播与监听机制中出现恶意行为的个数为380,占9%;本地代码执行机制中出现恶意行为的个数为464,占11%;服务机制中出现恶意行为的个数为3 469,占80%,分布情况如图5所示。不难看出,在服务机制出现的恶意行为最多,这也与服务机制的特点有关。在Android系统注册一个服务,不仅当前应用程序可以使用这个服务,其他应用程序也可以使用,这样可以实现两个应用程序联合完成恶意行为,一个应用程序注册服务,另一个应用程序使用已注册的服务,这样协作的恶意行为更具隐蔽性,更难被检测。
Figure 5 Malicious behavious detected图5 各系统机制中出现的恶意行为
例如,应用程序0d90ccfae4bb1ad17dd55768f-380406ef3b0eced.apk(欢乐斗地主)检测出一条隐私窃取的恶意行为。通过人工确认,该应用程序中确实存在这种行为。函数调用过程为:
MainService$SMSReceiver.onReceive@VLL
→MainService.access$7@VLLL
→MainService.sendSMS@VLL
→Sms Manager.send Text Message@VLLLLL
在这个函数调用过程中使用函数Sms Message.get Display Originating Address@L读取游戏期间发送短信的源地址,即发送该短信的用户手机号码,最后使用Sms Manager.send Text Message@VLLLLL将该信息发送出去。
本文从指令级和函数级两个不同粒度上对Android应用程序进行模拟执行。在指令级上模拟构建函数摘要,在函数摘要上模拟并结合恢复的程序结构和先验的特殊机制处理,完成对应用程序危险机制中的恶意行为检测。基于上述方法实现了一个原型系统,并通过检测恶意样本,进一步验证了Android提供这些便于开发的机制,在不当使用时便成为危害用户的危险机制。我们将进一步研究如何提高这些机制的安全性。
[1] Gartner says worldwide smartphone sales soared in fourth quarter of 2011 With 47 percent growth[EB/OL].[2012-02-15]http://www.gartner.com/it/page.jsp?id=1924314.
[2] IDC.Android Rises,Symbian 3 and Windows phone 7 launch
as worldwide smartphone shipments increase 87.2%year over year[EB/OL].[2011-02-07]http://www.idc.com/about/viewpressrelease.jsp?containerId=pr US22689111.
[3] Google android[EB/OL].[2012-02-15].http://www.android.com/.
[4] Bell D.Samsung Galaxy Tab Android tablet goes official[EB/OL].[2010-09-02].http://news.cnet.com/8301-17938_105-20015395-1.html.
[5] GIZMODO[EB/OL].[2010-06-21]http://gizmodo.com/5568458/toshiba-ac100-netbook-runs-androidand-has-massive-seven-days-of-standbybattery-life.
[6] Notion Ink.Adam Tablet[EB/OL].[2011-02-07].http://www.notionink.in/.
[7] Google Play[EB/OL].[2012-03-14].https://play.google.com/store.
[8] App Store[EB/OL].[2012-03-14].http://itunes.apple.com/gb/app/apple-store/id375380948?mt=8.
[9] Egele M,Kruegel C,Kirda E,et al.PiOS:Detecting privacy leaks in iOS applications[C]∥Proc of the 18th Annual Network and Distributed System Security Symposium,NDSS’11,2011:29-33.
[10] Fuchs A P,Chaudhuri A,Foster J S.SCanDroid:Automated security certification of Android applications[EB/OL].[2012-03-14].http://www.cs.umd.edu/~avik/papers/scandroidascaa.pdf.
[11] Enck W,Octeau D,McDaniel P,et al.A study of Android application security[C]∥Proc of the 20th USENIX Security Symposium,2011:21.
[12] Zhou W,Zhou Y,Jiang X,et al.Droid MOSS:Detecting repackaged smartphone applications in third-party Android marketplaces[C]∥Proc of the 2nd ACM Conference on Data and Application Security and Privacy,2012:317-326.
[13] Activity[EB/OL].[2011-02-07].http://developer.android.com/intl/zh-CN/guide/components/activities.html.
[14] Android NDK[EB/OL].[2011-02-15].http://developer.android.com/tools/sdk/ndk/index.html.
[15] DexClass Loader[EB/OL].[2011-02-15].http://developer.android.com/reference/dalvik/system/Dex Class Loader.html.
[16] Baksmali[EB/OL].[2011-02-15].http://code.google.com/p/smali/.
[17] IDA Pro[EB/OL].[2011-02-15].http://www.hex-rays.com/products/ida/index.shtml.
[18] Zhou Y,Jiang X.Dissecting android malware:Characterization and evolution[C]∥Proc of the 33rd IEEE Symposium on Security and Privacy(2012),2012:95-109.
[19] Android application development documentation[EB/OL].[2011-02-07].http://developer.android.com/intl/zh-CN/develop/index.html.