背景
system app需要访问/sys下设备节点信息。
因此te规则:
allow system_app sysfs:file r_file_perms;
make selinux_policy. 结果会报neverallow:
libsepol.report_failure: neverallow on line 129 of system/sepolicy/private/coredomain.te (or line 40213 of policy.conf) violated by allow system_app sysfs:file { ioctl read
lock open watch watch_reads };
libsepol.check_assertions: 1 neverallow failures occurred
Error while expanding policy
17:23:09 ninja failed with: exit status 1
#### failed to build some targets (50 seconds) ####
查看具体违反的规则:
# system/sepolicy/private/coredomain.te
full_treble_only(`
# /proc
neverallow {
coredomain
-init
-vold
} proc:file no_rw_file_perms;
为什么会违反这个规则呢?
在aosp源码/system/policy/下grep system_app就会发发现
# private/system_app.te
# system_app被关联到了coredomain
typeattribute system_app coredomain, mlstrustedsubject;
# public/file.te
# sysfs的定义,定义为sysfs_type
type sysfs, fs_type, sysfs_type, mlstrustedobject;
sysfs和proc怎么关联上还没有找到,后续补充。
# public/neverallow_macros
define(`no_w_file_perms', `{ append create link unlink relabelfrom rename setattr write }')
define(`no_rw_file_perms', `{ no_w_file_perms open read ioctl lock watch watch_mount watch_sb watch_with_perm watch_reads }')
根据上述定义和信息,确认是不允许system_app读取sysfs, 而sysfs上下文又被设置给sys路径:
# file_contexts
/sys u:object_r:sysfs:s0
解决:
在vendor或者自己目录下新建file.te文件,如果有,就不需要新建了,定义如下:
type my_sysfs, fs_type, sysfs_type, mlstrustedobject;
新建genfs_contexts文件,如果有,就不需要新建了,定义如下:
# 假设sys/devices/platform/aaa/bbb/ccc 是我们要操作的文件
# 意思是将上述路径的selinux上下文改为my_sysfs
genfscon sysfs /devices/platform/aaa/bbb/ccc u:object_r:my_sysfs:s0
新建system_app文件,如果有,就不需要新建了,定义如下:
allow system_app my_sysfs:file rw_file_perms;
编译:
在aosp根目录下m selinux_policy
将vendor/etc/selinux下的所以文件push到设备相应目录下,或者将
system/etc/selinux下的所以文件push到设备相应目录下, 具体看修改的selinux编译在哪里。
执行 restorcon -R /devices/platform/aaa/bbb/ccc 来重新加载selinux上下文,发现已经变成
my_sysfs了。OK,重启设备。