Android SELinux——安全策略(三)

        SELinux 通过严格的访问控制机制增强了 Linux 系统的安全性。它通过标签和安全策略来控制进程和文件的访问权限,从而保护系统免受未经授权的访问和攻击。

一、策略介绍

1、主要组件

  • 安全标签(Security Labels):每个文件、目录、进程等都有一个安全标签。标签包含类型(Type)、角色(Role)、用户(User)和类别(Category)等信息。
  • 安全策略(Security Policies):SELinux 支持多种安全策略,包括:

         1)Targeted Policy:针对特定类型的系统(如服务器、桌面系统)。
         2)Strict Policy:更严格的策略,适用于高度安全的环境。
         3)MLS Policy:多级安全策略,支持多级分类的安全需求。

  • 安全上下文(Security Context):安全上下文包含标签信息,用于访问控制决策。例如:u:object_r:some_type:s0。

标签概念

        SELinux 其实就是一个标签系统。每个进程都有一个 Label(称为 Process Label),每个文件系统所涵盖的文件/目录、网络端口、设备等对象也有一个 Lable(称为 Object Label)。SeLinux通过编写规则来控制一个 Process Label 对一个 Object Label 的访问,这个规则称之为策略(Policy)。SeLinux 的这种安全机制称为 Mandatory Access Control(MAC),是在内核层实现的。

安全上下文

        SELinux 给 Linux 的所有对象都分配⼀个安全上下⽂(也称为标签 Label), 描述成⼀个 标准的字符串,例如 u:r:untrusted_app:s0 。安全上下⽂的格式为: user:role:type:sensitivity[:categories] 。可以通过 file_contexts 或运⾏ ls -Z 查看安全上下⽂。

        Android 并不会使⽤ SELinux 提供的所有功能,通常可以忽略上下⽂的 user 、role 和 sensitivity 字段:

  •  不使⽤ SELinux ⽤⼾。唯⼀定义的⽤⼾是 u 。
  • 不使⽤ SELinux ⻆⾊和基于⻆⾊的访问权限控制(RBAC)。定义并使⽤了两个默认⻆⾊:r(适⽤于主题,进程)和 object_r(适⽤于对象,⽂件)。
  •  不使⽤ SELinux 敏感度。已始终设置好默认的 s0 敏感度。
  • MAC 的基础管理思路基于 Type Enforcement Access Control (简称 TEAC,⼀般⽤ TE 表⽰)
  • 进程的安全上下⽂的类型称为 Domain ,⽂件的安全上下⽂中的类型称为 Type 。

        通过 adb shell ps -Z 查看进程的 secontext,可以通过 grep 查看指定进程的 secontext。通过 ls -Z 查看⽂件的 secontext。

2、访问控制机制

  • 主体(Subject):主体通常是进程或用户。主体具有一个安全标签,用于标识其权限。
  • 客体(Object):客体通常是文件、目录或其他资源。客体也有一个安全标签,用于标识其访问控制信息。
  • 访问控制决策:SELinux 根据主体和客体的安全标签来决定是否允许某个操作。如果主体的安全标签允许访问客体的安全标签,则操作被允许;否则,操作被拒绝。

        SELinux 中的访问控制,就是判定一个 Source 有没有权限去访问 Target。这里的 Source 一般就是进程,Target 最长见的就是文件系统(比如文件、目录、socket、设备等等),当然还有其他类型的 Target。换句话说,SeLinux 的机制就是通过读取一个“规则”,来控制一个进程有没有权限去访问一个文件(或其他类型) 

        上面说的“规则”,在 SELinux 里的术语叫做 Policy(策略)或叫 Access Vector Rule。是可以由 AOSP 和厂商、供应商来编写的。上面的 Source,还叫做 Subject(主体),上面的 Target,还叫做 Object(对象或客体)。Label、Source、Target、Subject 和 Object,这些都不重要, 在实际语法中并没有相关关键词,只要各种资料里出现这些词的时候知道其所指就可以。

3、主要功能

  • 进程隔离:SELinux 可以隔离不同进程,确保它们之间不会相互干扰或攻击。
  • 文件访问控制:SELinux 可以精细控制文件和目录的访问权限,防止未经授权的访问。
  • 网络访问控制:SELinux 可以控制网络端口和服务的访问权限,防止未经授权的网络通信。
  • 审计和日志记录:SELinux 记录所有违反安全策略的操作,便于安全审计和问题排查。

设计

        SELinux 在 Android 4~7 和 Android 8 以后采用了不同的设计,Android 4~7 上,SELinux 的策略是作为一个整体来编译和更新的。Android 8 及以后,SELinux 采用了模块化、动态化设计,Platform(可以理解为 AOSP 的部分)、Non-Platform(vendor、odm、oem 的部分,这里总体称为 vendor 部分)的 SELinux 策略分别独立编译、升级。

设备架构图

        编译后会生成对应的 img 文件:

  • system.img:主要包含了 Android 框架层的文件系统,包括各种应用程序框架和服务,如 Activity Manager、Window Manager 等。
  • boot.img:是一个特殊的映像文件,包含了 Linux 内核以及针对 Android 进行优化的补丁集。它是设备启动过程中的关键组成部分。
  • vendor.img:存储了与特定 SoC(System on a Chip)相关的代码和配置信息,比如驱动程序等。
  • odm.img:包含了设备制造商提供的特定于设备的代码和配置,例如针对不同硬件特性的优化。
  • oem.img:包含了 OEM(Original Equipment Manufacturer)或运营商定制的内容,如预装的应用程序、特定的服务等。
  • bootloader:是引导加载程序,负责初始化硬件设备、建立内存空间的映射图,为最终调用操作系统内核做准备。
  • radio:通常指的是基带处理器软件,负责处理无线通信的部分,这部分通常是厂商专有的实现。

        Android 8以后,SeLinux 的策略文件可以伴随相应的 img 独立编译或者 OTA。

二、SEPolicy策略

        SEPolicy 是 SELinux 和 SEAndroid 中的安全增强策略的简称。SEPolicy 是 SELinux 系统的核心部分之一,它定义了系统中的安全策略,决定了各个进程、文件、网络端口等资源的访问控制规则。

1、核心策略

        在 SELinux 和 SEAndroid 的上下文中,核心策略(Core Policy)是指那些定义了系统基本安全规则的文件集合。这些规则被设计成通用的,以便能够在不同的设备和配置上运行,同时保证一定的安全标准。核心策略通常位于 /system/sepolicy/ 目录下,并且这些规则会被所有基于 SELinux 或 SEAndroid 的设备所使用。

核心策略组成

  • policy.conf:主策略文件。这是主要的 SELinux 策略文件,包含了大部分的安全规则。
  • types.conf:类型定义。定义了系统中各类对象的类型标签。
  • file_contexts:文件上下文。定义了文件系统的路径和其对应的安全上下文。
  • port_contexts:端口上下文。定义了网络端口的安全上下文。
  • initial_sid.conf:定义了初始安全标识符(SID)。
  • users.conf:定义了用户标签。
  • roles.conf:定义了角色标签。
  • booleans.conf:定义了布尔类型的安全策略变量。

        在实际的 SELinux 系统中,policy.conf 等文件可能并不直接存在,而是被拆分成多个文件和模块化的规则集。这是因为 SELinux 的策略文件结构已经演进,变得更加模块化和易于管理。

多模块策略

       从安卓8.0开始,sepolicy 策略被分成了多个部分。google 进⾏了可移植性改造,以及多版本兼容,因此将策略⽂件分散到了多个⽬录中,以增强其可移植性及兼容性。

  •  public - PLAT_PUBLIC_POLICY,平台公开策略,会被导出给其他⾮平台相关的策略。
  •  private - PLAT_PRIVATE_POLICY,平台私有策略,不会向vendor部分暴露。
  •  vendor - PLAT_VENDOR_POLICY,⼚商策略,可引⽤public的策略,不能引⽤private的策略。
  • mapping - 策略映射表,将旧版本的public策略映射到当前策略中,来保证旧版本可⽤,如xxx.cil ⽂件。

PLAT_PUBLIC_POLICY

        平台共有策略全部定义在 /system/sepolicy/public 下, public 下的 type 和 attribute 可以被 nonplatform 中的策略所使⽤,也就是说,设备⼚商的 sepolicy 开发者在 non-platform 下可以对 platform public sepolicy 的策略进⾏扩展。

PLAT_PRIVATE_POLICY

        与公有策略相反,被声明为私有策略的 type 或 attribute 对 non-platform 的策略开发者是不可⻅的。以 /system/sepolicy/private/ ⽬录下的 atrace.te 为例。

  • system/sepolicy/private/file_contexts 有定义 /system/bin/atrace u:object_r:atrace_exec:s0。
  • system/sepolicy/private/atrace.te 有定义 atrace 相关的规则。
  • 在 device/qcom/sepolicy/common ⽬录下新增⼀个 atrace.te ⽂件,并添加规则 allow atrace sdcardfs:file read。
  • 当执行 make sepolicy 进行编译时会失败,提示"device/qcom/sepolicy/common/atrace.te:2:ERROR 'unknown type atrace' at token ';' on line 23355",也就是说 private 策略中的 type 和 attribute 对我们是不可见的。

        但是 scontext 只有平台和⾮平台之分,也就是说,定义在平台 private 下⾯ file_contexts 属性, public 和⾮平台的也可以共享。

2、自定义策略

        通常情况下,SEPolicy 策略会根据厂商或产品的不同,定制不同的 SELinux 策略,一般在 device/<vendor>/<board>/sepolicy 或 device/<vendor>/sepolicy 路径下添加和管理 SELinux 策略文件,也可能在 /device/{硬件平台}/{产品}/sepolicy/ 路径下。

        这里在对应路径下会创建 private、public 和 vendor 等文件夹,而文件夹下会添加很多 SELinux 策略文件(.te ⽂件)来描述进程对资源的访问许可,这里的设备规则会被对应的产品使⽤。

应⽤添加策略 

        除了在 device ⽬录中添加 SELinux 策略,我们也可以在应⽤⽬录下添加。

源码位置:/packages/services/Car/car_product/build/car.mk

BOARD_SEPOLICY_DIRS += packages/services/Car/car_product/sepolicy/test

        这里同样创建 private、public 和 vendor 等文件夹,并添加对应的 te 文件。

3、te策略文件

         假设你在 device/<vendor>/<board>/sepolicy/private 目录中添加了一个名为 example.te 的策略文件:

# example.te# 定义一个新的类型
type example_t;# 允许某个进程访问特定文件
allow example_t data_file:file read;

        这里我们先来了解两个关键字 type 和 allow。

  • type 关键字:用于定义一个新的 SELinux 类型(type)。example_t 是一个新的类型名称,表示一种新的安全上下文。 
  • allow 关键字:用于定义一条允许规则,指定某种类型的主体(subject)可以执行某种操作。
  • example_t:是前面定义的类型,表示某个进程或实体。
  • data_file 是一个对象类(class)或类型,表示某种类型的文件。
  • file 是对象类的一个实例,表示普通文件。
  • read 是一个权限标志,表示读取操作。

        所以,综合来看定义了一个新的 SELinux 类型 example_t。这意味着你可以将进程或其他实体标记为此类型。定义了一条允许规则,使得类型为 example_t 的进程或实体可以对类型为 data_file 的文件执行读取操作。

示例应用

        假设有一个进程 example_process 被标记为 example_t 类型,并且有一个文件 example_data 被标记为 data_file 类型。那么这条规则允许 example_process 读取 example_data 文件。

进程安全上下文

        将某个进程的安全上下文设置为 example_t:

chcon u:object_r:example_t:s0 /path/to/example_process

文件安全上下文 

        将某个文件的安全上下文设置为 data_file:

chcon u:object_r:data_file:s0 /path/to/example_data

        通过这种方式,你可以精确控制进程对文件的访问权限,增强系统的安全性。 

4、添加策略目录

        在自定义路径下添加完策略文件,需要在对应目录的 mk 文件中添加 BOARD_SEPOLICY_DIRS 变量,这个变量用于指定 SELinux 策略文件的搜索路径。

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := sepolicy
LOCAL_MODULE_TAGS := optional# 添加策略文件的搜索路径
BOARD_SEPOLICY_DIRS += \device/<vendor>/<board>/sepolicy/private \device/<vendor>/<board>/sepolicy/public \device/<vendor>/<board>/sepolicy/vendorinclude $(BUILD_PHONY_PACKAGE)
  • LOCAL_PATH:设置当前路径为 $(call my-dir),即 device/<vendor>/<board>/sepolicy 或 device/<vendor>/sepolicy 目录。
  • BOARD_SEPOLICY_DIRS:这个变量用于指定 SELinux 策略文件的搜索路径。你可以添加多个路径,每个路径之间用空格分隔。

5、编译过程

        在修改完 Android.mk 文件并添加策略文件后,需要重新编译整个系统。SELinux 策略的编译过程涉及多个步骤,包括将各种策略文件转换为 CIL(Common Intermediate Language)格式,然后进行属性化和规则合并。下面是详细的编译过程:

将所有规则转换成CIL

  • 将私有策略(private)和公共平台策略(public platform)文件转换为 CIL
  • 将映射文件(mapping)转换为 CIL。
  • 将非平台公共策略(non-platform public)文件转换为 CIL。
  • 将非平台公共策略与私有策略合并后转换为 CIL。

属性化规则

        在将所有策略文件转换为 CIL 之后,需要对规则进行属性化处理。这一步主要是为了确保规则的完整性和一致性。

合并规则⽂件

  • 将映射文件(mapping)、公共平台策略(platform)和非平台公共策略(non-platform)的规则合并到最终的 CIL 文件中。
  • 将合并后的规则文件转换为二进制格式,以便在系统中使用。

        通过这些步骤,可以确保 SELinux 策略文件被正确地编译和合并,从而在系统中生效。 

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

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

相关文章

Nginx中,413 Request Entity Too Large错误

背景 在Nginx中&#xff0c;413 Request Entity Too Large错误通常发生在尝试上传或发送超过Nginx配置文件中的client_max_body_size限制的文件时。这个错误意味着请求的正文大小超过了Nginx允许的最大值。 解决这个问题的方法是在Nginx配置文件中增加client_max_body_size的值…

运动耳机选哪个品牌比较好?盘点五大高品质运动耳机推荐!

在骨传导耳机日益普及的同时&#xff0c;一个不容忽视的问题也逐渐暴露在大众视野之中。根据可靠消息&#xff0c;有超过九成的运动爱好者反馈在使用骨传导耳机时感到佩戴不适&#xff01;作为一名有着5年经验的运动达人&#xff0c;我秉持着对消费者负责的态度&#xff0c;同时…

【力扣刷题实战】(顺序表)移除元素

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a; 移除元素 题目描述 示例 1&#xff1a; 示例 2&#xff1a; 解题思路 具体思路 题目要点 完整代码 兄弟们共勉 &#xff01;&#xff01;&#xff01; 每篇前言 博客主页&#xff1a;小卡…

【新品发布】数字能源EMS管理再掀新篇章

致远电子EM系列工商业储能网关累计装机容量突破2GWh&#xff01;聚焦数字综合能源应用&#xff0c;全新一代EM-800/EM-1000G发布&#xff0c;见证光储充时代的来临&#xff01; 早在2008年&#xff0c;致远电子的工程师在为国内某新能源企业设计光伏通讯管理机方案时&#xff0…

Leetcode 50. Pow ( x , n ) 快速幂、取模 C++实现

问题&#xff1a;Leetcode 50. Pow ( x , n ) 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数。 算法&#xff1a; 具体实现流程如下&#xff1a; 代码&#xff1a; class Solution { public:double myPow(double x, int N) {double ans 1;long long n N;if (n <…

研究生异地报名,需要社保缴费记录,没有社保记录怎么办。

1、户籍在安徽省&#xff0c;在北京工作&#xff0c;想报北京科技大学&#xff1b; 招生简章中没有提社保记录&#xff0c;但是在报名的时候&#xff0c;又出来要求&#xff1a;北京连续6个月的社保记录。这里是指在北京市考试的要求。没有连续社保缴费记录&#xff0c;肯定不能…

软考《信息系统运行管理员》- 4.1信息系统软件运维概述

4.1信息系统软件运维概述 信息系统软件运维的概念 信息系统软件运维是指信息系统软件在开发完成投入使用后&#xff0c;对信息系统软件进行的改正 性维护、适应性维护、完善性维护、预防性维护等软件工程活动。 信息系统软件的可维护性及维护类型 信息系统软件维护工作直接…

dvwa:sql注入、sql盲注全难度解析

sql注入 easy 单引号闭合 id2 and if(11,sleep(3),1) and 11 ​ 联合注入&#xff1a; id2 union select database(),user() -- ​ 报错注入&#xff1a; id2 and updatexml(1,concat(0x7e,database(),0x7e),1) -- medium mysql_real_escape_string() 调用 mysql 库的函数 mys…

gbase8s的事务、并发控制、锁机制、隔离级别

一、事务概念 事务是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成&#xff0c;否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元&#xff0c;可以简化错误恢复并使应用程序更…

SpringBoot美发店解决方案:打造智能门店

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理美发门店管理系统的相关信息成为必然。开发…

收银系统源码营销活动-商品组合套餐

1. 功能描述 商品组合套餐&#xff1a;商家可以把不同的商品组合成套餐在收银台售卖&#xff0c;同时可以利用该套餐做一些会员拉新活动&#xff0c;如设置该活动仅限会员用户才可以购买等。还可以针对套餐的商品选择进行设置&#xff0c;如超市开业活动&#xff0c;价值19.8元…

JVM性能调优-JVM工具使用

命令行工具 jps jps -q 只看进程id jps -l 显示java进程的完整类名 jps -m 查看传递给主类main()的参数 jps -v 列出虚拟机启动时的jvm参数 以上参数可以组合使用 jstat 查看JVM统计信息 例&#xff1a;jstat -gc -t 19788 1000 10 -gc&#xff1a;打印gc统计信息 ;-t&am…

微信+AI应用平台之BotChoice 插件实现灵活调用扣子、dify

github地址&#xff1a;https://github.com/javak8/bot_choice.git 说明 BotChoice项目插件是作者原创插件, 根据提示词调用不同bot/model,可以实现多指令执行 目前bot/model只支持openai接口规范 可以多指令执行 &#xff0c;比如&#xff1a; /热点文案 /搜图片 杭州超市…

【Elasticsearch 实战与原理解析】好书推荐

Elasticsearch 实战与原理解析 在当今这个信息爆炸的时代&#xff0c;数据的存储、检索和分析变得越来越重要。Elasticsearch&#xff0c;作为一个基于 Lucene 的开源搜索引擎&#xff0c;以其强大的全文搜索能力、分布式特性和易用性&#xff0c;成为了数据检索领域的佼佼者。…

基于Java实现(APP)智能停车场管理系统

移动应用开发系统设计说明书&#xff08;智能停车场管理系统&#xff09; 服务集成流程详细设计 实现功能 序号功能点1新增用户2注册用户3修改场地信息4列出场地信息5新增认证车辆6列出认证车辆7删除认证车辆8车辆进入信息录入9停车记录列表展示10出停车场信息录入 参数说明…

SOMEIP_ETS_178: Subscribe_using_wrong_SOMEIP_MessageID

测试目的&#xff1a; 验证DUT能够拒绝一个SOME/IP头部使用错误消息ID进行服务发现的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个使用错误消息ID的服务发现SubscribeEve…

找不到opencl.dll怎么办,4种有效的方法教你解决

1. OpenCL.dll 概述 1.1 定义与作用 OpenCL.dll 是 Open Computing Language&#xff08;开放计算语言&#xff09;的一个关键组件&#xff0c;它是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;对实现 OpenCL 标准至关重要。OpenCL.dll 文件通常位于 Windows …

论文阅读:OpenSTL: A Comprehensive Benchmark of Spatio-Temporal Predictive Learning

论文地址&#xff1a;arxiv 摘要 由于时空预测没有标准化的比较&#xff0c;所以为了解决这个问题&#xff0c;作者提出了 OpenSTL&#xff0c;这是一个全面的时空预测学习基准。它将流行的方法分为基于循环和非循环模型两类。OpenSTL提供了一个模块化且可扩展的框架&#xff…

【Hadoop之Yarn】Yarn的搭建流程、概念和组成部分 以及 Yarn的历史日志jobHistory配置和三种调度器

文章目录 一、Yarn的搭建1、修改mapred-site.xml2、修改yarn-site.xml3、检查hadoop-env.sh 中是否配置了权限4、分发mapred-site.xml & yarn-site.xml 到另外两台节点上5、启动和停止yarn平台&#xff1a;6、同时启动hdfs和yarn&#xff1a;7、启动后jps进程&#xff08;包…

【一文讲透(番外篇)】如何编译安装KWDB v2.0.4数据库

KaiwuDB 浪潮集团是中国领先的云计算、大数据服务商&#xff0c;拥有浪潮信息、浪潮软件、浪潮数字企业三家上市公司。主要业务涉及计算装备、软件、云计算服务、新一代通信、大数据及若干应用场景。已为全球一百二十多个国家和地区提供IT产品和服务。 KaiwuDB 是浪潮控股的数据…