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

Android系统服务的SELinux策略定义:如何设置?,android,service,android-source,selinux,Android,Service,Android Source,Selinux,我之前编写了一个独立的守护进程来访问自定义设备(/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;

我之前编写了一个独立的守护进程来访问自定义设备(/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;
要添加的已编辑文件\u上下文:

/dev/mydev[0-9]*    u:object_r:mydev_device:s0
mydevsrvc                  u:object_r:mydevsrvc_type:s0
要添加的已编辑服务上下文:

/dev/mydev[0-9]*    u:object_r:mydev_device:s0
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 intent启动服务(线程),如中所述

我不知道如何设置SELinux策略,以便该java服务也能够访问dev文件


[更新]我已为此继续使用特权守护程序。我的java服务通过套接字连接到守护进程。我没有更好的解决方案。

以下是在Android设备上实现SELinux所需步骤的简要总结:

在内核和配置中添加SELinux支持。 将从init启动的每个服务(进程或守护进程)授予其自己的域。 通过以下方式确定这些服务: 查看init..rc文件并查找所有服务。 检查表单init的警告:警告!服务名称需要定义一个SELinux域;请修理!在dmesg输出中。 检查ps-Z | grep init输出以查看哪些服务正在init域中运行。 标记所有新进程、驱动程序、套接字等。所有对象都需要正确标记,以确保它们与应用的策略正确交互。请参阅AOSP中使用的标签,以了解创建标签名时要遵循的示例。 制定完全覆盖所有标签的安全策略,并将权限限制在其绝对最小值。 理想情况下,OEM从AOSP中的策略开始,然后根据这些策略进行定制


如需了解更多信息,请在您的ueventd.rc文件或特定项目中添加一行,以授予该权限

我终于找到了答案。张贴在这里,因为肯定会有像我一样的SEPolicy noobs寻找类似的答案

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

我需要在我的sepolicy目录中的新文件中添加以下规则:

允许系统应用程序mydev\u设备:chr\u文件rw\u文件perms

此外,还需要使我的服务应用程序在
system\u app
域中运行。为此,我需要:

  • 在Android构建期间,在
    priv_app
    中安装
  • 用平台钥匙签字
  • 在清单中声明共享用户id:
    android.uid.system
    。我发现没有这个,应用程序运行在
    平台应用程序
    域中,即使SEPolicy规则有相应的更改,也无法访问我的设备文件。不知道为什么,我没有费心调试

  • 也可以在
    mydevsrvc\u type
    域中运行我的服务应用程序。我不知道如何做到这一点,也不知道这是否可行。

    实际上,在为这个守护进程开发策略的过程中,我意识到启动进程的组件必须设置进程的域。现在,我发现init*.rc是我可以为守护进程设置域的地方。我找不到为基于java的android服务设置域的位置。如果有人看到它,我决定让本机守护进程从init.rc启动,并通过android的linux套接字从我的非特权java服务与它通信。这里有init.rc的'dervice'命令的语法,我已经看到了这个文本。我不知道如何从init*.rc启动android服务?我可以在init.rc中添加哪些行来启动我的服务。或者,如果我使用BOOT_COMPLETED启动服务,我如何在该服务上标记域?@Suzan Mak A我还想知道更多=)