Android SELinux 参数语法介绍及基础分析

news2024/11/24 10:37:40

Android SELinux安全策略主要使用对象安全上下文的基础进行描述,通过主体和客体的安全上下文去定义主体是否有权限访问客体,称为TypeEnforcement

安全上下文(Security Context)

SEAndroid中的安全上下文:共有4个部分组成分别为user、role、type、sensitivity level

u:object_r:system_data_file:s0为例
user:安全上下文的第一列为user,在SEAndroid中的user只有一个就是u。
role:第二列表示role,在SEAndroid中的role有两个,分别为r和object_r。
type:第三列为type,SEAndroid中共定义了139种不同的type。
security level:第四列是专为MLS访问机制所添加的安全上下文的扩展部分,
格式为sensitivity[:category list][- sensitivity[:category list]],例如s0 - s15:c0.c1023,
其中s0之后的内容可以不需要,冒号后面的内容是category,sensitivity和category组合一起声明了当前的安全级别(security level),“-”号左右分别标识了安全级别的最低和最高,这一列的参数将在MLS约束检查时用到,“15”、“1023”表示了sensitivity和category的最大值,这一参数可在Android.mk中定义。

安全上下文中最重要的部分就是第三列的type了,对于进程type被称为domain,type是整个SEAndroid中最重要的一个参量,所有的policy都围绕这一参量展开,所以为系统中每个文件标记上合适的type就显得极为重要了。在SEAndroid中关于安全上下文配置的核心文件主要是file_contexts、seapp_contexts和property_contexts 文件。

sContext相关文件表示的上下文
file_contexts系统中所有file_contexts安全上下文
seapp_contextsapp安全上下文
property_contexts属性的安全上下文
service_contextsservice文件安全上下文
genfs_contexts虚拟文件系统安全上下文

类型强制TE(Type Enforcement)

TE强制访问方式是SEAndroid中的最主要的安全手段,所有关于TE的强制访问规则都被定义在了后缀为te的文件中

在te文件中基本能总结为完成如下操作:
(1)对type类型的定义和将type归到相应的attribute中
SEAndroid在te文件中定义了安全策略中最基本的参量type,同时将具有共性的type归在一起构成一个称为attribute的集合,policy的规则执行也能以attribute作为执行对象。
(2)通过allow语句制定主体客体强制访问规则(白名单规则,不再规则中的都默认为非法操作)
(3)通过type_transition语句制定tpye类型转换规则
(4)通过dontaudit语句声明对一些被安全策略拒绝的访问不再进行审核。
审核是对于发生了访问违规或出现了被系统安全规则拒绝的行为进行日志记录的过程,审核可以帮助系统管理员发现bug和可能的入侵尝试。
默认情况下,SEAndroid会记录被拒绝的访问检查,但策略语言dontaudit允许我们取消这些默认的预料之中的拒绝审核消息。

  • SEAndroid为所有type共定义了17个attribute:

attribute含义
dev_type:包含了所有关于设备的type
domain:包含了如下所列的所有关于进程的type,通常策略中的访问主体也就是进程所在的domain都包含在了这一attribute中。
fs_type:包含了所有与文件系统相关的type。如下所列,大多是虚拟文件系统。
file_type:包含了所有存在于非伪文件系统的相关文件的type,数量过多不再列举。
exec_type:包含了所有关于domian接入点的type,多被用在domain transition中
data_file_type:包含了所有在/data目录下的文件type
sysfs_type:包含了在sysfs文件系统下的所有文件的type,在SEAndroid中只有sysfs_writable包含在这个attribute中。
node_type:所有与nodes/hosts有关的type,在SEAndroid中只有node包含在这个attribute中。
netif_type:
port_type:包含了所有与网络端口相关的type,在SEAndroid中只有port包含在这个attribute中。包含了所有与网络接口相关的type,在SEAndroid中只有netif包含在这个attribute中。
mlstrustedsubject:包含了所有能越过MLS检查的主体domain。
mlstrustedobject:包含了所有能越过MLS检查的客体type。
unconfineddomain:包含了所有拥有无限权限的type。
appdomain:包含了所有与app相关的type
netdomain:包含了所有与需要访问网络的app相关的type
bluetoothdomain:包含了所有与需要访问bluetooth的app相关的type
binderservicedomain:包含了所有与binder服务相关的type

SEAndroid中共定义了三个拥有巨大权限的attribute,分别是mlstrustedsubject、mlstrustedobject、unconfineddomain
mlstrustedsubject的type:在充当主体domain是可以越过MLS检查,
mlstrustedobject的type:在充当客体时可以越过MLS检查,
unconfineddomain的type:则拥有所有权限可对客体进行任意操作。

  • SEAndroid为系统定义了33个te策略文件,这33个策略文件是:

adbd.te、file.te、su.te、app.te、gpsd.te、netd.te、system.te、bluetoothd.te、init.te、net.te、ueventd.te、bluetooth.te、installd.te、nfc.te、unconfined.te、cts.te、kernel.te、qemud.te、vold.te、dbusd.te、keystore.te、radio.te、wpa_supplicant.te、debuggerd.te、mediaserver.te、rild.te、zygote.te、device.te、servicemanager.te、domain.te、shell.te、drmserver.te、surfaceflinger.te

TE一般放在device/qcom/sepolicy/system/sepolicy中,所有.te后缀的文件通过编译之后,都会生成一个sepolicy文件

常见te含义
file.te针对属性file的策略
init.te在这一文件中声明了init拥有无限权限
rild.te针对daemon domain的策略
system.te这一文件主要针对的是系统app和system server进程。对系统app访问binder、systemdata files、dalvikcatch、keystone等进行权限控制,对system server访问网络、bluetooth、netlink、app、binder、device、data files、socket、cache files等进行权限控制
app.te在这一文件里将安装在系统上的第三方app分类为受信任的app和不受信任的app,分别用不同的type表示,再分别为这两种app在访问网络,bluetooth,sdcard,数据,缓存,binder等等名感位置时设置相应权限

AVC LOG的抓取

1.提取所有的avc
adb shell “cat /proc/kmsg | grep avc” > avc_log.txt
或者
logcat -b events | grep avc

2.使用 audit2allow tool 直接生成policy
sudo apt install policycoreutils
audit2allow -i avc_log.txt 即可自动输出生成的policy

selinux权限添加相关: 将所有avc相关log拷贝到avc.txt中,将avc.txt拷贝到相关项目根目录下,执行 audit2allow -i avc.txt 会生成相应的权限语句;

3.查看安全上下文scontext:属于什么te
查看进程(APP):ps -Z
查看文件:ls -Z

AVC LOG分析

  • 示例:

I auditd  : type=1400 audit(0.0:4720): avc: denied { write } for comm="sh" name="export" dev="sysfs" ino=10547 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0

  • avc参数分析:

denied后面{}里的是要执行的动作,比如append,open,execmod,link等等
scontext指的是域,对应的是te文件 上面报错这条对应te文件是untrusted_app.te,scontext全写是source_type context;
tcontext指的是目标类型,上面报错这条对应的是目标类型system_file,tcontext全写是target_type context;
tclass指的是类别,上面报错这条对应的是类别是file

  • 添加对应TE

allow untrusted_app sysfs:file write;

TE表达式格式:
rule_name:规则名称,除了有allow还有dontaudit,auditallow和neverallow
source_type:源类型,对应一个很重要的概念--------域(domain)
tartget_type:目标的类型,即安全上下文,SELinux一个重要的判断对象
class:类别,目标(客体)是哪种类别,主要有File,Dir,Socket,SEAndroid还有Binder等,在这些基础上又细分出设备字符类型(chr_file),链接文件(lnk_file)等。可以通过ls -l查看文件类型
perm_set:动作集

  • 验证

重新编译bootimage:make bootimage

相关示例

  • SEAndroid为APP层读写sys设备节点自定义类型开放访问权限方法(如:sys/class/leds/red_aux/brightness)

1.添加设备节点读写权限

system/core/rootdir/init.rc

//开放节点让系统进程可以访问
chown system system /sys/class/leds/red_aux/brightness
//修改设备节点可读可写
chmod 0666 /sys/class/leds/red_aux/brightness

2.修改file.te,加入类型声明,定义selinux type

device/qcom/sepolicy/common/file.te

//表示sysfs_ledred_leds 节点具有fs_type和sysfs_type属性
type sysfs_ledred_leds, fs_type, sysfs_type;

3.修改file_contexts

device/qcom/sepolicy/common/file_contexts

//绑定sysfs_ledred_leds到对应的实际节点
/sys/devices/soc/75b5000.i2c/i2c-7/7-0045/leds/red_aux/brightness u:object_r:sysfs_ledred_leds:s0

4.修改sysetem_app.te文件,加入权限声明

device/qcom/sepolicy/common/file_contexts

//表示允许system_app进程能够拥有对sysfs_ledred_leds的这个字符设备的读写权限,rw_file_perms代表读写权限
allow system_app sysfs_ledred_leds:file rw_file_perms;

注意:以上的sysfs_ledred_leds必须与file.te文件中声明的文件类型、名称必须一致

5.APP需配置为系统APP
在AndroidMainefest.xml中配置android:sharedUserId="android.uid.system"

  • 新增allow xxx权限,编译报错neverallow的处理方式示例

allow radio vendor_data_file:file { read };在这里插入图片描述

  1. 国内版本可适当注释掉原生相关neverallow进行规避,不推荐方式

根据报错信息 在918行 system/sepolicy/public/domain.te加上 -radio

  1. CTS版本不能有任何neverallow,只能去掉添加的权限,自定义类型,绕过neverallow限制,推荐方式

这是因为我们添加的SELinux权限违反了google的neverallow规则,google不允许名为radio源类型访问标签名为vendor_data_file的目标类型,

解决方案是修改我们要访问的文件的标签名vendor_data_file,如何修改呢?我们要访问的目录是/data/vendor/time_code/,先看一下这个目录的信息
ls -Z data/vendor/time_code/

需要修改的标签属于文件类型,另外还有属性类型和程序类型,对于文件类型标签的修改就是自定义一个新的标签,在file.te中定义,在file_contexts中使用

file.te中添加如下语句:
type tct_time_data_file, file_type, data_file_type, mlstrustedobject;
file_contexts中添加如下语句:
/data/vendor/time_code(/.*)?       u:object_r:tct_time_data_file:s0

标签就被修改为了tct_time_data_file,然后再修改radio.te中的目标类型
allow radio tct_time_data_file:dir rw_dir_perms;

再进行编译

相关拓展

  • 常用文件

属性相关:property.te property_contexts
文件相关:file.te file_contexts
第三方应用配置:untrusted_app.te
platform系统应用配置:platform_app.te

  • 动作集

dir:
create_dir_perms、search、r_dir_perms、rw_dir_perms、ra_dir_perms
file:
create_file_perms、r_file_perms、rx_file_perms、x_file_perms、rw_file_perms

这里的rw_file_perms是一个包含所有的读写权限
define(r_file_perms’,{ getattr open read ioctl lock }‘)
define(w_file_perms’,{ open append write }‘)
define(rw_file_perms’,{ r_file_perms w_file_perms }')

相关参考

Android SELinux avc dennied权限问题解决方法
一文彻底明白linux中的selinux到底是什么
https://www.cnblogs.com/linhaostudy/p/8662534.html
https://blog.csdn.net/weixin_43835637/article/details/86508214
https://www.jb51.net/article/128214.htm
https://www.jianshu.com/p/88a92d101532
https://www.freesion.com/article/3645654781
https://www.pianshen.com/article/85991051081
https://www.jianshu.com/p/8b0e72776118
https://blog.csdn.net/gbmaotai/article/details/82415614

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

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

相关文章

STM32 定时器介绍--通用、高级定时器

目录 高级定时器 1.功能框图 1-时钟源 2-时基单元 3-输入捕获 4-输出比较 2.输入捕获的应用 3.输出比较的应用 4.初始化结构体 1-时基初始化结构体 2-输出比较结构体 3-PWM信号 周期和占空比的计算--以通用定时器为例 4-输入捕获结构体 5-断路和死区初始化结构体…

05. 机器学习入门 - 动态规划

文章目录 从一个案例开始动态规划 Hi, 你好。我是茶桁。 咱们之前的课程就给大家讲了什么是人工智能,也说了每个人的定义都不太一样。关于人工智能的不同观点和方法,其实是一个很复杂的领域,我们无法用一个或者两个概念确定什么是人工智能&a…

对一条Linux命令的解读(sed find egrep)

目录 1 sed -i的意义 2 $的作用 3 find . -type f的意义 4 -exec .... {} \;的意义 5 egrep -l的意义 6 综合以上 在前面的博客源码编译elfutils_金色熊族的博客-CSDN博客中,我使用了一条指令 sed -i s/-Werror//g $(find . -type f -exec egrep -l _no_Werr…

学信息系统项目管理师第4版系列15_资源管理基础

1. 项目资源 1.1. 实物资源 1.1.1. 着眼于以有效和高效的方式,分配和使用完成项目所需的实物资源 1.1.2. 包括设备、材料、设施和基础设施 1.2. 团队资源 1.2.1. 人力资源 1.2.2. 包含了技能和能力要求 2. 人力资源管理 2.1. 不仅是组织中最重要的资源之一&…

C语言结构体指针学习

结构体变量存放内存中,也有起始地址,定义一个变量来存放这个地址,那这个变量就是结构体指针; typedef struct mydata{int a1;int a2;int a3; }mydata;void CJgtzzView::OnDraw(CDC* pDC) {CJgtzzDoc* pDoc GetDocument();ASSERT…

【算法分析与设计】回溯法(上)

目录 一、学习要点1.1 回溯法1.2 问题的解空间1.3 0-1背包问题的解空间1.4 旅行售货员问题的解空间1.5 生成问题状态的基本方法 二、回溯法的基本思想三、回溯算法的适用条件四、递归回溯五、迭代回溯六、子集树与排列树七、装载问题八、批处理作业调度问题 一、学习要点 理解回…

Scala第十一章节

Scala第十一章节 1.模式匹配 2. Option 类型 3.偏函数 4.正则表达式 5.异常处理 6.提取器 7.案例:随机职业 scala总目录 文档资料下载

大数据Flink(九十五):DML:Window TopN

文章目录 DML:Window TopN DML:Window TopN Window TopN 定义(支持 Streaming):Window TopN 是一种特殊的 TopN,它的返回结果是每一个窗口内的 N 个最小值或者最大值。 应用场景

【C语言】模拟实现strstr

strstr这个库函数看到这个名字大概率猜不到这是什么函数, 但经过学习就可以很好的认识到这个函数 目录 介绍:模拟实现:思路:代码实现: 介绍: 可以看到此函数是用来寻找一个字符串中是否含有另一个字符串 代…

云安全之HTTP协议介绍补充

HTTP是一个基于TCP/IP通信协议来传递数据的协议,传输的数据类型为HTML文件、图片文件、查询结果等。HTTP协议一般用于B/S架构。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。 URI、URL、URN HTTP使用统一资源标识符(Uniform Resource ldentif…

WebSocket实战之二协议分析

一、前言 上一篇 WebSocket实战之一 讲了WebSocket一个极简例子和基础的API的介绍,这一篇来分析一下WebSocket的协议,学习网络协议最好的方式就是抓包分析一下什么就都明白了。 二、WebSocket协议 本想盗一张网络图,后来想想不太好&#x…

ImportSelector使用详解

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl ImportSelector概述 利用Import和ImportSelector可将组件批量添加至IoC容器 ImportSelector案例 在此,介绍ImportSelector使用案例。 定义ImportSelector S…

Kotlin前置检测判断check,require,requireNotNull

Kotlin前置检测判断check&#xff0c;require&#xff0c;requireNotNull &#xff08;1&#xff09;check fun main(args: Array<String>) {val b falsecheck(b) {println("check $b")}println("end") } check监测到值非真时候&#xff0c;抛出一…

国庆作业day5

应用层&#xff1a;提供用户与网络应用程序之间的接口。表示层&#xff1a;负责数据的格式转换、加密和解密。会话层&#xff1a;负责建立、管理和终止会话。它提供会话控制和同步&#xff0c;允许应用程序之间建立连接和交换数据。传输层&#xff1a;提供端到端的连接。网络层…

【ppt技巧】给ppt文件设置带有密码的只读模式

有没有同学&#xff0c;想要给PPT文件设置修改权限&#xff0c;却没有找到功能&#xff0c;给PPT文件设置只读模式&#xff0c;没有密码设置的&#xff1f;今天给大家分享给PPT文件设置带有密码的只读模式&#xff08;修改权限&#xff09;。 打开PPT文件之后&#xff0c;将PP…

数据结构与算法课后题-第三章(顺序队和链队)

#include <iostream> //引入头文件 using namespace std;typedef int Elemtype;#define Maxsize 5 #define ERROR 0 #define OK 1typedef struct {Elemtype data[Maxsize];int front, rear;int tag; }SqQueue;void InitQueue(SqQueue& Q) //初始化队列 {Q.rear …

WebSocket实战之一

一、前言 2017年做股票软件开始关注WebSoocket技术&#xff0c;不过当时客户端是Native采用的网络通讯框架是Netty&#xff0c;这次做收银台项目决定把WebSocket技术实践一把&#xff0c;主要应用于实时销量大盘数据展示以及消息系统提醒功能等。 注&#xff1a;一个技术点尽…

10.4号作业

Qt实现客户端搭建的代码和现象 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpSocket> #include <QMessageBox>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJ…

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石④

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石④ 第十九章 驱动程序基石④19.7 工作队列19.7.1 内核函数19.7.1.1 定义 work19.7.1.2 使用 work&#xff1a;schedule_work19.7.1.3 其他函数 19.7.2 编程、上机19.7.3 内部机制19.7.3.1 Linux 2.x的工作队列创建过程19.7.3…

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石⑤

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石⑤ 第十九章 驱动程序基石⑤19.9 mmap19.9.1 内存映射现象与数据结构19.9.2 ARM架构内存映射简介19.9.2.1 一级页表映射过程19.9.2.2 二级页表映射过程 19.9.3 怎么给APP新建一块内存映射19.9.3.1 mmap调用过程19.9.3.2 cach…