Android系统安全权限

本文详细介绍了Android的权限管理机制,包括权限声明、AndroidManifest.xml的角色、最小特权原则以及AndroidM之后的运行时权限请求流程。强调了Android系统权限的动态管理和用户在不同版本中的决策过程。

一、Android的权限机制

Android是目前最流行的智能手机软件平台之一,在智能移动终端如火如荼发展的同时,其安全态势也日益严峻。有调查表明,恶意软件的数量在持续的上升,Google在Android安全机制上面也做了很多工作,并且一直在持续的更新,其Android的安全模型由3个部分组成:Linux安全机制、Android本地库及运行环境安全与Android特有的安全机制,如下图:

  

本文只涉及到其中的权限机制介绍,其他的部分如果有感兴趣的,我们可以后续一起探讨。

Android的权限管理遵循的是“最小特权原则”,即所有的Android应用程序都被赋予了最小权限。一个Android应用程序如果没有声明任何权限,就没有任何特权。因此,应用程序如果想访问其他文件、数据和资源就必须在AndroidManifest.xml文件中进行声明,以所声明的权限去访问这些资源。否则,如果缺少必要的权限,由于沙箱的保护,这些应用程序将不能够正常提供所期望的功能与服务。

所有应用程序对权限的申请和声明都被强制标识于AndroidManifest.xml文件之中,通过,,等标签指定。如果需要申请某个权限,可以通过指定。应用程序申请的权限在安装时提示给用户,用户可以根据自身需求和隐私保护决定是否允许对该应用程序授权。

二、Android系统对应用程序授权申请的处理流程:

(1)进入处理应用程序授权申请的入口函数;

(2)系统从被安装应用程序的AndroidManifest.xml文件中获取该应用正常运行需申请的权限列表;

(3)显示对话框,请求用户确认是否满足这些权限需求;

若同意,则应用程序正常安装,并被赋予相应的权限;若否定,则应用程序不被安装。系统仅提供给用户选择“是”或者“否”的权利,没有选择其中某些权限进行授权的权利。

具体如下图:

三、Android系统权限变化趋势:

Android M之前,应用的权限请求是在安装时提示,确认后权限就会拥有。

但Android M出来后,将这个权限在运行时做了进一步的检查,用户随时可拒绝权限。

● 从平台角度看:Android权限集不断扩展,但不是以提供更细粒度的权限为目标,而是为访问新的硬件功能提供安全保障。特别地,Dangerous权限集的数量也在不断增多;

● 从第三方应用和预装应用角度看:大量应用并未遵守最小特权原则,而是存在大量过多申请权限的情形。值得注意的是:许多预装应用使用大量高级别的权限,带来很大的安全隐患。

用户只有通过不断学习,充分理解新加入的权限说明,才能在安装软件时从Android权限警告中获取足够的信息,从而做出正确的决定。鉴于Android系统每隔数月就有较大的版权更新,并引入较多新的权限,这为用户提出了很高要求。

四、Android M变化以及带来的影响

从Android6.0(API LEVEL23)开始,用户对应用权限进行授权是发生在应用运行时,而不是在安装时。这样可以让用户在安装时节省时间,而且可以更方便的控制应用的权限(至少权限管理不需要ROOT了)。用户可以按照对应用的需求来控制应用的权限,比如百度地图的联系人权限。同时用户也可以在应用程序设置中撤销对应用的权限授权。

Android系统中的权限被划分为两类:普通权限和敏感权限(更多普通权限、敏感权限及权限组信息:

普通权限不会涉及到用户隐私,如果应用在manifest文件中直接声明了普通权限,系统会自动授予权限给应用。比如:网络INTERNET、蓝牙BLUETOOTH、震动VIBRATE等权限。

敏感权限则要获取到一些用户私密的信息。如果你的应用需要获取敏感权限,首先需要获取用户的授权。比如:相机CAMERA、联系人CONTACTS、存储设备STORAGE。

https://developer.android.com/reference/android/Manifest.permission.html

详情见上面这个链接,每个权限里面可能会有Protection level,标记着是dangerous还是normal

在Android的各个版本中,不论是普通权限还是敏感权限,都需要在manifest文件中声明,例如权限声明。然而,在不同版本的操作系统或不同的target SDK level中的结果是不同的。

如果设备运行Android5.1或者更低版本的操作系统,或者你的目标SDK版本号小于或等于22,当你在manifest文件中请求了一些权限,用户必须在安装过程时授予全部权限,否则应用不能正常安装。

如果设备运行在Android6.0或者更高版本,并且目标SDK版本号大于或等于23,应用程序必须要在manifest文件中声明需要的权限,当程序运行时,它必须要向用户请求授权每个所需的敏感权限。用户可以允许或拒绝每个权限,并且程序可以依赖用户已经授权的权限继续运行。(这里可能比较绕,举个例子:假设你的APP需要联系人和拍照权限,在请求权限时用户只授予了联系人权限,那么当前程序可以正常运行并获取联系人信息,但是无法进行拍照)

五、其他

安全架构
Android安全架构中一个中心思想就是:应用程序在默认的情况下不可以执行任何对其他应用程序,系统或者用户带来负面影响的操作。这包括读或写用户的私有数据(如联系人数据或email数据),读或写另一个应用程序的文件,网络连接,保持设备处于非睡眠状态。

一个应用程序的进程就是一个安全的沙盒。它不能干扰其它应用程序,除非显式地声明了"permissions",以便它能够获取基本沙盒所不具备的额外的能力。它请求的这些权限"permissions"可以被各种各样的操作处理,如自动允许该权限或者通过用户提示或者证书来禁止该权限。应用程序需要的那些"permissions"是静态的在程序中声明,所以他们会在程序安装时就被知晓,并不会再改变。

应用程序签名
所有的Android应用程序(.apk文件)必须用证书进行签名认证,而这个证书的私钥是由开发者保有的。该证书可以用以识别应用程序的作者。该证书也不需要CA签名认证(注:CA就是一个第三方的证书认证机构,如verisign等)。Android应用程序允许而且一般也都是使用self-signed证书(即自签名证书)。证书是用于在应用程序之间建立信任关系,而不是用于控制程序是否可以安装。签名影响安全性的最重要的方式是通过决定谁可以进入基于签名的permisssions,以及谁可以share 用户IDs。

用户IDs和文件存取
每一个Android应用程序(.apk文件)都会在安装时就分配一个独有的Linux用户ID,这就为它建立了一个沙盒,使其不能与其他应用程序进行接触(也不会让其它应用程序接触它)。这个用户ID会在安装时分配给它,并在该设备上一直保持同一个数值。

由于安全性限制措施是发生进程级,所以两个package中的代码不会运行在同一个进程当中,他们要作为不同的Linux用户出现。我们可以通过使用AndroidManifest.xml文件中的manifest标签中的sharedUserId属性,来使不同的package共用同一个用户ID。通过这种方式,这两个package就会被认为是同一个应用程序,拥有同一个用户ID(实际不一定),并且拥有同样的文件存取权限。注意:为了保持安全,只有当两个应用程序被同一个签名签署的时候(并且请求了同一个sharedUserId)才会被分配同样的用户ID.

所有存储在应用程序中的数据都会赋予一个属性-该应用程序的用户ID,这使得其他package无法访问这些数据。当通过这些方法getSharedPreferences(String, int), openFileOutput(String, int), or openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory)来创建一个新文件时,你可以通过使用MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE标志位来设置是否允许其他package来访问读写这个文件。当设置这些标志位时,该文件仍然属于该应用程序,但是它的global read and/or write权限已经被设置,使得它对于其他任何应用程序都是可见的。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值