APP下载

Android本地恶意应用鉴别系统的实现

2016-05-14廖元之

网络空间安全 2016年4期
关键词:安卓

【 摘 要 】 近年来,Android手机由于其出色的用户体验,吸引了大量的用户,同时也因为它的开源特性,也极易受到恶意软件的攻击,其中本地恶意软件尤为恶劣。论文针对Android平台上本地恶意应用软件,提出了基于代码基本块控制流比较的鉴别方法。通过代码中基本块的分离,控制流图的构造及其信息的抽象比较,设计实现了一套Android平台上本地代码恶意应用鉴别系统。

【 关键词 】 安卓;本地代码;控制流图

【 Abstract 】 In recent years, Android smart phone attracts many users owing to its brilliant user experience. Meanwhile, its vulnerable to malware because of its open-source characteristic, especially native code. A method was proposed to detect native malware based on the comparison of control flow graph of basic blocks. By the separation of basic blockscode, the construction of control flow graph and the comparison of the abstract of it, a detection system is designed and implemented that can identify native malware on Android platform.

【 Keywords 】 android; native code; control flow graph

1 引言

近年来,移动终端发展迅速,2011年,全球移动掌上设备数量达到了16亿,单单苹果系统和Android系统的用户在2011年到2012年间就从3800万涨到了8400万。2013年初,Android系统的用户的数量超越了包括苹果、塞班和黑莓在内的多种系统的用户数量。NetMarketShare网站2016年2月统计结果,Android系统占市场份额第一,为58.75%,iOS第二位为32.93%,而第三位的Windows Phone只有2.86%。

随着智能手机的普及,手机病毒也随之得到快速发展。McAfee的一份调查报告显示,其实验室2015年第一季度收集的手机病毒比2014年第四季度增长了13%,总共已经包含了4亿个病毒样本。而2015年第一季度出现的新型手机病毒比2014年第四季度增长了49%。 G DATA发布的《移动恶意软件报告-2015年3季度》显示,2015年第三季度发现恶意软件574,706例,与2014年同期相比,发现的新型Android系统恶意软件增长了50%。

而在各式各样的恶意软件之中,将恶意功能隐藏在本地代码中的恶意软件尤为恶劣。它的恶意功能由C/C++代码实现并编译成.so链接库,无法像Java源码一样被还原分析,给识别带来较大困难,所以某些不法人士对它青睐有加。目前恶意本地代码这一领域是Android平台应用安全一个不可忽视的环节,对其的研究分析具有极大的挑战性,有利于全面提高Android平台应用的安全性。

2 研究现状

目前主流的恶意软件分析主要还是对Java代码的研究分析,少有人真正去关注本地代码级别的恶意软件。而相对可行的鉴别本地代码恶意软件的方法是利用沙盒软件,将目标APP放入其中运行,观测其输入输出流有无可疑信息。但是这样的方法对于计算机资源的消耗量比较大。文献[5]提出了另外两种试行方法,本地代码隔离(Native Code Separation)和本地代码权限管理(Managing Native Code Permissions),并且制作出了原型,但是并未公开,并且这种方法难度比较大。文献[6]制作了将机器学习(Machine Learning)与传统手段相结合的病毒检测系统,在面对大量样本时,系统可以通过机器学习一定程度上自动识别新的病毒。实验表明其病毒检测成功率超过90%,但需要大量后台资源的支持。

另一类有效的方法是利用基本块控制流之间的异同进行检测,对控制流分析的分析研究已经有较长的一段时间,其在计算机的各个领域内都有重要作用。但是,对高级语言的控制流分析已趋近成熟,而对于汇编语言的控制流分析尚在摸索之中。文献[7]对不同类型的处理器的汇编指令进行了统一归类,创造性地提出了一种能够绘制汇编代码子程序流程图的通用算法,但其算法只能适用于单个基本块的控制流构造,未涉及基本块之间的控制流构造。文献[8]弥补了文献[7]的缺陷,为基本块之间的控制流构造提供了有效的思路和方法,但是并未屏蔽汇编代码中的数据部分,且控制流的构造过于繁琐复杂,对于本项目目标来说不完全适用。文献[9]利用其制作的gSpan系统进行代码恶意行为的控制流图形挖掘,然后通过比较其图形来计算其相似性,不足之处是其系统是针对JavaScript,且并未给出具体实现方式。Cyber Security实验中心的研究人员提出一种利用控制流图优化比较的方式来检测恶意软件,对于相同而多余的步骤合并之后生成控制流图,收集恶意代码控制流图并与目标比较从而判断其是否为恶意软件,虽然其方法依然是针对Windows平台的病毒,但对本系统来说有很相当大的借鉴意义。

本文结合以上方法,提出一种基本块控制流散列函数用于安卓本地恶意代码之间的比较,方便可用,高效便捷,并能有效的抵抗病毒的混淆攻击。

3 鉴别系统流程

目前对于原生恶意代码的研究很少,没有开发出高效率的能有效针对原生恶意软件的系统。尽管有些散落在各个角落里的走在行业前端的工程师已经在着手分析原生恶意代码,但大多只是基于ARM汇编语言的对汇编代码的静态分析,效率较低,不具普适性。一旦出现新的恶意软件,又要重新进行代码分析。现在常用的监测方式是基于沙盒(Sandbox)的动态监测方式,将目标APP置于沙盒之中模拟其运行环境,同时观测记录其输入输出信息,配合一定的静态分析,得到目标的函数调用列表,数据流向和行为信息。这是一种有效而广泛的监测方式。但是唯一的缺点是需要消耗大量的计算机资源,还需要对相关的知识有相当的理解以及一定的编程水平。相较于以上两种检测手段,本文提出基于基本块控制流比较的本地恶意代码鉴别系统的实现方法,如图1所示。

鉴别体系首先将目标APK反编译,得到其中本地代码链接库,再利用此链接库反编译之后得到的.gdl文件提取基本块控制流信息,之后将提取出的信息与病毒库中已存的病毒控制流信息相对比来判断其是否是一个恶意软件。

3.1 本地代码链接库

Android NDK全称是Android Native Development Kit,Android程序是运行在Dalvik虚拟机中的,而NDK则使得用户能够使用C/C++原生代码执行部分程序功能。随着Android行业的发展,对Android程序安全性的要求越来越高,而Android中的Java层代码很容易被反编译并破解分析,NDK中提供的C/C++代码则相反,极难反编译。目前大部分的开源库也是使用C/C++代码编写,使用NDK调用这些第三方库能够较少程序员自身的负担并且方便移植共享。

由C/C++编写的程序在Android NDK提供的交叉编译工具链中的gcc编译器编译之后,就变成了.so文件。.so文件是Linux下的共享函数库,对应于Windows下的.dll文件,它存在于APK反编译文件夹下的LIB文件夹中,根据处理器型号的不同又会存放在不同的子文件夹下。本病毒检测系统重点关注的就是此.so文件。

3.2 控制流图

本系统的病毒检测主要是依靠基本块以及由基本块生成的控制流图。

基本块(Basic Block)是一段线性代码序列,除了入口和出口以外不含任何的分支。控制流从基本块的开始处进入,从其出口离开,控制流在其内不会停滞亦不会出现分支,直到离开本基本块。基本块的划分规则为:2条相邻的指令若在同一基本块中,当期仅当前一条指令被执行后,后一条指令才会被执行。

控制流图(Control Flow Graph,CFG)是基于基本块而画出的表示程序流动向的有向图,每个函数的控制流图只有一个入口,但可以有多个出口。如图2所示,图中每个圆圈代表一个基本块,箭头则表示控制流的变化方向。

下一个任务就是将.so文件中所包含的各个函数的CFG信息抽象出来成为一个集合,作为其基本块信息,并进一步连接操作码序列以实现基本块信息的压缩存储。收集多种病毒的基本块信息之后存储在本地作为病毒库,在面对未知APK时则将其中的.so文件进行同样的操作,然后与病毒库中包含恶意功能的样本进行对比,在相似率达到预设阈值时即可认为其也包含恶意功能。

3.3 构建块控制流图并生成块信息

整个流程的关键是如何生成函数的CFG以及如何抽象其中的结点信息。ida pro这个工具直接提供了函数CFG生成的方法。图3是ida中的汇编源码及其生成的CFG。

利用IDA自带的IDC脚本语言将函数CFG保存在本地,再用文本格式打开发现其中包含了此图中所有的结点构造信息和汇编级代码:

将基本块中每条操作码的前三位提取出来集合作为这个基本块的抽象信息。ARM汇编语言中大多出操作码为三位,少部分操作条件复杂的为五位,以及几个跳转操作为一位或者两位。若单纯的提取操作码会冗余出许多不必要的信息,而将截取的位数降低过多,操作码的区分度将大幅度降低。取三位也能很好的将需要特别关注的跳转指令与数据操作指令区分开。

3.4 判别检测

对于一个未知APK,使用Apktool工具对其进行反编译,在LIB文件下可以找到对应的目标.so文件。将IDAPro打开,导入libnative.so。在这里使用自己编写的IDC小脚本导出此实例内所有函数的CFG,之后会在so文件同一目录下生成所有函数的.gdl文件。

接下使用基本块信息提取程序对这些CFG文件进行操作。得到一个sample.txt,其中内容如图5所示。每一行都是一个基本块的抽象信息。接着使用基本块信息比较程序比较目标样本和病毒库中样本。比较算法采用的是字符串匹配算法,对于每一条基本块信息,遍历病毒比较样本中所有基本块信息,直到找到相同的为止。记录下有相同基本块信息的基本块数,最后与基本块总数相除得到该样本与病毒库中特定样本的相似度。

4 实验结果

实验采用AndroidMalShare官网49个家族共1260个恶意病毒样本,其中8个家族大范围使用了本地代码作为恶意功能的载体。统计结果如表1:

在这8个家族之中,DroidDream是AnserverBot和BaseBridge的升级版,他们使用的本地代码完全一致。同样,KungFu家族4个版本的本地代码也几乎完全一样。于是,基于本地代码恶意功能即可简单分为三类:DroidDream、KungFu和zHash。表2是几个样本的对比结果。

对于相似值(Similarity-a, Similarity-b),定义如下:

Similarity-a = 目标样本与病毒基本块控制流信息相似条数/目标样本基本块控制流信息条数*100%;

Similarity-b = 目标样本与病毒基本块控制流信息相似条数/病毒基本块控制流信息条数*100%;

因此每个样本与每个病毒相互之间有一对数据。

假设病毒中的代码功能为集合v,目标样本功能为集合t:

(1)若t=v,那么Similarity-a=Similarity-b=100%;

(2)若v∈t,那么Similarity-a

(3)若t∈v,那么Similarity-b

综上所述,取(Similarity-a,Similarity-b)中的Similarity-b作为判断目标样本是否为病毒的数值依据。由此,表2可以简化为表3。

可以看到,Sample1与KungFu家族病毒样本有极高的相似性,显然是KungFu病毒家族的一员。而余下样本与三种家族的病毒相似率均不高,并不是病毒。事实是,Sample1正是在AndroidMalShare官网所下载的KungFu病毒的一种,而余下病毒则是在Android应用官网首页上下载的几个普通APP。实验证明病毒检测系统运行良好。

5 结束语

本文提出的Android本地恶意代码检测系统,基于汇编级代码基本块控制流的抽象散列函数的比较。抽取了基本块控制流的基本特征,忽略了函数内部数据定义运算细节,能够有效对抗病毒代码的混淆等一系列抗检测手段。作为轻量型病毒检测系统,可提高企业或组织内的病毒检测的效率。

参考文献

[1] Market Share Statistics for Internet Technologies.http://www.netmarketshare.com/.

[2] McAfee Labs Threats Report,May 2015.http://www.mcafee.com/us/resources/reports/rp-quarterly-threat-q1-2015.pdf.

[3] G DATA移动恶意软件报告-2015年3季度.https://www.gdata-china.com/news/article/article/mobile20160219.

[4] 丰生强.Android软件安全与逆向分析[M].北京:人民邮电出版社,2015.

[5] Mengtao Sun,Gang Tan.NativeGuard: protecting android applications from third-party native libraries.WiSec '14: Proceedings of the 2014 ACM conference on Security and privacy in wireless & mobile networks.July,2014.165-176.

[6] Zhenlong Yuan,Yongqiang Lu,Yibo Xue.Droiddetector: android malware characterization and detection using deep learning.Tsinghua Science and Technology,2016,21(1):114-123.

[7] 周博,蒋烈辉,费勤福.汇编子程序流程图绘制算法研究[J].计算机应用与软件,2007,24(1):160-171.

[8] 窦增杰,王震宇,陈楠,王瑞敏,田佳.基于可执行代码中间表示的控制流分析[J].软件技术与数据库,2010,36(21):31-36.

[9] Chang Choi,Xuefeng Piao,Junho Choi,Mungyu Lee,Pankoo Kim,Malicious behavior pattern mining using control flow graph.RACS Proceedings of the 2015 Conference on research in adaptive and convergent systems.October,2015.119-122.

[10] S. S. Anju,P. Harmya,Noopa Jagadeesh,R. Darsana.Malware detection using assembly code and control flow graph optimization.A2CWiC '10: Proceedings of the 1st Amrita ACM-W Celebration on Women in Computing in India.September 2010.Article No.65.

[11] AndroidMalShare, http://andromalshare.androidmalware.org:8080/#home.

[12] Rafael Fedler,Marcel Kulicke,Julian Schütte.Natice Code Execution Control for Attack Mitigation on Android.SPSM '13: Proceedings of the Third ACM workshop on Security and privacy in smartphones & mobile devices.November,2013,15-20.

基金项目:

江苏省大学生科技创新训练计划(stitp)资助(项目编号:SZD2015008)。

作者简介:

廖元之(1995-),男,江苏南京人,南京邮电大学,本科在读生;主要研究方向和关注领域:Android平台病毒防治。

猜你喜欢

安卓
四大重要升级安卓13正式定档
安卓应用64位的问题
安卓内存巨大为何还要杀后台
安卓12预览版体验
在Windows 11中玩转《安卓》App
安卓11正式发布
让iPhone变安卓,这是真的野
文物表情包
安卓系统的更新换代
封闭的安卓没有未来