Android应用程序权限组重要性分析

2018-09-06 01:54白君泽杨红丽
计算机与现代化 2018年8期
关键词:有向图应用程序重要性

白君泽,杨红丽,张 标

(北京工业大学信息学部,北京 100124)

0 引 言

Android是一款基于Linux平台的开源手机操作系统,使用Android操作系统的手机占据了智能手机的主要市场,其应用程序变得日益丰富。数据公司Gartner[1]显示,使用Android操作系统的智能手机在2016年第一季度占据了84.1%的市场份额,而2017年第一季度市场份额更是提升到了86.1%。与此同时,应用程序过度申请Android权限,可能造成用户隐私数据的泄露,是当前Android系统手机的一大问题。Android系统更新到6.0版本之后,使用运行时权限机制(Runtime Permissions)将敏感权限分为9组,每一个权限组(Permission Groups)对应一类隐私信息,用户可以对权限按组进行设置,而不再对单独权限进行设置。设置过多的权限组,不利于用户对应用程序进行把控,应用程序可以在不通知用户的情况下使用隐私信息,威胁用户的安全和隐私;设置过少的权限组,会带来复杂的操作,影响用户体验。权限系统的升级,需要用户鉴别权限组的重要程度,对权限组进行正确的设置,这成为了用户面临的新问题。

目前研究中,学者们提出了大量Android静态分析方法。文献[2-6]详细分析了应用程序的结构,但是没有详细分析权限的使用情况。文献[7]通过收集应用程序使用的隐私信息和隐私信息对应的权限,分析隐私信息的传播方式,向用户发送隐私信息报告,提示用户应用程序对隐私数据的使用情况,但没有对权限重要性进行分析;文献[8]通过记录用户对应用程序的权限设置,分析用户的行为习惯,构建决策支持系统,推荐给用户权限的设置策略,但没有分析客观的程序结构,并且推荐对象为单独权限而没有按照权限组进行整体推荐;文献[9]将应用程序中函数调用图构建为网络,通过计算节点的权值并进行机器学习分类检测应用程序是否为恶意程序,但没有解决权限设置问题。综上,现有文献分析了应用程序静态结构以及应用程序中权限的使用,并从经验上推荐用户设置权限,但没有从程序结构分析的角度分析权限重要性以及推荐权限设置,且研究对象为单独权限而非权限组。

在Android系统的运行时权限机制下,用户需要了解应用程序中权限组的重要程度,确定如何设置权限组。为此,本文提出权限组重要程度分析方法:1)对应用程序文件进行逆向工程分析程序代码;2)利用排序算法计算权限组的重要性评分;3)利用机器学习方法进行实验认定。本文根据权限组的重要性评分,将权限组按照重要程度划分为关键和不关键2个部分,以此推荐权限组的设置策略。本文的主要工作有:

1)针对Android系统权限机制改变后新出现的权限组进行研究,分析应用程序中权限组的使用情况。

2)将排序算法引入Android应用程序静态分析,评价Android应用程序中权限组的重要程度,推荐权限组的设置策略。

3)通过机器学习方法分析应用程序中的权限组,提供新的应用程序分析方法和分类思路。

1 相关知识

本章描述Android系统权限机制的改变带来的新的权限组问题,需要使用新的分析方法用以分析权限组内容,引入排序算法对权限组的重要性进行评价。

1.1 Android权限机制

权限机制是Android系统保护用户安全和隐私的重要机制。应用程序访问用户隐私信息时,需要调用特定接口,应用程序需先向用户申请权限,获得用户允许才可以调用此权限下属的接口。Android 6.0版本之前的权限机制中,用户需要在安装应用程序时授予应用程序所有的权限,这一设定明显是不友好的,使得用户不仅在设置权限时容易出现问题,在对应用程序进行更新升级时也会受到影响。Android 6.0版本带来了新的运行时权限机制,用户可以实时对应用程序授予权限。系统设定了9个权限组,每个权限组包含一到多个权限,如表1所示。在应用程序运行阶段,当需要某个权限组的权限时,应用程序动态向用户进行弹框申请,如果用户同意,则权限组包含的所有权限被打包赋予给应用程序;如果用户不同意,则不授予权限。用户也可以在系统设置中对权限组进行设置,系统将应用程序使用的权限组全部列出,用户可以逐一对权限组的设置选项选择打开或者关闭,设置打开,则将权限组的权限赋予应用程序,应用程序可以随时使用这些权限组而不需要申请;选择关闭,则应用程序需要用到这些权限组的权限时,需要向用户动态申请。

表1 权限组对照表

在应用程序中,程序对某个权限组的使用越频繁,则说明应用程序对这个权限组对应的隐私信息处理越多,有关这类隐私信息的功能在应用程序中越重要,越需要对此权限组进行重点分析。Android系统对权限组的使用,体现方式为调用权限组所包含权限对应的接口。接口包含URI和API这2类,URI是系统消息提供器(Content Provider)提供的标识符,应用程序可以通过访问特定URI获取隐私信息,如:content://contacts是获取联系人的URI,对应权限READ_CONTACTS;API是系统封装好的方法,应用程序可以通过调用特定API访问隐私信息,如:Camera.takePicture()是使用摄像头的方法,对应权限CAMERA。目前已有对权限与接口映射关系的研究,PScout[10]使用静态分析的方法,将接口与其需要用到的权限进行分析,获得接口与权限的映射关系;Susi[11]使用机器学习的方法,总结接口与权限的映射关系。PScout和Susi各自提供了成果文档,为研究人员提供重要的分析资料。

1.2 排序算法

PageRank算法[12]是一种针对网页重要程度排序的算法。算法的思想是:一个网页的重要程度由所有可以超链接到这个网页的源网页重要程度来决定。算法将具有超链接关系的网页按照超链接关系构建一个有向图关系G=(V,E),其中V是节点集合,每个节点代表一个网页;E是2个节点之间的指向关系集合,每条指向关系代表这2个节点对应的网页具有超链接关系。算法计算有向图中每个节点的重要评分(PR),根据节点的重要性评分,将节点对应的网页进行重要程度排序。在有向图中,每个节点都有一个初始PR值(一般情况下,所有节点初始PR值相等),然后每个节点将自己的PR值平均分配给指向的节点,经过迭代计算,每个节点的PR值趋于稳定,稳定后的PR值即为这个节点的最终PR值,定义如下:

其中,p、q代表节点,R代表节点指向关系,o代表节点的出度。最后网页按照PR值进行排序。

PageRank算法用于进行网页的重要程度排序,也被用来分析程序结构。Component Rank[13]算法将一个程序的组件作为节点,组件的调用关系作为指向关系,构建有向图,借用PageRank算法,计算组件的重要性评分,推荐程序中的关键组件。VertexRank[14]参考了Component Rank的工作,并且考虑了应用程序具有入口点这一特性,将初始PR值仅分配给入口节点,再计算组件的重要性评分,定义如下:

其中,EPR代表节点的初始重要评分值,e代表节点,E代表入口节点集合,n代表入口节点总数。根据计算所得的重要性评分,上述工作对程序组件进行重要程度排名,推荐程序中排名靠前的组件。

2 权限组重要性分析

本文利用第1章介绍的相关知识,设计了一种新的权限组重要性分析方法,如图1所示,包含3个步骤:

1)程序分析。对Android应用程序文件进行逆向工程分析,获得程序代码,构建程序函数调用图,分析程序结构。

2)权限组重要性评分。根据函数调用图以及函数使用权限组的信息,通过排序算法计算权限组的重要性评分。

3)实验验证。进行实验验证方法的准确性,借助实验结果将权限组根据重要性评分划分为关键权限组和不关键权限组2类。

本文根据以上信息,展示应用程序中权限组的重要性评分,并推荐用户将关键权限组的设置打开,不关键权限组的设置关闭。

图1 Android应用程序权限组重要性分析架构图

2.1 程序分析

目前,市场上绝大多数的应用程序都没有开源,无法直接对源代码进行分析,因此本文采用逆向工程技术对应用程序进行反汇编获得字节码,对字节码进行静态程序分析。本文的程序分析工作基于Relda[15]工具进行实现,Relda工具是一款基于Python的轻量级静态Android分析工具,工具对应用程序文件进行逆向工程分析,获得字节码,从程序入口点开始逐层分析代码结构,构建程序调用图。Relda工具具有轻量级和结构简洁这2个特性,轻量级特性降低了工作的时间复杂度,为工具的实际应用提供便利;结构简洁特性方便进行二次开发,易于进行细节调整和实验检测。

图2 函数调用图

在函数调用图中,每个函数都可能调用接口,形成对权限组的使用。为在函数调用图中添加权限组的使用信息,需要分析每个函数调用的接口。为此,本文整理了1.1节中PScout和Susi总结的权限与接口对应关系,并查阅官方文档[16](API Document)补充上述2个工作没有提及的权限与接口的对应关系,再根据表1所提供的权限组与权限的对应关系,总结出接口映射表,获得接口与权限组的映射关系。

将接口映射表的信息嵌入到函数调用图当中,如图2所示,构建出了新的函数调用图,函数对接口的调用信息即可转化为函数对权限组的使用信息。

2.2 权限组重要性评分

函数调用图是有向图,与PageRank算法契合,本文1.2节中提出的研究也验证了PageRank算法对于程序分析的有效性。本文以2.1节中函数调用图的函数构建为节点,调用关系构建为指向关系,构建有向图,如图3所示,利用PageRank算法计算权限组的重要性评分。本文的PageRank算法是借助软件包NetworkX[17]实现的。

图3 有向图示例

本文借鉴PageRank算法,定义节点的重要性评分算法SourceRank,计算节点的重要性评分(SR)定义如下:

其中,p、q代表节点,R代表函数调用关系,o代表函数的出度(调用其他函数的数目)。由于接口本质上是系统封装的函数,在有向图中,如何定义接口的性质成为算法的一大问题。在旧的函数调用图中,接口看作函数的附加属性,权限组的重要性评分由调用这个权限组接口的函数节点分配而来;如果将接口看作函数,需要在有向图中添加新的函数节点,此时出现2种添加方式:1)每个接口看作单独函数进行添加;2)接口看作权限组的下属函数进行添加。不同的有向图中计算的权限组重要性评分不同,影响最终分析结果,本文希望构建最合理的有向图,对权限组进行最准确的分析。为此本文提出4种有向图构建方法,通过实验验证,选取最合理的构建方法构建有向图。4种有向图构建方法如下:

1)入度法(DL)。

在入度法中,不进行有向图的构建。此时,每个权限组的入度,即使用这个权限组的函数数目,视为这个权限组的SR值,定义如下:

SR(pgi)=n(pgi)

其中,pgi代表某个权限组,n代表入度。如图3中,SR(权限组2)=2。

2)不添加法(NL)。

在不添加法中,接口视为函数的附属,在此方法中,不添加新的节点,有向图如图3所示。此时,每个权限组的SR值,由所有调用这个权限组接口的函数节点SR值相加得出,定义如下:

其中,pgi代表某个权限组,n代表原函数节点,pg(n)代表节点n的权限组集合。如图3中,SR(权限组2)=SR(节点2)+SR(节点3)。

3)单独添加法(SL)。

在单独添加法中,接口被看作为单独函数,在此方法中,对每一个函数,如果调用了属于新权限组的接口,则将这个新的权限组添加为节点,图3有向图添加节点后如图4所示。

图4 SL方法构建有向图

此时,每个权限组的SR值,由所有根据这个权限组添加的函数节点SR值相加得出,定义如下:

其中,pgi代表某个权限组,n代表新添加的节点,pg(n)代表节点n对应的权限组。如图4中,SR(权限组2)=SR(节点7)+SR(节点8)。

4)分组添加法(GL)。

在分组添加法中,接口被看作为权限组的下属函数,在此方法中,将应用程序使用到的权限组添加为节点,图3有向图添加节点后如图5所示。

图5 GL方法构建有向图

此时,每个权限组的SR值,由根据这个权限组添加的函数节点SR值确定。如图5中,SR(权限组2)=SR(节点7)。

Android应用程序具有特殊的入口点,这些入口点是具有固定名称的函数,如函数OnCreate()、OnClick()等,系统通过调用这些入口函数开始执行程序。在为有向图赋予初始SR时,本文参考了VertexRank提出的策略,根据应用程序具有入口函数的特性,将初始SR仅赋予入口函数对应节点,如图3中所示的节点1为入口节点。

2.3 实验验证方案

对2.2节提出的4种有向图构建方法,分别可以计算出应用程序中每个权限组的SR值。应用程序中权限组的重要程度难以具体量化,且权限组的SR值跟随程序代码规模增大而增大,为确定哪种方法的结果更加合理,本文作如下假设:相同种类的应用程序,对权限组的使用情况应当有相似性,即同一种类的应用程序中各个权限组的SR值占比应当相似。为此,本文按照应用市场的应用程序种类划分,分别下载不同种类应用程序,计算应用程序中每个权限组SR对权限组合集SR的占比(SP),定义如下:

其中,pgi、pgj代表某个权限组,S代表权限组合集。本文使用机器学习分类方法,以应用程序各个权限组的SP作为特征进行分类,每种应用程序选取一部分作为训练集,其余应用程序作为测试集,分别计算4种有向图构建方法下应用程序分类的准确率。分类准确率越高,说明此种有向图构建方法下权限组区分度越高,方法更加合理。

选定有向图构建方法后,可以确定每个权限组的SP值,进行重要程度排序。在有序的权限组中,需要确定一个阈值将权限组划分为关键权限组和不关键权限组2类,为确定这个阈值,本文设计实验如下:当过滤掉小于某个值的SP值后,分类的准确度不受影响,则确定这个值为需要的阈值。此时,SP值小于阈值的权限组,存在与否不影响应用程序分类,可以认定其为不关键的权限组。本文据此推荐权限组的设置策略:将SP值大于阈值的权限组的设置打开,SP值小于阈值的权限组的设置关闭。

3 实验结果及分析

根据Android应用市场豌豆荚的应用程序种类划分和下载量信息,本文对7个种类应用程序下载量过万的全部个体进行分析。分析样本共计261个应用程序,去除分析失败和应用程序未使用权限组的程序,共计188个应用程序。本文整理分析结果,得到应用程序中各个权限组的SP值,以GL方法为例,每个种类应用程序各个权限组的平均SP值如表2所示,可以看到不同种类的应用程序权限组SP值有较大区别。

为评价2.2节中DL、NL、SL、GL这4种有向图构建方法的优劣,本文使用机器学习的方法将SP作为特征进行分类。因为以权限组作为特征分类,分类结果没有明显边界,目的是判断应用程序最可能的分类结果,所以本文选取KNN算法计算分类的准确率。sk-learn[18]模块实现了各种机器学习算法,本文利用sk-learn模块实现KNN算法的分类,按照1:1的比例构建训练集和测试集,计算4种有向图构建方法下分类的准确率。为确定本文方法对应用程序分类的帮助,本文将每种构建方法下分析方法分类准确率与随机事件概率14.3%(1/7)作比较,计算分类准确率的提升率,结果如表3所示。实验结果显示,使用GL方法构建有向图分类准确率的提升率最高,由此方法计算SP更加合理。本文分析方法意在分析应用程序中权限组的重要性,所以将权限组作为对象进行节点构建和评分更加贴合本文方法的设计初衷,实验显示结果也与设计初衷相符合。

表2 应用程序权限组平均SP

表3 应用程序分类的准确率提升 单位:%

在构建有向图分配初始SR值时,本文采用VertexRank的策略,将初始SR仅分配给函数入口节点。为判断此方法的优劣,本文比较了是否采用VertexRank的策略分类的准确率,结果如表4所示。实验表明,VertexRank的策略能够提升分类准确率,适合本文的方法。

表4 VertexRank的策略对分类准确率影响 单位:%

为确定划分权限组关键与否的阈值,本文在GL法和采纳VertexRank策略基础上,对数据集进行筛选,分析选取不同阈值后分类准确度的变化,结果如图6所示。实验结果显示,过滤掉小于0.048的SP后分类结果不受影响,因此阈值设定为0.048。

图6 阈值对分类准确率影响

本文整理以上信息作为Android应用程序权限组重要性分析的分析结果,展示各个权限组的重要性评分,并推荐权限组的设置策略。

4 结束语

本文针对Android应用程序权限组重要性分析问题,通过逆向工程分析应用程序中的函数调用和接口调用,通过权限组与接口的映射关系确定函数对应用程序权限组的使用情况,利用PageRank算法为权限组进行重要性评分,根据重要性评分界定权限组是否应当设置打开。整理以上信息,展示权限组的重要性评价和设置推荐,既可以帮助用户了解应用程序,也能帮助应用商店完善应用程序的权限组描述信息。

本文研究受限于当前技术影响,存在一定局限性:1)由于没有完备的接口数据库,本文仅能通过整理现有工作和人工收集尽量保证映射表的全面性;2)应用程序的字节码可能出现重复片段影响重要性评分的计算,因此函数使用权限组均按使用一次计算;3)应用市场没有明确的应用程序分类标准,新的应用程序为了扩展功能也可能用到新的权限组,应用程序分类难以准确实现,仅作为实验评价标准;4)本文以新的权限组为对象提出新的分析方法,缺乏类似工作进行对比,结果较为单调。未来,随着Android接口映射表的日益完备以及静态分析工具准确性和性能的提升,更多的分析方法被提出,本文提出的Android应用程序权限组重要性分析方法可以成为新的Android应用程序分析方式,研究人员可以通过本文的方法进行进一步研究。

猜你喜欢
有向图应用程序重要性
极大限制弧连通有向图的度条件
有向图的Roman k-控制
“0”的重要性
论七分饱之重要性
幼儿教育中阅读的重要性
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
读《边疆的重要性》有感
本原有向图的scrambling指数和m-competition指数
一类含三个圈的本原有向图的m-competition指数