Android Selinux 权限处理

问题现象: 无法打开某个设备文件,提示权限失败
问题信息:unable to open /dev/ttyS0, error:Permission denied
解决步骤:

1 确认设备节点是否存在;
2 确认设备节点权限;尝试向所有组添加权限(chmod 777 /dev/ttyS0);

上述步骤如果还不能解决问题,就需要考虑Android Selinux权限策略。
1 临时取消Android Selinux 安全检查。

root@dev:# getenforce
Enforcing
root@dev:# setenforce 0
root@dev:# getenforce
Permissive

上述问题如果解决权限问题,那么就是Android Selinux对进行访问进行了权限限制,setenforce只能一次性、临时性解决问题,完整的解决方案需要根据Android AVC的提示对进行进行权限设定。

01-01 01:33:48.409 21230 21230 W chinaycheng: type=1400 audit(0.0:76): avc: denied { read write } for name="ttyS0" dev="tmpfs" ino=2532 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:serial_device:s0 tclass=chr_file permissive=0

AVC分析结果:

描述 关键值 测试值
缺少什么权限 denied {} read write
谁缺少 scontext u:r:platform_app
对那个文件 tcontext u:object_r:serial_device:s0
文件类型 tclass chr_file

解决方法:
在指定文件platform_app.te中添加权限
allow platform_app serial_device:chr_file { read write }
文件路径不确定,主要位于external/sepolicy 和device/**/sepolicy文件夹下面。修改之后需要重新少些boot.img才能生效。

PS:以上是对已经存在进程修改权限,如果进程不存在,对应的te文件不存在,那么就需要重新新增te文件。
1 找到对应的sepolicy文件夹,有一个file_contexts文件,模仿已经存在的信息,多写一条。以新增一个叫chinaycheng的程序为例

/system/bin/dex2oat     u:object_r:dex2oat_exec:s0 
/system/bin/patchoat    u:object_r:dex2oat_exec:s0 
/system/bin/chinaycheng u:object_r:chinaycheng_exec:s0

这就指定了chinaycheng这个程序的权限设置路径为:chinaycheng_exec,名字不重要,主要以_exec结尾就可以了。然后再参考目录下,其他文件的te,拷贝一个过来,修改里面的allow信息即可。

你可能感兴趣的:(android)