快速配置 SELinux 权限的方法

Android 快速配置 SELinux 权限的方法

快速配置方法 eg1:
avc: denied { read } for name=“u:object_r:serialno_prop:s0” dev=“tmpfs” ino=2297 scontext=u:r:mtk_hal_audio:s0 tcontext=u:object_r:serialno_prop:s0 tclass=file permissive=0
配置的权限应该就是:
allow mtk_hal_audio serialno_prop:file { read };

eg2.01-01 20:19:45.585 7807 7807 W Binder:7807_1: type=1400 audit(0.0:889): avc: denied { write } for path="/data/user_de/0/com.android.settings/cache/TakeEditUserPhoto2.jpg" dev=“mmcblk0p64” ino=1137 scontext=u:r:priv_app:s0:c512,c768 tcontext=u:object_r:system_app_data_file:s0 tclass=file permissive=0
修改办法:
device/qcom/sepolicy/private/priv_app.te
allow priv_app system_app_data_file:file { read write getattr };//针对报错 denied { write } 里面缺什么就填什么。)

若只需要read权限,则可省略{},写成:
allow mtk_hal_audio serialno_prop:file read;

那么要修改的文件应该就是mtk_hal_audio.te,这个文件在:
device/mediatek/sepolicy/basic/non_plat/

如果device/mediatek/sepolicy/下有多个 mtk_hal_audio.te,那么随便修改一个就可以,不过个人建议改basic/下面的。(原因请看补充部分)

剩下的几个 avc 配置类比即可,最后要配置的权限就是这样的:
allow mtk_hal_audio serialno_prop:file { read };
allow mtk_hal_audio audioserver_data_file:dir { search };
allow mtk_hal_audio serialno_prop:file { open };
allow mtk_hal_audio serialno_prop:file { getattr };

不难发现,除了第二个,其余3个只有最后面的权限定义不一样,于是我们就可以把它们整合一下,顺便也就把{}的用处体现出来了:
allow mtk_hal_audio serialno_prop:file { read open getattr };
allow mtk_hal_audio audioserver_data_file:dir { search };

一般权限配置到这里就差不多 OK 了,但这里修改了serialno_prop的访问权限,编译会报neverallow的错误,错误指向了system/sepolicy/public/domain.te文件。

根据错误信息,找到了如下代码:
neverallow {
domain
-adbd
-dumpstate
-hal_drm
-hal_cas
-init
-mediadrmserver
-recovery
-shell
-system_server
} serialno_prop:file r_file_perms;

需要说明的是,这里面的是白名单,只有这里面列出的才能访问serialno_prop。
这里我们需要把mtk_hal_audio加到白名单,但直接加进去,会报文件找不到。
我们回过来检查mtk_hal_audio.te文件的定义,发现前2行有如下配置:
type mtk_hal_audio, domain;
hal_server_domain(mtk_hal_audio, hal_audio)
虽然没看明白是在干啥,不过可以看出来mtk_hal_audio与hal_audio是有联系的;这里mtk_hal_audio明显是MTK加的,那hal_audio应该就是 Android 原生存在的,neverallow里面配置的应该也是Android原生的。

基于这些分析和猜测,将hal_audio加入了白名单,编译验证果然OK了。
1、这里的配置只是简易方法,并不一定所有情况都适用。
2、一定要注意冒号:、分号;的使用。
3、最后面权限声明的{}类似于数组,可以添加多种权限,但是各个权限之间要用空格隔开。
4、经验证,修改 neverallow,会导致 CTS Fail !!!
5、当确认权限添加无误后,还是没效果的时候,请检查 scontext,若出现如下c512,c768信息

scontext=u:r:untrusted_app_25:s0:c512,c768
tcontext=u:object_r:sysfs_ir:s0

则说明,mls 检测未通过,还需要配置其它权限。
sepolicy 文件主要放在下面几个目录:
1). Google 原生目录 external/sepolicy
2). MTK 配置目录 device/mediatek/common/sepolicy
3). MTK 配置目录 device/mediatek/{platform}/sepolicy (M版本后才添加,主要是针对平台客制化)

单编方法:
mmm external/sepolicy
make -j24 ramdisk-nodeps
make -j24 bootimage-nodeps

你可能感兴趣的:(快速配置 SELinux 权限的方法)