6

我想在使用 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
4

3 回答 3

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

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

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

部分:标记新服务并解决拒绝问题

于 2017-04-25T04:38:52.340 回答
3

您必须将 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
于 2018-11-28T14:57:27.107 回答
1

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

当你运行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可能是一个很好的候选人,但你的里程可能会有所不同......

于 2019-04-29T10:22:00.760 回答