雪落的小屋

Selinux权限以及neverallow编译报错

2023-08-23折腾笔记编程SELinux

公司有个项目需要在上层对底层的节点进行数据写入,所以需要修补 SeLinux 权限,查阅资料之后实践修改成功,故记录一下。

报错

系统内缺少的权限报错如下:

[ 108.891334] (2)[463:logd.auditd]type=1400 audit(1702696933.400:1585): avc: denied { write } for comm="hiro.rearscreen" name="st_spilcd_dev" dev="tmpfs" ino=19498 scontext=u:r:system_app:s0 tcontext=u:object_r:device:s0 tclass=chr_file permissive=1 [ 108.891458] (2)[463:logd.auditd]type=1400 audit(1702696933.400:1586): avc: denied { open } for comm="hiro.rearscreen" path="/dev/st_spilcd_dev" dev="tmpfs" ino=19498 scontext=u:r:system_app:s0 tcontext=u:object_r:device:s0 tclass=chr_file permissive=1

尝试直接补上权限

allow system_app device:chr_file write;

但是编译却报了 neverallow 报错

分析

是什么原因导致的这个编译报错呢?

其实是当前这个 process 进程申请的权限过高了。

如果直接加 system_appchr_file 那是很危险的权限,假如被恶意软件利用系统漏洞提权了,那么就可以轻而易举的对各种 chr_file 进行写入,谷歌不允许这种情况出现,所以把它加入了 neverallow 里面。

解决

那有没有办法绕过这个报错呢?

当然是有的,可以参考如下步骤:

1、先查看一下是哪些相关的代码申请的这个权限,主要是判断一下是申请的属性还是 device 节点访问权限等;

2、新增加一个 SELinux type;

根据申请的类型可以进修改一下访问的 ObjectLabel

比如我这里是 device 节点,那我就在 device.te 中:

type spilcd_device, dev_type;

3、绑定文件到这个 SELinux type;

因为我这里知道我访问的是 /dev/mmcblk1rpmb 节点,我在第一步中确认的,

所以在 file_contexts 中添加如下代码

/dev/st_spilcd_dev u:object_r:spilcd_device:s0

4、修改 te 文件,添加 process/domain 的访问权限;

这里就比较简单了,直接添加对应的规则就可以了。

allow system_app spilcd_device:chr_file rw_file_perms;

diff --git a/device/mediatek/mt6833/init.mt6833.rc b/device/mediatek/mt6833/init.mt6833.rc
index 39154af8d3d..c6632853351 100644
--- a/device/mediatek/mt6833/init.mt6833.rc
+++ b/device/mediatek/mt6833/init.mt6833.rc
@@ -700,6 +700,8 @@ on post-fs-data
     chown system system /proc/secmem0
 
     chmod 0666 /dev/exm0
+    chmod 0666 /dev/st_spilcd_dev
+    chown system system /dev/st_spilcd_dev
 
 
        #Thermal
diff --git a/device/mediatek/sepolicy/basic/non_plat/device.te b/device/mediatek/sepolicy/basic/non_plat/device.te
index 61601cae974..664419818ba 100644
--- a/device/mediatek/sepolicy/basic/non_plat/device.te
+++ b/device/mediatek/sepolicy/basic/non_plat/device.te
@@ -379,3 +379,5 @@ type ccci_mdmonitor_device, dev_type;
 # Operator: S migration
 # Purpose: Add permission for vilte
 type ccci_vts_device, dev_type;
+
+type spilcd_device, dev_type;
diff --git a/device/mediatek/sepolicy/bsp/non_plat/file_contexts b/device/mediatek/sepolicy/bsp/non_plat/file_contexts
index 409daae398e..a1a88046e84 100644
--- a/device/mediatek/sepolicy/bsp/non_plat/file_contexts
+++ b/device/mediatek/sepolicy/bsp/non_plat/file_contexts
@@ -274,3 +274,5 @@
 #
 /mnt/vendor/persist/t6(/.*)?    u:object_r:tkcore_protect_data_file:s0
 /mnt/vendor/protect_f/tee(/.*)? u:object_r:tkcore_protect_data_file:s0
+
+/dev/st_spilcd_dev       u:object_r:spilcd_device:s0
diff --git a/device/mediatek/sepolicy/bsp/non_plat/system_app.te b/device/mediatek/sepolicy/bsp/non_plat/system_app.te
index 50ece4665cc..d0e1330a9ba 100644
--- a/device/mediatek/sepolicy/bsp/non_plat/system_app.te
+++ b/device/mediatek/sepolicy/bsp/non_plat/system_app.te
@@ -163,3 +163,5 @@ allow system_app mtk_audiohal_data_file:file create_file_perms;
 
 
 hal_client_domain(system_app, hal_fingerprint)
+
+allow system_app spilcd_device:chr_file rw_file_perms;