一、Android的权限机制
Android是目前最流行的智能手机软件平台之一,在智能移动终端如火如荼发展的同时,其安全态势也日益严峻。有调查表明,恶意软件的数量在持续的上升,Google在Android安全机制上面也做了很多工作,并且一直在持续的更新,其Android的安全模型由3个部分组成:Linux安全机制、Android本地库及运行环境安全与Android特有的安全机制,如下图:
本文只涉及到其中的权限机制介绍,其他的部分如果有感兴趣的,我们可以后续一起探讨。
Android的权限管理遵循的是“最小特权原则”,即所有的Android应用程序都被赋予了最小权限。一个Android应用程序如果没有声明任何权限,就没有任何特权。因此,应用程序如果想访问其他文件、数据和资源就必须在AndroidManifest.xml文件中进行声明,以所声明的权限去访问这些资源。否则,如果缺少必要的权限,由于沙箱的保护,这些应用程序将不能够正常提供所期望的功能与服务。
所有应用程序对权限的申请和声明都被强制标识于AndroidManifest.xml文件之中,通过,,等标签指定。如果需要申请某个权限,可以通过指定。应用程序申请的权限在安装时提示给用户,用户可以根据自身需求和隐私保护决定是否允许对该应用程序授权。
二、权限基本知识
2.1 权限的类别
由于基于Linux内核,Android系统中的权限分为以下3类。
(1)Android手机所有者权限
这个和厂商相关,可以理解为系统权限。
(2)Android ROOT权限
类似于Linux,这是Android系统中的最高权限。如果拥有该权限,就可以对Android系统中的任何文件、数据、资源进行任意操作。所谓“越狱”,就是令用户获得最高的ROOT权限。
(3)Android应用程序权限
该权限在AndroidManifest文件中由程序开发者声明,在程序安装时由用户授权,共有下述4类不同的权限保护级别(Protection Level)。
2.2 Protection level
我们经常在AndroidManifest中使用权限,如果我们想让应用程序可以发短信,那么应该这样写:
其权限的定义是在frameworks/base/core/res/AndroidManifest.xml中,如下:
android:permissionGroup="android.permission-group.COST_MONEY"
android:protectionLevel="dangerous"
android:label="@string/permlab_sendSms"
android:description="@string/permdesc_sendSms" />
这个XML可以认为是系统APK使用的AndroidManifest.xml,该APK使用系统的私钥进行签名。
下面分别简单介绍下各个标签的含义:
android:name:权限的名字,uses-permisson使用的。
android:permissionGroup:权限的分类,在提示用户安装时会把某些功能差不多的权限放到一类。
android:protectionLeve:分为Normal、Dangerous、Signature、SignatureOrSystem。
android:label:提示给用户的权限名。
android:description:提示给用户的权限描述。
其中android:protectionLevel各个属性说明如下:
(1)Normal
风险较低的权限,任何应用都可以申请,在安装应用时,不会直接提示给用户,点击全部才会展示。
(2)Dangerous
风险较高的权限,任何应用都可以申请,安装时需要用户确认才能使用。
(3)Signature
仅当申请该权限的应用程序与声明该权限的程序使用相同的签名时,才赋予该权限。
(4)SignatureOrSystem
仅当申请该权限的应用程序位于相同的Android系统镜像中,或申请该权限的应用程序与声明该权限的程序使用相同的签名时,才赋予该权限。
可以这样理解:
1)和该APK(定义了这个权限的APK)用相同的私钥签名的应用。
2)在/system/app目录下的应用。
2.3 进程的权限表现
Android是一个多进程系统,在这个系统中,应用程序会在自己的进程中运行,系统和应用之间的安全性是通过Linux进程级别来强制实现的,会给应用程序分配userID和GroupID。
比如我们查看qqdownload这个进程,adb shell后查看下其进程id(红色部分):
根据id,执行下查看状态,如下:
我们关注如下三行