主要配置:
(1)文件;
type my_file, file_type, data_file_type, core_data_file_type;
/data/my_file(/.*)? u:object_r:my_file:s0
注意 my_file 的类型,如果是data目录下的,要添加 core_data_file_type; 是 vendor目录下的,要添加vendor_file_type;
(2)服务;
type my_service, app_api_service, service_manager_type;
com.example.my_service u:object_r:my_service:s0
add_service(my_app, my_service)
只有添加为系统service时,才需要编写策略。
(3)应用;
user=system seinfo=platform name=com.example.app1 domain=my_system_app type=app_data_file
user=_app seinfo=platform name=com.example.app2 domain=my_platform_app type=app_data_file
user=_app seinfo=cust name=com.example.app3 domain=my_untrust_app type=app_data_file
my_system_app 可以参考系统的 system_app 复制一份,再修改;
my_platform_app 可以参考系统的 platform_app 复制一份,再修改;
seinfo=cust 是自定义seinfo,高通平台可以通过修改 vendor_mac_permissions.xml 文件,将应用签名和seinfo关联起来,这样可以为保留签名的第三方应用创建自定义角色。
seapp_contexts 中关联的是 app 的进程名,如果app 有多个进程,每个都要写一行。
(4)属性;
type my_prop, property_type, mlstrustedsubject;
persist.my_prop. u:object_r:my_prop:s0
编写规则:
按照 selinux 的规则写法,主题访问客体的方式。通常都是allow 方式。
allow my_app my_prop:property_service { set };
allow my_app my_prop:file r_file_perms;
selinux 定义了很多宏,简化策略写法。
宏 | 说明 |
create_dir_perms | 读写目录 |
create_file_perms | 读写文件 |
r_dir_perms | 读取目录 |
r_file_perms | 读取文件 |
binder_call(A, B) | 允许应用A bind服务B |
add_service(A, B) | 允许应用A 添加服务B为系统服务 |
create_socket_perms | 创建网络套接字权限 |
Android 9.0 继承了 Android 8.1 的 Treble 设计,将 system 和 vendor 进行了隔离。
system 目录下应用要读取 vendor 属性或者执行 vendor 文件,会触发错误。
Android 9.0 定义了一系列 violators 属性,允许这种跨域访问:
属性 | 说明 |
system_writes_vendor_properties_violators | 允许系统应用写vendor属性 |
socket_between_core_and_vendor_violators | 允许系统应用和vendor应用互相使用socket通信 |
system_executes_vendor_violators | 允许系统应用执行vendor应用。 |