基于权限管理的Android应用行为检测

中国科技论文在线
https://www.360docs.net/doc/0e8557936.html,
基于权限管理的 Android 应用行为检测
刘智伟,孙其博**
5 (北京邮电大学网络与交换技术国家重点实验室,北京 100876) 摘要:随着 Android 系统所占据市场份额的增加,越来越多的安全问题成为了困扰 Android 系统进一步发展的羁绊。 当前市场大部分安全软件不能够实现对应用行为实时的监控, 极少 安全软件需要 root 权限才能是实现应用行为实时的监控。 本文基于 Android 应用框架层的定 制, 利用 Android 系统 permission 机制的动态检查模式实现应用运行时行为的检测。 Android 应用通过申请所需权限,在运行过程中当需要调用对应的 API 或者访问系 统数据时,会发生系统权限检查,从而实现对应用行为的监控。相对在应用层进行应用行为 的监控要更简洁有效, 通过在框架层的定制更好地实现了对应用行为的监控, 同时带给系统 的损耗更小。 关键词:应用行为;Permission 机制;权限动态检查 中图分类号:TP399
10
15
Android Application Behavior Detection Based Rights Management
LIU Zhiwei, SUN Qibo
20 (State Key Laboratory of Networking and Switching Technology, Beijing University of Posts and Telecommunications, Beijing 100876) Abstract: With the increase of the market share occupied by the Android system, security issues become more and more troubled by the fetters of the Android system for further development. More of the current market for security software is not able to achieve real-time monitoring application behavior, very few security software requires root privilieges to achieve real-time monitoring application behavior. Based on a custom Android application framework layer, using a dynamic model of Android system permission checking mechanism to achieve detection application runtime behavior. Application take advantage of the label of to required permissions, during the runtime when the app needs to call the corresponding API or access to system data, system privileges inspection will occur and get the application behavior monitoring. This method is more simple and effective to monitoring applicaion behavior and binging a smaller loss system. Key words: Application Behavior; Permission Mechanism; Permissions Dynamically Check
25
30
0 引言
伴随着 Android 系统的迅猛发展,其安全问题受到了越来越多人的关注。由于 Android 35 系统的开源以及其生态环境的多样性, 导致了 Android 市场里边充斥着各种各样的木马病毒 软件,严重的影响了用户的隐私信息和财产安全。 当前市场上也出现了很多安全防护软件, 大部分是采取了被动防御的方式, 利用特征码 的方式来识别已经明确的木马病毒, 对于未知的木马病毒不能起到很好的预防作用。 小部分 采用了主动防御,利用 root 权限,采用 hook 机制实现对应用程序的动态行为监控,但是监 40 控之后要移交给用户,让用户自己判断应用的行为是否合理,这样大大增加了用户的负担, 尤其是对于没有计算机背景的用户来说是很难做出正确的选择。
作者简介:刘智伟(1988-),男,硕士,终端安全 通信联系人:孙其博(1975-),男,副教授,移动信息安全、下一代网络与网络智能化. E-mail: qbsun@https://www.360docs.net/doc/0e8557936.html,
-1-

中国科技论文在线
https://www.360docs.net/doc/0e8557936.html,
相比较 ios 系统而言, 造成 Android 系统面临这么严重的安全问题主要是由于两个原因: 其一是由于 Android 系统的开放性,总所周知 Android 系统作为一个开源项目,对于开发者 而言开放了太多的接口,这也为一些不良的开发者提供了机会;其二是由于 Android 应用的 45 生态环境,用户可以通过多种渠道来安装应用,不仅限于 Android Market,很多第三方的应 用提供商对于上架的应用没有进行严格的审查, 导致了各种携带恶意代码的应用充斥在网络 中,对用户造成了伤害。 基于以上的问题,本文从系统的权限管理机制出发,首先对 Android 系统定义的 permission 进行分析,将权限与应用行为关联抽象;其次,对 Android Permission 的动态检 50 测以及 Linux 内核的权限管理进行了深入研究,确定系统定义的 permission 的检测方式;最 后,对系统模块的修改扩展,完成对应用动态行为的检测。
1 Android 权限管理机制
Android 的权限管理机制主要包括两部分:Linux 用户权限管理机制以及在此基础之上 扩展的 Permission 机制。Permission 机制位于 Android 的 Framework 层,也是本文主要研究 55 的部分。 1.1 Linux 用户权限管理 Android 良好的继承了 Linux 用户权限管理,使得 Android 系统成为一个权限分离的系 统。Linux 系统中通过 uid、gid、gids 来实现对系统中的用户管理。在 Linux 系统中,用户/ 用户组对文件的访问遵循 Linux 系统的访问控制原则, 即根据长度为 10 个字符的权限控制 60 符来决定用户/用户组对文件的访问权限。该控制符的格式遵循下列规则: 第 1 个字符:表示一种特殊的文件类型。其中字符可为 d 表示该文件是一个目录、b 表 示该文件是一个系统设备、“.”表示该文件是一个普通文件,没有特殊属性等。 2 ~ 4 个字符:用来确定文件的所有者(owner)权限; 5 ~ 7 个字符:用来确定文件的组(group)权限; 65 8 ~ 10 个字符:用来确定文件的其它用户(other user ,所有者以及组成员以外用户)的 权限。 第 2、5、8 个字符是用来控制文件的读权限的,该位字符为 r 表示允许所有者、组成 员或其它人可从该文件中读取数据。短线“-”则表示不允许该成员读取数据。 第 3、6、9 位的字符控制文件的写权限,该位若为 w 表示允许写,若为“-”表示不允许 70 写。 第 4、7、10 位的字符用来控制文件的执行权限,该位若为 x 表示允许执行,若为“-” 表示不允许执行。 用户在访问某一个文件的时候, 系统会根据文件的权限控制符来判断用户是否拥有权限 进行相应的操作。Linux 系统中为每个用户分配 uid 以及 gid,通过 uid 和 gid 来进行用户权 75 限管理, 判断用户是否拥有权限操作某个文件。 同样的在 Android 系统中也保存了这一特性, 将系统中的各种应用当成用户来看待,为每个应用分配 uid、gid 以及 gids。 uid:在 Android 系统中将一个应用当作一个用户,在应用安装之初就为应用设定 uid, 第三方安装的应用的 uid 号是从 10000 开始分配的, 小于 10000 的编号是用于分配给系统进 程的。这个 uid 在应用存在于系统的整个时间里是不会改变的。对于同一个应用在不同的 80 Android 系统中分配的 uid 是可能不一致的,并且在同一个 Android 系统中重新装一次之后
-2-

中国科技论文在线
uid 也是可能发生改变的。
https://www.360docs.net/doc/0e8557936.html,
gid:对于普通应用而言,gid 与 uid 是一致的,使得不用应用的 gid 不同,从而很好的 保护了应用的私有数据。 gids:在应用程序安装的时候,根据应用申请的权限,系统为应用分配 group,并被保 85 存在相应的结构中。 Android 系统中每一个应用程序都是独立的运行在自己的进程中(一个沙箱中),由于 它们彼此之间拥有不同的 uid 以及 gid,从而完美的实现了对应用进程之间的隔离,使得它 们的数据和代码彼此不被影响。在内核层次实现了对权限的分离管理。 1.2 Permission 机制 90 Permission 机制是 Android 系统在 Linux 的权限管理基础上扩展的一种安全保护机制, 它主要的任务是用来对应用可以执行的某些具体操作进行权限细分和访问控制,位于 Android 系统的框架层,主要是为了限制应用开发者对系统资源或者用户信息的滥用。 Android 应用程序的权限主要包括两个方面: 一方面, 应用利用系统提供的 API 及其他服务, 这些 API 和服务受权限保护,需要在 Manifest 中注册相应的权限,此时应用成为权限的需 95 求方;另一方面,如果一个应用提供了其他应用需要访问的功能,为了安全的目的,需要在 代码中指定访问这些功能所需要的权限,此时该应用成为授权方[1]。 Android 系统将系统提供的 API 以及数据进行细化,封装了 145 个 permission,每一个 permission 对应一种资源。默认缺省情况下,应用无权执行可能对其他应用、系统或者用户 造成影响的任何操作,这些操作可能包括读写用户私人数据(短信或者通话记录等)、访问 100 网络、获取地理位置信息以及录音拍照等。如果要使用系统提供的这些功能,则需通过 标签在 Manifest 文件中申请对应的权限。例如: …… 上述这段代码注册了三个权限分别是:访问网络、写内存卡以及读取联系人信息,注册 115 权限之后, 应用程序在执行访问网络、 写内存卡或者读取联系信息操作的时候才能正常完成。 一个权限主要包含三个方面的信息:权限名、权限组以及保护级别。权限名用来标识一 个权限,权限组是指将相同功能的权限划分为一个组以方便管理,权限级别则相对复杂。 Android 系统对权限进行了四级划分:normal、dangerous、signature、signatureorsystem。前 两个级别对第三方的应用开发者而言是最常用的,其中,normal 级别的权限申请了就可以 120 使用,dangerous 级别的权限需要在安装的时候用户确认才行。后两个级别主要针对系统预 装的应用,要求应用的数字证书必须与系统一致才行。
105
110
-3-

中国科技论文在线
https://www.360docs.net/doc/0e8557936.html,
Android 系统还支持应用程序定义自己的权限, 来限制其他应用对其组件或数据的访问, 其方法是通过标签在 Manifest 文件中定义应用的 permission,然后在 Activity、 Service、BroadcastReceivery 以及 ContentProvider 四大组件的申明中添加权限要求。其他的 125 应用希望利用到该应用的资源时也需要像申请系统权限一样在 Manifest 文件中申请。 应用在申请了相关 permission 之后就可以操作相应的系统资源, 因此默认没有任何权限 的应用程序是不能够对系统或者其他应用造成危害的。 这也说明申请 permission 所对应的系 统 API 调用或者数据访问是关键的应用行为。所以本文从此入手,将应用的关键行为通过 permission 进行抽象,将 permission 关联到应用的行为元素。 130
权限 android.permission.INTERNET android.permission.INTERNET android.permission.READ_SMS android.permission.WRITE_EXTERNAL_STORAGE android.permission.CLEAR_APP_CACHE android.permission.ACCESS_FINE_LOCATION android.permission.CALL_PRIVILEGED android.permission.CHANGE_NETWORK_STATE 表1 权限&行为对应关系 行为 访问网络 发送短信 读取短信 写内存卡 清楚缓存 获取位置信息 拨打电话 改变网络状态
注:大部分权限通过字面的意思就能明确它所对应的应用行为,这里没能将全部对应关系在文中一一 列出。
通过对 Android 系统中所有的 permission 的抽象,确定了应用行为的集合。虽然这个集 合没能包括全部的应用行为, 仅仅包含了应用与系统交互的行为, 但是包含了可能对用户造 135 成隐私信息或财产安全损害的所有关键行为。 因为默认情况下不申请任何权限的应用是不会 对系统或用户造成任何威胁的, 它没有权限去操作任何系统资源或用户信息, 只有申请了相 应的权限有可能对系统或用户造成财产和隐私的损害, 例如上表中发短信的行为、 访问网络 的行为、 获取地理位置等等, 获取这些权限之后都是可能会给用户带来财产或信息损失的行 为。 这样对应用行为进行分析时面临的数据量要小很多, 而且更加有针对性, 比较清晰简洁。 140
2 Android 动态权限检测机制
应用行为与 permission 的关联使得对应用动态行为的检测问题转变成为 Android 系统对 应用权限的动态检测。应用权限的动态检测机制是 Permission 机制中最重要的组成部分, 通 过静态的注册以及动态的检测实现了对系统资源的保护。 Android 系统不允许应用程序动态注册权限,必须在安装应用之前申请所需要的权限。
145
运行时,在应用调用系统受限的 API 或访问系统受限的数据时,会触发权限的检测,如果 应用没有注册相应的权限就会抛出 SecurityException 异常,并终止应用的执行;如果应用注 册了相应的权限,才能通过系统的检测,并完成相应的操作。基于此,可以通过对 Android 系统权限检测模块的定义来实现对应用行为的监控。 Android 系统的 Permission 框架如图 1 所示:
-4-

中国科技论文在线
https://www.360docs.net/doc/0e8557936.html,
150
图1 Permission 框架[2]
针对以上 Permission 框架,需要重点关注的两个问题是:其一,在应用安装的过程中, 系统是如何解析应用申请的权限并保存; 其二, 应用访问受限系统资源的时候是怎么触发系 统的权限检测模块以及如何判断应用是否拥有了对应的权限。 155 2.1 应用权限的授权 Android 应用的安装方式主要有四种:系统应用安装、网络下载安装、SDcard 安装以及 ADB 命令安装。四种安装方式虽然不一样,但是安装过程中对权限的的处理流程是一样的。 Android 权限在安装过程中的流程如图 2 所示:
160
图2
应用权限的实现流程
这里需要重点注意的是第 3、4 步的处理,在第三步的处理过程中会根据权限的级别对 应不同的处理流程,尤其是对于 dangerous 级别的权限,在解析之后会提示给用户,让用户
-5-

中国科技论文在线
https://www.360docs.net/doc/0e8557936.html,
来授权安装。第四步会检测 AndroidManifest.xml 中的权限是否对应存在于系统定义的 platform.xml 文件中(对于大部分权限而言,在 platform.xml 文件中是没有定义的,主要是 165 针对系统部分设备),platform.xml 存储了 group gid 和权限字符串的对应关系,系统会根据 对应的关系将所安装的应该用添加到对应的 group 中。platform.xml 中存储的格式如下: 对 于 不 在 platform.xml 文 件 中 定 义 的 权 限 , 在 处 理 的 过 程 中 会 被 保 存 在 PackageParser.Package 的 requestPermissions 的数据结构中, 最后连同应用注册的组件信息一 起保存在/data/system/packages.xml 文件中, 以便于系统能够更快的启动并且启动应用的时候 不用再次的对应用进行解析。 180 2.2 权限检测 应用程序获得相应权限之后,它就能通过调用系统提供的 API 来完成相应的功能,但 是在调用之前需要进行权限的检测,这样就将应用的权限范围限定在它所申请的权限范围 内。由于安装的时候对权限进行了不同的处理,所以对于权限的动态检测也存在两种机制。 1) 185 对系统设备直接访问的权限检测 这种类型的权限检测机制主要是针对类似网络访问或者读写内存卡的权限等, 在实现的 过 程 中 直 接 利 用 了 Linux 的 用 户 权 限 管 理 机 制 。 当 应 用 程 序 申 请 了 android.permission.INTERNET 权限, 在应用安装的过程中通过查询 platform.xml 文件为应用 程序分配相应的 group。在应用启动的时候系统将设置进程的 uid、gid 以及 gids,其中 gids 就是系统为应用分配的 group 信息[3]。 190 应用程序运行时通过系统提供的接口访问对应的网络设备, 在访问之前, 系统会进行权 限的认证。这个认证过程与 Linux 下对文件的访问权限控制一致,通过检查应用程序所拥有 的 gids 与设备所对应的 group 是否一致, 来决定是否允许完成这次访问。 这种控制机制是由 Linux 内核来实现管理的。针对这一类的权限,可以通过在应用层开发一个针对特定行为的 应用程序来进行监控。 这个应用程序主要是对网络访问以及读写内存卡的情况进行监控, 其 195 他的一些权限对应用行为的判断影响很小,这里暂时没有考虑。 2) 对系统设备或系统服务间接访问的权限检测 Android 系统对于大部分权限对应的功能都提供了对应的系统服务进程,应用通过进程 间的调用来获取相应的功能服务, 这种跨进程访问是通过 Android 的 Binder 机制来实现。 具 体应用对于某个系统服务 API 的调用要经历三个步骤:第一,应用申请了相应权限之后调 200 用系统封装标准库的 API;第二,这些标准库的 API 会去调用 API 代理接口(RPCstub); 第三,RPCstub 把请求通过 Android 系统的 Binder 机制通知系统服务进程,功能最后是由系 统服务进程实现的。而权限的检测发生在系统服务进程中,通过调用 Context 类中的 check**Permission()方法来判断。
-6-
170
175

中国科技论文在线
205
https://www.360docs.net/doc/0e8557936.html,
210
215
下边通过发短信权限的系统检测代码说明该种权限检测的方式。 public void sendData(String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { mPhone.getContext().enforceCallingPermission( "android.permission.SEND_SMS", "Sending SMS message"); if (Log.isLoggable("SMS", Log.VERBOSE)) { log("sendData: destAddr=" + destAddr + " scAddr=" + scAddr + " destPort=" + destPort + " data='" + HexDump.toHexString(data) + "' sentIntent=" + sentIntent + " deliveryIntent=" + deliveryIntent); } mDispatcher.sendData(destAddr, scAddr, destPort, data, sentIntent, deliveryIntent); } 在代码中是通过调用 Context 的 enforceCallingPermission 方法来进行检测的,Context 类是一个抽象类,具体的权限检测的实现都是在其子类 ContextImpl.java 中实现的,其中主
220
225
要由以下这些函数实现对应用的权限检测: Context.checkCallingOrSelfPermission(String); Context.checkCallingOrSelfUriPermission(Uri,int); Context.checkCallingPermission(Permission); Context.checkCallingUriPermission(Uri,int); Context.checkPermission(String,int,int); Context.checkUriPermission(Uri,int,int,int); Context.checkUriPermission(Uri,String,String,int,int,int); Context.enforceCallingOrSelfPermission(String,String); Context.enforceCallingOrSelfUriPermission(Uri,int,String); Context.enforceCallingPermission(String,String); Context.enforceCallingUriPermission(String,String); Context.enforcePermission(String,int,int,String); Context.enforceUriPermission(Uri,int,int,int,String); Context.enforceUriPermission(Uri,String,String,int,int,int,String); 具体函数的含义请参考官方文档,其中需要说明的一点是,这些函数的最后都要调用 PackageManagerService 中的 checkUidPermission 方法来判断应用是否申明了对应的权限 (应 用在初始安装时会将其所有的 Permission 信息保存,检测的时候就是判断应用对应的 permission 序列中是否包含当前检测的 permission),从而最终实现对应用权限的动态检测。
230
235
240
3 应用运行行为检测
通过前一小节深入研究 Android 权限的检测机制,为实现对应用的行为检测提供了方 法。 由于 Android 动态权限检测分为两种情况, 所以通过两种方式来实现对应用行为的检测: 其一是在系统 Framework 层对现有源码的修改和扩展; 其二是利用 Android 系统提供的 API, 实现一个系统应用对特定几个权限对应的行为进行检测。
245
基于 Android 源码扩展的应用行为检测架构图 3 如下所示:
-7-

中国科技论文在线
https://www.360docs.net/doc/0e8557936.html,
图3
系统架构图
该系统的架构基于原 Android 系统对权限动态检测的机制, 添加了对应用行为的监控模 块以及内存卡和网络访问行为的监控应用。 250 1) 对于系统 Framework 层的修改和扩展主要是集中在 PackageManagerService 类的 checkUidPermission 方法中[4][5],在权限检测成功的分支上调用自定义的一个方法,启动应 用行为监控模块,调用日志输出模块输出应用行为,实现应用行为监控。 2) 255 利用系统提供的 API 来实现对特定权限对应行为的监控,主要是包括两个权限, 分别是网路访问以及内存卡读写权限, 通过实现一个 Android 上的应用来实现对这两个权限 的监控, 也采用相同的日志输出模块进行处理, 这样就可以将两种检测模式下检测到的行为 信息整合到一 块有利于以 后的分析 。其中对于 网 络访问情况的 监控利用系 统提供的 TrafficStats 类来实现。Google 在 Android 2.3 之后对流量监控进行了很好的封装,基于系统 提供的接口可以对系统所有应用的网络访问情况进行很好的监控。 TrafficStats 提供了多种接 口实现对网络流量的监控, 包括发送和接收的流量以及 WiFi 情况下以及 Mobile 情况下的流 260 量等等,清晰的监控到应用访问网络的行为。 对于内存卡的读写监控是基于系统提供的 FileObverser 类实现。它是利用 Linux 系统的 Notify 机制完成的,可以实现对内存卡中文件或者文件夹的打开、创建、移动和删除等操作 实时的监控。 同时该应用里边还包含对日志输出模块的交互操作, 来实现对日志模块的控制。 3) 265 日志输出模块负责把应用行为信息存储到本地, 在完成了对应用测试将日志上传到 服务端。日志模块的主要功能包括:识别 uid,通过为日志输出模块设定 uid 过滤不属于该 uid 应用的行为信息;发送日志到服务端,应用测试完成之后通知日志输出模块将日志信息 发送到服务端;日志内容主要包括:uid、permissionName、time 三个字段,其中 uid 用于确 定应用,permissionName 是要检测权限的字符串表示,time 用来记录行为发生的时间,然后 通过 Permission 与应用行为的对照表完成对行为的解释。 270 通过在框架层和应用层全面的对应用动态行为的检测, 并且实现了应用行为信息的合并 以及过滤,保证了应用行为信息的完整性,为后来对应用行为的分析提供了良好的保证。
-8-

中国科技论文在线
4 结束语
https://www.360docs.net/doc/0e8557936.html,
本文从 Android 系统的权限管理机制出发,深入研究系统在运行时对权限的动态检测, 将应用行为的检测转变为权限的动态检测,同时将应用行为与 permission 相关联,完成了对 275 应用行为的动态检测。从理论上能够很好地完成预定的目标:实时监控应用的行为。下一步 将完善应用运行的行为集合,将应用自定义的 permission 考虑进来,尽可能全面的实现对应 用行为的监控。 [参考文献] (References) 280
[1] 张中文,雷灵光,王跃武. Android Permission 机制的实现与安全分析[J]. 信息网络安全,2012,(8): 3-6 [2] 鲍可进,彭钊. 一种扩展的 Android 应用权限管理模型[J]. 计算机工程,2012,38(18):57-60 [3] 邓凡平. 深入理解 Android 卷 1[Z]. 北京:机械工程出版社,2011 [4] 黄景全, 陈铁民, 孔德智, 李倩. Android 权限模型的研究和改进[J]. 电子产品可靠性与环境试验, 2013, 31(3):37-40 [5] 戴威, 郑滔. 基于 Android 权限机制的动态隐私保护模型[J]. 计算机应用研究, 2012, 29 (9) : 3479-3482
285
-9-

相关文档
最新文档