最近做了一个功能:设备首次驻网时,在设备指定目录创建文件,并在此文件中写入当前的时间,然后通过暗码可以读取这个时间

这个功能挺简单的,唯一比较麻烦的是添加SELinux权限时的一些问题,在此记录一下。

首先通过rc文件创建一个目录

init.rc

mkdir /data/vendor/time_code 0771 radio radio

然后设备首次驻网时在此目录下创建txt文件,"/data/vendor/time_code/time_code.txt",此时SELinux权限问题就来了,如下所示:
SELinux权限拒绝
ps:如何确认是 SELinux 问题?可以关闭 SELinux(adb shell setenforce 0),确认相关功能是否 ok,如果 ok 是 SELinux 问题,如果nok,说明本身程序有问题

上述的SELinux报的权限并不全,通常SELinux打开时不会一次性打印出所有缺少权限,可以先将SELinux关闭,在通过adb logcat或者adb shell dmesg打印全部缺少权限

SELinux报错的标准格式是:

  avc: denied  { 操作权限  }  for pid=26382  comm=“进程名” 
  scontext=u:r:源类型:s0  tcontext=u:r:目标类型:s0  
  tclass=访问类型 permissive=0

添加规则是,在源类型.te文件中添加 :

allow  源类型 目标类型:访问类型 {操作权限};

例如上图报出的log:
05-11 16:39:13.249 1950 1950 W SharedPreferenc: type=1400 audit(0.0:99): avc: denied { read } for name=“time_code.txt” dev=“mmcblk0p65” ino=27156 scontext=u:r: radio:s0 tcontext=u:object_r:vendor_data_file:s0 tclass=file permissive=0

我们就应该在radio.te中添加:allow radio vendor_data_file:file { read };

添加SELinux权限的一个原则就是报出来什么,添加什么,上述log中缺少权限并没有报全,最终添加全部缺少权限如下:

allow radio vendor_data_file:dir rw_dir_perms;
allow radio vendor_data_file:file { open write read create rw_file_perms setattr};
allow radio vendor_data_file:file rename;
allow radio vendor_data_file:file unlink;

添加好了之后进行编译,mmma system/sepolicy/,此时发现编不过,
在这里插入图片描述
这是因为我们添加的SELinux权限违反了google的neverallow规则,google不允许名为radio源类型访问标签名为vendor_data_file的目标类型,

解决方案是修改我们要访问的文件的标签名vendor_data_file,如何修改呢?我们要访问的目录是/data/vendor/time_code/,先看一下这个目录的信息
在这里插入图片描述
需要修改的标签属于文件类型,另外还有属性类型和程序类型,对于文件类型标签的修改就是自定义一个新的标签,在file.te中定义,在file_contexts中使用,
file.te中添加如下语句:

type tct_time_data_file, file_type, data_file_type, mlstrustedobject;

file_contexts中添加如下语句:

/data/vendor/time_code(/.*)?       u:object_r:tct_time_data_file:s0

标签就被修改为了tct_time_data_file,然后再修改radio.te中的目标类型

allow radio tct_time_data_file:dir rw_dir_perms;
allow radio tct_time_data_file:file { open write read create rw_file_perms setattr};
allow radio tct_time_data_file:file rename;
allow radio tct_time_data_file:file unlink;

再进行编译,mmma system/sepolicy/
在这里插入图片描述
编译成功后push进手机验证,
adb push out/target/product/dubaivzw/vendor/etc/selinux/ /vendor/etc/

首先ls -Z看看/data/vendor/time_code/的信息,可以看到,标签名已经被修改
在这里插入图片描述
并且log中没有再报SELinux权限的问题,/data/vendor/time_code/time_code.txt文件也成功创建了,此文件中也成功写入了当前驻网时间:
在这里插入图片描述

GitHub 加速计划 / sel / selinux
150
64
下载
common selinux implementation
最近提交(Master分支:29 天前 )
1b71cb46 pwalk, pwalkdir: fix walk vs remove race 1 年前
40a1afee Misc nitpicks 1 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐