【问题标题】:SEPolicy for Android Native binder clientSEPolicy for Android Native binder 客户端
【发布时间】:2019-09-07 10:10:30
【问题描述】:

我是 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. 可以向vendor servicemanager添加服务
  3. my_clientpermissive 模式 下表现良好

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


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

我通过

检查被拒绝的消息
dmesg | grep avc | grep my_
logcat | grep avc: | grep my_

但是我在permissive和enforcing模式下都没有找到任何消息

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

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 的问题?

【问题讨论】:

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


    【解决方案1】:

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

    原来和客户端程序的SEPolicy无关


    首先,我发现vndservice listenforcing模式下没有lisy 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_clientprocess context 仍然是 su 而不是 my_client,我认为这可能是与这个问题无关。

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

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

    【讨论】:

    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多