android selinux权限添加

本文详细介绍了在Android10版本中添加SELinux权限的方法,包括创建自启动服务、新建domain、添加Label、编译镜像以及处理错误提示和使用audit2allow工具。重点讲述了如何根据错误信息调整策略以确保系统安全。
摘要由CSDN通过智能技术生成

Android SELinux权限添加

TIPS: 本文基于Android10版本举例介绍selinux权限的添加方法

目录

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文件加入BoardConfig.mk

2.1.1 添加自启动service

init.xxx.rc文件里添加(此文件参考具体的源码路径)

service startup /vendor/bin/start_up.sh
    class late_start

2.1.2 新建domain

在此路径 device/<manufacturer>/<device-name>/sepolicy/startup.te创建包含以下内容的文件

# startup service
type startup, domain;
type startup_exec, exec_type, file_type, vendor_file_type;

init_daemon_domain(startup)

把新建的startup.te文件加入BoardConfig.mk

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 重新编译烧写镜像

编译并重新烧写boot.img和system.img

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官方文档https://source.android.com/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/envsetup.sh
lunch <your-target>
cat dmesg.log | audit2allow -p policy

若自定义的service有缺失的selinux权限会有如下样例提示:

#============= startup ==============
allow startup vendor_product_prop:file read;

注释部分会提示和service对应的te文件名,只需要把输出的缺失权限添加到自己添加的startup.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官方文档获取https://source.android.com/docs/security/features/selinux

  • 32
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值