舟山建设技术学校网站首页wordpress 免邮箱注册
SELinux(Security-Enhanced Linux)是一种强制访问控制(MAC)机制,它为 Android 系统提供了额外的安全层。通过 SELinux,系统管理员可以定义细粒度的安全策略,限制进程对文件、网络和其他资源的访问。本文将详细介绍如何在 Android 上增加 SELinux 权限。
1. 了解 SELinux 模式
在开始之前,了解 SELinux 的不同模式是很重要的:
- Enforcing 模式:SELinux 策略被强制执行,违反策略的行为会被阻止。
 - Permissive 模式:SELinux 策略被记录但不强制执行,违反策略的行为会被记录但不会阻止。
 - Disabled 模式:SELinux 被禁用,不执行任何策略。
 
注意: Android 里面临时关闭selinux命令:setenforce 0
2.识别需要增加权限的地方
2.1 查看日志
在 Permissive 模式下,SELinux 会记录所有违反策略的行为。你可以通过查看日志来识别需要增加权限的地方。
audit(0.0:53): avc: denied { execute } for path=“/data/data/com.mofing/qt-reserved-files/plugins/platforms/libgnustl_shared.so” dev=“nandl” ino=115502 scontext=u:r:platform_app:s0 tcontext=u:object_r:app_data_file:s0 tclass=file permissive=0
2.2 编写 SELinux 策略
分析过程:
 缺少什么权限: { excute } 权限
 谁缺少该权限: scontext = u:r:platform_app:s0
 对哪个文件缺少权限: tcontext = u:object_r:app_data_file
 什么类型的文件:tclass = file
 完整意思:platform_app进程对app_data_file类型的file缺少excute权限。
 解决办法:
 在SEpolicy目录下,找到platform_app.te这个文件,加入以下内容:
 allow platform_app app_data_file:file excute;
 如果存在大量报错,可以用如下方法(某些语句会识别不出来,可用根据上面的方法,自己写)
 1、日志中搜索 “avc”,存在类似如下的报错
 
 2、将所有报错保存到一个文件中,例如avc.txt,并放到源码根目录
 3、在源码目录先source lunch
 4、利用原生自带功能生成 avc.te 权限文件
 audit2allow -i avc.txt -o avc.te
2.3 增加权限过程
这个需要通过先type定义,但大多数情况是已经存在了,只需要增加权限就好了
1、device.te里面添加一个标签(以下为举例,具体根据报错添加)
 type demura_spi_device, dev_type;
 2、file_contexts里面添加节点
 /dev/spidev0.0 u:object_r:demura_spi_device:s0
 3、XXXXXX.te添加允许规则(一般只需要这个步骤,除非是未定义的标签和节点)
 allow XXXXX demura_spi_device:chr_file { ioctl read write open map getattr }
2.4 特殊情况
(1)增加 ioctl 权限
 增加ioctl权限规则的时候,若代码中已经存在allow语句,且avc log中包含 ioctlcmd = xxxx 字段的时候,则需要使用allowxperm。
 查找对应的16进制代码,在te文件中增加
 allowxperm A B:class ioctl ioctlcmd;
 (2)ioctl cmd集合
 若是需要很多ictol cmd,可以参考以下两个文件,定义一个ictol cmd集合,一次性加多个io权限
/system/sepolicy/public/ioctl_defines
/>system/sepolicy/public/ioctl_macros
- _ ioctl_macros中定义ictol cmd集合,集合中的ictol cmd权限可以在ioctl_defines中找到
 - 在te文件中增加ictol cmd集合权限_

 
