原文地址: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 | 09-21 11:19:46.394 5490 5490 E System : ************** |
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
2
3. build/envsetup.sh
lunch PRODUCT_NAME
make -j运行
privapp_permissions.py
脚本,生成privapp_permissions.py
文件,如果设备的/partition/etc/permissions
中已经包含白名单,则该工具只会打印出差异内容,也就是说只会打印缺少的signature|privileged权限。将生成的文件复制到
/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
来启用白名单。