Android13 添加SELinux权限 编译的时候出现 neverallow 编译报错

背景:

项目需要,需要通过init.rc启动一个服务,需要添加SELinux权限。

添加SELinux权限的步骤就不在此详细说明,大致如下:

修改system/sepolicy/prebuilts/api/33.0/private/file_contexts和system/sepolicy/private/file_contexts文件,在system/sepolicy/prebuilts/api/33.0/private/和system/sepolicy/private/目录下添加对应的te文件。以下是我修改的内容

heartbeat.te
type heartbeat, domain;
type heartbeat_exec, exec_type, file_type;

init_daemon_domain(heartbeat)

allow heartbeat sysfs:file {open write};


file_contexts
/system/bin/heartbeat            u:object_r:heartbeat_exec:s0

编译的时候在Selinux检测阶段出现 neverallow 编译报错

这个报错的原因,就是定义的te文件allow部分的规则和谷歌定义的neverallow的规则发生了冲突,导致编译不过。

根据报错提示信息,在system/sepolicy/public/domain.te第945行,找到对应文件位置

full_treble_only(`
    # Do not allow coredomain to access entrypoint for files other
    # than system_file_type and postinstall_file
    neverallow coredomain {
        file_type
        -system_file_type
        -postinstall_file
    }:file entrypoint;
    # Do not allow domains other than coredomain to access entrypoint
    # for anything but vendor_file_type and init_exec for vendor_init.
    neverallow { domain -coredomain } {
        file_type
        -vendor_file_type
        -init_exec
    }:file entrypoint;
')

我添加的是main类型,冲突的部分就是neverallow {domain -coredomain},若是core类型,冲突部分应该是neverallow coredomain。

根据网上的解决方案大部分都是在domain上加上“-heartbeat”,编译报错找不到heartbeat类型,反正在android13上是无法解决。

然后看代码,既然“-”屏蔽规则,这里冲突的部分应该就是“file_type”,尝试将“file_type”改为“-file_type”,编译居然通过,虽然这这办法可行,但会导致google的CTS测试失败,不推荐。

看到domain的规则中

翻译是不允许除coredomain之外的域访问除vendor_file_type和vendor_init的init_exec之外的任何内容的入口点,也就是说coredomain之外的域只能访问vendor_file_type和vendor_init的init_exec,白话的意思是vendor_file_type和init_exec不受规则影响。

修改heartbeat.te

                                                                                                                                                                                                               type heartbeat, domain;
type heartbeat_exec, exec_type, vendor_file_type, file_type;

init_daemon_domain(heartbeat)
allow heartbeat sysfs:file {open write};

添加一个vendor_file_type,编译通过,烧写到机器后权限也正常,程序正常运行。

至此问题解决,也不影响google认证,虽然原理不是很清楚。还有,我只在Android13上验证过,其他版本不知道是不是可以用此方法。再说一嘴,网上的文章真是千篇一律,感觉都是一个版本抄袭出来,例子都一摸一样的,不知道有没有验证就发出来,希望大家都能把博客写好,给人以便利,给自己以价值。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android系统中,SELinux是一种强制访问控制机制,用于保护Android设备免受恶意应用程序和攻击的影响。当系统运行过程中出现SELinux时,我们需要对这些进行统计和分析,以便更好地了解系统的安全状况。 Android中的SELinux通常会被记录在内核日志中,我们可以通过以下步骤来统计这些: 1. 获取内核日志:要统计SELinux,我们需要首先获取内核的日志信息。可以通过adb工具或第三方应用程序来获取设备的内核日志。 2. 过滤SELinux:在获取到内核日志后,我们需要将日志中与SELinux相关的进行筛选和提取。可以使用关键词过滤或正则表达式匹配来寻找与SELinux有关的日志条目。 3. 统计数量:一旦筛选出SELinux,我们可以通过遍历日志文件并计数相应的条目来统计数量。可以使用脚本或编程语言来自动化这个过程。 4. 分析原因:除了统计数量,我们还需要对进行分析,了解具体的原因和背后的问题。可以查阅相关文档、论坛或专业资料,学习和理解不同类型的SELinux,并提供相应的解决方案。 5. 提取关键信息:在分析SELinux后,我们可以提取出其中的关键信息,如发生的时间、的应用程序或进程、的具体内容等。这些信息可以帮助我们更好地定位和解决问题。 总结起来,要统计Android中的所有SELinux,需要获取内核日志、过滤SELinux、统计数量、分析原因并提取关键信息。这将帮助我们更好地了解系统安全状态,并及时采取措施解决潜在的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值