简介
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 相关的功能就异常了。
所以,权限有风险,修改需谨慎!!!