Android 系统关闭SELinux 权限

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、目的

二、参考资料

三、实现方案

涉及到修改文件

解决方案

[四、日常adb 调试技巧](#四、日常adb 调试技巧)

日常调试命令

四个关键词含义

getenforce

[setenforce 0](#setenforce 0)

[setenforce 1](#setenforce 1)

[Permissive 宽容模式](#Permissive 宽容模式)

[Enforcing 强制模式](#Enforcing 强制模式)

命令-结果关键词核心对比表

五、实战分析

六、思考

前言

Linux系统底层开发、Android系统开发 绕不开 权限、绕不开 SELinux 权限,这里讲解如何关闭SELinux 权限

一、目的

日常经常用到,特别是项目调试时候能够快速定位;快速验证问题、实现功能,绕开各种权限问题;必备技能知识点。

  1. 总结知识点、方便后续高效开发
  2. 日常开发快速验证问题、得出结论、验证功能

二、参考资料

以下提供相关资料参考,主要目的:理解SELinux 权限,当然也只有自己在做系统底层开发工作时候才会更加深刻理解。

Android SELinux权限
Android SELinux权限 _

别再乱加allow了!Android SELinux权限配置避坑指南(附audit2allow实战)

系统端提供Data分区upgrade目录创建-实现OTA功能接口-授权SELinux权限:以前一个功能相关案例,如何配置功能相关的SELinux 权限

三、实现方案

涉及到修改文件

/system/core/init/selinux.cpp

解决方案

在**/system/core/init/selinux.cpp 文件中的 IsEnforcing 方法,直接返回false**

复制代码
bool IsEnforcing() {
    return false;//huanghb add
    if (ALLOW_PERMISSIVE_SELINUX) {
        return StatusFromProperty() == SELINUX_ENFORCING;
    }
    return true;
}

四、日常adb 调试技巧

日常调试命令

如下

C:\Users\Administrator>adb shell

k69v1_64_k419:/ $ su

k69v1_64_k419:/ # getenforce

Permissive

k69v1_64_k419:/ # setenforce 0

k69v1_64_k419:/ # getenforce

Permissive

k69v1_64_k419:/ # setenforce 1

k69v1_64_k419:/ # getenforce

Enforcing

k69v1_64_k419:/ # setenforce 0

k69v1_64_k419:/ #

四个关键词含义

getenforce

查看当前 SELinux 工作模式,只会返回两种结果:

  • Permissive:宽容模式
  • Enforcing:强制模式

setenforce 0

临时设置 SELinux 为 宽容模式 Permissive

setenforce 1

临时设置 SELinux 为 强制模式 Enforcing

Permissive 宽容模式

  • SELinux 不拦截、不禁止任何权限违规行为
  • 只是把违规行为打印日志(avc:denied) ,但不杀进程、不阻止运行
  • 就算权限不够,APP / 二进制照样能跑
  • 适合调试 SELinux 权限用

Enforcing 强制模式

  • SELinux 真正生效、严格强制权限
  • 一旦出现 avc:denied直接拦截、禁止访问、甚至闪退 / 进程挂掉
  • 量产固件默认都是这个模式

命令-结果关键词核心对比表

命令 含义 行为表现 适用场景
setenforce 0 设为宽容模式 Permissive 只记录报错日志,不拦截、不限制权限 调试 SELinux、临时绕过权限报错
setenforce 1 设为强制模式 Enforcing 严格权限校验,拒绝违规、拦截、闪退 量产正式版本
Permissive 当前是宽容模式 放行所有违规,仅打日志 开发调试
Enforcing 当前是强制模式 严格拦截所有 SELinux 权限拒绝 正式量产

getenforce → Permissive 默认开机就是宽容模式

setenforce 0 → 还是宽容

setenforce 1 → 变成强制模式

setenforce 0 → 又切回宽容

五、实战分析

日志分析

比如如下日志: 只有在开放了SELinux 权限之后,日志中涉及到SELinux 相关的permissive=1 标志位的值才会等于1,关闭SELinux 权限后,标志位permissive 一定等于零,表示拦截掉了。

复制代码
05-12 14:36:31.376 E/SELinux (  401): avc:  denied  { find } for pid=3451 uid=99000 name=content_capture scontext=u:r:isolated_app:s0:c512,c768 tcontext=u:object_r:content_capture_service:s0 tclass=service_manager permissive=1

案例分享

如下都是之前遇到过的相关SELinux 权限知识点,并实际配置 实现相关功能。

系统端提供Data分区upgrade目录创建-实现OTA功能接口-授权SELinux权限 : 涉及到文件相关的SELinux 权限

系统定制服务-IPC实战-系统新增aidl接口-实现自定义系统服务功能 : 涉及到服务文件权限、进程权限等 配置SELinux 权限

六、思考

  • 经验分享:快速验证功能,抛开权限来讲,直接关闭SELinux 权限,证明功能是否可用,然后在打开SELinux 针对性的解决各种权限问题。通过代码里面直接关闭,也可以用adb 命令零时关闭
  • SELinux 权限问题、分析解决才是核心的技能知识点,这里只是为了高效开发,在国内太多太多绝多数系统开发中是可以打开的。
  • SELinux 权限开关是否打开或者关闭:认证的软件特别是产品是国外产品认证基本上不允许关闭的,按照规范来。 国内工控软件、消费级软件 都是可以关闭的。

总结

  • 这里只是一个知识点的总结,实际开发中高频配置使用
  • 理解并尝试具备SELinux 开发的技能,权限始终贯穿整个开发周期,这个才是核心技能点,需要掌握并理解原理
  • 对于新手很难理解,慢慢就理解了