APP下载

Android系统中恶意代码的动态检测技术研究

2017-03-27李博亚

关键词:调用应用程序代码

李博亚, 薛 质

(上海交通大学 电子信息与电气工程学院,上海 200240)

Android系统中恶意代码的动态检测技术研究

李博亚, 薛 质

(上海交通大学 电子信息与电气工程学院,上海 200240)

随着手机普及程度的日益提高,人们对智能手机的依赖性加重,手机的安全性问题变得愈加突出.根据Android安装包(APK)文件的权限调用和Android系统的应用程序接口(API)函数调用情况,设计了一种基于API拦截技术的检测恶意代码的动态检测方法.实验结果表明,该方法可以有效检测并报告Android系统中的恶意代码.

Android; 应用程序编程接口; 恶意代码; 动态检测

0 引 言

随着科学技术的进步与发展,智能手机已成为人们身边不可或缺的设备,在功能不断完善发展的同时,其性能也日新月异.现在,手机不仅用于通讯,而且可以存储照片、文件、视频等隐私敏感信息.由于移动支付技术的不断发展,智能手机现在还充当着人们的“钱包”.然而,随着智能手机应用性的增加和功能的不断完善,有关隐私信息的安全性问题也愈加突出.根据赛门铁克2016年度安全报告(ISTR2016)显示:2016年,在移动平台上利用恶意代码进行隐私窃取的相关攻击数目增加了200%,达到了数千万起[1].欺诈者利用各种漏洞攻击和改写APP安装文件,并向手机中植入各类恶意代码,对用户的手机进行攻击并获取各类隐私信息.而在各类平台中,Android系统因为其开源的特性和开放度更大的用户体验获得了最大的市场占有率.由于Android平台高度开放,保障系统安全性便成为了难题,在截获的各类恶意代码和恶意软件中,拥有75%市场占有率的Android平台智能设备吸引了98.05%恶意软件的关注[2].因此,研究解决基于Android系统的智能设备的信息安全问题就显得愈加急迫,并且受到越来越多的关注.本文作者根据Android安装包(APK)文件的权限调用和Android系统的应用程序接口(API)函数调用情况,设计了一种基于API拦截技术的检测恶意代码的动态检测方法,实验发现该方法具有一定可行性.

1 恶意代码的检测分析技术

恶意代码是指那些对程序运行没有帮助,却对系统安全产生危害的代码,包括病毒攻击、隐私窃取、远程控制、流氓行为等类型.恶意代码的分析和检测是为最终清除恶意代码进行准备和提供依据.根据分析方法不同,目前恶意代码的检测方式大致可以分为两种,静态检测和动态检测[3].

1.1 静态检测方法

静态检测方法,即特征码匹配检测方法,是目前最主流,也是各大杀毒软件普遍采用的恶意代码检测分析技术.这种方法并不在手机上实际运行恶意代码或者安装恶意软件,而是通过反编译技术,在安全环境中对包含可疑代码的文件进行代码分析,并将特征码写入经过分类的特征数据库中.在通过查杀测试之后,把数据库上传到服务器中,供装有手机安全软件的用户进行下载更新,用户在使用该安全软件对手机进行扫描时,软件会以手机中的文件和程序作为目标,将在本地设备上获得的应用程序的特征码与特征码库进行匹配扫描,从而达到检测恶意软件和代码的目的.

静态检测方法具有较高的识别率和较快的扫描速度,但是也有很多缺点,例如,恶意代码特征码的提取需要人工识别,反编译工程量很大,特征码匹配检测可能存在对某些软件代码误报的情况,对于采用混淆代码、加壳并且变型等手段进行掩饰的恶意代码很难精准识别等.随着技术的发展,恶意代码的变换型式会不断增多,这样的匹配检测方式会消耗更多的软、硬件资源.

1.2 动态检测技术

动态检测技术,即基于被检测软件的行为进行检测的技术,该技术是把目标软件置于特定的封闭安全的环境下运行,并且模拟随机边界条件,对软件运行行为进行监控,同时对于其运行特征和权限调用进行评估,以达到对于目标软件性质做出判断的目的.

动态检测方法没有静态方法扫描的准确率高,检测结果只是一种可能性,对于某些在特定环境下(例如特定日期、用户行为)才会执行的恶意代码并不能完美地进行检测.但是由于动态检测分析的是恶意代码运行的特征、行为,所以相对于静态方法,拥有直观、快速的优点.另外,当检测到用户设定的某些特定指标被触发,例如调用某些特定应用程序编程接口(API)函数时,动态检测软件会通过某些算法对这些行为进行加权记录、评估,当目标软件的行为特征超过设定好的阈值时,将该目标软件判定为恶意软件[4].因此,动态检测方法可以不受到各种类别的掩饰手段的干扰,对软件的恶意行为进行准确的识别.本文作者所设计的方法属于动态检测技术.

2 Android安装包(APK)文件权限与API函数调用权限的获得

目前Android系统采用了一种特殊的安全机制,这种特殊的权限获得方法,可以被称为默认拒绝法,它采用了强制性的访问控制,每个应用程序在系统中都有自己独立的用户id和组id,当应用程序在安装时,必须对自己本体在运行时可能会使用的敏感权限进行声明,并且需要得到用户的明文允许,否则它的所有操作,甚至于安装操作都将被拒绝.因此,应用程序必须在开发时于APK内的manifest.xml文件中声明其在运行过程中所可能调用到的权限并在安装时对用户进行展示[5].一旦在安装过程中,用户允许了应用程序使用相关权限,那么在此后的运行过程中,该程序将默认永久获得该权限,而权限的确认和解析调用在应用程序的启动过程中就将被完成,所以在设备的使用过程中直接动态监控应用程序的权限调用情况是不可行的.本文作者通过分析Android特色的权限——API系统,设计一种在软件的运行过程中,可以对相关调用函数的情况进行监视的方法,进而统计出软件的行为特征,通过加权累计和阈值判定来检测一个目标应用程序是否为恶意程序.

2.1 Android的应用程序中权限信息部分代码的提取

APK是Android应用程序经过编译器打包而成的安装程序,实质上是一个压缩包文件.一个最基本的可被运行的APK文件中,至少包含4个子目录名和3个子文件名,其中,AndroidManifest.xml文件用于描述该Android应用程序的全局数据、版本号、运行时所需要获得的权限等内容.根据开发公司google的官方说明,一个在Android平台上运行的程序最多可以获得包括电话、短信、互联网在内的145项权限.想要获得对于访问各种系统数据的权限,应用程序必须在自身安装包中的Manifest.xml文件里事先进行权限声明,由此,想要知晓目标程序究竟要获得哪些权限,分析APK中的Manifest.xml文件就显得必不可少[6].

采用APKtool等工具对APK文件进行反编译后找到相关文件,使用记事本打开,可以获得以下代码如图1所示.

图1 部分涉及权限的代码以及注解说明

由上述分析可以得知,想要提取并获得应用程序的权限申请信息,可以采用反编译的方法,对相关的文件进行分析,并且提取use-permission字段中有关android.permission的属性值,即可得到目标应用程序所申请调用的权限信息.

2.2 Android中应用程序调取API信息的获得方法

任何应用程序想要执行操作,都要通过对系统发送对API函数进行调用的请求来实现.通过APKtool等反编译工具,对于APK文件中的classex.dex文件进行反编译就可以得到能在虚拟机环境中执行的代码,通过对于这部分代码的分析,可以得到应用程序在运行过程中可能会调用的API函数[7].

通过对于应用程序权限获得和API函数调用情况的分析,可以获取应用程序的文件特征,可以对之后总体风险的评估起到补充和辅助的作用.

3 应用程序测试中实际调用API函数的监控

上节提到,在应用程序的运行过程中,所有操作都要通过调用系统API函数进行,使得监控软件行为成为可能.

3.1 API拦截技术

具体设计中,采用HookAPI的方式进行对调用行为的日志信息进行拦截.Hook意为钩子,实质上是一段获得并处理信息的程序,通过进行系统调用的方式加载进系统,可以使API调用的相关信息在没有执行之前就被监控获取并记录.这种技术可以在不改变应用程序运行方式的同时,对于应用程序调用API的行为进行监控并记录.

应用程序正常调用流程为:1)API调用;2)API执行;3)调用情况返回.

使用了HookAPI的方法进行处理后,调用流程为:1)API调用;2) Hook API;3)API执行;4)Hook API数据标记反馈;5)调用情况返回.

在操作系统的启动过程中,所有可执行程序包含的进程都是由一个名为Zygote的原初进程生成的,在设备启动过程中,该进程被创建并且同时生成一个Dalvik虚拟机的母本,之后,每当有进程被启动时,Zygote进程会对虚拟机母本进行复制并且分发给应用软件,这样,每一个应用程序都将独享一个Dalvik虚拟机的拷贝[8].

通过对于Zygote进程的解析,可以得到如下脚本命令:service zygote /system/bin/app_process-Xzygote /system/bin--zygote-start-system-server

由这段代码可以得知,Zygote进程在Android系统中对应的可执行程序是/system/bin/app_process,由此可以得出一个结论,如果将系统中的这个程序进行修改替换,增加输出端口,就可以控制Zygote进程,进而达到对其所创建的Dalvik虚拟机母本进行控制的目的.同时,由于所有应用程序使用的都是该Dalvik虚拟机的拷贝副本,所以就可以达到对系统中所运行的API进行Hook API的操作[9].

3.2 Android系统中软件调用API行为的标记和记录

相较于静态分析方法,动态检测方法的最大优势就是可以及时地发现检测未被记录的新型、变型的恶意代码.为了达到这个目的,设计了一种数据标记的方法来进行软件恶意行为的检测和记录.

该方法是在进行Hook API的同时,对于部分敏感API端口返回的数据插入数据代码进行标记.该段代码应该具有如下特点:

1)独立性,即插入API返回数据同时不影响该操作行为的判断和执行.

2)隐蔽性,即该段数据标签不应该被恶意软件发觉从而影响检测和记录.

3)易检出性,即该标签应有独特的形式,不会在记录时被漏过从而导致漏检.

进行数据标记的过程如下:

1)定义某些类型的API函数为敏感函数,在敏感的API函数被调用时,通过替换和可操作的Dalvik虚拟机对数据进行标记.

相关的API类型举例如表1所示.

表1 数据读取相关敏感API类型

在这些敏感类型的API函数被进行调用时,进行数据标记.

2)该标记跟随数据和变量进行传播和存储.由于对Zygote进程指向的app_process进行了替换操作,所有应用程序使用的Dalvik虚拟机全部是替换过且可操作的,不论该段敏感数据如何转移,该数据标签总能通过相应的Android跨进程通信(Binder)库进行同步的传播和跟踪[10].

3)在特定的敏感位置检测到该数据标签时,进行记录.

相关的敏感位置举例如表2所示.

表2 数据发送存储相关敏感API类型

该过程构成元素如图2所示.

图2 动态检测的构成元素

3.3 关于恶意行为的检测算法

上文中提到,Android平台开放给应用程序的API函数共有145种,如果用唯一编号1到145号对其进行编号,那么,针对Android平台的恶意行为所能调用的API函数数量是有限且可标定的.

可定义正整数集合N,N={N1,N2,…,N145},其中Ni项表示第i个API函数的唯一编号.那么,在Android平台上运行的应用程序的操作行为调用的API函数编号必有集合M={M1,M2,…,Mk},1≤k≤145,其中Mi为应用程序操作行为调用API函数的唯一编号,且必有一组二进制变量a1,a2,…a145,满足M={a1N1,a2N2,…,a145N145},那么,记录该组变量中赋值为1的变量数量并且进行累加,则可以得到应用软件的调用API数量的特征数值K,1≤K≤145.

本文作者提出的恶意行为测试算法是由相互影响的两个部分构成:对于程序算法的训练阶段和对于目标软件代码的检测阶段.训练阶段的目的是确定一个合适的阈值,定义为T,而检测阶段就会提取被检测软件的特征数值K和阈值T进行比较,来判断目标软件是否为恶意软件或是在正常的软件中存在恶意代码的嵌入.

在训练阶段中,选择一个恶意软件的样本集合,提取其中一个恶意软件的特征数值K1作为初始值并赋值给阈值变量T1,循环提取不同的恶意软件的特征数值Kn,并与T1进行比较,如Kn>T1,则保留变量T1数值不变,如Kn

再选择一个正常可信软件测试集,提取特征数值并赋值给阈值变量T2,进行同样的循环赋值,并得到最终的可信阈值变量T2.取T1,T2的均值作为阈值T,在尽可能降低漏报率的同时,可有效避免误报的发生.

在检测分类阶段中,将待检测的应用程序的特征数值提取并与阈值T进行比较,大于T,则被测软件为恶意软件,进行警报;小于T,则被测软件为正常软件.用户可以根据自己的需求手动调节T的值以达到减小误报率或者减小漏报率的目的.

3.4 检测结果的显示和表达

被测软件在经过算法部分的测试过后,检测程序会对数据进行处理并生成一个报告.为了直观考虑,数据收集内容主要只表达恶意行为的事件.报告格式为XML格式,代码如图3所示.

图3 检测报告代码图

代码中,“{}”内的部分为检测报告生成过程中输出的恶意行为的具体内容.behavior/item表示在检测过程中被检软件所进行的一个行为;behavior/item/action表示这条行为的具体动作.检测结果报告给出了敏感数据的流向,并且直观地展示了恶意软件的指向性.

4 实验结果记录和分析

实验目标选自Android恶意代码工具包.

恶意样本的分析测试输出结果示例,如图4所示.

图4 恶意软件测试软件结果

结果表明,该恶意软件会收集设备敏感信息,并将结果发送到一个150开头的手机号码.

测试结果表明,应用该方法的检测软件可以有效的识别和分辨被检软件在运行过程中产生的恶意行为,并对用户发出警报.

测试结果统计如表3所示.

表3 对恶意代码样本和可信软件集样本的测试结果统计

检测结果统计显示,对于恶意软件样本的测试是比较成功的.对于漏报的部分样本,经过手动逆向解析,发现主要原因是因为:在测试沙盒中,对于模拟环境的设置存在一定限制,部分恶意代码需要连接特定服务器获取特定指令方能激活,但是在模拟环境中,由于服务器被隔绝,无法获取指令,导致恶意代码无法激活,因此测试软件搜集不到恶意行为的数据,导致了相关漏报的发生.但是在实际使用中,这类代码的检测不会受到影响.

对于可信软件样本的检测中,发生了误报率超过15%的情况,经过对于相关软件的权限声明的分析可知报警的原因是相关软件的确存在相应的恶意行为,这里牵涉到Android程序权限滥用的问题,不再多加讨论.

5 总 结

本文作者探讨了一种Android平台上恶意代码的动态检测方法,并用原型工具初步对这种方法进行了验证,取得了一定的成果.但是在测试过程中发现,仍然有很多类型的恶意代码无法检测,而且由于只有一个模拟环境,每次只能检测一个目标软件,工作效率还有待提升.因此,提高检测成功率和提升检测效率将是未来又一个重要研究课题.

[1] Symantec Corporation.2016 Internet Security Threat Report [R/OL].(2016-04-13)[2016-10-19].https://www.symantec.com/security-center/threat-report.

[2] 腾讯移动安全实验室.潜伏在身边的危机:智能设备安全 [R/OL].(2015-09-16)[2016-10-21].https://security.tencent.com/index.php/blog/msg/94.

[3] 刑文利.恶意代码动态分析系统的设计与实现 [D].北京:清华大学计算机科学与技术系,2005.

Xing W L.Design and implementation of a malicious code dynamic analyzing [D].Beijing:Department of computer science and technology,Tsinghua University.

[4] 刘伟,孙其博.Android平台恶意软件行为模式研究 [J].软件,2012,33(11):150-151.

Liu W,Sun Q B.Android platform malware behavior model research [J].Computer Engineering and Software,2012,33(11):150-151.

[5] 郑焕鑫,叶小平.基于API拦截的主动防御系统 [J].技术研究,2012,07:29-31.

Zheng H X,Ye X P.The defense system basing on API interception network [J].Netinfo Security,2012,07:29-31.

[6] Google.Android API Differences Report[R/OL][2016-10-29].https://developer.android.google.cn/sdk/api_diff/23/changes.html.

[7] 冯博,戴航,慕德俊.Android恶意软件检测方法研究 [J].计算机技术与发展,2014,02(2):150-153.

Feng B,Dai H,Mu D J.Research of malware detection approach for Android [J].Computer Technology and Development,2014,02(2):150-153.

[8] 罗升阳.Android系统源代码情景分析 [M].北京:电子工业出版社,2012.

[9] Zeng H,Ren Y,Wang Q X.Detecting malware and evaluating risk of app using Android permission-API system [C]//IEEE.2014 11th International Computer Conference on Wavelet Actiev Media Technology and Information Processing(ICCWAMTIP).Chengdu:IEEE,2014.

[10] 谢鑫.基于程序属性的Java静态软件胎记技术研究 [D].郑州:解放军信息工程大学,2011.

Xie X.Research on program properties based java static software birthmarking [D].Zhengzhou:PLA information Engineering University,2011.

(责任编辑:包震宇)

Dynamic detection technology of malicious code for Android system

Li Boya, Xue Zhi

(School of Electronic Information and Electrical Engineering,Shanghai Jiao Tong University,Shanghai 200240,China)

With the increasing popularization of mobile phones,people′s dependence on them is rising,the security problems become more and more prominent.According to the calling of the APK file permission and the API function in Android system,this paper proposes a dynamic detecting method based on API interception technology to detect the malicious code.The experimental results show that this method can effectively detect the malicious code in Android system.

Android; API; malicious code; dynamic detection

10.3969/J.ISSN.1000-5137.2017.01.003

2017-01-20

李博亚(1987-),男,硕士研究生,主要从事Android系统恶意代码等方面的研究.E-mail:lby3333@163.com

导师简介: 薛 质(1971-),男,教授,博士生导师,主要从事信息安全,网络攻防与测评等方面的研究.E-mail:zxue@sjtu.edu.cn(通信联系人)

TP 309; TP 316

A

1000-5137(2017)01-0016-07

猜你喜欢

调用应用程序代码
核电项目物项调用管理的应用研究
删除Win10中自带的应用程序
LabWindows/CVI下基于ActiveX技术的Excel调用
谷歌禁止加密货币应用程序
创世代码
创世代码
创世代码
创世代码
基于系统调用的恶意软件检测技术研究
利用RFC技术实现SAP系统接口通信