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定义了不同版本所要编译包含的目录。