0

我是 Android 世界的新手

我想知道如何 为本机 binder 客户端程序设置 SEPolicy (以及设置什么......)

我正在使用来自Using Binde-IPC 的供应商绑定器(vndservicemanager)参考

我为所需的 SEPolicy 添加了一些文件


现在我有两个内置的可执行文件——my_binder_servicemy_client

它们都在 /vendor/bin/ 下

my_binder_service在启动时启动,它会将服务添加到 vendor servicemanager

my_client是一个使用 binder IPC 从my_binder_service执行某些功能的程序

这是我在init.rc中的设置

service my_binder_service /vendor/bin/my_binder_service
    class main
    class oneshot
    class console
    seclabel u:r:my_binder_service:s0

到目前为止我有什么:

  1. my_binder_service在引导时成功启动
  2. 它可以向供应商服务管理器添加服务
  3. my_client在permissive 模式下表现良好

以上内容在强制模式下通过ps -AZvndservice list命令进行验证


但是,my_client在强制模式下遇到分段错误

我通过以下方式检查被拒绝的消息

dmesg | grep avc | grep my_
logcat | grep avc: | grep my_

但是我在许可和强制模式下都没有找到任何消息

我还通过ps -AZ检查了这两个正在运行的进程的上下文:

u:r:my_binder_service:s0  <- for my_binder_service
u:r:su:s0                 <- for my_client

我发现没有为my_client正确设置进程上下文

我认为这可能是my_client在强制模式下的问题

我认为my_binder_service设置正确是因为 init.rc 文件中的seclabel命令

但我不知道在哪里为 my_client 设置进程上下文

这里是my_client.te的内容(my_binder_service.te和这个类似)

type my_client, domain;
type my_client_exec, exec_type, file_type, vendor_file_type;

init_daemon_domain(my_client)

allow my_client my_client_exec:file entrypoint;
allow my_client serial_device:chr_file { read write };

vndbinder_use(my_client);
binder_call(my_client, my_binder_service);

并且文件上下文在file_context文件中指定

/vendor/bin/my_binder_service      u:object_r:my_binder_service_exec:s0
/vendor/bin/my_client              u:object_r:my_client_exec:s0

SEPolicy 部分是否缺少任何内容?

或者这不是关于 SEPolicy 的问题?

4

1 回答 1

0

几个小时后我找到了我的问题的解决方案..

原来它与客户端程序的 SEPolicy 无关


首先,我发现vndservice list在enforcing mode下没有 lisy my_binder_service ,我混淆了permissive mode 的结果。

然后,我再次检查了Using Binder IPC中的 SOP,看看我是否遗漏了什么。

事实上!我确实错过了很多东西...


这是我所做的所有修改

# In vndservice_contexts 
my_binder_service                         u:object_r:my_binder_service:s0

我认为init.rc中的seclabel有效,但事实证明这行仍然是必要的

# In my_binder_service.te
type my_binder_service, domain, vndservice_manager_type;
allow my_binder_service self:service_manager add;

增加vndservice_manager_type,根据logcat|增加允许规则 grep avc:结果和audit2allow 命令

我在my_client.te中所做的唯一更改是我在其中删除了 init_domain_daemon()

因为我检查了 te_macros 文件后发现它不合理


最后,一切都在强制模式下工作

除了my_client的进程上下文仍然是su不是my_client,我认为这可能与这个问题无关。

也许对客户端和服务器之间的 IPC 来说唯一重要的是以下几行

binder_call(my_client, my_binder_service);
binder_call(my_binder_service, my_client);
于 2019-04-17T10:11:48.967 回答