Android实战经验篇-玩转Selinux(详解版)

news2025/1/27 13:37:41

列文章转如下链接:

Android Display Graphics系列文章-汇总

Android实战经验篇-系列文章汇总

本文主要包括部分:

一、Selinux概述

        1.1  SELinux是什么?

        1.2 自主访问控制(DAC)

        1.3 强制访问控制(MAC)

        1.4 SELinux 的工作原理

        1.5 SELinux 标签和类型强制访问控制

        1.6 Selinux policy language

        1.7 Selinux for Android

二、Selinux 修改

        2.1 问题解决

                2.1.1  SElinux问题分析

                2.1.2 增加缺失权限

                2.1.3 MLS问题

                2.1.4 neverallow问题

        2.2 修改验证

                2.2.1 Android源码修改验证

                2.2.2 设备端修改验证

三、小结

一、Selinux概述

1.1  SELinux是什么?

安全增强型 Linux(SELinux)是一种采用安全架构的 Linux® 系统,它能够让管理员更好地管控哪些人可以访问系统。它最初是作为 Linux 内核的一系列补丁,由美国国家安全局(NSA)利用 Linux 安全模块(LSM)开发而成。

SELinux 于 2000 年发布到开源社区,并于 2003 年集成到上游 Linux 内核中。

1.2 自主访问控制(DAC)

基于Linux内核的衍生操作系统中,全都符合“一切皆文件”的理念。也就是对用户来说,系统的硬件资源(磁盘、内存、网络等)和软件资源都是以一种可访问甚至可编辑修改的方式提供的。这样给使用者带来了极大的便利,但却给计算机带来了很多安全问题。例如,恶意进程会不会强制把其它进程kill掉?会不会在不征求使用者同意的情况下,修改或删除其磁盘的数据?

显然为了控制这种恶意操作或资源管控,需要一种资源管理机制。目前Linux上的资源管理机制是自主访问控制DAC,全称是 Discretionary Access Control。TCSEC 定义的访问控制中的一种类型。DAC根据主体(如用户、进程或 I/O 设备等)的身份和他所属的组限制对对象的访问。所谓的自主,是因为拥有访问权限的主体,可以直接(或间接)地将访问权限赋予其他主体(除非受到强制访问控制的限制)。

DAC模型是指对象(比如程序、文件、进程)的拥有者可以任意修改或者授予此对象相应的权限,也就是UGO+RWX/ACL权限控制。

权限有三个要素:主体(subject)、对象(object)、策略(policy),用于表示主体对哪个对象拥有什么访问策略,例如:用户小明\opt\work文件夹拥有读访问策略。

1.2.1 文件的UGO+RWX权限控制

UGO是User(用户)、Group(用户所属组)和Other(其他用户)的简称:

User是文件的所有者(属主),一般是创建文件的用户,对该文件具有完全的权限。只有文件的属主和超级用户root 修改文件的权限。

Group是文件所属用户组对文件的访问权限(属组)。项目协作中需要不同开发者(User)相互查看和修改本项目的文件,此时就用到组(Group)的概念的。可以创建一个用户组(Group),把相应开发者(User)添加这个组(Group)中。在设置文件的访问权限时,允许这个组(Group)中的开发者(User)项目文件进行读取和修改。

Other是除了User、Group之外,其他用户对该文件的访问权限。也就是不适合放到项目组(Group)中的用户(User),这时候就属于Other单独设置Other权限就可以有效控制组(Group)外人员的访问。

RWX

RWX则是Read(读)、Write(写)、eXecute(执行)的简称:

每个文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行三种权限。用命令 ls -l 查看详细信息,最左边一列为文件的访问权限。例如:

$ ls -al

total 2102

drwxr-xr-x 1 user 197121       0 Jan 21 17:25 ./

drwxr-xr-x 1 user 197121       0 Jan 13 15:49 ../

drwxr-xr-x 1 user 197121       0 Jan 21 18:05 .git/

drwxr-xr-x 1 user 197121       0 Jan 21 17:25 .github/

-rw-r--r-- 1 user 197121     128 Jan 21 17:25 .gitignore

drwxr-xr-x 1 user 197121       0 Jan 21 17:35 .gradle/

drwxr-xr-x 1 user 197121       0 Jan 21 17:23 .idea/

-rw-r--r-- 1 user 197121    6810 Jan 21 17:25 FAQ.md

-rw-r--r-- 1 user 197121   11591 Jan 21 17:25 LICENSE

-rw-r--r-- 1 user 197121    6725 Jan 21 17:25 README.md

drwxr-xr-x 1 user 197121       0 Jan 21 17:25 app/

权限列共有 10 个字符,第一个字符为文件类型,后面九个分为三组:第一组为 U(User) ,即文件属主对应的权限;第二组为 G(Group),即同组用户对应的权限;第三组为 O(Others),即其他用户对应的权限。每个字符的意义可用下图描述:

权限列的第一个字符(文件类型),-代表普通文件;l代表链接文件;d代表目录文件。

文件与目录的权限有所区别,如下所示:

权限

文件

目录

R(可读)

读取文件内容

读包含在目录中的文件名称

W(可写)

对文件内容进行编辑

可以写信息到目录中,即可以创建、删除文件、移动文件等操作

X(可执行)

作为执行文件执行

可以进入目录;可以搜索(能用该目录名称作为路径名去访问它所包含的文件和子目录)

1.2.2 文件的ACL权限控制

ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何用户或用户组设置任何文件/目录的访问权限。

在UGO+RWX权限中,用户对文件只有三种身份,就是属主、属组和其他人,但是在实际工作中,这三种身份实在是不够用,我们举个例子来看看

根目录中有一个 /project 目录,这是班级的项目目录。班级中的每个学员都可以访问和修改这个目录,老师也需要对这个目录拥有访问和修改权限,其他班级的学员当然不能访问这个目录。需要怎么规划这个目录的权限呢?应该这样:老师使用 root 用户,作为这个目录的属主,权限为 rwx;班级所有的学员都加入 tgroup 组,使 tgroup 组作为 /project 目录的属组,权限是 rwx;其他人的权限设定为 0。这样这个目录的权限就可以符合我们的项目开发要求了。

有一天,班里来了一位试听的学员 st,她必须能够访问 /project 目录,所以必须对这个目录拥有 r 和 x 权限;但是她又没有学习过以前的课程,所以不能赋予她 w 权限,怕她改错了目录中的内容,所以学员 st 的权限就是 r-x。可是如何分配她的身份呢?变为属主?当然不行,要不 root 该放哪里?加入 tgroup 组?也不行,因为 tgroup 组的权限是 rwx,而我们要求学员 st 的权限是 r-x。如果把其他人的权限改为 r-x 呢?这样一来,其他班级的所有学员都可以访问 /project 目录了。

当出现这种情况时,普通权限中的三种身份就不够用了。ACL 权限就是为了解决这个问题的。在使用 ACL 权限给用户 st 陚予权限时,st 既不是 /project 目录的属主,也不是属组,仅仅赋予用户 st 针对此目录的 r-x 权限。这有些类似于 Windows 系统中分配权限的方式,单独指定用户并单独分配权限,这样就解决了用户身份不足的问题。

如下图,user是test,group是test,去写一个root权限的readme.txt文件,就是没权限的。

DAC 的管控颗粒度太大,没法精确控制到某个进程。

1.3 强制访问控制(MAC)

MAC就是为了解决了DAC权限控制颗粒度太大的问题。在SELinux 这样的 MAC 系统上,访问权限有相应的管理设置策略。即使主目录上的 DAC 设置发生更改,SELinux 策略也会阻止其他用户或进程访问目录,从而保证系统的安全。

借助 SELinux 策略,可以设置具体规则任何进程做任何事情,都需先在安全策略配置文件中赋予权限也就是说,不在安全策略配置文件中配置的权限,进程就没有该权限。即使你是root,也不一定拥有权限操作

1.4 SELinux 的工作原理

SELinux 用于定义对系统上应用、进程和文件的访问控制。利用安全策略(一组规则,用于告知 SELinux 可以或不能访问哪些内容)来强制执行策略所允许的访问。

当应用或进程(称为主体)发出访问对象(如文件)的请求时,SELinux 会检查访问向量缓存(AVC),其中缓存有主体对象的访问权限。如下例子:

进程和文件都被打上了安全上下文(Context),user在写入script的时候,除了要拥有写权限,同时要在规则库声明权限,这样才能正常写入。

如果拒绝授予权限,Linux会在/var/log.messages 中将会显示“avc: denied”消息而android会在logcat或kernel log中显示“avc:denied”

1.5 SELinux 标签和类型强制访问控制

类型强制访问控制标签Label是 SELinux 中最为重要的两个概念。

SELinux 可作为标签系统运行,也就是说,系统中的所有文件、进程和端口都具有与之关联的 SELinux 标签。标签可以按照逻辑将目标组合分组。在启动过程中,内核负责管理标签。

标签的格式为 user:role:type:level(level 为可选项)。User、role 和 level 用于更高级的 SELinux 实施中标签类型对于目标策略而言最为重要。

1.5.1 类型强制

SELinux实现了一个灵活的MAC机制,叫做类型强制TE(Type Enforcement)。SELinux 利用类型强制访问控制来强制执行系统中定义的策略。

  TEAC(Type Enforcement Accesc Control)也是的MAC 基本管理单位,而且基于角色的访问控制(RBAC)也是基于 TE 的。 TE 也是 SELinux 中最主要的部分。平时用的 allow 语句就是 TE 的范畴。

在类型强制下,所有主体和客体都有一个”安全上下文“与它们关联,要访问某个客体,主体的类型必须为客体的类型进行授权。

对比SELinux和标准Linux的访问控制属性

标准Linux

集成SElinux的Linux

主体(进程)安全属性

真实有效的用户和组ID

安全上下文

客体安全属性

访问模式、文件用户户和组ID

安全上下文

访问控制基础

进程用户/组ID和文件的访问模式,此访问模式基于文件的用户/组ID

在进程类型和文件类型之间允许的许可

1.5.2 查看安全上下文Context

怎么查看文件和进程的Selinux Context呢?ps 和 ls 都加Z选项。

文件的 Secure Context,使用ls -alZ查看

 

**************************************************************************************************************

文章全文转免费链接:Android实战经验篇-玩转Selinux(详解版)

**************************************************************************************************************

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2283144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CLOUDFLARE代理请求重定向你太多次

现象 使用CLOUDFLARE代理前请求正常,使用CLOUDFLARE代理请求后出现 原因分析 以下是我的猜测,在默认情况下 CLOUDFLARE代理,可能是直接请求我们服务器的IP,比如:http://1.1.1.1 而不是通过域名的方式(如…

U-Net - U型网络:用于图像分割的卷积神经网络

U-Net是一种专为图像分割任务设计的卷积神经网络(CNN),最初由Olaf Ronneberger等人于2015年提出。它被广泛应用于医学影像分析、遥感图像分割、自动驾驶和其他许多需要对图像进行像素级分类的任务中。U-Net具有强大的特征提取和恢复能力&…

第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

第十五届的题目在规定时间内做出了前5道,还有2道找时间再磨一磨。现在把做的一些思路总结如下: 题1:握手问题 问题描述 小蓝组织了一场算法交流会议,总共有 50人参加了本次会议。在会议上,大家进行了握手交流。按照惯例…

Vue3 + TS 实现批量拖拽 文件夹和文件 组件封装

一、html 代码&#xff1a; 代码中的表格引入了 vxe-table 插件 <Tag /> 是自己封装的说明组件 表格列表这块我使用了插槽来增加扩展性&#xff0c;可根据自己需求&#xff0c;在组件外部做调整 <template><div class"dragUpload"><el-dial…

DX12 快速教程(4) —— 画钻石原矿

快速导航 新建项目 "004-DrawTexture"纹理贴图纹理采样纹理过滤邻近点采样双线性过滤Mipmap 多级渐远纹理三线性过滤各向异性过滤 纹理环绕LOD 细节层次 开始画钻石原矿吧加载纹理到内存中&#xff1a;LoadTexture什么是 WIC如何用 WIC 读取一帧图片获取图片格式并转…

LBS 开发微课堂|AI向导接口服务:重塑用户的出行体验

为了让广大开发者 更深入地了解 百度地图开放平台的 技术能力 轻松掌握满满的 技术干货 更加简单地接入 位置服务 我们特别推出了 “位置服务&#xff08;LBS&#xff09;开发微课堂” 系列技术案例 第六期的主题是 《AI向导接口服务的能力与接入方案》 随着地图应…

mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看当前数据库是那个,删除数据库,使用数据库;查看当前数据库有哪些表

SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库&#xff0c;创建表&#xff0c;创建表中的字段&#xff0c;创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后&#xff0c;那么我们就需要给这个表中 添加数…

【Bug 记录】el-sub-menu 第一次进入默认不高亮

项目场景&#xff1a; 项目场景&#xff1a;el-sub-menu 第一次进入默认不高亮 问题描述 例如&#xff1a;sub-menu 的 index 后端默认传过来是 number&#xff0c;我们需要手动转为 string&#xff0c;否则会有警告&#xff0c;而且第一次进入 sub-menu 默认不高亮。 解决方…

深入探讨ncnn::Mat类——ncnn中的核心数据结构

最近在学习 ncnn 推理框架&#xff0c;下面整理了 ncnn::Mat 的使用方法。 ncnn作为一个高性能的神经网络推理框架&#xff0c;其核心数据结构ncnn::Mat在数据存储与处理上扮演了至关重要的角色。本文将从基础到高级&#xff0c;详细介绍ncnn::Mat类的各个方面&#xff0c;帮助…

npm:升级自身时报错:EBADENGINE

具体报错信息如下&#xff1a; 1.原因分析 npm和当前的node版本不兼容。 // 当前实际版本: Actual: {"npm":"10.2.4","node":"v20.11.0"}可以通过官网文档查看与自己 node 版本 兼容的是哪一版本的npm&#xff0c;相对应进行更新即可…

ipad和macbook同步zotero文献附件失败的解决办法

背景&#xff1a;我所有的文献及其附件pdf都是在台式机&#xff08;windows系统&#xff09;&#xff0c;想要把这些文献同步到云上&#xff0c;然后再从云上同步到平板和其他笔记本电脑比如macbook。文献同步虽已成功&#xff0c;但文献附件都无法打开。 平板报错如下&#xf…

【嵌入式】总结——Linux驱动开发(三)

鸽了半年&#xff0c;几乎全忘了&#xff0c;幸亏前面还有两篇总结。出于快速体验嵌入式linux的目的&#xff0c;本篇与前两篇一样&#xff0c;重点在于使用、快速体验&#xff0c;uboot、linux、根文件系统不作深入理解&#xff0c;能用就行。 重新梳理一下脉络&#xff0c;本…

15_业务系统基类

创建脚本 SystemRoot.cs 因为 业务系统基类的子类 会涉及资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 所以在业务系统基类 提取引用资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 并调用单例初始化 using UnityEngine; // 功能 : 业务系统基类 public c…

C语言-构造数据类型

1、构造数据类型 结构体、共用体、枚举。 2、结构体 1、结构体的定义 结构体是一个自定义的复合数据类型&#xff0c;它允许将不同类型的数据组合在一起。 struct 结构体名 {数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;数据类型4 成员变量4; } 2、结构体变…

文档解析:PDF里的复杂表格、少线表格如何还原?

PDF中的复杂表格或少线表格还原通常需要借助专业的工具或在线服务&#xff0c;以下是一些可行的方法&#xff1a; 方法一&#xff1a;使用在线PDF转换工具 方法二&#xff1a;使用桌面PDF编辑软件 方法三&#xff1a;通过OCR技术提取表格 方法四&#xff1a;手动重建表格 …

【统计的思想】假设检验(二)

假设检验是根据人为设定的显著水平&#xff0c;对被测对象的总体质量特性进行统计推断的方法。 如果我们通过假设检验否定了零假设&#xff0c;只是说明在设定的显著水平下&#xff0c;零假设成立的概率比较小&#xff0c;并不是说零假设就肯定不成立。如果零假设事实上是成立…

汽车定速巡航

配备定速巡航功能的车型&#xff0c;一般在方向盘附近设有4~6个按键&#xff08;可能共用键位&#xff09;。 要设置定速巡航&#xff0c;不仅需要方向盘上的按键&#xff0c;还要油门配合。 设置的一般流程&#xff1a; 开关&#xff1a;类似步枪上的“保险”&#xff0c;按…

MacOS安装Docker battery-historian

文章目录 需求安装battery-historian实测配置国内源相关文章 需求 分析Android电池耗电情况、唤醒、doze状态等都要用battery-historian&#xff0c; 在 MacOS 上安装 battery-historian&#xff0c;可以使用 Docker 进行安装runcare/battery-historian:latest。装完不需要做任…

总线、UART、IIC、SPI

一图流 总线 概念 连接多个部件的信息传输线&#xff0c;是各部件共享的传输介质 类型 片内总线&#xff1a;连接处理器内核和外设的总线&#xff0c;在芯片内部 片外总线&#xff1a;连接芯片和其他芯片或者模块的总线 总线的通信 总线通信的方式 串行通信 数据按位顺序传…

大型齿轮箱健康监测与智能维护系列套件:测试台+故障诊断算法工具箱+齿轮箱智能维护系统平台+案例分析

大型齿轮箱健康监测与智能维护系列套件&#xff1a;测试台故障诊断算法工具箱齿轮箱智能维护系统平台案例分析 大型齿轮箱健康监测与智能维护系列套件&#xff1a;测试台定制、数据测试服务、算法工具箱与算法模型的定制研制服务&#xff0c;以及各类设备故障诊断与健康预诊系…