适用于Android本机活页夹客户端的SEPolicy

时间:2019-04-17 08:11:49

标签: android android-source selinux android-binder seandroid

我是Android世界的新手

我想知道如何为本地活页夹客户端程序设置 SEPolicy (以及要设置的内容。)

我正在使用Using Binde-IPC

中的供应商资料夹(vndservicemanager)参考

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


现在我有两个内置的可执行文件- my_binder_service my_client

它们都在/ vendor / bin /

my_binder_service 在引导时启动,它将为服务添加到供应商servicemanager

my_client 是一个使用活页夹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. 它可以将服务添加到供应商servicemanager
  3. 我的客户许可模式
  4. 下表现良好

以上内容已通过 ps -AZ vndservice list 命令

在强制模式下进行了验证。

但是, my_client 强制模式

下遇到分段错误

我通过以下方式检查被拒绝的邮件

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

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

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

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

我发现 my_client

的流程上下文设置不正确

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

由于init.rc文件中的 seclabel 命令,我认为 my_binder_service 设置正确

但是我不知道在哪里为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的问题吗?

1 个答案:

答案 0 :(得分:0)

几个小时后,我找到了解决问题的方法。

事实证明,这与客户端程序的SEPolicy无关


首先,我发现 vndservice列表强制模式下并没有干扰my_binder_service,我将 permissive 模式的结果混为一谈。

然后,我再次检查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 process context 仍然是 su 而不是 my_client ,我认为这可能是与这个问题无关。

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

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