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语句。

相关推荐
Dingdangr5 小时前
Android中的Intent的作用
android
技术无疆5 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
GEEKVIP5 小时前
Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
android·笔记·安全·macos·智能手机·电脑·笔记本电脑
Jouzzy11 小时前
【Android安全】Ubuntu 16.04安装GDB和GEF
android·ubuntu·gdb
极客先躯12 小时前
java和kotlin 可以同时运行吗
android·java·开发语言·kotlin·同时运行
Good_tea_h14 小时前
Android中的单例模式
android·单例模式
计算机源码社19 小时前
分享一个基于微信小程序的居家养老服务小程序 养老服务预约安卓app uniapp(源码、调试、LW、开题、PPT)
android·微信小程序·uni-app·毕业设计项目·毕业设计源码·计算机课程设计·计算机毕业设计开题
丶白泽20 小时前
重修设计模式-结构型-门面模式
android
晨春计21 小时前
【git】
android·linux·git
标标大人1 天前
c语言中的局部跳转以及全局跳转
android·c语言·开发语言