Android SELinux权限添加
TIPS: 本文基于Android10版本举例介绍selinux权限的添加方法
目录
- 1. selinux介绍
-
2. selinux权限添加
-
2.1 selinux权限添加示例
- 2.1.1 添加自启动service
- 2.1.2 新建domain
- 2.1.3 添加Label
- 2.1.4 重新编译烧写镜像
- 2.1.5 设备切换成宽容模式
- 2.1.6 复现场景
-
2.1.7 根据错误提示添加selinux policy
- 2.1.7.1 使用audit2allow添加缺失的权限
- 2.1.7.2(选)直接从dmesg获取信息添加缺失的SELinux权限
- 2.2 audit2allow使用总结
-
2.1 selinux权限添加示例
1. selinux介绍
Android SELinux(Security-Enhanced Linux)是 Android 操作系统中使用的强化安全性的 Linux 安全模块。其主要目标是提高 Android 设备的系统安全性,通过实施强制访问控制机制来防止恶意软件和攻击。简单点说, SELinux 将系统划分为多个安全域,每个应用运行在自己的域中。即使应用程序被攻击,其权限也受到限制,不会对整个系统造成危害。并通过策略规则定义了系统中不同组件之间的交互方式。这些规则确保了合法的访问,并对潜在的安全威胁实施保护。所以简单的总结selinux权限添加就是添加域(domain)和策略规则(policy)
2. selinux权限添加
selinux权限的添加流程一般如下:
- 设备切换成宽容模式
- 复现场景
- 根据错误提示添加selinux policy
tips: 若启用宽容模式下还是无法实现期望的功能则可能不是selinux规则缺失的问题
2.1 selinux权限添加示例
比如添加一个开机自启动的service
,这个service
会运行/vendor/bin/start_up.sh
脚本,假设此脚本已经存在/vendor/bin/start_up.sh
目录下了;需要新建domain
.te文件、添加Label
,把新建的.te文件加入
2.1.1 添加自启动service
在文件里添加(此文件参考具体的源码路径)
service startup /vendor/bin/start_up.sh
class late_start
2.1.2 新建domain
在此路径 device/<manufacturer>/<device-name>/sepolicy/
创建包含以下内容的文件
# startup service
type startup, domain;
type startup_exec, exec_type, file_type, vendor_file_type;
init_daemon_domain(startup)
把新建的文件加入
2.1.3 添加Label
将以下内容添加到device/<manufacturer>/<device-name>/sepolicy/file_contexts
/vendor/bin/start_up\.sh u:object_r:startup_exec:s0
2.1.4 重新编译烧写镜像
编译并重新烧写和
2.1.5 设备切换成宽容模式
添加了自启动脚本后可以先用命令禁用selinux,确认脚本是否能正常运行。
用以下命令设备切换成宽容模式
adb shell setenforce 0
用以下命令判断是否切换成功
adb shell getenforce
成功切换回返回Permissive
结果
若禁用selinux权限后脚本还不生效,可能是脚本本身有问题,不是selinux导致的无法生效,需确认脚本能正常生效之后再用dmesg导出log喂给audit2allow查看service缺失的权限。
2.1.6 复现场景
每次开机均会运行/vendor/bin/start_up.sh
脚本,导出kernel log或者logcat log,这两个log均会保存完整的拒绝事件
2.1.7 根据错误提示添加selinux policy
把错误提示改写成selinux rule有两种方法,一种是用audit2allow工具把错误提示直接输出为selinux rule,一种是自己找出log里的错误提示,改写成selinux rule。最简单方便的方式使用audit2allow。下面会演示两种方法的使用。
tips: selinux权限添加可能会和neverallow 规则冲突,冲突会报编译错误,详细信息可以参阅Android官方文档/docs/security/features/selinux/customize
2.1.7.1 使用audit2allow添加缺失的权限
在使用audit2allow
之前需配置环境变量和把设备里的policy
导出到工程的根目录;policy
文件在设备里的/sys/fs/selinux/policy
路径下;
比如在linux环境下工程根目录如下操作:
adb pull /sys/fs/selinux/policy <工程根目录>
source build/
lunch <your-target>
cat | audit2allow -p policy
若自定义的service有缺失的selinux权限会有如下样例提示:
#============= startup ==============
allow startup vendor_product_prop:file read;
注释部分会提示和service
对应的te文件名,只需要把输出的缺失权限添加到自己添加的里,当把所有的权限都添加好后自启动脚本就可以正常运行了
2.1.7.2(选)直接从dmesg获取信息添加缺失的SELinux权限
[ 3.342984] audit: type=1400 audit(243.435:7): avc: denied { open } for pid=313 comm="sn_writer" path="/dev/__properties__/u:object_r:vendor_product_prop:s0" dev="tmpfs" ino=14874 scontext=u:r:startup:s0 tcontext=u:object_r:vendor_product_prop:s0 tclass=file permissive=0
- 上方
denied { open }
的{ open }
表示执行的操作。根据它和末尾的tclass=file permissive=0
,可以大致了解是对什么对象执行什么操作被拒绝了。 -
scontext=u:r:startup:s0
表示发起相应操作的环境,此示例表示的是startup
service。 -
tcontext=u:object_r:vendor_product_prop:s0
表示操作目标的环境,在此示例中是归startup
所有的某个 file。 -
comm="sn_writer"
可帮助了解拒绝事件发生时正在运行的程序。
可以总结出selinux权限语法为:
allow [scontext] [tcontext]:[tclass] [denied];
根据上面的dmesg信息可以写成
allow startup vendor_product_prop:file open;
具体的含义为
allow source_type target_type:target_class permission(s);
2.2 audit2allow使用总结
- 把手机里面的policy文件拉到工程根目录
- 配置环境变量
- 复现场景
- 导出dmesg/logcat喂给audit2allow生成selinux rule
TIPS: 更多关于Android selinux的详情可以通过Android官方文档获取/docs/security/features/selinux