作为业界良心,小米终于在3月2日(Android 6.0正式发布半年后)正式开始推送MIUI 7.2稳定版(based on Android 6.0.1),我的小米4也在最近收到了OTA推送。
Android 6.0,代号Marshmallow,自发布伊始,其主要新特性运行时权限就备受关注。在6.0之前,都是权限一刀切的处理方式,只要用户安装,manifest申请的权限都会被赋予,并且安装后权限也撤销不了。从6.0开始,Android系统引入了新的权限机制,即运行时权限。关于运行时权限,已经有很多文章介绍了,这里就不哆嗦了,还没来得及了解的同学可以去看下技术小黑屋的这篇文章聊一聊Android6.0的运行时权限。
Android6.0将一些敏感权限进行了分类,其中有一个类别叫做危险权限。危险权限实际上才是运行时权限主要处理的对象,这些权限可能引起隐私问题或者影响其他程序的运行,应用在安装时,它在manifest中危险权限不会被授予,必须在APP运行时主动请求,由用户选择是否授予相关权限。
Android中的危险权限又进行了分组,每个组内有一个或多个权限,详细可以查阅Permission groups。这里需要注意的是,当组内的任意一个权限被授予时,和它同组的其他权限也会被同时授予。
If an app requests a dangerous permission listed in its manifest, and the app does not currently have any permissions in the permission group, the system shows a dialog box to the user describing the permission group that the app wants access to. The dialog box does not describe the specific permission within that group.
举个例子,要允许APP发短信,就得同时允许这个APP收短信。
Are you kidding me?如果这个APP是具有吸费功能的流氓软件呢?所以说Android 6.0权限系统的设计者基本无视了最小权限原则(principle of least privilege)。我们来看一下PHONE和SMS这两个分组:
PHONE和SMS两个组内权限数量多,而且都是敏感权限,如果这些权限组合在一起,那对小白用户来说真的是太可怕了。所以说Android原生系统对普通用户来说真的不算是友好且安全的,它更像是一个面向手机厂商的系统,厂商拿到以后,经过再加工,重新设计成一个面向大众用户的操作系统。
既然原生Android在运行时权限这里设计的并不好,那我们来看看MIUI是怎么做的。
首先安装一个target Android 6.0的应用,6.0已经正式发布半年了,BAT的几大APP基本都符合要求,这里我们选择手机百度APP。
安装完成后,打开手机百度,竟然畅通无阻,使用时并没有看到请求运行时权限的弹窗。奇怪,难道MIUI已经默认将那些权限授予了手机百度吗?我们来到MIUI安全中心-授权管理-应用权限管理,找到手机百度,和之前猜测的一样,在手机百度安装后但未运行时,MIUI就已经默认授予了手机百度一些权限:
反向验证,我们将手机百度的定位权限的选项改为询问,然后再次打开手机百度,果然,手机百度会弹出新手引导提示用户授予权限,接着系统也会显示请求定位权限的弹框:
可以看出,MIUI 7.2在运行时权限的基础上,做了一些细节上的修改,在用户使用类似手机百度这种常用的超级APP时,并不会出现请求权限的弹窗,避免用户选择拒绝后APP无法使用的情况。MIUI应该是统计了用户对APP权限允许和拒绝的数据,针对TOP排行榜靠前的APP,运营出了满足这个APP基本运行要求、并且确保资费和隐私安全的前提下默认的一套权限配置。
我们再来看一下MIUI 7.2对权限是怎么分组的:
令人欣慰的是,除了把读&写手机存储合并以外,其他的敏感权限都是单个权限区分开来的,并没有像原生Android那样按组划分。
继续寻找MIUI对应用权限的智能配置,我们需要反编译分析MIUI安全中心。经过分析,找到保存权限配置的数据库及其相关字段。然后遍历所有权限,每次允许一项权限后,记录代表用户当前所允许权限的int值,转为二进制,如图所示:
可以看出,其实上面的二进制,每一位就代表应用的一项权限。感兴趣的同学可以仔细研究下,涉及到MIUI的权限数据,我这里就不往详细里说了。