Android15 userdebug版本不能remount

背景描述:

最近调试Android Vendor Hal的时候发现一个奇怪的现象: android userdebug版本刷到设备中,执行adb root没提示错误,但是没有获取到root权限。

Android设备运行的系统版本有三种情况:user版本、userdebug版本和eng版本。user版本默认是不允许root,userdebug通常是开发调试使用版本可以做root操作。

下面以这个具体的问题出发,说明是如何确定问题的原因以及解决的方法。

先揭晓问题的原因:SELinux状态被设置成了"Enforcing",即SELinux处于强制模式,会限制root权限。

发现问题

如下,adb root执行看着是成功了,但是当执行一些需要root权限的操作时会提示Permission denied。

确认问题

1.确认设备中的系统版本是usedebug

如上,确认设备中跑的系统是userdebug版本。根据以往经验,这种版本一般是能做root操作的。

2.确认是不是root成功

如上,虽然su命令执行提示是"inaccessible or not found"不确能准确说明是"inaccessible"还是"not found", 但是从命令行提示符可以判断执行操作的用户应该还是普通用户,而非root。正常的root用户如下:

3.检查SELinux状态

SELinux是Android4.3以后引进的Linux安全机制,Enforcing说明SELinux处于强制模式,可能会限制root权限。

至此,基本确定问题原因,接下来就是怎么改的。

解决问题

尝试临时解决

如上,尝试临时修改的两种方法都因为权限不够失败了。这时候通过命令应该能看到SELinux拒绝相关日志 (关键词:"avc")。

尝试永久解决

根据以往经验,这时通常有两种方法修改SELinux策略为Permissive:

  1. 从bootload阶段,进入到特权模式,然后修改。 这种方法失败了,因为设备有点特殊不像手机能按键选择。
  2. 重新做个android镜像,制作镜像时设置SELinux为Permissive模式

接下来介绍怎么修改,使制作出来的android镜像SELinux模式为Permissive。

修改Android SELinux模式为Permissive步骤

1.修改镜像打包阶段板级配置脚本BoardConfig.mk中BOARD_BOOTCONFIG

如下图,在Android构建源码device/vendorX/platformX/BoardConfig.mk中有如下内容:

将enforcing改成permissive

2.重新打包bootimage

bash 复制代码
$cd aosp
$source build/envsetup.sh
$lunch xx_userdebug
$make bootimage

3.替换boot.img到设备

使用fastboot flash刷新bootimg分区,或者使用自研工具替换boot.img到设备

补充:SELinux介绍

三种模式介绍

Disabled(禁用)模式

核心特征:SELinux完全关闭,不提供任何安全保护

行为表现:

  • 内核不加载SELinux策略
  • 所有访问控制仅依赖传统Linux DAC (自主访问控制)
  • 不生成任何SELinux审计日志

使用场景:

  • 紧急故障排查(如:当SELinux导致系统无法启动时)
  • 性能测试(消除SELinux开销)

重要限制:

  • 从Disabled切换到其他状态必须重启系统
  • 禁用状态下修改的文件可能丢失安全标签

Permissive(宽容)模式

核心特征:只记录不拦截的调试模式

行为表现:

  • 完整加载并解析SELinux策略
  • 检测到策略违规时仅记录到日志而不阻止操作
  • 生成详细的avc:denied审计日志

使用场景:

  • 策略开发和调试阶段
  • 排查权限拒绝问题
  • 收集新策略所需的访问规则

操作命令:

复制代码
#setenforce 0  #切换到Permissive(无需重启)
#getenforce  #切换成功的话,这里返回"Permissive"

Enforcing(强制)模式

核心特征:完全启用安全保护

行为表现:

  • 加载并强制执行SELinux策略
  • 拦截所有违反策略的操作并记录日志
  • 提供MAC(强制访问控制)保护

使用场景:

  • 生产环境(默认安全配置)
  • 安全敏感应用(金融、企业设备)
  • Google要求Android设备必须默认启用

操作命令:

复制代码
#setenforce 1  #切换到Enforcing(无需重启)
#getenforce    #成功切换的话,这时返回"Enforcing"

三种模式转换关系

启用SELinux(Disabled->Permissive/Enforcing)必须重启。Permissive <-> Enforcing可通过setenforce实时切换。关闭SELinux(任何状态->Disabled)必须重启。

相关推荐
2501_9371931410 分钟前
TV 电视影视大全:全终端流畅观影技术解析
android·源码·源代码管理·机顶盒
catchadmin20 分钟前
PHP 现在可以零成本构建原生 iOS 和 Android 应用 NativePHP for Mobile v3 发布
android·ios·php
独自破碎E29 分钟前
【回溯】二叉树的所有路径
android·java
安卓机器32 分钟前
安卓玩机工具推荐------免root权限使用的 支持安卓4至安卓16系统的系统开源应用 推荐
android·反编译apk
summerkissyou198733 分钟前
android-蓝牙-广播启动-startAdvertising和startAdvertisingSet区别
android·蓝牙
雪球Snowball37 分钟前
【Android关键流程】Configuration变更时更新应用程序配置
android
h7ml38 分钟前
于 CompletableFuture 的异步编排优化企业微信通知发送性能
android·windows·企业微信
子木鑫41 分钟前
[SUCTF 2019] CheckIn1 — 利用 .user.ini 与图片马构造 PHP 后门并绕过上传检测
android·开发语言·安全·php
风清云淡_A43 分钟前
【ANDROID】使用webview实现加载第三方的网页效果
android
吴声子夜歌1 小时前
RxJava——操作符详解(四)
android·echarts·rxjava