android selinux权限添加

时间:2025-01-31 07:14:35

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使用总结

1. selinux介绍

Android SELinux(Security-Enhanced Linux)是 Android 操作系统中使用的强化安全性的 Linux 安全模块。其主要目标是提高 Android 设备的系统安全性,通过实施强制访问控制机制来防止恶意软件和攻击。简单点说, SELinux 将系统划分为多个安全域,每个应用运行在自己的域中。即使应用程序被攻击,其权限也受到限制,不会对整个系统造成危害。并通过策略规则定义了系统中不同组件之间的交互方式。这些规则确保了合法的访问,并对潜在的安全威胁实施保护。所以简单的总结selinux权限添加就是添加域(domain)和策略规则(policy)

2. selinux权限添加

selinux权限的添加流程一般如下:

  1. 设备切换成宽容模式
  2. 复现场景
  3. 根据错误提示添加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使用总结

  1. 把手机里面的policy文件拉到工程根目录
  2. 配置环境变量
  3. 复现场景
  4. 导出dmesg/logcat喂给audit2allow生成selinux rule

TIPS: 更多关于Android selinux的详情可以通过Android官方文档获取/docs/security/features/selinux