Android Selinux权限之genfscon

53 篇文章 2 订阅
4 篇文章 0 订阅

简介

genfscon 标签相关说明参考 政策兼容性

我的理解,genfscon 用于给设备节点打标签。

说人话:它可以改变设备类型,如把某一个节点从 u:object_r:sysfs:s0 改为 u:object_r:sysfs_dev:s0 。

举个例子。
在这里插入图片描述

在读写设备节点时,碰到了 Selinux 权限问题,
根据 log 添加了 allow system_app sysfs:file rw_file_perms; ,编译后触发了 neverallow 报错。

触发了 neverallow ,根本原因是赋予的权限过⼤,缩⼩范围即可。
即我们需要访问的是 sys/ 目录下的某一个文件夹,其实并不需要访问整个 sys/ 目录。
指定访问 sys/ 下的指定目录即可,指定目录的类型可以按需修改。

不过CTS认证的话,可以根据编译报错直接修改 system/sepolicy/ 目录的文件。

因为要过CTS认证,不能修改 system/sepolicy/ 目录

所以另寻他法,就用到了 genfscon 标签。

1.genfscon

访问的节点是 sys/devices/virtual/test_class/test_dev/ ,

通过 ls -lZ sys/devices/virtual/test_class/test_dev/* 知道,它是 u:object_r:sysfs:s0 类型

修改 device/xxx/common/sepolicy/vendor/genfs_contexts

+genfscon sysfs /devices/virtual/test_class/test_dev/                             u:object_r:sysfs_dev:s0
+genfscon sysfs /devices/virtual/test_class/test_dev/capacity                     u:object_r:sysfs_dev:s0
+genfscon sysfs /devices/virtual/test_class/test_dev/status                       u:object_r:sysfs_dev:s0
+genfscon sysfs /devices/virtual/test_class/test_dev/time_empty                   u:object_r:sysfs_dev:s0
+genfscon sysfs /devices/virtual/test_class/test_dev/time_full                    u:object_r:sysfs_dev:s0

烧录后再使用 ls -lZ 查看就是 u:object_r:sysfs_dev:s0 类型,说明修改生效。

2.te文件

source 、lunch 后使用 get_build_var BOARD_SEPOLICY_DIRS 命令找到当前产品使用的权限目录,

修改 device/xxx/common/sepolicy/vendor/system_app.te ,

+allow system_app sysfs_dev:file rw_file_perms;

3.节点权限

修改 device/xxx/yyyy/init.rk3588.rc ,把权限改为 666 ,可读可写。

+    chmod 0666 /sys/class/test_class/test_dev/capacity
+    chmod 0666 /sys/class/test_class/test_dev/status
+    chmod 0666 /sys/class/test_class/test_dev/time_empty
+    chmod 0666 /sys/class/test_class/test_dev/time_full
+    chmod 0666 /sys/class/test_class/test_dev/uevent

4.编译

source 、lunch 后,可以使用 make -j12 sepolicy 命令验证 Selinux 相关的修改,

它可以验证语法是否正确、是否触发 neverallow 。单编比全编快多了,节约时间。

编译后可以通过查看 out/target/product/xxx/vendor/etc/selinux/vendor_sepolicy.cil 文件,检查是否编译进去了。

编译验证,OK 。

我是怎么知道把 u:object_r:sysfs:s0 改为 u:object_r:sysfs_dev:s0 的?
无他,唯 debug ~ 。换了好几个类型试出来的。

找到 device/xxx/common/sepolicy/vendor/file.te, sysfs_dev 的定义如下,

type sysfs_dev, fs_type, sysfs_type, mlstrustedobject;

再遇到类似问题,如 demo 类型 NG ,可以尝试 demo_dev 、 demo_service 、hal_demo 等和它有关的类型,或者声明为 mlstrustedobject 的类型(声明为 mlstrustedobject 的类型,具有更多的权限)。

有没有编译成功,验证NG的情况?
答:有!
不是所有情况下都可以这样改。
有试过把 u:object_r:camera_device:s0 改成其他类型,虽然编译通过,但是 camera 相关的功能就异常了。
所以,权限有风险,修改需谨慎!!!

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值