Android SELinux——添加策略实例(十五)

news2024/10/21 11:26:22

        通过前面的文章,我们基本了解在 Android 系统中 SELinux 策略配置和基本语法,这里我们就来看一些常见的问题及其解决方案。这里我们主要看通过 allow 添加策略的方案。

一、直接添加权限

       添加策略一般都是根据 Log 中的信息,使用 audit2allow 生成策略,谁缺少权限,就修改谁的 .te 文件。

示例

selinux: avc: denied { set } for property=vold.decrypt pid=7192 uid=2000 gid=2000 scontext=u:r:shell:s0
tcontext=u:object_r:exported_vold_prop:s0 tclass=property_service permissive=0

        从 Log 中可以看出来进程 u:r:shell:s0 缺少对 property_service 类型的对象 u:object_r:exported_vold_prop:s0 的 set 权限。 通过 audit2allow 生成策略也比较简单:

#============= shell ==============
allow shell exported_vold_prop:property_service { set };

        这样,我们找到或创建对应的 .te(即 shell.te)文件,添加上面的权限赋予语句即可解决。

二、添加domain或type

        为了细化 SELinux 的权限管理,我们可以通过定义自定义的 domain 和 type 来避免默认权限过大的问题。操作步骤如下:

  • 定义类型:根据进程或资源的类型, 在相应的 .te 中定义属性。
  • 绑定资源和安全上下文:在 xxx_contexts 文件中绑定进程或资源的安全上下文。
  • 定义策略:根据主体需要访问的文件,在主体 xxx.te 文件中添加策略。

1、自定义文件type

        这里我们以特定文件 /data/local/tmp/vsomeip-vehicle.log 定制 SELinux 安全策略。

定义新的文件类型

源码位置:/device/{厂商}/sepolicy/vendor/{设备名称}/file.te

# 在 file.te 文件中定义新的文件类型 vsomeip_data_file
type vsomeip_data_file, file_type, data_file_type, core_data_file_type, mlstrustedobject;

        这里在 file.te 文件中定义新的文件类型 vsomeip_data_file,该类型继承多个父类型:file_type, data_file_type, core_data_file_type, mlstrustedobject。 

设置文件的安全上下文

源码位置:/device/{厂商}/sepolicy/vendor/{设备名称}/file_contexts

# 在 file_contexts 文件中绑定文件的安全上下文
/data/local/tmp/vsomeip-vehicle.log u:object_r:vsomeip_data_file:s0

        在 file_contexts 文件中为 /data/local/tmp/vsomeip-vehicle.log 指定安全标签 u:object_r:vsomeip_data_file:s0。

添加策略 

源码位置:/device/{厂商}/sepolicy/vendor/{设备名称}/vsomeip-vehicle.te

 # 在 vsomeip-vehicle.te 文件中添加策略
allow vsomeip-vehicle vsomeip_data_file:file { append getattr open };

        在 vsomeip-vehicle.te 文件中添加策略,允许 vsomeip-vehicle 访问 vsomeip_data_file 类型的文件。 

2、自定义init服务type

        这里我们自定义一个 init 启动的服务 demo_service,对应的执行档是 /system/bin/demo。首先需要在 vendor 目录下中创建 demo.te 文件。

定义新的类型

源码位置:/device/{厂商}/sepolicy/vendor/demo.te 

# 定义新的类型
type demo, domain;
type demo_exec, exec_type, file_type;

# 允许 demo 访问 demo_exec
allow demo demo_exec: file { execute read };

         这里修改 demo.te文件,定义demo 类型,init 启动 service 时类型转换。

设置文件的安全上下文

源码位置:/device/{厂商}/sepolicy/vendor/file_contexts

# 在 file_contexts 文件中绑定文件的安全上下文
/system/bin/demo u:object_r:demo_exec:s0

        到这里其实 SELinux 的策略其实已经修改完成了,但是还需要修改 init.rc 和 Android.mk 文件。在 init.rc 文件中定义 demo_service 并设置类型转换。

定义 init.rc 文件中的服务

service demo /system/bin/demo
    class main
    user root
    group root
    type demo

        在 Android.mk 文件中添加 BOARD_SEPOLICY_DIRS 目录,以确保 demo.te 文件被编译。

 修改 Android.mk 文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := sepolicy

LOCAL_SRC_FILES := \
       $(wildcard $(LOCAL_PATH)/vendor/*.te)

LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/selinux
LOCAL_MODULE_TAGS := optional

BOARD_SEPOLICY_DIRS += $(LOCAL_PATH)/vendor

include $(BUILD_PREBUILT)
  • 确保一致性:确保 demo 和 demo_exec 的定义与系统中的其他策略一致。确认 /system/bin/demo 的路径正确无误。
  • 重新加载策略:修改完文件后,可能需要重新加载 SELinux 策略或重启设备以使更改生效。使用命令 semodule -i <模块文件> 重新加载模块。
  • 测试验证:修改后,进行测试以确保 demo_service 能够正确启动并访问 /system/bin/demo 文件。检查日志文件(如 /var/log/audit/audit.log)以获取详细信息。
  • 错误处理:如果遇到任何 SELinux 相关的错误,检查日志文件以获取详细信息,并根据错误提示进行调整。 

3、自定义属性type

        这里我们实现一个自定义的 native service demo 并设置一个自定义的系统属性 demo.setting.case1。首先同样需要在 vendor 目录下中创建 property.te 文件。

定义新的系统属性类型

源码位置:/device/{厂商}/sepolicy/vendor/property.te

# 定义 system property 类型
type demo_prop, property_type;

绑定系统属性的安全上下文 

源码位置:/device/{厂商}/sepolicy/vendor/property_contexts

# 绑定 demo.setting.case1 的安全上下文
demo.setting.case1 u:object_r:demo_prop:s0

添加权限并使用宏 

源码位置:/device/{厂商}/sepolicy/vendor/demo.te 

        这里我们使用上面的 demo.te 文件,在其中添加对应权限,可以使用 set_prop 宏。

# 允许 demo 访问 demo_prop
allow demo demo_prop: property { setprop };

# 使用 set_prop 宏
set_prop(demo, demo_prop);

# 允许其他 domain 获取 demo_prop
allow other_domain demo_prop: property getprop;

        在其他的 domain 里面需要读取,可以 get_prop 宏获取相关属性。

get_prop(xxxx, demo_prop);

4、自定义系统服务type

        这里我们实现一个 native service demo 并对外提供服务。同样需要在对应目录下创建 service.te 文件,然后在 service.te 中定义 service 类型。

定义新的服务类型

文件位置: /device/{厂商}/sepolicy/vendor/service.te

# 定义新的服务类型
type demo_service, service_manager_type;

绑定服务的安全上下文 

文件位置: /device/{厂商}/sepolicy/vendor/service_contexts

demo u:object_r:demo_service:s0

声明 Binder 权限 

文件位置: /device/{厂商}/sepolicy/vendor/demo.te

        这里我们同样在 demo.te 文件添加对应的 Binder 权限。

# 允许 demo 使用 Binder
binder_use(demo);

# 允许 demo 调用其他域的 Binder 服务
binder_call(demo, binderservicedomain);

# 允许 demo 提供 Binder 服务
binder_service(demo);

# 允许 demo 进程添加 demo 服务
allow demo demo_service:service_manager add;

5、自定义系统设备节点type

        这里我们实现一个 native service 访问一个专属的字符设备 /dev/demo,同样在对应目录下创建 device.te 文件,然后在 device.te 中定义新的设备类型。

定义新的设备类型

文件位置: /device/{厂商}/sepolicy/vendor/device.te

# 定义新的设备类型
type demo_device, dev_type;

绑定设备的安全上下文 

文件位置: /device/{厂商}/sepolicy/vendor/file_contexts

/dev/demo u:object_r:demo_device:s0

添加权限

文件位置: /device/{厂商}/sepolicy/vendor/demo.te

        声明 demo 使用 demo_device 的权限,这里我们同样以 demo.te 为例:

# 允许 demo 访问 demo_device
allow demo demo_device:chr_file rw_file_perms;

6、自定义socket type

        这里我们实现一个 native service 通过 init 创建一个 socket 并绑定在 /dev/socket/demo,同时允许某些进程访问该 socket。

定义新的 socket 类型

文件位置: /device/{厂商}/sepolicy/vendor/file.te

# 定义新的 socket 类型
type demo_socket, file_type;

绑定 socket 的安全上下文

文件位置: /device/{厂商}/sepolicy/vendor/file_contexts

/dev/socket/demo u:object_r:demo_socket:s0

添加权限

文件位置: /device/{厂商}/sepolicy/vendor/demo.te

        添加 appdomain 访问 demo_socket 的权限:

# 允许 appdomain 连接和写入 demo_socket
allow appdomain demo_socket:unix_stream_socket { connectto write };

定义 demo 服务

文件位置: /device/{厂商}/sepolicy/vendor/init.rc

        在 init.rc 文件中定义 demo 服务并创建 socket。

service demo /system/bin/demo
    class main
    user root
    group root
    socket demo /dev/socket/demo stream 0660 demo demo

绑定可执行文件的安全上下文

文件位置: /device/{厂商}/sepolicy/vendor/file_contexts 

/system/bin/demo u:object_r:demo_exec:s0

        对于添加权限的类型就先介绍这么多,以后在项目中遇到相关问题会继续更新的。

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

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

相关文章

视频转文字工具搜集

视频转文字工具是一种能够将视频中的音频内容转化为文字的软件或在线服务。这类工具通常支持多种视频格式和语言&#xff0c;适用于不同的场景和需求。以下是一些推荐的视频转文字工具及其特点&#xff1a; 媒关系&#xff1a;这是一款免费的视频转文字工具&#xff0c;支持多种…

ABAQUS应用11——支座弹簧

文章目录 0、背景1、ABAQUS中几类弹簧的简介2、SPRING1的性质初探 0、背景 1、ABAQUS中几类弹簧的简介 先说参考来源&#xff0c;ABAQUS2016的帮助文档里第4卷&#xff0c;32.1.1节&#xff0c;有三种弹簧&#xff08;SPRING1 、SPRING2 以及SPRINGA&#xff09;。 三种弹簧里…

【AIGC】ChatGPT提示词Prompt高效编写模式:Self-ask Prompt、ReACT与Reflexion

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;自我提问 (Self-ask Prompt)如何工作应用实例优势结论 &#x1f4af;协同思考和动作 (ReACT)如何工作应用实例优势结论 &#x1f4af;失败后自我反思 (Reflexion)如何工作…

oracle数据恢复—文件损坏导致Oracle数据库打开报错的数据恢复案例

oracle数据库故障&分析&#xff1a; 打开oracle数据库时报错&#xff0c;报错信息&#xff1a;“system01.dbf需要更多的恢复来保持一致性&#xff0c;数据库无法打开”。急需恢复zxfg用户下的数据。 出现上述报错的原因有&#xff1a;控制文件损坏、数据文件损坏、数据文件…

FastDFS单节点部署

FastDFS单节点部署 1、FastDFS入门1.1 分布式文件系统1.2 FastDFS 简介1.3 FastDFS 发展历史1.4 FastDFS 整体架构1.5 FastDFS 线上使用者 2、FastDFS 环境搭建2.1 FastDFS 安装2.1.1 安装前的准备2.1.2 安装 libfastcommon库2.1.3 安装 FastDFS 2.2FastDFS 配置2.2.1 去掉/etc…

python爬虫快速入门之---Scrapy 从入门到包吃包住

python爬虫快速入门之—Scrapy 从入门到包吃包住 文章目录 python爬虫快速入门之---Scrapy 从入门到包吃包住一、scrapy简介1.1、scrapy是什么?1.2、Scrapy 的特点1.3、Scrapy 的主要组件1.4、Scrapy 工作流程1.5、scrapy的安装 二、scrapy项目快速入门2.1、scrapy项目快速创建…

Spring Boot框架下JavaWeb在线考试系统的创新实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

JavaFx学习--chapter02(网络对话)

chapter02(网络对话) 简单网络对话程序 设计任务&#xff1a;客户端向服务器发送字符串&#xff0c;并能读取服务器返回的字符串。 知识点&#xff1a;TCP套接字技术&#xff0c;C/S软件架构程序设计 重点理解&#xff1a;Java客户套接字类Socket和服务器套接字类ServerSoc…

docker配置加速器

阿里云 控制台》容器镜像服务》镜像工具》镜像加速器 复制地址&#xff1a;https://ywtoq7bz.mirror.aliyuncs.com 到&#xff1a;etc/docker下&#xff1a;vi daemon.json 格式&#xff1a; { "registry-mirrors": ["加速器地址"] } 注&#xff1…

Visual Studio 2022安OpenCV可视化工具image watch

1. 打开 VS2022 &#xff0c;扩展 -管理扩展 2. 搜索 Image Watch 关闭VS2022 后 安装 打开视图、调出 Image Watch 窗口 测试代码&#xff1a; #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.…

Transformer(Vit+注意力机制)

文献基本信息&#xff1a; Encoder-Decoder&#xff1a; Transformer的结构&#xff1a; 输入编码器解码器输出 Transformer的工作流程&#xff1a; 获取输入句子的每一个单词的表示向量X&#xff0c;X由单词的embedding&#xff08;embedding是一种将高维特征映射到低维的技…

opencv出错以及解决技巧

opencv配置 一开始&#xff0c;include的路径是<opencv4/opencv2/…> 这样在using namespace cv的时候导致了报错&#xff0c; 所以在cmakelist中需要对cmake的版本进行升级。 set(CMAKE_CXX_FLAGS “-stdc14 -O0 -Wall”)-O0 表示在编译过程中不进行任何优化 对应的pac…

Linux操作系统如何制作U盘启动盘

在麒麟系统中有一款U盘启动器软件&#xff0c;它是用于制作系统启动U盘的工具&#xff0c;方便无光驱的电脑安装操作系统&#xff0c;也可以反复使用一个U盘&#xff0c;避免光盘的浪费。下面对该U盘启动器使用方法做详细讲解。 1.准备需要安装的系统镜像文件。 图 1 2.准备1…

Node-RED开源项目的modbus通信(TCP)

一、Modbus 通信协议 Modbus是一种串行通信协议&#xff0c;是Modicon公司&#xff08;现在的施耐德电气 Schneider Electric&#xff09;于1979年为使用可编程逻辑控制器&#xff08;PLC&#xff09;通信而发表。Modbus已经成为工业领域通信协议的业界标准&#xff08;De fact…

Redis高阶篇之Redis单线程与多线程

文章目录 0 前言1. 为什么Redis是单线程&#xff1f;1.1 Redis单线程1.2 为什么Redis3时代单线程快的原因1.3 使用单线程原因 2.为什么逐渐加入多线程呢&#xff1f;2.1 如何解决 3.redis6/7的多线程特性和IO多路复用入门3.1主线程和IO线程怎么协作完成请求处理的3.2 Unix网络编…

政府采购合同公告明细数据(1996-2024年)

透明度成为了公众对政府活动的基本要求之一。特别是在政府采购领域&#xff0c;透明度不仅关系到公共资源的合理分配&#xff0c;更是维护市场公平竞争的重要保障。政府采购合同公告制度正是为了满足这一需求而设立的。 1996-2024年政府采购合同公告明细数据&#xff08;dta文…

Perl打印9x9乘法口诀

本章教程主要介绍如何用Perl打印9x9乘法口诀。 一、程序代码 1、写法① use strict; # 启用严格模式&#xff0c;帮助捕捉变量声明等错误 use warnings; # 启用警告&#xff0c;帮助发现潜在问题# 遍历 1 到 9 的数字 for my $i (1..9) {# 对于每个 $i&#xff0c;遍历 1…

Javascript 脚本查找B站限时免费番剧

目录 前言 脚本编写 脚本 前言 B站的一些番剧时不时会“限时免费”&#xff0c;白嫖党最爱&#xff0c;主打一个又占到便宜的快乐。但是在番剧索引里却没有搜索选项可以直接检索“限时免费”的番剧&#xff0c;只能自己一页一页的翻去查看&#xff0c;非常麻烦。 自己找限…

Git极速入门

git初始化 git -v git config --global user.name "" git config --global user.email "" git config --global credential.helper store git config --global --list省略(Local) 本地配置&#xff0c;只对本地仓库有效–global 全局配置&#xff0c;所有…

spring boot yml文件中引用*.properties文件中的属性

1、首先在*.properties文件中加入一个属性&#xff0c;如&#xff1a; 2、然后再application.yml文件中通过${jdbc.driver}来引用&#xff0c;如&#xff1a; 3、然后再创建一个资源配置类&#xff0c;通过PropertySource来引入这个*.properties文件&#xff0c;如&#xff1…