Android 系统服务的 SELinux 策略定义:如何设置?
SELinux policy definition for Android system service: how to setup?
我之前编写了一个独立的守护进程来访问自定义设备 (/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 意图启动服务(线程),如 a previous question
中所述
我无法弄清楚如何设置 SELinux 策略,以便此 java 服务也能够访问开发文件。
[更新] 我继续为此目的使用特权守护进程。我的 java 服务通过套接字连接到守护进程。我没有更好的解决方案。
以下是在您的 Android 设备上实施 SELinux 所需的 steps 的简要总结:
在内核和配置中添加 SELinux 支持。
授予从 init 启动的每个服务(进程或守护进程)自己的域。
通过以下方式识别这些服务:
查看 init..rc 文件并找到所有服务。
检查表单 init 的警告:警告!服务名称需要定义一个 SELinux 域;请修复!在 dmesg 输出中。
检查 ps -Z | grep init 输出以查看 init 域中有哪些服务 运行。
标记所有新进程、驱动程序、套接字等。所有对象都需要正确标记,以确保它们与您应用的策略正确交互。请参阅 AOSP 中使用的标签,以获取标签名称创建中要遵循的示例。
制定完全涵盖所有标签并将权限限制在绝对最低限度的安全策略。
理想情况下,原始设备制造商 (OEM) 从 AOSP 中的政策开始,然后基于它们进行自定义。
更多https://source.android.com/security/selinux/implement.html
可能在您的 ueventd.rc 文件或项目中添加一行以授予权限
我终于找到了答案。把它张贴在这里,因为肯定会有像我这样的 SEPolicy 新手在寻找类似的答案。
对于这项工作,我需要能够从实施我的服务的 java 应用访问我的设备文件。
我需要在我的 sepolicy 目录中的一个新文件中添加以下规则:
allow system_app mydev_device:chr_file rw_file_perms;
此外,需要在 system_app
域中创建我的服务应用程序 运行。为此,我需要:
- 在 Android 构建期间在
priv_app
中安装。
- 使用平台密钥签名
- 在清单中声明共享用户 ID:
android.uid.system
。我发现如果没有这个,应用程序 运行s 在 platform-app
域中并且即使在 SEPolicy 规则中有相应的更改也无法访问我的设备文件。不知道为什么,我没有费心去调试。
也可以 运行 我的服务应用程序在 mydevsrvc_type
域中。我不知道该怎么做,也不知道这是否有效。
回答您从 init rc 启动服务的问题
你可以像下面这样写一个 rc 文件。收到 boot_completed
后它将在何处开始您的服务
on property:sys.boot_completed=1
start mydevsrvc
供参考http://androidxref.com/9.0.0_r3/xref/device/generic/qemu/init.ranchu.rc#60
我之前编写了一个独立的守护进程来访问自定义设备 (/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 意图启动服务(线程),如 a previous question
中所述我无法弄清楚如何设置 SELinux 策略,以便此 java 服务也能够访问开发文件。
[更新] 我继续为此目的使用特权守护进程。我的 java 服务通过套接字连接到守护进程。我没有更好的解决方案。
以下是在您的 Android 设备上实施 SELinux 所需的 steps 的简要总结:
在内核和配置中添加 SELinux 支持。 授予从 init 启动的每个服务(进程或守护进程)自己的域。 通过以下方式识别这些服务: 查看 init..rc 文件并找到所有服务。 检查表单 init 的警告:警告!服务名称需要定义一个 SELinux 域;请修复!在 dmesg 输出中。 检查 ps -Z | grep init 输出以查看 init 域中有哪些服务 运行。 标记所有新进程、驱动程序、套接字等。所有对象都需要正确标记,以确保它们与您应用的策略正确交互。请参阅 AOSP 中使用的标签,以获取标签名称创建中要遵循的示例。 制定完全涵盖所有标签并将权限限制在绝对最低限度的安全策略。 理想情况下,原始设备制造商 (OEM) 从 AOSP 中的政策开始,然后基于它们进行自定义。
更多https://source.android.com/security/selinux/implement.html
可能在您的 ueventd.rc 文件或项目中添加一行以授予权限
我终于找到了答案。把它张贴在这里,因为肯定会有像我这样的 SEPolicy 新手在寻找类似的答案。
对于这项工作,我需要能够从实施我的服务的 java 应用访问我的设备文件。
我需要在我的 sepolicy 目录中的一个新文件中添加以下规则:
allow system_app mydev_device:chr_file rw_file_perms;
此外,需要在 system_app
域中创建我的服务应用程序 运行。为此,我需要:
- 在 Android 构建期间在
priv_app
中安装。 - 使用平台密钥签名
- 在清单中声明共享用户 ID:
android.uid.system
。我发现如果没有这个,应用程序 运行s 在platform-app
域中并且即使在 SEPolicy 规则中有相应的更改也无法访问我的设备文件。不知道为什么,我没有费心去调试。
也可以 运行 我的服务应用程序在 mydevsrvc_type
域中。我不知道该怎么做,也不知道这是否有效。
回答您从 init rc 启动服务的问题 你可以像下面这样写一个 rc 文件。收到 boot_completed
后它将在何处开始您的服务on property:sys.boot_completed=1
start mydevsrvc
供参考http://androidxref.com/9.0.0_r3/xref/device/generic/qemu/init.ranchu.rc#60