首页 > 系统相关 >Android系统SELinux详解

Android系统SELinux详解

时间:2023-10-25 18:01:19浏览次数:37  
标签:sepolicy SELinux app system 详解 file Android te type

前言

SELinux是一种加强文件安全的一种策略,可以更好地保护我们的Android系统, 比如限制系统服务的访问权限、控制应用对数据和系统日志的访问等措施,这样就降低了恶意软件的影响,并且可以防止因代码存在的缺陷而产生的对系统安全的影响。

从系统安全方面考虑,SELinux是保护神,但是从软件开发方面,SELinux就是一道牵绊,这是一把双刃剑。SELinux默认开启,即使获得了该系统的root权限,也只能向相关策略中指定的设备写入数据,从而更好地保护和限制系统服务,保障系统和数据的安全。

Android系统SELinux详解_bc

环境

硬件平台:Google Pixel2
操作系统:Android10.0

selinux有两种工作模式

名称

作用

permissive

所有操作都被允许(即没有MAC),但是如果有违反权限的话,会记录日志

enforcing

所有操作都会进行权限检查

标签、规则和域

SELinux 依靠标签来匹配操作和策略。标签用于决定允许的事项。套接字、文件和进程在 SELinux 中都有标签。SELinux 在做决定时需参照两点:一是为这些对象分配的标签,二是定义这些对象如何交互的策略。

在 SELinux 中,标签采用以下形式:user:role:type:mls\_level,其中 type 是访问决定的主要组成部分,可通过构成标签的其他组成部分进行修改。对象会映射到类,对每个类的不同访问类型由权限表示。

策略规则采用以下形式:allow domains types:classes permissions;,其中:

名称

作用

domain

一个进程或一组进程的标签。也称为域类型,因为它只是指进程的类型。

type

一个对象(例如,文件、套接字)或一组对象的标签。

class

要访问的对象(例如,文件、套接字)的类型。Permission - 要执行的操作(例如,读取、写入)。

策略配置源文件

  1. external/sepolicy
    这是独立于设备的配置,一般不能针对设备进行修改
  2. device///sepolicy
    这是特定于设备的配置,基于 BOARD\SEPOLICY\\* 变量来选择对应平台的策略配置。

Type Enforcement (TE) 配置文件

.te 文件中保存了对应对象的域和类型定义、规则。通常每个域一个 .te 文件,例如installd.te。在 device.te、file.te 中声明了设备和文件类型。在某些文件(例如domain.te、app.te)中则存储着共享规则。

标签配置文件

  1. file\_contexts:文件安全上下文
  2. property\_contexts:属性安全上下文
SEAndroid app分类

SELinux(或SEAndroid)将app划分为主要三种类型(根据user不同,也有其他的domain类型):

名称

作用

untrusted\_app

第三方app,没有Android平台签名,没有system权限

platform\_app

有android平台签名,没有system权限

system\_app

有android平台签名和system权限

从上面划分,权限等级,理论上:untrusted\_app < platform\_app < system\_app

user

user可以理解为UID。android的UID和linux的UID根本是两回事,Linux的UID是用于针对多用户操作系统中用于区分用户的,而Android中的UID是用于系统进行权限管理的。参考链接中的文章对于uid的产生讲的很清楚。

seinfo

不同签名会创建对应的selinux上下文。
Android.mkLOCAL\_CERTIFICATE := platform
有platform签名,所以seinfo是platform。

自定义安全策略

以上面两个运行的app来说,我们为这两个APP添加额外的权限,对应的TE配置文件分别就是system\_app.te、untrusted\_app.te,对应路径为:

$aosp/system/sepolicy/public/system_app.te
$aosp/system/sepolicy/public/untrusted_app.te

以longzhiye.example.app为例,我们为其添加can设备的执行权限:

longzhiye@longzhiye-laptop:~/mount/project/androidq$ vi system/sepolicy/public/system_app.te
......
allow system_app vendor_shell_exec:file { getattr open read execute execute_no_trans };
allow system_app shell_exec:file { getattr open read execute execute_no_trans };
allow system_app shell:file { getattr open read execute execute_no_trans };
......

以策略规则配置形式(allow domains types:classes permissions)

分析:

策略规则

示例

domains

system\_app

types

vendor\_shell\_exec

classes

file

permissions

getattr open read execute execute\_no\_trans

neverallow failures

有时我们增加的权限,系统默认的配置是不允许的,比如我们上面给forlinx.example.app增加的执行脚本的权限,报错如下:

libsepol.report_failure: neverallow on line 9 of system/sepolicy/private/system_app.te

(or line 41463 of policy.conf) violated by allow system_app shell:file { read open };

libsepol.report_failure: neverallow on line 22 of system/sepolicy/private/shell.te

(or line 40025 of policy.conf) violated by allow system_app shell:file { read open };

libsepol.check_assertions: 2 neverallow failures occurred

系统默认的安全策略的路径为system/sepolicy/,根据报错的提示,我们可以修改默认的配置,修改system/sepolicy/private/system\_app.te和system/sepolicy/private/shell.te,从而完成权限的赋予。

安卓中快速编译sepolicy并验证(需要本地代码整编过一次,已经生成out目录)

$ mmm system/sepolicy/
$ adb push out/target/product/xxx/system/etc/selinux /system/etc/selinux
$ adb push out/target/product/xxx/vendor/etc/selinux /vendor/etc/selinux

也可单编systemimage,并刷机

$ make systemimage
$ adb reboot bootloader
$ fastboot flash system ./system.img
$ fastboot reboot

如何应对neverallow? 绕过CTS认证

在system/sepolicy/private/logpersist.te与system/sepolicy/prebuilts/api/29.0/private/logpersist.te中配置以下allow语句并编译,
会报neverallow的错。如下声明allow:
allow logpersist system\_data\_file:dir write;
这表示谷歌不允许我们使用allow语句,解除限制的最暴力方法就是将报错处的neverallow语句删掉,这样确实可行,但是会过不了cts。
由于我们要访问的目录path为/data/syslog,将该目录定义成自己的Type,可以自定义Type,如下:
在file.te中自定义一个type为file\_type,data\_file\_type,core\_data\_file\_type:

  1. type log\_data\_file, file\_type, data\_file\_type, core\_data\_file\_type;
    在file\_contexts中定义安全上下文:
  2. /data/syslog(/.\*)? u:object\_r:log\_data\_file:s0
    在logpersist.te将allow语句改为:
  3. allow logpersist log\_data\_file write;
    然后在logpersist.te中单独将自定义的log\_data\_file减去即可。(这里最好的是自定义一个service代替logpersist,那就要新建一个te文件了,比较麻烦)
neverallow logpersist {
  file_type
  userdebug_or_eng(`-misc_logd_file -coredump_file')
  with_native_coverage(`-method_trace_data_file')
  -log_data_file
}:file { create write append };

如何新增domian域?(一般在平台相关目录下添加)

例子如下
在device/平台名/system/private/file\_contexts 文件添加

# tcontext=u:object_r:sysfs:s0

/sys/kernel/display/abcd u:object\_r:wxl\_abcd:s0 #wxl\_abcd替换sysfs,wxl\_abcd随便取

在device/平台名/system/public/file.te 中添加

type wxl_cabc, fs_type,sysfs_type;

在 device/平台名/system/private/system\_server.te 文件中添加

allow system_server wxl_abcd:file { r_file_perms w_file_perms rw_file_perms };

添加 write 或者 read 的权限要注意 open 的权限,最后使用 r\_file\_perms、w\_file\_perms、rw\_file\_perms。

添加设备文件节点权限(sysfs gpio管脚节点权限)?

/sys/class/leds/green/brightness //快捷方式
/sys/devices/soc.0/gpio-leds.66/leds/green/brightness //实际节点

操作LED灯的设备文件节点为APP层system app进程开放该节点访问权限(读或写),权限配置主要修改(一般在/device/平台/sepolicy/common)目录下的file.te、file\_contexts和system\_app.te三个文件
(1)file.te修改如下:
\# GPIO accessed by system app

type sysfs_gpio, fs_type, sysfs_type;

(2)file\_contexts修改如下:

/sys/devices/soc/1010000.pinctrl/gpio/gpio62/value           u:object_r:sysfs_gpio:s0
    /sys/devices/soc/1010000.pinctrl/gpio/gpio63/value           u:object_r:sysfs_gpio:s0

(3)system\_app.te修改如下:

allow system_app sysfs_gpio:file rw_file_perms;

如果通过以上添加SELinux之后,仍没有权限读写sys或proc节点,需要到/system/core/rootdir/init.rc里面配置如下:
(1)修改设备节点用户所有者和所属用户组,以及它们所对应的权限
chown system system 设备文件结点
chmod 777 设备文件结点

修改selinux没有生效???

将SELinux Policy 文件存放在下面目录
(1) Google 原生目录 /system/sepolicy
(2) 厂商配置目录 /device/厂商平台/sepolicy/
android将SELinux Policy 文件存放的te一般都是在device/平台/sepolicy 和 /system/sepolicy两个目录下

标签:sepolicy,SELinux,app,system,详解,file,Android,te,type
From: https://blog.51cto.com/u_16175630/8023642

相关文章

  • IOC和DI详解
    一、IOC控制反转它是一个概念,是一种思想。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。即是将new的过程交给spring容器去处理二、DI依赖注入:依赖注入DI是指程序运......
  • C++中vector容器详解
    参考链接:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html一、什么是vector?向量(Vector)是一个封装了动态大小数组的顺序容器(SequenceContainer)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。二......
  • 最好用的Android APK第三方下载站,替代Google play
    最好用的AndroidAPK第三方下载站,推荐以下7个替代Googleplay方案可通过第三方应用程序下载各种apk历史版本1、APKPure:APKPure 提供:网页、AppAPKPure是知名度很高的免费安卓应用商店,基本上大部分GooglePlay上架的软件都可以在这里找到,但最近也有被屏蔽的倾向。2、APKMirror......
  • Upgrade-Insecure-Requests:1 详解
    Upgrade-Insecure-Requests:1Upgrade-Insecure-Requests 是一个HTTP响应头,用于向浏览器发出指示,要求浏览器使用HTTPS加密协议来访问网站,以提高网站的安全性。当浏览器收到这个响应头时,它会自动将所有的HTTP请求转换为HTTPS请求,从而避免使用不安全的HTTP协议......
  • H5与Android的调试
    准备工作:PC下载并安装chrome(谷歌)浏览器一台安卓手机(4.4系统以上),用usb线链接电脑,打开开发者模式,且允许WebView进行调试,需新增如下代码:WebView.setWebContentsDebuggingEnabled(true);编译并运行代码chrome浏览器地址栏输入chrome://inspect,进入后点击inspect即进入调试模式(需要......
  • Java类加载机制详解 | 京东云技术团队
    一.类加载器及双亲委派机制类加载器加载类备注启动类加载器(BootstrapClassLoader)JAVA_HOME/jre/lib无上级,无法直接访问由jvm加载拓展类加载器(ExtensionClassLoader)JAVA_HOME/jre/lib/ext父加载器为Bootstrap,显示为null。该类由Bootstrap加载应用类加载器(ApplicationClassLoa......
  • 悲哀!大厂门槛成了很多Android开发无法企及的追求?这个机会到底怎么获得!
    大厂offer是每个技术人的追求许多程序员都梦想着能够获得大厂的offer,这并不是饭后闲聊的话题,而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等公司的技术氛围和技术规范度,相较于一些创业型公司或小公司,显然要高得多。如果能在这类公司工作几年,对个人能力的提升无疑会非......
  • 详解Linux中FTP命令 (ftp命令 linux)
    Linux中FTP命令详解FTP(FileTransferProtocol)是一种用于在网络上传输文件的标准协议。在Linux操作系统中,可以使用FTP命令进行文件的上传和下载,而无需使用第三方工具。本文将详细介绍Linux中FTP命令的使用方法和相关技巧。一、FTP命令概述FTP命令是Linux中自带的命令之一,用于连......
  • STL之set和map使用介绍(六千字长文详解)
    set和map介绍基础概念关联式容器像是vector,list,deque,forward_list这些都是属于==序列式容器==!因为其底层为线性序列的数据结构,里面存储的是元素本身。而map和set是属于==关联式容器==!什么是关联式容器?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的<......
  • unity打包 android
    第一种:手动把没有的包都放入C:\ProgramFiles\Unity\Hub\Editor\2022.3.3f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle\lib 第二种:修改镜像urlC:\ProgramFiles\Unity\Hub\Editor\2022.3.3f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools......