Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

Small Changes, Big Changes: An Updated View on the Android Permission System

Introduction

  • 本文介绍了6.0新版本引入的权限变化,并且结合历史版本的权限变化进行了分析,指出了其中可能存在的问题。
  • 6.0版本(API 23)最大的特点是引入了动态权限机制,所有权限都被分为两类,一类是installtime permissions另一类是runtime permissions。前者主要包括normal权限和signature权限,在APP安装的时候被赋予。后者主要是危险权限,安装时默认禁止,用户可以在之后进行权限控制。
  • 所有动态权限机制都被按组分配,粒度较粗,例如在申请读取联系人的同时也被赋予了修改联系人的权限(READ CONTACTS和 WRITE CONTACTS同属于CONTACTS权限组)
  • signature权限可以被第三方app获得,不需要满足相同签名的条件
  • signature|system的权限等级被废弃了
  • 一些以前版本的危险级权限现在成为normal等级的,并且用户无法控制

作者的发现:

  • 即使 signature|system的权限等级被废弃了,但是官方仍然新加入了这个等级的新权限
  • 由于runtime permission需要向后兼容,开发者开发新的APP希望能够运行在老版本的系统上,但有些老版本中不存在特定的权限,作者找到了一些这样的权限
  • 一些非危险等级的权限被放在了权限组中,作者找到了类似的权限。

Background

Fig

  • 图a表示以前版本的APP在6.0上的权限提示对话框。图b表示具体到每个组里有哪些应用,图C表示所有的权限组,图D表示第三方权限
  • 新的API编写的APP,每次使用权限之前都需要先请求权限,为了向后兼容,在旧版本的系统上也能运行,实现runtime权限,google提供了兼容库,通过代理API做权限查询,但是以前版本的权限不统一,在某些版本没有特定的权限,代理会固定返回false,从而导致APP无法使用。
  • 用以前API编写的APP,在新的系统上,为了兼容会首先提示图a所示的提示框,和旧版本一样,用户必须全部同意或者拒绝安装。

具体到每一个权限,在系统内部有两个32比特的值来记录这个权限的特征,分别是protectionLevel 和permissionFlags。

Fig

  • protection Level高位16比特没有使用,低四位用来表示保护等级,normal dangerous signature 还是signature|system
  • protection Level flag目前有7种,细化了权限的特权等级,例如FLAG PRIVILEGED代表必须是相同签名或者安装在特定目录下的APP才能获得此权限,FLAG APPOP对应的每个权限都有一个图B类似的界面,展示给用户哪些APP拥有这个权限。
  • 程序员通过 android:permissionFlags标签可以控制的属性是FLAG COSTS MONEY和FLAG HIDDEN

Analysis of Permission Changes

Fig

  • 权限总量是递增的,具体到每次更改上,有些权限是新加入的,有些权限被移除,移除的原因大部分是因为系统中相应的组件被移除了,有些是因为权限合并,还有一些是改名。
  • 有些权限多次被修改保护等级,例如 BATTERY STATS最开始是normal,在API 17中被设置为dangerous,在API19中是signature|system,在API 23中被设置成signature

Key Findings

  1. Runtime permissions向后兼容,最主要的问题在于老APP中只有部分权限能够被动态修改,并且APP作者需要自己确定权限已经被赋予。
  2. Runtime permissions向前兼容,作者写了一个脚本去分析6.0版本中出现但是不能兼容以前版本的权限,一共找打了8个 USE SIP(added in API 9); ADD VOICEMAIL (in API 14); WRITE CALL LOG, READ CALL LOG, READ CELL BROADCASTS, READ EXTERNAL STORAGE (in API 16); BODY SENSORS (in API 21)
  3. UID共享权限,两个相同UID的应用权限共享
  4. Signature permissions可以被第三方获得,这表明有一些APP假设签名权限只有相同签名的应用才能获得,这个假设已经不成立了。Development permissions权限虽然是signature保护等级,但是可以在pm grant命令中赋予给第三方
  5. signature|system保护等级被弃用了,但是作者还是发现了9个这类权限,全部报给了google,其中2个已经被修复了
  6. 一些以前是危险等级的权限现在变成了Normal,例如INTERNET,NFC, BLUETOOTH, WRITE PROFILE,MANAGE ACCOUNTS

作者列举了一些有趣的发现:

  1. signature|system保护等级没有被完全移除,开发者还能使用这一个标志位,此外,在APP安装阶段,权限的保护等级并不会做相似性检测,也就是说APP重打包之后可以进行保护等级的叠加。
  2. 新添加的权限对FLAG COSTS MONEY和FLAG HIDDEN没有严格限制,可以随意使用。
  3. Additional permissions目录下包含了组权限和单个的权限并且不区分是由哪个APP提出的,只要是target API 23的APP给出的自定义权限就会列出来
  4. APP自定义权限可以被添加进系统权限组,如果该权限是危险等级的,在申请了这个权限之后,APP会被自动赋予组内其他权限,如果该权限等级不是危险的,则组内其他权限就不会赋给APP,例如ACCESS IMS CALL SERVICE的保护等级是signature|system 属于 PHONE 权限组
  5. 重复定义一个权限,例如INSTALL SHORTCUT , UNINSTALL SHORTCUT,API 19中两次定义的保护等级不一样,一个是Normal一个是dangerous