Android软件静态分析技术研究进展
2014-10-27郁峰
郁峰
摘 要:通过介绍基于Linux内核的Android操作系统所面临的被恶意软件威胁的现状,引出静态分析。本文首先介绍了静态分析的对象、常用的静态分析方法及分类,然后从静态分析的一般流程和常见恶意行为的静态分析以及分析中存在的问题方面介绍了静态分析研究的现状,最后根据静态分析的现状和特点提出了进一步研究的方向。
关键词:Android应用;惡意行为;静态分析
近几年,Android的发展极为迅猛,这除了相关产品强大的功能与丰富的应用外,更是因为它优良的性能表现吸引着用户。随着Android的兴起,基于Android平台的应用需求也越来越复杂,形形色色的软件壮大了Android市场,也丰富了我们的生活,给我们的生活带来了极大的便利。事情有利有弊,恶意程序泄露用户隐私信息、恶意扣费、破坏系统的事件屡见不鲜,Android系统的安全逐渐成为了研究的热点。
如今Android平台的逆向分析主要应用于恶意代码检测,从根本上来说这是对逆向技术的一种合理运用和发展。Android平台的逆向分析技术,主要分为静态分析和动态分析两类。静态分析和动态分析是相对的概念,动态分析需要观察软件实际运行的情况,而静态分析只需要从一个正常工作的软件出发,分析的对象是该软件的源码。
1 问题描述与定义
静态分析是指不运行代码的情况下,采用词法分析、语法分析等各种技术手段对程序文件进行扫描从而生成程序的反汇编代码,然后阅读反汇编代码来掌握程序功能的一种一种技术,在实际的分析过程中,完全不运行程序是不现实的,需要通过运行目标程序来寻找程序的突破口。静态分析强调的是静态,在整个分析过程中,阅读反汇编代码是主要的分析工作。
1.1 静态分析对象
Android应用程序的后缀的.apk,APK文件其实是zip格式的文件,可以使用Winrar打开,得到它的目录结构。如图1所示,主要包括五个部分,一是META-INF目录,用来存放签名信息,保证apk包的完整性和系统安全;二是res目录,用来存放资源文件,包括程序图片等内容;三是AndroidManifest.xml文件,用来描述应用的名字、版本、权限和引用的库文件等信息;四是class.dex文件,是java源编译后生成的java字节码文件;五是resources.arsc文件,是编译后的二进制资源文件[1]。在这五个部分中,最重要的是AndroidManifest.xml和class.dex文件。我们可以通过对应用程序的AndroidManifest.xml反编译后进行分析,得到该程序运行的权限设置等信息,分析该程序的恶意行为。同样的可以通过反编译class.dex文件得到程序源码,对程序进行分析。
1.2 静态分析方法
Android静态分析主要在于恶意代码的匹配及信息泄露等,Android源码的量非常大,如何对问题代码快速定位是分析Android源码的基础。主要的分析方法[2]:
⑴信息反馈法是指先运行目标程序,然后根据目标运行时给出的反馈信息作为突破口寻找关键代码。通常情况下,程序中用到的字符串会存储在String.xml文件或者硬编码到程序代码中,如果是前者,字符串在程序中会以id的形式访问,只需在反汇编代码中搜索字符串的id值即可找到代码处;如果是后者的话,在反汇编代码中直接搜索字符串即可。
⑵特征函数法,无论程序做出任何动作或者反馈,都需要调用Android SDk中提供的相关API函数来完成的。
⑶顺序查看法是指从软件的启动代码开始,逐行的向下分析,掌握软件的执行流程。
1.3 静态分析分类
静态分析根据分析对象的不同,主要分为二进制程序分析和源代码分析[3]。对二进制程序进行分析,通过比较二进制文件中是否包含恶意行为特征码,判断程序是否具有恶意行为。对二进制文件进行特征码分析,只能针对已经出现的病毒、木马进行查杀,不能检测未知病毒,面对不断出现的新病毒或病毒变种,必须不断更新病毒库。源代码分析,是指分析软件的源代码,通过与预先定义的引起恶意行为的API调用进行比对,判断程序中是否含有恶意行为。以“恶意扣费”为例,引起扣费行为的发生,往往是由于恶意应用以发送短消息的方式,注册了相关的SP服务。分析Android应用反编译后的源代码,通过查询源代码中是否包含发送短消息相关的API调用,并判断相应的API 参数,是否为某些特定SP服务注册码,从而检测Android 应用中是否包含“恶意扣费”等行为。
分析Android应用反编译后的源代码,由于源代码逻辑结构更为清晰,查找更精确。引起恶意行为发生是相关的API调用导致的,而无论恶意行为如何变种,在源代码中都必须调用关键的底层系统API。对源代码进行检测,只需查找关键的系统API调用进行判断,对于不断更新的病毒、木马变种,并不需要频繁地更新相应的检测规则。
2 静态分析技术研究现状
目前在对Android程序进行静态分析时,主要采取以下两种方法:一是阅读反汇编生成的Dalvik字节码,可以使用IDA Pro分析dex文件,或者使用文本编辑器阅读baksmali反编译生成的smali文件;二是阅读反汇编生成的java源码,可以使用dex2jar生成jar文件,然后使用jd-gui阅读jar文件的代码。
2.1 静态分析的一般流程
2.1.1 Android软件预处理
在静态分析过程中获得反汇编代码是主要的分析工作,首先要选取一个强大的反汇编工具,本文选取的是开源的Dex2jar工具。Dex2jar采用d2j-dex2jar ***.apk命令获得java字节码,获得java字节码后就可以通过反编译工具jd-gui直接以源码的形式显示jar文件中的内容。在反编译得到的文件中包含AndroidManifest.xml文件和java源代码,在xml文件中获得源码的元信息(包括Activity、Service等的注册信息和入口)和权限申请信息。Android软件预处理的流程如图2所示。
一个Android程序由一个或多个Activity以及它的组件构成,不同的Activity实现不同的功能。每个程序有且只有一个主Activity,也是程序启动和显示的第一个Activity。在程序中使用到的Activity都需要在AndroidManifest.xml文件中手动声明,声明Activity使用的activity标签。在反编译出的AndroidManifest.xml中找到主Activity后,可以直接去查看其所在类的OnCreate()方法的反汇编代码,對大多数软件来说,这就是程序的代码入口,所有的功能都从这里开始得到执行,然后可以追踪软件的执行流程。
2.1.2 控制流图生成
抽象语法树(AST)作为程序的中间表现形式,是基于JavaCC工具得到的,在经过对源码预处理,然后经过词法语法分析得到的。能够直观地表示出源程序信息,存储效率高,但是无法表示复杂的控制流信息,如选择、循环语句。可以基于抽象语法树得到源码的控制流图和数据流以及函数调用图,以便进行静态分析。控制流图是程序的中间表示形式,作为函数依赖分析、控制流分析和数据流分析的基础,可以很好的反映语句以及模块之间的调用和执行流程。控制流图生成流程如图3所示。
2.1.3 安全规则解析
解析安全规则[4],查找规则中定义的关键API调用,以及API调用和某个参数、返回值或某些资源的关系,从而判别安全问题的存在。安全分析规则,一般规定对程序中关键信息元素的约束,如关键类、关键方法等。如果类、方法的相应属性符合规则定义的约束条件,则报告分析结果。规则的内容上主要涉及自动耗费、隐私窃取、系统破坏等常见恶意行为。
2.2 Android软件常见恶意行为的静态分析
基于java编写的Android应用程序,有着移动终端普遍的安全问题。具体的恶意行为可分为以下几类[5]:
2.2.1 耗费用户钱财行为
这些行为包括没有用户提示自动连接网络、自动发送短信息、自动拨号等。查找连网行为,可以通过查找网址URL字符串以及Android执行连网行为的关键API调用进行判断。针对此类恶意行为,可以分析程序方法间依赖关系,通过定位在执行网络连接前,是否弹出对话框等,提示用户有网络连接行为,判断在程序在执行时是否有用户提示。
2.2.2 窃取用户隐私行为
涉及未经用户许可读取个人隐私数据,包括短信息、Email电子邮件、通讯录、通话记录、日程安排、多媒体资料和手机IMEI标识,以及监控、记录、处理话音记录,启动GPS全球定位系统监控物理位置并将其发送到特定网站等。
进一步考虑下面获取手机IMEI标识,并将其发送到特定网站的恶意代码:
TelePhonyManager tm=(TelePhonyManager)getSystemService(”phone”);
String userld=tm.getDeviceld();
URL url=newURL(“http://www.myweb.com.cn:80?id=”+userld);
url.openConnection();
首先可以通过查找关键API调用定位到程序的第3、4行。程序首先定义了一个URL类的对象url,并调用url的openConnection方法企图进行网络连接。在URL类的构造函数中,以userId变量的内容作为“http://www.myweb.com.cn:80”URL的参数传递给网站,进一步分析,userId报讯的是通过调用telephonymanager对象的getDeviceId方法返回的结果,并且telephonymanager是利用TelephonyManager类调用其静态方法getSystemService(“phone”)获得的。由此得知,userId正是通过调用Android系统的API获得手机设备的IMEI标识。上述程序把手IMEI标识通过URL参数上传给指定网站。
此外,一些恶意代码也会调用Location类的getLatitude和getLongitude方法获取手机设备当前位置的纬度和经度,再作为URL参数发送给指定网站,这些可疑的恶意行为都可以根据上下文,查找关键API调用和参数变量的取值检测出。
2.2.3 破坏用户数据的行为
破坏用户数据行为包括删除用户数据,终止其他进程或系统服务的运行等。删除用户数据,包括删除以文件形式保存的系统文件、配置文件和数据文件,以及删除保存在数据库中的通讯录、日程、短信息记录等。对文件的删除,可以通过查找关键API调用并定位所要删除文件的绝对路径,判断是否属于系统文件。对数据库中记录的删除,通过查找程序中调用的SQL语句,并判断所要操作的数据库表是否是保存用户数据的表等。另外,如果程序在运行过程中,终止其他进程或系统服务的运行,造成对系统的破坏,也属于恶意行为。常见的系统服务,包括电话服务、通知服务、输入法服务、网络连接服务、声音服务、账户服务等。具有恶意行为的程序,会在程序运行过程中,枚举系统中当前正在运行的进程和系统服务,获取到进程或服务所在Package的名字,并将其作为参数调用系统API,终止进程或服务的运行。
为了防止恶意行为的发生,需要进行用户行为判别。对于自动连接网络、自动发送短信、自动拨打电话等恶意行为,检测系统应判断出连网、发送短信、拨打电话等行为是用户发起的,还是程序未经过用户许可,直接发起的请求。如果程序中使用了SMS、MMS、WII、WEB/WAP等敏感API,那么就需要对追踪信息进行分析,如果是用户提交的请求,那么认为调用是安全的;如果所调用的API并不是用户提交的,参数为敏感信息,那么就认为可能存在后门隐患。
2.3 静态分析中存在的问题
静态分析的目标就是在不运行待测程序的基础上分析程序的源代码或者Dalvik字节码,检测出程序中存在的恶意行为。静态分析需要获得源码、安全规则和模式库,并且分析效果的好坏往往取决于模式库和安全规则。对于已知恶意行为的检测能够做到高效、准确,但是在对恶意行为关键特征的搜集、提取并制定相应规则方面还需要进一步完善,目前的安全规则还不全面,某些恶意行为的实现方式会有很多种情况,并不仅仅局限于一些关键API的调用。由于在分析时不能考虑实际运行情况,因此需要分析所有的路径,误报率较高,会产生大量的分析结果,增加了分析的难度。如何提高静态分析的效率和准度是安全领域重要的研究方向。
3 进一步研究
随着Android安全问题日益突出,静态分析技术被运用得越来越广泛,这项技术也会更加成熟,结合静态分析技术的特点,今后的研究方向主要有:
⑴设计基于静态分析的Android应用程序恶意行为通用检测模型,集成各种静态分析方法,以提高静态分析的效率。
⑵不断完善安全规则,随着Android平台的不断发展,会出现更多的恶意行为,现有的安全规则还不完善,需要不断更新,与时俱进,才能提高静态分析的准确性,降低误报率。
⑶将静态分析与动态分析以及污点传播分析技术结合,设计一个自动化恶意软件检测系统。自动提取终端上的应用程序进行自动化分析,实现对应用程序的离线安全检查。
[参考文献]
[1]王世江,余志龙,陈昱勋,等.Google Android SDK 开发范例大全[M].第二版.北京:人民邮电出版社,2010.
[2]唐宇敬.Android平台下软件安全漏洞挖掘方法研究[D].邯郸:河北工程大学,2013.
[3]路程,张淼,徐爱国.基于源代码静态分析技术的Android应用恶意行为检测模型[J].中国科技论文在线.201111-54.
[4]余建,韩双霞,黄云龙.软件安全性的静态分析[J].计算机工程与设计,2006,27(8):1411-1414.
[5]路程.Android平台恶意软件检测系统的设计与实现[D].北京:北京邮电大学,2012.