一、 问题复现
1 | 1.service ro_isn /system/bin/isn.sh |
kernel log会打印以下log:
1 | Warning! Service ro_isn needs a SELinux domain defined; please fix! |
这是因为Service ro_isn没有在SELinux的监控之下,这种情况会提示你定义一个SELinux。
在这种情况下,你可以:
1.无视该条log,Service功能不受影响。各种权限不受限制。但是这样做会有风险。
2.为Service ro_isn定义一个SELinux domain,仅添加需要的权限,未允许的权限操作会被拒绝。具体方法请参照下节。
二、解决方法
1.
1 | devices/qcom/sepolicy/common/ |
目录下新增ro_isn.te文件,内容如下:
1 | type ro_isn, domain; |
2.
在1
devices/qcom/sepolicy/Android.mk
中添加ro_isn.te文件,内容如下:
1 | BOARD_SEPOLICY_UNION := \ |
3.
在1
devices/qcom/sepolicy/common/file_contexts
中增加如下内容:
###################################
1 | # System files |
4.
在init.rc中service ro_isn下添加1
2
3
4
5
6
7
8secure context by seclabel
service ro_isn /system/bin/isn.sh
class late_start
user root
oneshot
seclabel u:r:ro_isn:s0
5.
编译并烧录bootimage
6.
如果编译不成功,失败原因如下:
1 | Error while expanding policy |
这是因为系统在domain.te中定义了全局的neverallow策略,与ro_isn.te中allow的策略有冲突:
1 | allow ro_isn system_file:file { entrypoint }; |
请确定自己的service有必要需要这个权限。如无必要,请在自己的code中删除掉相关操作;如必要,可以在1
external/sepolicy/domain.te
中冲突的neverallow
语句中添加自己为例外:
1 | neverallow { |
7.
在service ro_isn运行时,搜索关于“ro_isn”的1
avc: denied log
1 | <6>[ 13.547188](CPU:0-pid:320:logd.auditd) type=1400 audit(17468992.410:7): avc: denied { entrypoint } for pid=272 comm="init" path="/system/bin/isn.sh |
8.
按照如下规则在ro_isn.te添加权限
SELinux规则语句一般如下:
1 | allow A B:C D; |
可以从log中分别获取ABCD四个参数。
比如这行1
2
3
4
5
6
7
8warning log:
avc: denied { entrypoint } for pid=272 comm="init" path="/system/bin/isn.sh
" dev="mmcblk0p38" ino=631 scontext=u:r:ro_isn:s0 tcontext=u:object_r:system_file:s0 tclass=file
avc: denied { transition } for pid=320 comm="init" path="/system/xbin/fcgiserver.sh
" dev="mmcblk0p21" ino=7873 scontext=u:r:init:s0 tcontext=u:r:fcgiserver:s0 tclass=process permissive=1
那么我们就得出最后的规则是:
1 | allow qcomsysd block_device:dir { search }; |
1 | allow ro_isn system_file:file { entrypoint }; |
重复步骤5-8,直到没有关于ro_isn的avc: denied log