基于污点传播动态分析的Android安全系统研究
2017-01-12潘志安
潘志安
摘 要: 随着移动互联网的飞速发展,Android系统得到了大量用户和开发人员的青睐。针对Android系统的恶意软件层出不穷,由此引发的危害也越来越严重。目前针对Android系统应用程序的检测多采用静态分析技术,通过分析代码发现其恶意行为,因此准确度并不是很高,而且对于新的恶意软件变种的检测存在较多问题,而动态分析技术恰好可以弥补这一不足。基于污点传播的动态分析技术,在应用程序运行时监测其行为并记录相关信息进行分析,确定其是否具有恶意软件性质。不仅对系统运行负载较小,也便于系统移植进行多平台的开发测试。
关键词: Android系统; 恶意软件; 动态分析; 污点标记
中图分类号: TN929.5?34; TM417 文献标识码: A 文章编号: 1004?373X(2016)23?0039?04
针对目前Android系统恶意软件检测技术的研究现状,对Android 安全监控系统进行了研究和设计,在应用程序框架层和Dalvik虚拟机层监控、记录应用程序行为的方式,构建了新的污点传播监控系统,跟踪被污点标记的敏感数据在系统中的传播过程并进行信息记录分析,确定应用程序行为是否具有恶意软件性质。
1 系统结构
监控系统的总体设计结构如图1所示。本系统基于Android 4.1.1系统和Pandaboard 内核设计。通过对系统的Dalvik虚拟机和应用程序框架层的修改,实现了污点数据定义、污点数据标记、污点标记传播、污点标记提取和应用程序行为分析等功能。
在图1中,污点数据定义模块的功能是定义和存储敏感数据源类型,用于污点标记不同类型的数据;污点标记模块在应用程序调用系统API进行数据操作时对其读取的敏感数据类型进行污点标记;污点传播模块在应用程序和系统组件之间的传递依靠系统中的Binder IPC完成;污点标记提取模块负责在污点数据到达目标应用程序时记录污点传播路径;最后通过应用程序分析模块筛选Android系统中logcat应用程序的相关行为信息并输出。
2 系统详细实现
2.1 污点数据定义模块
针对污点数据源dalvik\vm\interp\Taint.h和dalvik\ src\main\java\dalvik\system\Taint.java,Taint.java的作用在于提供Dalvik虚拟机的污点接口,并在taint类中声明污点数据源的定义,其代码如下所示,其中TAINT_CLEAR表示为空值。
public static final int TAINT_CLEAR =0x00000000; //空值
public static final int TAINT_LOCATION = 0x00000001;
//位置
public static final int TAINT_CONTACTS = 0x00000002;
//联系人
public static final int TAINT_MIC = 0x00000004; //话筒输入
public static final int TAINT_PHONE_NUMBER= 0x00000008; //电话号码
public static final int TAINT_LOCATION_GPS= 0x00000010; //GPS
public static final int …
将污点数据源定义为32位值的原因在于Android系统的应用程序运行在Dalvik虚拟机中。Dalvik虚拟机是Google专门为Android平台开发的Java虚拟机,但是它不兼容java字节码格式,而是首先将java应用程序转换成.dex格式再执行。因此需要将污点数据源定义为.dex文件中的数据类型。
在Taint.java文件中完成污点数据源的声明之后,需要在Taint.h文件中完成污点数据源在Dalvik解释器中的定义。首先对污点数据类型进行了定义,其结构体为:
typedef struct Taint { u4 tag; } Taint;
在完成污点数据源的定义之后,就可以进行Dalvik虚拟机和应用程序框架层的修改,完成污点监控系统的其他功能。
2.2 污点数据标记模块
通过分析Android系统架构发现,要实现污点数据标记功能应该在Dalvik虚拟机层完成,但是又涉及到应用程序框架层API的改动,因而需要使用JNI技术。通过JNI技术,Java程序中的函数可以调用本地语言,例如C/C++等语言编写的函数,而本地语言中的函数方法也可以调用Java层的函数。在本监控系统中,具体的方法实现是:首先在Java类使用native关键字声明本地的方法并作为类的静态成员;之后通过编译生成.class文件和.h头文件,在C/C++语言中完成具体的实现方法;最后通过编译生成动态链接库lib*.so文件用于系统调用。整个流程如图2所示。
在对数据进行污点标记之前,需要了解Dalvik虚拟机中各种对象的存储方式。一个.dex文件通常需要由类加载器加载原生类和Java类,然后通过解释器根据指令集对Dalvik字节码进行解释和执行。在加载具体的类之前,需要使用mmap函数对.dex文件进行解析,将.dex文件映射到内存中即可进行读/写操作。在完成文件解析之后,需要加载class,而加载的类则需要ClassObject数据结构存储。
在完成函数声明之后,在dalvik\vm\native中新建dalvik_system_Taint.cpp,完成上述两个函数的定义。
在完成了Dalvik虚拟机层的修改之后,还需要对应用程序框架层中的API进行修改。首先通过恶意软件样本得到了恶意软件经常调用的API,如表1所示。
表1 Android恶意软件常用API示例
[API\&说明\&addPermisson() \&为系统增加一个权限\&getCellLocation()\&获取当期设备位置\&getDeviceId() \&获取惟一的设备 ID\&getSimState()\&获取 SIM 卡状态\&sendTextMessage()\&向单个收件人发送短信息\&sendBoradcast()\&向接收器广播消息\&]
对应用程序框架层API的修改主要在Cursor包装库,短信息管理类以及获取设备信息管理等类。其中CursorWrapper类是Cursor类的包装类。它提供了多种对数据库查询结果进行访问的接口方法,因此可以通过修改Cursor类Wrapper类,使得任何调用该类的函数对象都会被进行污点标记,其实现方法为:首先在CursorWrapper类中定义进行污点标记的功能函数;之后修改getString()等方法。
getString()方法用于接收参数,其返回值同样也为String类型。此方法多用于从Android系统数据库中获取查询结果,因此通过修改该方法,将污点标记功能嵌入其中,即可实现对数据库查询结果中String类型数据的污点标记,其实现代码为:
public String getString(int columnIndex)
{
//开始污点标记
String retString = mCursor.getString(columnIndex);
if(taint_ != Taint.TAINT_CLEAR)
{
Taint.addTaintString(retString, taint_);
}
//结束污点标记
return retString;
}
由于针对Android系统原生的API的扩展,因此在完成修改之后,需要更新frameworks/base/api/下的current.txt文件,使得修改后的API生效,操作命令为在编译Android系统之前,在终端输入make update?api。
2.3 污点数据传播模块
在Android系统中,有关Binder的实现在各个层都有,主要的Binder库由本地原生代码实现。Java和C++层都定义有相同功能的Binder接口,供应用程序使用,他们实际都是调用原生Binder库的实现。Binder的系统架构如图3所示。
在源代码中定义了Parcel类,并对当前数据位置读取寄存器中值的方法定义进行了修改:
public final int readInt()
{
//开始污点数据追踪
int start = dataPosition();
int val1 = nativeReadInt(mNativePtr);
int end = dataPosition();
int len = end ? start;
int tag = getTaint(start, len);
int val2 = Taint.addTaintInt(val1, tag);
return val2;
//结束污点数据追踪
}
同时在cmds\servicemanager\binder.c下添加在数据传输时进行污点标记的命令函数。在完成IPC的污点设计之后,系统需要对应用程序框架层的API进行修改。以读取视频数据为例,在源代码中插入了污点追踪代码。
2.4 污点标记提取模块
污点标记的提取发生在污点数据到达目标应用程序时,与敏感数据离开应用程序时进行污点标记类似,可以通过扩展应用程序框架层和Dalvik虚拟机中的相关函数,完成污点标记的提取。在完成Dalvik虚拟机污点标记提取的功能之后,需要扩展应用程序框架层API功能,使其可以根据污点标记的来源判断应用程序行为是否属于恶意行为。
以发送短信方法SmsManager为例,由于Android系统中发送短信和数据都要使用SmsManager类的API,因此经常被恶意软件调用,将用户敏感信息发送给远程主机或者直接发送短信息到高额扣费号码。通过扩展SmsManager类中sendTextMessage方法,使其可以判断变量类型的来源。
2.5 应用程序分析模块
在整个监控系统完成之后,就可以将Android应用程序放入该系统中运行。在程序运行期间记录其操作,并输出到系统外部。因此该模块设计分为两部分。
2.5.1 Logcat输出日志
Logcat是Android系统中集成的一个命令行工具,Android系统日志存储在循环缓冲区中,通过logcat就可以记录和查看这些系统信息,其默认命令为[adb] logcat [
每一个输出的Android日志信息都有一个标签和优先级,Android系统中默认的标签其优先级由高到低分别为Verbose,Debug,Info,Warning,Error,Fatal,Silent。其中最高级的Silent一般没有信息输出。监控系统经过改造之后,在logcat中新增了taintlong标签,通过adb logcat dalvikvm:W OSNetworkSystem:W*:S以及进一步操作,就可以在logcat日志中提取出污点数据传播的相关信息。
2.5.2 自动化程序安装测试
要运行应用程序,首先要启动其主活动main avtivity。在Android应用程序中,AndroidManifest.xml描述了main activity等信息。因此系统首先通过Python语言中的zipfile模块解压apk文件,然后通过AXMLPrinter对AndroidManifest.xml进行读取。通常定义为“android.intent.action.MAIN”标签的活动即为其main activity。
3 系统测试及结果分析
测试环境基于Ubuntu 12.04系统,Android系统为修改后的4.1.1版本。同时为了移植到Pandaboard进行测试,需要下载适用于Pandaboard的OMAP?Panda内核。
在程序运行时,会自动完成发送SMS、网络访问、读写文件、解密以及拨打电话的功能。在程序运行时运行脚本collect.py,在Ubuntu系统终端可以获得应用程序的全部行为信息。
通过分析测试结果可以发现,该测试应用程序在运行时立刻拨打了电话,同时在后台启动了读取文件,并且未经用户允许在后台发送了短信。这些行为均会被恶意软件滥用,给手机用户带来严重损失。同时该应用程序开启了大量服务,对系统运行也会造成一定的负担。
通过查看该测试样本源代码中声明的相应功能和测试结果相对比,可以看出本系统能比较准确地反映样本的行为特征,其中写文件、向网络发送数据及信息泄露是恶意软件的常见特征。
由于本系统对Android原生系统进行了修改,运用动态分析技术监测应用程序的行为特征,因此会对系统运行性能产生一定影响。本系统的性能评测标准包括开机时间、程序启动时间和测试样本从运行到首次记录到行为信息的时间。
首先针对系统进行开机时间测试。一共进行了5次测试,每次的开机时间如表2所示。
通过表2可以发现,原生系统平均开机时间为50.2 s,监控系统平均开机时间为53.4 s,性能下降6%。由于监控系统主要针对Dalvik虚拟机和应用程序框架层的修改,未对系统内核进行修改,在开机启动方面监控系统与原生系统相差不大,同时对系统运行稳定性未造成影响。
系统运行应用程序的时间测试,包括载入APK、创建联系人、拨出电话和拍照四个方面,测试结果如表3所示。
通过表3可以发现,监控系统在进行相关操作时所用时间均大于原生系统,这是因为在进行相应操作时还需要进行污点标记的功能,但是整体上未对系统带来大量负载。值得注意的是,在进行拍照操作时,监控系统比原生系统多耗费了47%的时间,这主要是因为拍照操作需要进行额外的针对文件的污点标记。
通过表4可以发现,不同应用程序首次获得行为信息的时间差距很大,这是由应用程序完成的不同功能导致的。总体而言,监控系统可以较快地响应和记录程序运行期间的行为。
4 结 论
本文应用基于污点传播的动态分析技术,针对目前Android系统面临的隐私泄漏、恶意扣费等安全威胁,设计了基于行为分析的Android安全监控系统。测试结果表明,该系统可以发现并记录绝大部分恶意软件的行为信息,并且运行稳定能较快地响应应用程序行为进行记录。
目前使用沙箱进行动态分析,采用的是单线程的方式,导致分析的效率还不够理想,因此下一步还需要研究使用多线程方式一次分析多个程序的可行性。
参考文献
[1] 刘洪涛.基于Android系统的安全防护软件设计与实现[D].天津:南开大学,2011.
[2] YEUNG D Y, DING Y X. Host?based intrusion detection using dynamic and static behavioral models [J]. Pattern recognition, 2003, 36(1): 229?243.
[3] 丰生强.Android软件安全与逆向分析[M].北京:人民邮电出版社,2013.
[4] PAYET E, SPOTO F. Static analysis of Android programs [J]. Information and software technology, 2012, 54(11): 1192?1201.
[5] 张宏飞,包睿,李超.工业自动化监控系统中PLC技术的应用研究[J].现代电子技术,2015,38(11):150?151.
[6] 任肖丽,陈佳喜,王骥.基于GPRS技术在线环境监测系统的研究[J].现代电子技术,2015,38(4):60?62.