init警告:Service myservice需要定义SELinux域。请修理

时间:2017-04-25 01:45:13

标签: android service selinux seandroid

我想在启动时执行可执行文件在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.

所以现在我被困在困境中,不知道该往哪里去。我的问题:

    1. 任何人都知道如何在Android中禁用或设置许可模式?
    1. 如果我想为新服务定义域,我应该修改哪些文件?

此外,ls -Z /system/bin/myservice给出了这个:

u:object_r:system_file:s0

3 个答案:

答案 0 :(得分:1)

  1. 你需要su来设置许可模式。或者您需要源代码来禁用SELinux,例如在内核配置中禁用SELinux,或者在device / vendor_name / product_name / BoardConfig.mk中的BOARD_KERNEL_CMDLINE中禁用SELinux。

  2. 如果您有源代码,则可以根据需要定义新域。

  3. 请参阅Android官方文档:https://source.android.com/security/selinux/device-policy

    部分:标记新服务并拒绝拒绝

答案 1 :(得分:0)

您必须在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

答案 2 :(得分:0)

我自己遇到了一个非常相似的问题,这就是我所发现的:

运行this.childrens并获取此信息:

ls -Z /system/bin/myservice

这意味着您的文件位于u:object_r:system_file:s0 域中。现在不好了,因为不应该执行系统文件,或者最后不应该在init期间执行(以后您仍然可以从终端以常规方式执行它)。

就我而言,我很幸运,因为我正在用从源代码编译的定制服务替换现有的系统服务。这意味着我能够检查要替换的原始文件的安全上下文,该文件来自system_file

ls -Z /system/bin/myservice.bak

所以我使用u:object_r:myservice_exec:s0

将新文件更新为相同的文件

之后,它运行良好。

如果您想创建一个全新的服务,则可能需要使用已存在于您的Sepolicies中的域,将其简单地设置为chcon u:object_r:myservice_exec:s0 /system/bin/myservice就无济于事,因为那将是不存在的您的域。 如果我不知所措,并且希望避免定义自定义策略,则可以尝试查找具有类似安全性的服务,请检查该域上的域,然后尝试将其设置为我的服务。 myservice_exec可能是一个不错的候选人,但是您的里程可能会有所不同...