主要配置:
(1)文件;
type my_file, file_type, data_file_type, core_data_file_type;
- 在 file_contexts 文件中关联实际的文件路径和文件类型;
/data/my_file(/.*)? u:object_r:my_file:s0
注意 my_file 的类型,如果是data目录下的,要添加 core_data_file_type; 是 vendor目录下的,要添加vendor_file_type;
(2)服务;
- 在 service.te 声明一个service类型;
type my_service, app_api_service, service_manager_type;
- 在 service_contexts文件中关联 service 名字和 service 类型;
com.example.my_service u:object_r:my_service:s0
- 在 my_app.te 中添加规则,允许 my_app 添加 my_service到系统服务;
add_service(my_app, my_service)
只有添加为系统service时,才需要编写策略。
(3)应用;
- 在seapp_contexts 中将app进程名和角色关联上
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;
- 在 property_contexts文件中关联属性定义和类型
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应用。 |
|