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

列文章转如下链接:

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 -altotal 2102drwxr-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 .gitignoredrwxr-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.mddrwxr-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.mzph.cn/bicheng/69070.shtml

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

相关文章

全连接神经网络(前馈神经网络)

目录 一、初步认识全连接神经网络 1、神经元 2、网络结构 3、正向传播算法 二、反向传播算法 1、理解 2、迭代流程 三、构建神经网络模型的基本步骤 四、线性回归神经网络结构 4.1 数据处理 1、数据导入 2、数据归一化处理 3、数据集划分 4、数据形状变换 4.2 模…

MyBatis最佳实践:MyBatis 框架的缓存

缓存的概念: 在内存中临时存储数据,速度快,可以减少数据库的访问次数经常需要查询,不经常修改的数据,不是特别重要的数据都适合存储到缓存中 缓存的级别: 一级缓存(默认开启):SqlSession 级别 …

(即插即用模块-特征处理部分) 十八、(TIM 2022) TIF Transformer交互融合模块

文章目录 1、Transformer Interactive Fusion2、代码实现 paper:DS-TransUNet: Dual Swin Transformer U-Net for Medical Image Segmentation Code:https://github.com/TianBaoGe/DS-TransUNet 1、Transformer Interactive Fusion 对于一些传统的特征融…

CVE-2025-0411 7-zip 漏洞复现

文章目录 免责申明漏洞描述影响版本漏洞poc漏洞复现修复建议 免责申明 本文章仅供学习与交流,请勿用于非法用途,均由使用者本人负责,文章作者不为此承担任何责任 漏洞描述 此漏洞 (CVSS SCORE 7.0) 允许远程攻击者绕…

[操作系统] 深入进程地址空间

程序地址空间回顾 在C语言学习的时,对程序的函数、变量、代码等数据的存储有一个大致的轮廓。在语言层面上存储的地方叫做程序地址空间,不同类型的数据有着不同的存储地址。 下图为程序地址空间的存储分布和和特性: 使用以下代码来验证一下…

IGBT的损耗计算的学习【2025/1/24】

可以通过示波器实测IGBT电压电流波形,然后通过示波器的math功能将电压电流波形乘积后积分求损耗。 软开管:给了导通信号,但是电流并没有从此IGBT流过 IGBT(绝缘栅双极晶体管)的损耗主要分为 导通损耗 和 开关损耗 两部…

Jmeter使用Request URL请求接口

简介 在Jmeter调试接口时,有时不清楚后端服务接口的具体路径,可以使用Request URL和cookie来实现接口请求。以下内容以使用cookie鉴权的接口举例。 步骤 ① 登录网站后获取具体的Request URL和cookie信息 通过浏览器获取到Request URL和cookie&#…

联想电脑怎么设置u盘启动_联想电脑设置u盘启动方法(支持新旧机型)

有很多网友问联想电脑怎么设置u盘启动,联想电脑设置u盘启动的方法有两种,一是通过bios进行设置。二是通过快捷方式启动进入u盘启动。但需要注意有两种引导模式是,一种是uefi引导,一种是传统的leacy引导,所以需要注意制…

142.WEB渗透测试-信息收集-小程序、app(13)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:141.WEB渗透测试-信息收集-小程序、app(12) 软件用法&#xff0c…

电路研究9.2——合宙Air780EP使用AT指令

这里正式研究AT指令的学习了,之前只是接触的AT指令,这里则是深入分析AT指令了。 软件的开发方式: AT:MCU 做主控,MCU 发 AT 命令给模组的开发方式,模组仅提供标准的 AT 固件, 所有的业务控制逻辑…

亚博microros小车-原生ubuntu支持系列:1 键盘控制

背景:电脑配置不太行,我在ubuntu再运行vmware,里面运行亚博官方的虚拟机镜像ubuntu,系统很卡。基本上8G内存给打满了。还是想把亚博官方的代码迁移出来,之前售后就说除了官方镜像虚拟机,需要自己摸索迁移。…

第4章 神经网络【1】——损失函数

4.1.从数据中学习 实际的神经网络中,参数的数量成千上万,因此,需要由数据自动决定权重参数的值。 4.1.1.数据驱动 数据是机器学习的核心。 我们的目标是要提取出特征量,特征量指的是从输入数据/图像中提取出的本质的数 …

如何获取小程序的code在uniapp开发中

如何获取小程序的code在uniapp开发中,也就是本地环境,微信开发者工具中获取code,这里的操作是页面一进入就获取code登录,没有登录页面的交互,所以写在了APP.vue中,也就是小程序一打开就获取用户的code APP.…

Blazor-选择循环语句

今天我们来说说Blazor选择语句和循环语句。 下面我们以一个简单的例子来讲解相关的语法,我已经创建好了一个Student类,以此类来进行语法的运用 因为我们需要交互性所以我们将类创建在*.client目录下 if 我们做一个学生信息的显示,Gender为…

科家多功能美发梳:科技赋能,重塑秀发新生

在繁忙的都市生活中,头皮健康与秀发养护成为了现代人不可忽视的日常课题。近日,科家电动按摩梳以其卓越的性能和创新设计,赢得了广大消费者的青睐。这款集科技与美学于一身的美发梳,不仅搭载了2亿负离子、6000次/分钟的声波振动等前沿技术,更融入了650nm聚能环红光与415nm强劲蓝…

14-6-2C++的list

(一&#xff09;list对象的带参数构造 1.list&#xff08;elem);//构造函数将n个elem拷贝给本身 #include <iostream> #include <list> using namespace std; int main() { list<int> lst(3,7); list<int>::iterator it; for(itlst.begi…

【GoLang】利用validator包实现服务端参数校验时自定义错误信息

在C/S架构下&#xff0c;服务端在校验请求参数时&#xff0c;若出现参数错误&#xff0c;要响应给客户端一个错误消息&#xff0c;通常我们会统一响应“参数错误”。 但是&#xff0c;如果只是一味的提示参数错误&#xff0c;我并不知道具体是哪个参数错了呀&#xff01;能不能…

在无法联网的Linux主机或者容器内远程连接主机部署或者容器版的postgresql数据库

最近做的项目遇到一个问题&#xff0c;需要在Linux主机或者容器内&#xff08;内网环境&#xff0c;无法联网下载postgresql资源&#xff09;&#xff0c;访问远程环境上主机或者容器部署的postgresql数据库&#xff0c;进行数据库数据备份和恢复。 我们知道&#xff0c;直接在…

C语言内存管理详解

C语言不像其他高级语言那样提供自动内存管理&#xff0c;它要求程序员手动进行内存的分配和释放。在C语言中&#xff0c;动态内存的管理主要依赖于 malloc、calloc、realloc 和 free 等函数。理解这些函数的用法、内存泄漏的原因及其防止方法&#xff0c;对于编写高效、可靠的C…

Airflow:解码Airflow执行日期

执行日期是Apache Airflow&#xff08;用于编排复杂数据管道的开源平台&#xff09;的关键概念。掌握执行日期的概念及其对工作流的影响对于构建高效、可靠和可维护的数据管道至关重要。在本实用指南中&#xff0c;我们将深入研究执行日期在气流中的作用&#xff0c;它们的目的…