Privileged Permission Whitelisting

原文地址:https://source.android.com/devices/tech/config/perms-whitelist

特权白名单

Android特权应用指的是位于系统分区的priv-app目录下的应用,这个分区包括:

  • Android 8.1及以下- /system
  • Android 9及以上- /system/, product, /vendor

在过去,设备开发人员几乎无法控制可以向特权应用授予哪些signature|privileged权限。从Android 8.0开始,必须在/partition/etc/permissions下的XML文件中显式的指定授予特权应用的权限,否则不会授给应用对应权限。而在Android 9中,必须显式grant或者deny所有的privileged权限,否则设备无法启动,此时会输出类似下面的log:

1
2
3
09-21 11:19:46.394  5490  5490 E System  : **************
09-21 11:19:46.395 5490 5490 E System : **** Failure starting system services
09-25 22:04:37.731 19857 19857 E System : java.lang.IllegalStateException: Signature|privileged permissions not in privapp-permissions whitelist: {com.android.phone: android.permission.FORCE_STOP_PACKAGES}

privapp-permissions.xml文件只能grant或者deny相同分区下特权应用的权限。比如,vendor分区下的特权应用权限必须在/vendor/etc/permissions下的XML中定义。

只用在‘’android“,也就是framework-res.apk中定义的权限才需要添加黑名单。设备制造商定义的privileged权限任然会被默认授给应用。privapp-permissions.xml中的应用如果不存在对应的分区,则对应的项会被忽略。

添加白名单

系统原本的特权白名单定义在framework/base/data/etc/下,privapp-permissions-platform.xml中添加的是AOSP中应用的权限。其他应用的权限可以在项目中进行配置,只要保证最后拷贝到应用所在分区的etc/permissions目录下即可。

生成白名单

可以使用AOSP中的命令行工具development/tools/privapp_permissions/privapp_permissions.py自动生成应用的白名单。

  1. 编译系统映像:

    1
    2
    3
    . build/envsetup.sh
    lunch PRODUCT_NAME
    make -j
  2. 运行privapp_permissions.py脚本,生成privapp_permissions.py文件,如果设备的/partition/etc/permissions中已经包含白名单,则该工具只会打印出差异内容,也就是说只会打印缺少的signature|privileged权限。

  3. 将生成的文件复制到/partition/etc/permissions中,系统启动过程中会读取这些文件。

自定义白名单

AOSP中应用的权限已经定义在/partition/etc/permissions/privapp-permissions-platform.xml 如果需要可以自定义。

privapp_permissions.py生成的结果会默认授予所用应用申请的权限,如果有的权限需要拒绝,可以在生成的结果中用deny-permission这个tag进行配置。

查找缺少的权限

可以通过配置ro.control_privapp_permissions=log属性来查找确实的权限。此时违规行为会在日志中进行报告,但是仍然会授予权限,这样可以在查找违规行为的同时保证设备能正常工作。

错误消息格式如下:

1
PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions whitelist

所有违规行为必须加入白名单,如果未加入,即使这些应用位于priv-app中也不会被授予对应的权限,设备会无法启动。

强制执行白名单

白名单设好后,可以通过设置属性ro.control_privapp_permissions=enforce来启用白名单。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2018 - 2022 得一 All Rights Reserved.

访客数 : | 访问量 :