Android Selinux详解[一]---整体介绍

Android 使用安全增强型 Linux (SELinux) 对所有进程强制执行强制访问控制 (MAC),甚至包括以 Root/超级用户权限运行的进程(Linux 功能)。

借助 SELinux,Android 可以更好地保护和限制系统服务、控制对应用数据和系统日志的访问、降低恶意软件的影响,并保护用户免遭移动设备上的代码可能存在的缺陷的影响。

SELinux 按照默认拒绝的原则运行:任何未经明确允许的行为都会被拒绝。SELinux 可按两种全局模式运行:

  • 宽容模式permissive:权限拒绝事件会被记录下来,但不会被强制执行。
  • 强制模式enforcing:权限拒绝事件会被记录下来强制执行.

下面大概介绍一下工作中经常遇到的Selinux相关知识

目录

[1. 如何打开/关闭Selinux](#1. 如何打开/关闭Selinux)

[1.1 打开Selinux](#1.1 打开Selinux)

[1.2 关闭Selinux](#1.2 关闭Selinux)

[2. 关于Android12 高通平台Selinux的目录介绍](#2. 关于Android12 高通平台Selinux的目录介绍)

[2.1 原生Sepolicy目录](#2.1 原生Sepolicy目录)

[2.2 QSSI侧Sepolicy定制目录](#2.2 QSSI侧Sepolicy定制目录)

[2.3 VENDOR侧Sepolicy定制目录](#2.3 VENDOR侧Sepolicy定制目录)

[3. 一些使用场景的分析](#3. 一些使用场景的分析)

[3.1 假如我们的功能都实现在QSSI侧,实现的是一个系统服务, 我们想让它被vendor侧访问,应该在哪里添加type才能被vendor侧访问呢?](#3.1 假如我们的功能都实现在QSSI侧,实现的是一个系统服务, 我们想让它被vendor侧访问,应该在哪里添加type才能被vendor侧访问呢?)

[3.2 假如我们的功能都实现在VENDOR侧,实现的是一个hal服务, 我们想让它被system侧访问,应该在哪里添加type才能被system侧访问呢?](#3.2 假如我们的功能都实现在VENDOR侧,实现的是一个hal服务, 我们想让它被system侧访问,应该在哪里添加type才能被system侧访问呢?)

[3.3 假如我们的功能都实现在QSSI侧,实现的是一个系统服务, 我们不想让它被vendor侧访问,应该在哪里添加type才能不被vendor侧访问呢?](#3.3 假如我们的功能都实现在QSSI侧,实现的是一个系统服务, 我们不想让它被vendor侧访问,应该在哪里添加type才能不被vendor侧访问呢?)

[3.4 假如我们的功能都实现在VENDOR侧,实现的是一个HAL服务, 我们不想让它被system侧访问,应该在哪里添加type才能不被system侧访问呢?](#3.4 假如我们的功能都实现在VENDOR侧,实现的是一个HAL服务, 我们不想让它被system侧访问,应该在哪里添加type才能不被system侧访问呢?)


1. 如何打开/关闭Selinux

1.1 打开Selinux

打开Selinux即将Selinux处于enforcing模式,所以权限事件都会被记录下来并强制执行。

adb root

adb shell setenforce 1

adb shell getenforce

Enforcing (返回结果)

如果Selinux处于打开状态下,权限事件的log如下, 可以看到permissive=0,即可以确定当前处于enforcing模式,这时候test进程是不可以读取test.json的,会被明确拒绝。

01-01 20:15:07.355 1035 1035 I auditd : type=1400 audit(0.0:23): avc: denied { read } for comm="test" name="test.json" dev="sda12" ino=25609 scontext=u:r:test:s0 tcontext=u:object_r:test_file:s0 tclass=file permissive=0

1.2 关闭Selinux

关闭Selinux即将Selinux处于permissive模式,所以权限事件都会被记录下来,但不会强制执行。

adb root

adb shell setenforce 0

adb shell getenforce

Permissive (返回结果)

如果Selinux处于关闭状态下,权限事件的log如下, 可以看到permissive=1,即可以确定当前处于permissive模式,这时候test进程可以读取test.json的,虽然log也打印出来了,但是这个log只是打印出来供用户读取,并不会起到任何拒绝的作用

01-01 20:15:07.355 1035 1035 I auditd : type=1400 audit(0.0:23): avc: denied { read } for comm="test" name="test.json" dev="sda12" ino=25609 scontext=u:r:test:s0 tcontext=u:object_r:test_file:s0 tclass=file permissive=1

2. 关于Android12 高通平台Selinux的目录介绍

Android 12 上,高通的主目录分为两个,一个是QSSI, 一个是VENDOR, QSSI下存放着Android原生的一些东西, VENDOR下放着厂商定制的东西。Selinux策略sepolicy在QSSI和VENDOR下都有,sepolicy分为原生sepolicy 和厂商自己定制的sepolicy

2.1 原生Sepolicy目录

请不要在原生的sepolicy目录下修改文件,否则会导致CTS失败。请在Sepolicy定制目录下根据需求添加。

根目录 子目录 编译后的生成路径 如果在这个目录下定义一个新的type,system/vendor访问限制
QSSI/system /sepolicy/ private out/target/product/qssi/ system/etc/selinux system可以访问,vendor无法访问
QSSI/system /sepolicy/ public out/target/product/qssi/ system/etc/selinux system,vendor都可访问
QSSI/system /sepolicy/ private/compat ------ 当在system/sepolicy/public新增一个type的时候,需要在compat/api/api.ignore.cil中添加这个新增的标签,否则会编译失败

2.2 QSSI侧Sepolicy定制目录

QSSI侧Sepolicy定制目录,如果是我们自己添加Selinux策略,请添加到此处,

根目录 子目录 编译后的生成路径 如果在这个目录下定义一个新的type,system/vendor访问限制
QSSI/device/ qcom/sepolicy/ generic/ private out/target/product/qssi/ system_ext/etc/selinux system可以访问,vendor无法访问
QSSI/device/ qcom/sepolicy/ generic/ public out/target/product/qssi/ system_ext/etc/selinux system,vendor都可访问
QSSI/device/ qcom/sepolicy/ generic/ private/compat ----- 当在device/qcom/sepolicy/generic/public新增一个type的时候,需要在compat/api/api.ignore.cil中添加这个新增的标签,否则会编译失败

2.3 VENDOR侧Sepolicy定制目录

VENDOR侧Sepolicy定制目录

|------------------------------------------------------|-----------------------------|---------------------------------------------|--------------------------------------|
| 根目录 | 子目录 | 编译后的生成路径 | 如果在这个目录下定义一个新的type,system/vendor访问限制 |
| VENDOR/device/ qcom/ sepolicy_vndr/ generic/ vendor/ | common 所有芯片共用的 | out/target/product/qssi/ vendor/etc/selinux | vendor可以访问,system无法访问 |
| VENDOR/device/ qcom/ sepolicy_vndr/ generic/ vendor/ | 还有其他子目录,分别是不同的芯片不同的sepolicy | out/target/product/qssi/ vendor/etc/selinux | vendor可以访问,system无法访问 |

3. 一些使用场景的分析

3.1 假如我们的功能都实现在QSSI侧,实现的是一个系统服务, 我们想让它被vendor侧访问,应该在哪里添加type才能被vendor侧访问呢?

答案是,在QSSI/device/qcom/sepolicy/generic/public下添加相关的type声明,并在QSSI/device/qcom/sepolicy/generic/private/compat/api/api.ignore.cil中添加这个新增的标签。

allow语句在哪里添加都可以

3.2 假如我们的功能都实现在VENDOR侧,实现的是一个hal服务, 我们想让它被system侧访问,应该在哪里添加type才能被system侧访问呢?

答案是,在QSSI/device/qcom/sepolicy/generic/public下添加相关的type声明,并在QSSI/device/qcom/sepolicy/generic/private/compat/api/api.ignore.cil中添加这个新增的标签。

allow语句在哪里添加都可以

3.3 假如我们的功能都实现在QSSI侧,实现的是一个系统服务, 我们不想让它被vendor侧访问,应该在哪里添加type才能不被vendor侧访问呢?

答案是,在QSSI/device/qcom/sepolicy/generic/private下添加相关的type声明,并且只能在这个目录下添加相关allow语句。

3.4 假如我们的功能都实现在VENDOR侧,实现的是一个HAL服务, 我们不想让它被system侧访问,应该在哪里添加type才能不被system侧访问呢?

答案是,在VENDOR/device/qcom/sepolicy_vndr/generic/vendor/common下添加相关的type声明,并且只能在这个目录下添加相关allow语句。

相关推荐
安卓理事人1 小时前
安卓LinkedBlockingQueue消息队列
android
万能的小裴同学2 小时前
Android M3U8视频播放器
android·音视频
q***57743 小时前
MySql的慢查询(慢日志)
android·mysql·adb
JavaNoober3 小时前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
城东米粉儿4 小时前
关于ObjectAnimator
android
zhangphil5 小时前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android
火柴就是我6 小时前
从头写一个自己的app
android·前端·flutter
lichong9517 小时前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端
用户69371750013847 小时前
14.Kotlin 类:类的形态(一):抽象类 (Abstract Class)
android·后端·kotlin
火柴就是我7 小时前
NekoBoxForAndroid 编译libcore.aar
android