我想在启动时执行可执行文件在Android 5.1的目标板上,所以我在init.rc中添加它:
on boot
start myservice
service myservice /system/bin/myservice
#class main
user root
group root
#oneshot
我做了解包和重新包装的工作。 但是,在进行更改时,屏幕会保持打印:
init warning: Service myservice needs a SELinux domain defined. Please fix.
type=1400 ... avc:denied ... scontext ... tcontext ... #some annoying warning messages like this
SELinux对我来说似乎是一个巨大的项目。我只想避免这种情况。我尝试了两种方法:
1. setenv kernelargs 'console=ttyS0,115200n8 rootdelay=1 selinux=0' and saveenv
2. set enforce 0
对于方法1,printenv
给出结果:
kernelargs=console=ttyS0,115200n8 rootdelay=1 selinux=0
所以你看,已经做出了改变。但是重新启动后警告消息会继续打印。 对于方法2,它说:
Could not set enforce status. Permission denied.
所以现在我陷入困境,不知道去哪里。我的问题:
此外,ls -Z /system/bin/myservice
给出了:
u:object_r:system_file:s0
请参考Android官方文档:https://source.android.com/security/selinux/device-policy
部分:标记新服务并拒绝拒绝
您必须在init.rc文件中将seclabel属性添加到服务中,但我不知道您的上下文是否有效。我刚用init_exec上下文实现了它:
$ grep yourservice system/sepolicy/file_contexts
/system/bin/vpd u:object_r:init_exec:s0
$ ls -Z path/to/system/bin/yourservice
u:object_r:init_exec:s0 path/to/system/bin/yourservice
$ grep yourservice device/brand/product/init.rc -A 5
service yourservice /system/bin/yourservice
seclabel u:r:init:s0
user root
group root
oneshot
在Android上禁用SELinux并不难,并且有很多线程在处理这个问题。只需在内核命令行参数中添加以下任一项(即U-Boot中的bootargs):
androidboot.selinux=permissive
androidboot.selinux=disabled
我自己遇到了一个非常类似的问题,这就是我发现的:
当你运行ls -Z /system/bin/myservice
并得到这个:
u:object_r:system_file:s0
这意味着您的文件位于system_file
域中。现在这不好,因为系统文件不应该被执行,或者最后不是在init期间(你可能仍然能够以通常的方式从终端执行它)。
在我的情况下,我很幸运,因为我正在使用我从源代码编译的自定义系统服务替换现有的系统服务。这意味着我能够检查我正在替换的原始文件的安全上下文,这是来自ls -Z /system/bin/myservice.bak
:
u:object_r:myservice_exec:s0
所以我使用chcon u:object_r:myservice_exec:s0 /system/bin/myservice
将我的新文件更新为相同的文件
之后它运作良好。
如果您想创建一个全新的服务,您可能需要使用已存在于您的sepolicies中的域,因为只需将其设置为myservice_exec
,就无济于事,因为在您的情况下,这将是一个不存在的域。如果我想要避免定义自定义策略,我可能会尝试找到具有类似安全性的服务,请检查域中的域并尝试将其设置为我的服务。 init_exec
可能是一个很好的候选人,但你的里程可能会有所不同......