Android系统服务的SELinux策略定义:如何设置?

9

我之前编写了一个独立的守护进程,用于访问自定义设备 (/dev/mydev0)。查看AOSP源代码后,我发现需要在以下文件中设置策略才能使其正常工作:

新建文件 device.te 包含:

type mydev_device, dev_type;

新建一个名为mydevsrvc.te的文件,其中包含以下内容:

# service flash_recovery in init.rc
type mydevsrvc_type, domain;
type mydevsrvc_type_exec, exec_type, file_type;

init_daemon_domain(mydevsrvc_type)

allow mydevsrvc_type mydev_device:chr_file rw_file_perms;

编辑file_contexts以添加:

/dev/mydev[0-9]*    u:object_r:mydev_device:s0

编辑service_contexts以添加:

mydevsrvc                  u:object_r:mydevsrvc_type:s0

通过编辑init.flo.rc文件来启动守护进程,添加以下行:

service mydevsrvc /system/bin/mydevsrvc
    class main
    user system
    group system
    seclabel u:r:mydevsrvc_type:s0
    oneshot

现在,我需要在Android应用程序中访问设备,所以我必须将守护进程更改为 Android 系统服务。
我可以使用 BOOT_COMPLETED 意图启动服务(线程),如上一个问题中所解释的那样。
我无法弄清如何设置 SELinux 策略,使此 Java 服务也能够访问 dev 文件。
[更新] 我继续使用特权守护程序来实现这一目的。我的 Java 服务通过套接字连接到守护程序。我没有更好的解决方案。

实际上,在开发此守护程序的策略期间,我意识到启动进程的组件必须设置进程的域。现在,我发现 init*.rc 是可以为守护程序设置域的位置。我找不到在基于Java的Android服务中设置域的位置。 - GPS
如果有人在看,我决定从init.rc启动本地守护进程,并通过Android的Linux套接字与我的非特权Java服务进行通信。 - GPS
这里是init.rc中'dervice'命令的语法。 https://dev59.com/Q1_Va4cB1Zd3GeqPS2an - kkk_ddd
4个回答

5

我终于找到了答案。在这里发布,因为一定会有像我这样的SEPolicy新手寻找类似的答案。

对于这项工作,我需要能够从实现我的服务的Java应用程序中访问我的设备文件。

我需要在sepolicy目录中添加以下规则,放在一个新文件中:

allow system_app mydev_device:chr_file rw_file_perms;

还需要使我的服务应用程序在system_app域中运行。为此,我需要:

  1. 在Android构建期间安装在priv_app中。
  2. 使用平台密钥进行签名
  3. 在清单中声明共享用户ID:android.uid.system。我发现,如果没有这个,应用程序将在platform-app域中运行,并且即使在SEPolicy规则中做出相应更改,也无法访问我的设备文件。不确定原因,我没有费心去调试。

可能还可以在mydevsrvc_type域中运行我的服务应用程序。我没有找到如何做到这一点,也不知道是否有效。


2
以下是在Android设备上实现SELinux所需的步骤的简要概述:
- 在内核和配置中添加SELinux支持。 - 为从init启动的每个服务(进程或守护程序)授予其自己的域。 - 通过以下方式识别这些服务: - 查看init..rc文件并找到所有服务。 - 检查dmesg输出中类似于“init: Warning! Service name needs a SELinux domain defined; please fix!”的警告。 - 检查ps -Z | grep init输出以查看在init域中运行哪些服务。 - 对所有新进程、驱动程序、套接字等进行标记。所有对象都需要正确标记,以确保它们与应用的策略正确交互。请参考AOSP中使用的标签名称创建示例。 - 实施安全策略,完全覆盖所有标签,并将权限限制为绝对最小值。 - 理想情况下,OEM应该从AOSP中开始使用策略,然后根据自己的定制进行构建。
更多信息请访问https://source.android.com/security/selinux/implement.html

3
我看到了这段文字先生。 我无法弄清如何从init*.rc开始安卓服务?我该在init.rc中添加哪些行来启动我的服务。 另外,如果我使用BOOT_COMPLETED启动服务,如何为此服务标记域? - GPS
@Suzan Mak 我也想了解更多 =) - HenriqueMS

1

0
可能需要在您的ueventd.rc文件或项目特定文件中添加一行以授予权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接