IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android系统SELinux简单整理 -> 正文阅读

[移动开发]Android系统SELinux简单整理

SELinux分成了两部分,位于 /system/sepolicy 下的 platform 部分和位于 /device/vendorName/sepolicy 下的 vendor 部分。
对应开发板子上目录 /system/etc/selinux 下的 platform 部分和位于 /vendor/etc/selinux 下的 vendor 部分。

>>>>>> 哪些是 coredomain ???
Coredomain 是 attribute(属性),属于 domain (针对进程)或者 type(针对对象,如文件等)的集合。coremain 可以理解为包含 system 下可执行文件和 apps 所运行的 domain 或者说包含所有属于 Android 的 domain。总结为,Coredomain里包含一个或多个domain。

>>>> coredomain有两种定义方式????
??? 1. type XXX ..., coredomain ...;
??? 2. typeattribute XXX coredomain;
上面两种方式都是将 XXX 放入到 coredomain 集合中,即 XXX 是属于 coredomain,对 coredomain 配置的权限也会同步给 XXX,同样对 coredomain 的限制也会限制 XXX。

>>>>>>>工具查看???
Android的system/sepolicy/tools下sepolicy-analyze 工具,然后需要编译好的 sepolicy 文件,使用下面命令可以查看 coredomain 都包含那些 domain:
sepolicy-analyze 编译好的sepolicy? attribute coredomain

首先selinux是一种加强文件安全的一种策略。主要包含进程和文件对象。
在system\sepolicy\public\attributes文件中有:
(1)# All types used for processes.
attribute domain;????? ##用于进程的所有类型
(2)# All core domains (as opposed to vendor/device-specific domains)
attribute coredomain;?? ##和设备特性域相对的所有核心域

>>>>>>>>>>>>selinux有两种工作模式???
“permissive”:所有操作都被允许(即没有MAC),但是如果有违反权限的话,会记录日志
“enforcing”:所有操作都会进行权限检查

>>>>>>>>>>>>SEAndroid app分类
SELinux(或SEAndroid)将app划分为主要三种类型(根据user不同,也有其他的domain类型):
(1)untrusted_app 第三方app,没有Android平台签名,没有system权限
(2)platform_app 有android平台签名,没有system权限
(3)system_app 有android平台签名和system权限
从上面划分,权限等级,理论上:untrusted_app < platform_app < system_app

权限规则增加:
adb logcat | grep avc
查看对应的缺少的log 或者 adb shell进入提示后
dmesg | grep avc
标志性log 格式如下
avc: denied { 操作权限 } for pid=7201 comm=“进程名” scontext=u:r:源类型:s0
解析说明
Domain:u:r:logpersist:s0是一个“域”,它是一个进程或一组进程的标签。
Type:u:object_r:system_data_file:s0是一个“对象标签”,它是一个对象或一组对象的标签。
Class:dir 是客体的类型。(dir是文件夹,file是文件…)
Permission:write 是缺少的权限。

>>>>>>>查看SELinux模式命令:getenforce
更改SELinux模式命令:setenforce 1 设置为Enforcing
???????????????????? setenforce 0 设置为Permissive

>>>>>>> 安卓中快速编译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两个目录下,然后在这篇上面找到答案
https://www.jianshu.com/p/8b0e72776118
例如:RK平台android10.0中在device/rockchip/common/sepolicy下有private、public、vendor三个目录te文件,
????? 那么我们到底应该改private、public、vendor哪个路径呢?
????? 在device/rockchip/common/BoardConfig.mk定义了不同版本所要编译包含的目录。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:47:44  更:2022-04-22 18:50:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 22:51:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码