当前位置: 代码迷 >> 综合 >> 【selinux】selinux加prop,hal层读取
  详细解决方案

【selinux】selinux加prop,hal层读取

热度:34   发布时间:2023-12-05 20:47:12.0

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步骤

  1. 在property_contexts中创建prop,并为它贴上标签
  2. 在te文件中为作用域(hal和app)添加标签可执行操作(set/get prop权限)
  3. 在app和hal层调用函数读取/设置prop
  相关解决方案