【selinux】selinux加prop,hal层读取

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
  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值