一、报错问题

在 应用访问时 log 中 报出 avc: denied, 是 selinux 问题, :报错日志如下:

10-29 10:56:01.367  5118  5118 I auditd  : type=1400 audit(0.0:624): 
avc:  denied  { connectto }for  comm="JavaBridge" 
path=0056616E73746F6E65426C7565746F6F7468 
 scontext=u:r:untrusted_app_25:s0:c512,c768 
 tcontext=u:r:untrusted_app_29:s0:c84,c256,c512,c768 
 tclass=unix_stream_socket permissive=0 app=com.qinsilk.appUniverse

二、解决办法

2.1 初次尝试

解决方法: 一般先提取重要信息 :主体、客体、客体类别

scontext=u:r:untrusted_app_25:s0:c512,c768 
tcontext=u:r:untrusted_app_29:s0:c84,c256,c512,c768 
tclass=unix_stream_socket 

根据这个信息,一般的做法是 在 untrusted_app_25.te 中增加如下语句

allow untrusted_app_25 untrusted_app_29:unix_stream_socket { connectto  };

但是添加上述日志后,这个 connectto 权限还是有问题,正常的情况是没有 这两个 c512, c768 的。SEAndroid 主要采用了两种强制访问的方法: TE 、 MLS。 我们经常接触到的都是 TE。 这个恰好是 MLS 相关的,这个部分比较难理解。
详细的可以读下面链接的文档
SEAndroid策略

2.2 最终解决

我用到的只参考了下面的部分:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SEAndroid中共定义了三个拥有巨大权限的attribute分别是
mlstrustedsubject、mlstrustedobject、unconfineddomain

  • 被分类到mlstrustedsubject的type在充当主体domain是可以越过MLS检查;
  • 被分类到mlstrustedobject的type在充当客体时可以越过MLS检查;
  • 被分到unconfineddomain的type则拥有所有权限可对客体进行任意操作。

SEAndroid

  • 被分在mlstrustedsubject attribute中的 type 有
    adbd、debuggerd、drmserver、init、installd、kernel、mediaserver、netd、surfaceflinger、su、system、vold、zygote。
  • 被分在mlstrustedobject attribute中的type有alarm_device、ashmem_device、binder_device、log_device、mtp_device、nv_device、powervr_device、ptmx_device、null_device、cgroup、sysfs、sysfs_writable、sysfs_writable、sysfs_writable、debugfs、apk_data_file、cache_file、dnsproxyd_socket。
  • 被分在unconfineddomain的type有init、kernel、su。

按照上面的说明,需要把 untrusted_app_25untrusted_app_29 类型定义的时候加上 mlstrustedsubject, 但是增加后编译报错,需要修改neverallow报错,我增加了 mlstrustedsubject, 问题解决。

type untrusted_app_25, domain, mlstrustedsubject;
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐