赞
踩
上个章节说了在file_context中也可以新增节点,但可能会出现标签无法生效的情况,这种情况下就需要在genfs_contexts中去新增设备节点相关的标签了,因为在genfs_contexts中打的标签,系统会自动执行restorecon命令,而在file_contexts中新增设备节点标签,是需要代码或者手动执行restorecon命令才会生效的。
在工作过程中,SElinux常用的有以下几个文件可用于新增标签
可用于加标签的文件名 | 含义 | 对应的声明文件名(一般会声明的地方,根本上放哪里都可以) |
---|---|---|
file_contexts | 给 文件/目录/节点 新增标签 | file.te |
genfs_contexts | 给节点新增标签,与上一个不同的是,不用执行restorecon操作 | file.te |
hwservice_contexts | 给hal服务新增标签 | hwservice.te |
property_contexts | 给属性新增标签 | property.te |
seapp_contexts | 给APP新增标签 | untrusted_app.te app.te...等等 |
service_contexts | 给系统服务新增标签 | service.te |
本文主要讲一下如何在genfs_contexts中新增标签。
目录
1. 我们看一下源码中的genfs_contexts加标签的格式
genfs_contexts - OpenGrok cross reference for /system/sepolicy/private/genfs_contexts
给/proc/cmdline打标签
genfscon proc /cmdline u:object_r:proc_cmdline:s0
给/sys/class/leds打标签
genfscon sysfs /class/leds u:object_r:sysfs_leds:s0
可以看到格式如下
genfscon 节点首目录标签 /路径 u:object_r:新标签名:s0
比如/sys/class/leds的标签是用如下加法去加的:
首先看一下sys目录的标签是什么, 在adb shell 后执行
ls -l -Z
dr-xr-xr-x 14 root root u:object_r:sysfs:s0 0 1970-01-01 00:00 sys
可以看到sys的标签是sysfs,然后就可以给/sys/class/leds打标签了,打法就是下面这样的
genfscon sysfs /class/leds u:object_r:sysfs_leds:s0
看下机器里是什么样的,执行ls -l -Z /sys/class/,就可以看到leds的标签了。
drwxr-xr-x 2 root root u:object_r:sysfs_leds:s0 0 1970-01-03 18:45 leds
我们随便举个例子,假设我们要给/sys/devices/platform/soc/xxx000.i2c/i2c-0/0-00xx/leds/blue加标签
加标签之前我们要先看一下当前的标签,以及确认一下当前的路径
adb shell
cd /sys/devices/platform/soc/xxx000.i2c/i2c-0/0-00xx/leds
$/sys/devices/platform/soc/xxx000.i2c/i2c-0/0-00xx/leds # ls -l -Z
total 0
drwxr-xr-x 3 root root u:object_r:sysfs:s0 0 1970-01-03 18:45 blue
看完之后,我们会发现,当前blue节点的标签是sys的默认标签,也就是sysfs,那加法就是如下的:
+ genfscon sysfs /devices/platform/soc/xxx000.i2c/i2c-0/0-00xx/leds u:object_r:sysfs_new_leds:s0
但到此处,加法是不全的,我们还需要看一下/sys/devices/platform/soc/xxx000.i2c/i2c-0/0-00xx/leds这条路径有没有超链接,也就是有没有从别的路径也能到blue这个节点的地方,我们做如下操作:
cd ..
ls -l
cd ..
ls -l
一直往前查找,查找到第一个目录sys,查看有没有超链接,假设这里是有超链接的,格式是如下这种
sys/devices/platform/soc/xxx000.i2c/i2c-0$ ls -l
total 0
drwxr-xr-x 22 root root 0 1970-01-03 18:45 0-00xx -> ../../../../../class/platform
那说明也可以通过sys/class/platform/soc/xxx000.i2c/i2c-0/0-00xx/leds路径到达blue节点,那我们就要把这个超链接路径也添加进去才可以
+ genfscon sysfs /class/platform/soc/xxx000.i2c/i2c-0/0-00xx/leds u:object_r:sysfs_new_leds:s0
到此就结束了,总结下,那我们需要在genfs_contexts添加两条才可以
+ genfscon sysfs /devices/platform/soc/xxx000.i2c/i2c-0/0-00xx/leds u:object_r:sysfs_new_leds:s0
+ genfscon sysfs /class/platform/soc/xxx000.i2c/i2c-0/0-00xx/leds u:object_r:sysfs_new_leds:s0
然后再在file.te中添加声明,节点类的基本都是如下声明格式,将标签名替换即可。
+type sysfs_new_leds, sysfs_type, fs_type;
编译方式 | 验证方法 |
---|---|
整编 | 刷机烧录的方式,此方法不用任何别的操作,去你新增的标签下通过ls -l -Z查看即可看到效果 |
单编 | adb push完之后然后执行adb reboot 重启完成后去对应目录下去查看标签,会发现标签并没有生效 需要执行以下restorecon命令才可以 当文件对应路径下使用restorecon +文件名的方式,即可看到打标签后的效果 |
如果涉及到开机过程中的权限访问,请最好整编验证,因为此时执行restorecon命令可能会来不及。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。