Android selinux 权限 修复 avc: denied

selinux

{

getenforce 串口命令查看权限

selinux=0 内核关闭 selinux

selinux=1 内核打开 selinux

android 系统 两种模式

androidboot.selinux=permissive 宽松

androidboot.selinux=enforcing 强制

getenforce

setenforce 0 命令,让 selinux 处于宽容模式

sn: getprop ro.serialno

mac: cat /sys/class/net/wlan0/address

相关文件

{

修改权限最好在device下客制化修改

device/xxx/xxx/sepolicy/

原始code的权限最好不要动

system/sepolicy/public/

system/sepolicy/prebuilts/api/xx/public/

}

设置文件 device/softwinner/eros-p1/BoardConfig.mk

BOARD_KERNEL_CMDLINE += selinux=1 androidboot.selinux=permissive androidboot.dtbo_idx=0,1,2

BOARD_KERNEL_CMDLINE += selinux=1 androidboot.selinux=enforcing androidboot.dtbo_idx=0,1,2

权限报错,类似提示

{

init: Unable to set property 'persist.standby.mode' to '1' from uid:1000 gid:1000 pid:7184: SELinux permission check failed

2.047169 selinux: avc: denied { set } for scontext=u:r:vendor_init:s0 tcontext=u:object_r:default_prop:s0 tclass=property_service permissive=1

2.064680 selinux: avc: denied { set } for scontext=u:r:vendor_init:s0 tcontext=u:object_r:config_prop:s0 tclass=property_service permissive=1

2.081488 selinux: avc: denied { set } for scontext=u:r:vendor_init:s0 tcontext=u:object_r:exported2_default_prop:s0 tclass=property_service permissive=1

153.759885 selinux: avc: denied { set } for property=persist.standby.mode pid=3928 uid=1000 gid=1000 scontext=u:r:system_app:s0 tcontext=u:object_r:default_prop:s0 tclass=property_service permissive=1

178.937290 selinux: avc: denied { set } for property=settings.notifi.count pid=2183 uid=1000 gid=1000 scontext=u:r:system_server:s0 tcontext=u:object_r:default_prop:s0 tclass=property_service permissive=1

avc: denied { write } for name="light" dev="sysfs" ino=14600 scontext=u:r:system_server:s0 tcontext=u:object_r:sysfs_gpio:s0 tclass=file permissive=0

}

方法一 修改

vendor/aw/homlet/sepolicy/property_contexts

system/sepolicy/.../property_contexts

{

system_prop 对应的只能在 系统层app才能使用

ro.datamax.RomVersion u:object_r:system_prop:s0

persist.ota.server u:object_r:system_prop:s0

persist.standby.mode u:object_r:system_prop:s0

}

方法二

{

抓取相关log,提取权限名称。

dmesg|grep avc

获取所有的avc 权限问题

logcat|grep avc: > /sdcard/avc.log

linux工具 需要先 source build/envsetup.sh & lunch

audit2allow -i avc.log

源码中使用工具生成

{

#============= hal_wifi_default ==============

allow hal_wifi_default vendor_data_file:file getattr;

#============= init ==============

allow init settings_service:service_manager find;

allow init system_file:file execute_no_trans;

#============= system_app ==============

allow system_app system_data_file:file { write read create };

}

根据生成的条件修改 te文件

system/sepolicy/public/system_app.te

allow system_app system_data_file:dir { add_name write };

allow system_app system_data_file:file { create open write };

报错提示:

libsepol.report_failure: neverallow on line 458 of system/sepolicy/public/app.te (or line 8332 of policy.conf) violated by allow system_app system_data_file:dir { write };

libsepol.report_failure: neverallow on line 458 of system/sepolicy/public/app.te (or line 8332 of policy.conf) violated by allow system_app system_data_file:file { write create };

libsepol.check_assertions: 2 neverallow failures occurred

找到 app.te 中对应的 458 等行修改

{

原始:

neverallow appdomain system_data_file:dir_file_class_set

{ create write setattr relabelfrom relabelto append unlink link rename };

修改后 1

neverallow appdomain -system_app system_data_file:dir_file_class_set

{ create write setattr relabelfrom relabelto append unlink link rename };

修改后 2

neverallow appdomain system_data_file:dir_file_class_set

{ setattr relabelfrom relabelto append unlink link rename };

}

报错提示:

Files system/sepolicy/prebuilts/api/28.0/public/app.te and system/sepolicy/public/app.te differ

对比两个文件输入的字符,一个空格都要一致

编译测试

make selinux_policy

}

}