赵淑贤
摘要:Android系统上的应用程序主要是由各个组件组成的,而组件的公开使用又会造成组件的权限泄露。针对这种危险提出了一种静态检测方法。重点研究权限泄露的检测,运用静态代码的分析技术,建立API特征库,其次遍历AndroidManifest.xml文件中的组件声明设置,检测该组件的公开性,再跟踪公开组件的函数入口以及函数的调用流程,从而检测出权限泄露问题。
关键词:Android组件;权限泄露;API特征库
中图分类号:TB文献标识码:Adoi:10.19311/j.cnki.16723198.2016.24.093
1绪论
在现今的社会中,我们的生活中存在了一个不可或缺的东西—手机,利用手机我们可以QQ、微信聊天、看视频、打游戏,似乎连着网就可以做很多事情,包括不用拿着钱就可以买任何东西,因为有电子钱包。它让我们的日常变得更加便利,可是在享受这些方便的时候也承担着更多的隐私泄露风险。在智能终端系统上,Android操作系统占据着很大的比重,并有日趋加重的势头。因此,关于Android系统的应用程序的漏洞数目也是层出不穷。
由于众多Android安全漏洞的产生,Android平台的威胁也越来越大。众所周知,Android应用框架是基于组件的方式来实现代码重用,因此应用程序在进行程序设计时都是以组件为基本模块,在组件内存在许多对敏感资源访问的功能。如果编程人员对组件使用不够熟练就会造成组件漏洞。因此本文主要针对组件漏洞展开研究,对该漏洞的原理、应用场景做了深入的分析,并对漏洞的检测技术进行研究。
2Android系统概述
2.1Android体系结构
Android的架构采取堆栈式,层次之间分工明确又协同工作。整个系统的结构分为5个层次,从上向下依次为:应用程序层、应用程序框架层、系统运行时库以及Linux内核层。
2.2Android系统的安全机制
Android系统设定了权限分离的安全机制,将安全设计体现在各个结构层次上。尽管如此,Android系统仍然存在诸多安全威胁。
沙盒技术、签名技术、权限的设置等都是Android的自我保护机制。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行,这就使得程序之间的代码和数据分开,不可以互相访问。一个应用程序在没有别的应用程序允许的时候只能访问自己的数据。Android程序是需要签名的,而且是通过验证证书来签名的。若是Android的应用程序需要调用私有权限譬如拍照、打电话、读取联系人信息,是利用系统的API申请相应的权限。
Android系统在AndroidManifest.xml中必须设置所需的访问权限,也必须声明组件访问的许可。在一个应用程序的内部,各个组件之间允许互相访问;在不同的应用程序之间则必须设定访问权限,只有申请权限才可调用该组件,以防恶意利用。
3Android系统组件间的安全缺陷
Android系统主要有四大组件:Activity,Service,Broadcast Receiver和Content Provider。组件间的通信有三种:Intent、IPC Binding 和ContentResolver。其中大多数是通过Intent通信。当不同的应用程序或者同一个应用程序的不同组件之间需要传输数据就需要Intent的帮助。Intent能够实现组件间的异步并且保存相应的“意图”。Intent也实现了通用组件的多次利用,减轻了编码的成本。但是方便的同时,组件的权限泄露就产生了。
权限泄露也即权限提升。它是组件的重用带来的威胁。如图1,程序M是恶意程序,希望获得私密信息而又没有得到权限许可,程序N得到了访问该私密信息的权限,M与N存在某个组件n1的重用,那么M就会通过调用N程序中该组件盗取私密信息,从而造成私有信息的泄露,造成安全隐患。
Android漏洞的挖掘技术大体分为静态分析和动态分析。
4.1静态分析技术
静态分析技术是指不运行代码,分析反编译生成的源码,从而找到漏洞的方法。静态分析的步骤:(1)反编译生成源码,对源码通过词法、语法分析,将其转化为映射关系的表现形式。(2)再在(1)中间表现形式上进行分析。中间形式通常是使用抽象语法树(AST),此方式是能够比较直接明了的展现出源码,是一种存储效果很好的语法表现形式,AST在查询的速度、操作、遍历等方面有很高的效率。
静态分析技术的优点是:查询代码的范围广、分析速率快,漏报率低。但是也有不足之处:查询的同时不能实际运行代码,因此会有大量的误报。
4.2动态分析技术
动态分析是不用源代码,但是要通过实际运行代码观测运行结果以此来分析漏洞的具体位置。动态分析有两大技术:(1)数据流分析:利用半有效的数据去诱发软件中隐藏的漏洞,通过对运行结果分析来发掘漏洞。(2)动态跟踪技术:在运行代码中设置多个断点,对调用函数的正确性及数据流实行追踪,挖掘潜在的漏洞。
动态分析技术有漏洞率低、精确率高、不用反编译生成源代码等优点,通常情况下是不会有误报。可是在断点的确定上、技术人员以及检测框架上有局限性。Fuzzing技术(模糊测试技术)是主要的动态分析技术。
4.3动静结合的安全漏洞分析技术
目前,软件漏洞挖掘技术大多不是单纯的静态或动态技术,而是结合多种挖掘方法的优点,从而得到高效、快速、准确的混合型漏洞发掘技术。
Android的静态和动态相结合的挖掘技术有许多的优点。在静态分析技术上采取类型推断与约束分析相结合的方式获得漏洞点,这种方式综合分析了漏洞点处各信息间的约束关系。再运用漏洞约束算法得到漏洞点处的测试用例,减少了测试用例的个数,并提升了精确度。结合Android漏洞库对测试用例实行变异处理,最后运用Fuzzing技术,从而得到漏洞。
这类漏洞挖掘技术一般是动态分析对静态分析结果进行更深入的解析,静态分析为动态分析生成需要的测试用例,大大减少了测试用例,也降低了Fuzzing的漏报率。
5解决方案
通常,Android应用程序的组件若是想调用某项与隐私权限有关的组件,是必须在AndroidManifest.xml文件中进行声明设置,而且在被调用组件的设置里增加permission属性用来操纵自身被调用时,调用者同样具备相有该权限。研究前文的漏洞检测技术,本文就权限泄露提出解决方案,主要包括四个部分:
(1)Android API(应用程序接口)与permission映射集合。首先需要建立特征库。通过Android API的文档,创建系统权限与调用方法的映射关系。一个权限对应了多个方法,可以运用对应的方法去调用相应的系统权限资源。这个特征库一旦建立后,只需要在表项有遗漏或者错误的时候对其做微调,不需要太多的维护。
(2)暴露组件的检测。组件权限漏洞产生的首要条件是:存在公开的组件。所以检测首先必须排查公开的组件,如果有就继续检查,若没有就不需要继续。
组件是否公开进行重用,是由AndroidManifest.xml文件中每个组件的exported属性和
(3)在检测有无权限泄露时,必须着重考虑公开暴露的组件。在(2)的基础上,需要对暴露的组件的权限泄漏进行检测。首先按照函数调用图(FCG)分析组件入口点和存在危险API的路径,采集这个组件相关的权限表;然后通过组件调用图(CCG),解析该组件调用其他组件的路径,收集该组件与其他组件相联系的权限表。
(4)当检测到暴露组件并且发现可疑的路径后,比对(1)所建立的特征库,以此来检测该组件有无权限泄露的问题。
6结论
Android系统的开源特性深受大家喜爱,但也因为该特性使得越来越多的危险愈发严重,因此引发的组件间的漏洞数目和种类也层出不穷。通过漏洞检测技术可以检查出程序安全漏洞,防止造成用户的信息泄露。
参考文献
[1]Mariantonietta La Polla,Febio Martinelli,Daniele Sgandurra.A Survey on Security for Mobile Devices[J].IEEE Communications Surveys & Tutorials,2013,15(1):446471.
[2]Nwokedi Idika,Aditya P,Mathur.A Survey of Malware Detection Techniques[DB/OL].http://www.serc.net,2012,(11).
[3]William Enck,Machigar Ongtang,Patrick McDaniel.Understanding Android Security[J].IEEE Security and Privacy,2009,7(1):5057.
[4]张文,严寒冰,文伟平.一种Android恶意程序检测工具的实现[J].信息网络安全,2013,(1):2732.
[5]杨珉,王晓阳,张涛等.国内Android应用商城中程序隐私泄露分析[J].清华大学学报(自然科学版),2012,52(10):14201426.
[6]于鹏洋,黄俊飞,宫云战.Android应用隐私泄露静态代码分析[J].软件,2012,33(10):15.