初始化警告:服务 myservice 需要定义 SELinux 域。请修复
init warning: Service myservice needs a SELinux domain defined. Please fix
我想在启动时执行可执行文件 在带有 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
对于方法一,printenv
给出结果:
kernelargs=console=ttyS0,115200n8 rootdelay=1 selinux=0
所以你看,已经做出了改变。但是重启后警告信息一直在打印。
对于方法 2,它表示:
Could not set enforce status. Permission denied.
所以现在我陷入了不知何去何从的困境。我的问题:
- 有人知道如何在 android 中禁用或设置宽容模式吗?
- 如果要为新服务定义域,我应该修改哪些文件?
此外,ls -Z /system/bin/myservice
给出了这个:
u:object_r:system_file:s0
你需要su来设置宽容模式。或者你需要源代码来关闭SELinux,比如在kernel config中关闭SELinux,或者在device/vendor_name/product_name/BoardConfig.mk.
中的BOARD_KERNEL_CMDLINE中关闭SELinux
如果你有源代码,你可以随意定义新域。
请参考Android官方文档:https://source.android.com/security/selinux/device-policy
部分:标记新服务和地址拒绝
您必须将 seclabel 属性添加到 init.rc 文件中的服务,但我不知道您的上下文是否有效。我只是在 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
可能是一个不错的候选人,但你的里程可能会有所不同...
我想在启动时执行可执行文件 在带有 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
对于方法一,printenv
给出结果:
kernelargs=console=ttyS0,115200n8 rootdelay=1 selinux=0
所以你看,已经做出了改变。但是重启后警告信息一直在打印。
对于方法 2,它表示:
Could not set enforce status. Permission denied.
所以现在我陷入了不知何去何从的困境。我的问题:
- 有人知道如何在 android 中禁用或设置宽容模式吗?
- 如果要为新服务定义域,我应该修改哪些文件?
此外,ls -Z /system/bin/myservice
给出了这个:
u:object_r:system_file:s0
你需要su来设置宽容模式。或者你需要源代码来关闭SELinux,比如在kernel config中关闭SELinux,或者在device/vendor_name/product_name/BoardConfig.mk.
中的BOARD_KERNEL_CMDLINE中关闭SELinux
如果你有源代码,你可以随意定义新域。
请参考Android官方文档:https://source.android.com/security/selinux/device-policy
部分:标记新服务和地址拒绝
您必须将 seclabel 属性添加到 init.rc 文件中的服务,但我不知道您的上下文是否有效。我只是在 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
可能是一个不错的候选人,但你的里程可能会有所不同...