服务永远不会在 AOSP 中被调用。这是SELINUX问题吗?

问题描述 投票:0回答:1

下面是我想为sdm710产品调用AOSP中的init.target.rc的服务。

service dispBridge /system/bin/test.sh
    seclabel u:r:init:s0
    user root
    group root
    oneshot
    disabled
    write /dev/kmsg "dispBridgeServiceStartedTest onBootTest"



on boot
    chown system system /sys/class/leds/red/blink
    chown system system /sys/class/leds/green/blink
    chown system system /sys/class/leds/blue/blink
    write /dev/kmsg "onBootTest1"
    start dispBridge
    write /dev/kmsg "onBootTest2"

在上面的代码中,我期望该服务将在

on boot
内调用,并期望看到
dispBridgeServiceStartedTest onBootTest
在 adb shell 中打印出来。

但是,我只能看到

onBootTest1
onBootTest2
打印出来,这意味着
dispBridgeServiceStartedTest onBootTest
一定被跳过了/服务没有被调用。

我尝试在 BoardConfig.mk 上设置

androidboot.selinux=permissive
, 和
seclabel u:r:init:s0
,根据 Android 在启动时使用 init.rc 运行脚本不起作用

我尝试使用

start dispBridge
在 adb shell 上手动启动服务,这是使用
adb shell dmesg -w | grep dispBridge

的输出
[  271.108234] init: Received control message 'start' for 'dispBridge' from pid: 2606 (start dispBridge)
[  271.109119] init: starting service 'dispBridge'...
[  271.132498] init: Service 'dispBridge' (pid 2607) exited with status 127
[ 3069.662302] init: Received control message 'start' for 'dispBridge' from pid: 5640 (start dispBridge)
[ 3069.662771] init: starting service 'dispBridge'...
[ 3069.716114] init: Service 'dispBridge' (pid 5641) exited with status 127

当我使用

dmesg | grep -i "avc: denied"

[  271.122590] type=1400 audit(1730388931.839:21): avc: denied { entrypoint } for pid=2607 comm="init" path="/system/bin/test.sh" dev="dm-0" ino=1215 scontext=u:r:shell:s0 tcontext=u:object_r:system_file:s0 tclass=file permissive=0
[ 3069.693749] type=1400 audit(1730388931.839:21): avc: denied { entrypoint } for pid=2607 comm="init" path="/system/bin/test.sh" dev="dm-0" ino=1215 scontext=u:r:shell:s0 tcontext=u:object_r:system_file:s0 tclass=file permissive=0
[ 3069.694039] type=1400 audit(1730391730.409:22): avc: denied { entrypoint } for pid=5641 comm="init" path="/system/bin/test.sh" dev="dm-0" ino=1215 scontext=u:r:shell:s0 tcontext=u:object_r:system_file:s0 tclass=file permissive=0

参考 init 警告:服务 myservice 需要定义一个 SELinux 域。请修复,我尝试运行此命令

ls -Z /system/bin/test.sh  

这是输出

u:object_r:system_file:s0 /system/bin/test.sh

我也不确定是否需要.te文件来设置权限,但我也尝试了

androidboot.selinux=disabled
,但服务仍然没有运行。

我可以寻求帮助来为我指明正确的方向以启用此服务吗?我不太确定问题是什么,老实说,我不知道如何继续,因为我对此很陌生。预先感谢您!

android android-source selinux rc
1个回答
0
投票

我建议隔离变量并一步步引入复杂性。 SELinux 是 Android 中最复杂的领域之一,但幸运的是它是开源的,因此有很多示例可供参考。

阅读 AOSP 站点上“编写 SELinux 策略”页面上的“标记新服务和地址拒绝”部分:https://source.android.com/docs/security/features/selinux/device-policy#label_new_services_and_address_denials 本节将解释如何为您的应用程序创建一个新域,并确保它在 init 启动时进行转换(在这种情况下,您不需要在 init rc 文件中使用

seclabel
)。

从本机应用程序而不是 shell 脚本开始,因为 shell 脚本引入了另一个变量:shell 二进制文件。本机应用程序应该只执行诸如打印“Hello world”之类的操作并循环睡眠,然后您可以验证应用程序至少开始运行。一旦你开始工作,你就可以访问一些资源,这也需要添加 SELinux 规则。

这是我发现的由 init 启动的服务的 SELinux 规则的随机示例:https://cs.android.com/android/platform/superproject/main/+/main:system/sepolicy/vendor/hal_gnss_default .te

一般来说,纯AOSP中的init服务都不是shell脚本。像 Qualcomm 这样的供应商倾向于在 init 期间使用 shell 脚本,但它有点复杂,所以我建议不要这样做,除非您正在开发一个已经使用 init shell 脚本的项目,在这种情况下您可以遵循他们的示例。

© www.soinside.com 2019 - 2024. All rights reserved.