当前位置: 首页 > news >正文

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

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

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

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

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

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

目录

1. 如何打开/关闭Selinux

1.1 打开Selinux

1.2 关闭Selinux

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

2.1 原生Sepolicy目录

2.2 QSSI侧Sepolicy定制目录

 2.3 VENDOR侧Sepolicy定制目录

3. 一些使用场景的分析

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

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

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

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/

privateout/target/product/qssi/
system/etc/selinux
system可以访问,vendor无法访问
publicout/target/product/qssi/
system/etc/selinux
system,vendor都可访问
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无法访问
publicout/target/product/qssi/
system_ext/etc/selinux
system,vendor都可访问
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无法访问
还有其他子目录,分别是不同的芯片不同的sepolicy

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

相关文章:

  • 15双体系Java学习之数组的声明和创建
  • [数据集][目标检测]芒果叶病害数据集VOC+YOLO格式4000张5类别
  • 万字完整版【C语言】指针详解~
  • 【智能家居入门1之环境信息监测】(STM32、ONENET云平台、微信小程序、HTTP协议)
  • 141 Linux 系统编程18,线程,ps –Lf 进程 查看LWP,线程间共享数据,优缺点,编译加-lpthread,
  • docker学习入门篇
  • 【java数据结构】HashMap和HashSet
  • 详解开关电源
  • 理论学习:nn.CrossEntropyLoss
  • linux中git暂存,提交,上传到github
  • 深入学习默认成员函数——c++指南
  • 学习数据节构和算法的第15天
  • 什么是jwt
  • 【Spring Boot 3】动态注入和移除Bean
  • git - 笔记
  • php的引用
  • [ JavaScript ] 数据结构与算法 —— 链表
  • HTTP--网络协议分层,http历史(二)
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • magento2项目上线注意事项
  • MaxCompute访问TableStore(OTS) 数据
  • 编写高质量JavaScript代码之并发
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 日剧·日综资源集合(建议收藏)
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 三栏布局总结
  • 微服务入门【系列视频课程】
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 我从编程教室毕业
  • 我看到的前端
  • 学习使用ExpressJS 4.0中的新Router
  • 译有关态射的一切
  • 在Unity中实现一个简单的消息管理器
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (06)金属布线——为半导体注入生命的连接
  • (C++20) consteval立即函数
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (三) diretfbrc详解
  • (十一)手动添加用户和文件的特殊权限
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • . Flume面试题
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)