selinux解决sysfs neverallow问题

背景

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,重启设备。

        

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值