Android给新增的二进制应用添加selinux权限

本文介绍如何在SELinux环境中为特定文件或进程配置权限,包括文件类型确定、加入权限及解决编译报错的方法。

I.SELinux文件类型确定

查看文件的安全上下文并做修改

1、到相关目录中去查看

root@Z00T:/cd system/bin/
root@Z00T:/ls -Z | grep demo
  • 1
  • 2
  • 3

PS:demo替换成所需查看的文件名 
一般情况下,由于没有设置demo的selinux权限,一般会默认它为文件系统中的文件 
demo u:object_r:system_file:s0

2、添加定义文件类型的策略文件 
1)添加所需的策略文件demo.te(这里demo以可执行程序为例) 
在device/qcom/sepolicy/common中,新建demo.te文件

type demo, domain;
type demo_exec, exec_type, file_type;
init_daemon_domain(demo)
  • 1
  • 2
  • 3
  • 4

定义了demo是domain(领域),demo_exec为可执行程序

2)对文件匹配进行设定 
在device/qcom/sepolicy/common/file_contexts中,加入匹配字段

/system/bin/demo u:object_r:demo_exec:s0
  • 1
  • 2

PS:上文中的demo均可替换成所需文件名

此时再进行第1步看是否生效,注意demo文件不能使用push进去的文件,以免file_context不识别。这时的kernel所报的log才是需要加权限的log

编译是否生效:查看out/target/product/<>/root/file_contexts文件及 out/target/product/<>/obj/ETC/file_contexts_intermediates/file_contexts文件

PS:如demo仅仅是资源文件,可以直接在file_context做匹配字段,在device/qcom/sepolicy/common/file.te上可以看到所有的文件类型 
demo u:object_r:system_file:s0 system_file换成所需文件类型即可

II.SELinux加入权限

根据内核log所报的错误权限信息,加入权限即可。

比如内核报这样的错:

# cat /dev/kmsg
[  172.554381] type=1400 audit(22611.739:4): avc:  denied  { getattr } for  pid=257 comm="demo" path="/system/rfs"             dev="mmcblk0p42" ino=2070 scontext=u:r:recovery:s0 tcontext=u:object_r:rfs_system_file:s0 tclass=dir permissive=0
[  173.287498] type=1400 audit(22612.479:5): avc:  denied  { relabelfrom } for  pid=257 comm="demo" name="rfs" dev="mmcblk0p42" ino=2070 scontext=u:r:recovery:s0 tcontext=u:object_r:rfs_system_file:s0 tclass=dir permissive=0
  • 1
  • 2
  • 3
  • 4

一般可以在comm下面看到domain的信息,知道我们所需要修改的te文件

在相应的te、文件中增加语句,语句格式为

allow sourcecontext targetcontext:class 许可 ;

例如

[ 172.554381] type=1400 audit(22611.739:4): avc: denied { getattr } for pid=257 comm=”update_binary” path=”/system/rfs” dev=”mmcblk0p42” ino=2070 scontext=u:r:recovery:s0 tcontext=u:object_r:rfs_system_file:s0 tclass=dir permissive=0 

sourcecontext指的是“scontext=u:r:recovery:s0”的recovery,targetcontext 指的是“tcontext=u:object_r:rfs_system_file:s0 ” 中的rfs_system_file, class指的是“tclass=dir”中的dir,许可指的是“{}”中的getattr, 
所以增加语句

allow recovery rfs_system_file:dir getattr;

III.解决编译报错问题

访问block device超过权限问题

对block device访问时,会因为neverallow,导致编译不过,此时不可以去修改/external/sepolicy/domain.te文件,这样会使cts跑不过,因而给domain特定的block device访问权限。

可以在device/qcom/sepolicy/msm89xx/file_context定义相关block device,如果仍发现编译报错,报错原因是相关的block device没有定义,可以到/external/sepolicy/device.te做定义。然后再根据第II步所示,继续修改。

访问default property超过权限

有时会碰到访问default property的访问权限被neverallow,导致编译不过,同理不可修改domain.te,可以在device/qcom/sepolicy/common/property.te中 定义一类property

type demo_prop, property_type;
  • 1
  • 2

在device/qcom/sepolicy/common/property_context上匹配所需要访问的property

adb.on                     u:object_r:demo_prop:s0
  • 1
  • 2

然后再根据第II步所示,继续修改。

操作访问

当需要手动进行一定的操作的时候,可以 cat /dev/kmsg,看需要什么样的权限,然后找到特定的te文件,进行操作

如在mout某分区时

avc: denied { associate } for pid=4256 comm="mount" scontext=u:-Object_r:fac_file:S0 (file:S0) (file:S0 (file:S0)) tcontext=u:-Object_r:fac_file:S0 (file:S0) (file:S0 (file:S0)) tclass=filesystem permissive=0
  • 1
  • 2

说明mount没有相关的权限,可以在init.te中加入相关的权限。

版权声明: 作者:alex wang版权:本文版权归作者和优快云共有 转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢 要求:未经作者同意,请保留此段声明;在文章中给出原文连接;否则必究法律责任

转自:http://blog.youkuaiyun.com/u013983194/article/details/50462694

<think>我们正在处理一个关于在Android 14的MTK平台上禁用SELinux的请求。请注意,SELinux(安全增强型Linux)是Android安全模型的重要组成部分,通常不建议禁用它,因为这会使设备面临安全风险。然而,在某些开发或调试场景中,可能需要临时禁用。 根据提供的引用,我们有一些关于Android启动过程和SELinux实现的背景信息。特别是: - 引用[1]提到了SELinux实现的步骤总结。 - 引用[2]描述了Android启动过程的概述。 - 引用[3]涉及安全上下文、策略以及如何修改SELinux模式。 - 引用[4]展示了init进程在启动过程中如何显示Logo。 在Android中,SELinux模式通常在启动时由内核命令行参数或`init`进程设置。常见的SELinux模式有: - `enforcing`:强制执行安全策略。 - `permissive`:仅记录不强制执行(即打印警告但不阻止)。 - `disabled`:完全禁用SELinux。 在Android 14上,特别是MTK平台,禁用SELinux通常需要修改启动参数并重新编译boot镜像(boot.img)。由于设备制造商可能对启动过程有定制,因此步骤可能因设备而异。 以下是禁用SELinux的一般步骤(注意:这需要解锁bootloader并拥有编译Android源码的环境): ### 步骤1: 获取设备boot.img - 方法1:从设备中提取(需要root权限): ```bash adb shell su -c "dd if=/dev/block/platform/bootdevice/by-name/boot of=/sdcard/boot.img" adb pull /sdcard/boot.img ``` - 方法2:从官方固件包中提取。 ### 步骤2: 解包boot.img 使用工具如`magiskboot`(来自Magisk)或`unpack_bootimg`解包: ```bash magiskboot unpack boot.img ``` 解包后,你会得到`kernel`、`ramdisk.cpio`等文件。 ### 步骤3: 修改ramdisk中的init.rc或selinux相关脚本 在ramdisk中,通常有一个文件负责设置SELinux模式。这可能是: - `init.rc` - `init.<device_name>.rc` - 或者直接在`init`二进制文件中硬编码。 我们需要在ramdisk中找到设置SELinux模式的地方。通常,在`init.rc`中会有类似: ``` on early-init # Set SELinux mode setenforce 1 ``` 或者在内核命令行参数中设置(在boot.img的头部信息中)。 为了禁用SELinux,我们可以: 1. 修改内核命令行参数:添加`androidboot.selinux=permissive`或`androidboot.selinux=disabled`(但注意,在较新内核中,`disabled`可能被移除,所以通常用`permissive`)。 2. 修改`init.rc`:将`setenforce 1`改为`setenforce 0`(设置为permissive模式),或者完全移除SELinux的初始化(不推荐,可能导致启动问题)。 更安全的方法是设置内核命令行参数。在解包boot.img后,我们可以查看`header`文件(如果有)中的命令行,然后添加或修改参数。 ### 步骤4: 重新打包boot.img 使用相同的工具重新打包boot.img: ```bash magiskboot repack boot.img ``` 这将生成新的boot.img(通常命名为`new-boot.img`)。 ### 步骤5: 刷入修改后的boot.img 使用fastboot刷入: ```bash fastboot flash boot new-boot.img fastboot reboot ``` ### 注意事项 - 禁用SELinux可能会违反系统完整性(SafetyNet/Play Integrity认证可能失败)。 - 在Android 14上,由于强化的安全机制,完全禁用SELinux可能不可行,系统可能无法启动。因此,更推荐设置为`permissive`模式。 - 有些设备在`init`中会检查内核命令行参数,但具体实现可能因设备而异。 ### MTK平台的特殊性 MTK平台可能有自己的初始化脚本。在ramdisk中,可能有一个名为`init.mtXXXX.rc`的文件(XXXX是芯片型号),我们需要检查该文件。 另外,MTK平台可能使用`lk`(Little Kernel)作为bootloader,但修改boot.img通常足够。 ### 替代方法(无需修改boot.img) 如果设备已经root,并且有内核模块支持,可以尝试在运行时禁用SELinux(但Android 14上可能很难): ```bash adb shell su -c "setenforce 0" ``` 但这个方法只是临时将SELinux从`enforcing`切换到`permissive`,并不能完全禁用,而且重启后会恢复。 ### 永久禁用 要永久禁用,必须修改启动镜像(boot.img)中的设置。 ### 警告 禁用SELinux会降低设备安全性,请仅在开发调试环境中使用。 ### 相关问题 1. 在Android设备上,如何临时将SELinux设置为permissive模式? 2. 修改boot.img后刷入导致设备无法启动,如何恢复? 3. 在Android 14上,SELinux有哪些新特性?</think>### 如何在 Android 14 MTK 平台禁用 SELinuxAndroid 14 MTK 平台上禁用 SELinux 需要修改内核启动参数和系统配置,**但需注意**:禁用 SELinux 会严重降低设备安全性,仅建议在开发调试阶段使用。以下是具体步骤: --- #### 方法 1:通过内核启动参数禁用(推荐) 1. **修改设备树 (Device Tree) 或内核命令行** 在 MTK 平台的 bootloader 阶段添加 `androidboot.selinux=permissive` 或 `androidboot.selinux=disabled` 参数: ```bash # 修改内核命令行 (cmdline) bootargs = "console=tty0 androidboot.selinux=disabled ..."; ``` *注:具体修改位置在 MTK 平台的设备树文件(如 `dts/<chip>/<board>.dts`)或内核配置中。* 2. **重新编译并刷写 boot 镜像** ```bash make bootimage # 在 Android 源码环境中 fastboot flash boot boot.img ``` --- #### 方法 2:运行时临时禁用(需 root) ```bash adb shell su setenforce 0 # 切换为 permissive 模式(不强制执行策略) # 或完全禁用(需内核支持) echo 0 > /sys/fs/selinux/enforce ``` *注意:重启后失效,且 Android 14 可能限制此操作。* --- #### 方法 3:修改 SELinux 策略文件(永久生效) 1. **关闭 SELinux 强制模式** 编辑 `system/core/init/selinux.cpp` 源码: ```cpp // 修改函数:bool IsEnforcing() { // return false; // 原代码返回 true 或检查属性 // } ``` 2. **禁用策略加载** 在 `init.rc` 或 MTK 的 `init.<device>.rc` 中注释 SELinux 初始化: ```bash # on early-init # start ueventd # start selinux_setup # 注释此行 ``` 3. **重新编译系统镜像** ```bash make -j$(nproc) # 编译整个系统 fastboot flash system system.img ``` --- ### 验证是否禁用 ```bash adb shell getenforce # 应返回 "Disabled" 或 "Permissive" adb shell dmesg | grep selinux # 检查内核日志 ``` --- ### 注意事项 1. **安全风险** 禁用 SELinux 后恶意应用可能获得系统权限,仅限测试环境使用[^1]。 2. **兼容性问题** Android 14 强化了 SELinux 约束,部分功能(如 HAL 服务)在禁用后可能异常[^3]。 3. **厂商定制** MTK 平台可能在 `vendor/mediatek/proprietary` 中有额外 SELinux 策略,需同步修改。 > **重要提示**:生产设备严禁禁用 SELinux!调试建议使用 `permissive` 模式记录策略拒绝日志,再针对性优化策略[^3]。 --- ### 相关问题 1. 如何在不禁用 SELinux 的情况下调试权限拒绝问题? 2. Android 14 的 SELinux 策略相比旧版有哪些关键改进? 3. MTK 平台如何定制 SELinux 策略以允许新增硬件访问? [^1]: 引用自 SELinux 实现步骤总结 [^3]: 引用自 SELinux 安全策略与修改方法 [^4]: 引用自 Android 系统启动过程分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值