0 参考文章
Android P添加一个可以让system_server进程访问的hal service需要改动的sepolicy文件
android 系统(13)—Android O treble 新增hal hwservice selinux policy
service获取selinux权限_SELinux学习笔记
1 需求
工厂测试app需要新增一个属性,app可以设置这个prop,hal层进行读取,用于切换snd_device
2 prop文件路径
代码中有三个sepolicy文件夹,对应不同平台创建的。
目前我的需求是用于工厂测试,所以在oem目录下。
3 创建prop
文件路径:android\vendor\oem\sepolicy\property_contexts
vendor.audio.dualmic.factorytest u:object_r:exported_system_prop:s0
属性名:“vendor.audio.dualmic.factorytest”
标签:“u:object_r:exported_system_prop:s0”
引用自《深入理解SELinux SEAndroid(第一部分)》by 阿拉神农 (https://blog.csdn.net/innost/article/details/19299937/)
u:同样是user之意,它代表创建这个文件的SELinux user。
object_r:文件是死的东西,它没法扮演角色,所以在SELinux中,死的东西都用object_r来表示它的role。
rootfs:死的东西的Type,和进程的Domain其实是一个意思。它表示root目录对应的Type是rootfs。
s0:MLS的级别。
根据SELinux规范,完整的SContext字符串为:
user:role:type[:range]
注意,方括号中的内容表示可选项。s0属于range中的一部分。下文再详细介绍range所代表的Security Level相关的知识。
SContext的核心其实是前三个部分:user:role:type。
重点查看下exported_system_prop,网上未找到详细介绍,询问过软件的同事,她的理解如下:
exported_system_prop 为数不多的上层设置,底层读取
exported_default_prop 底层设置,上层读取
至此,已经创建好了这个属性,并贴上了标签,后续需要为这个属性添加权限以及使用。
补充:创建type
type也是可以自定义创建的
文件路径:android\vendor\oem\sepolicy\file.te
type sysfs_usb_device, sysfs_type, fs_type;
自定义type名:sysfs_usb_device
该类型支持的域:sysfs_type, fs_type(理解存疑)
4 app设置
4.1 使用:app中新增prop设置
在app代码中,通过Android的系统属性SystemProperties提供的接口函数set直接设置属性"vendor.audio.dualmic.factorytest"为"true"。
import android.os.SystemProperties;SystemProperties.set("vendor.audio.dualmic.factorytest", "true");
4.2 添加权限:app需要获取设置权限
注意,创建的时候就已经为这个prop贴上了"u:object_r:exported_system_prop:s0"标签
在system_app.te文件中设置上层app的设置权限
文件路径:android\vendor\oem\sepolicy\system_app.te
set_prop(system_app, exported_system_prop)
允许system_app进程对exported_system_prop上下文的属性进行设置
SELinux/SEAndroid 实例简述(三)实例看SELinux/SEAndroid
5 hal层设置
5.1 使用:hal层读取prop
在hal层要使用这个prop
函数定义:android/system/core/libcutils/properties.cpp
//property_get_bool函数定义
int8_t property_get_bool(const char *key, int8_t default_value) {
if (!key) {
return default_value;}int8_t result = default_value;char buf[PROPERTY_VALUE_MAX] = {
'\0'};int len = property_get(key, buf, "");if (len == 1) {
char ch = buf[0];if (ch == '0' || ch == 'n') {
result = false;} else if (ch == '1' || ch == 'y') {
result = true;}} else if (len > 1) {
if (!strcmp(buf, "no") || !strcmp(buf, "false") || !strcmp(buf, "off")) {
result = false;} else if (!strcmp(buf, "yes") || !strcmp(buf, "true") || !strcmp(buf, "on")) {
result = true;}}return result;
}//hal层代码读取属性
if (property_get_bool("vendor.audio.dualmic.factorytest",false)){
snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
}
获取该属性,true/false。
5.2 添加权限:hal层设置权限
在hal_audio.te文件中设置底层读取权限
文件路径:android\vendor\oem\sepolicy\hal_audio.te
get_prop(hal_audio_default, exported_system_prop)
使用get_prop函数进行设置
exported_system_prop是我们给prop贴的标签
hal_audio_default是prop作用的域
5.2.1 hal_audio_default
以下内容存疑
Q1:hal_audio_default,这个从哪里来
//android\system\sepolicy\vendor\hal_audio_default.te
type hal_audio_default, domain;
hal_server_domain(hal_audio_default, hal_audio)
“type hal_audio_default, domain;”
定义一个新的domain(域),叫做hal_audio_default
“hal_server_domain(hal_audio_default, hal_audio)”
设置定义的域hal_audio_default,作为已经定义好的hal_audio的server域存疑
android 系统(13)—Android O treble 新增hal hwservice selinux policy
5.2.2 hal_audio
Q2:为什么在hal_audio.te中设置
搜索下列三个文件,查找attributes文件,发现有几个创建了attribute hal_audio。
存疑不确定是否和这里创建有关
SELinux深入理解
6 小结
新建一个prop步骤
- 在property_contexts中创建prop,并为它贴上标签
- 在te文件中为作用域(hal和app)添加标签可执行操作(set/get prop权限)
- 在app和hal层调用函数读取/设置prop