当前位置: 首页 > java >正文

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

$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)必须重启。

http://www.xdnf.cn/news/10202.html

相关文章:

  • reverse_ssh 建立反向 SSH 连接指南 混淆AV [好东西哟]
  • 腾讯云推出云开发AI Toolkit,国内首个面向智能编程的后端服务
  • Vue 3 中ref 结合ts 获取 DOM 元素的实践指南。
  • BLE 广播与扫描机制详解:如何让设备“被看见”?
  • Deseq2:MAG相对丰度差异检验
  • 算法分析与设计概述
  • 达梦的TEMP_SPACE_LIMIT参数
  • 如何实现一个请求库?【面试场景题】
  • NLP学习路线图(十三):正则表达式
  • CloudCompare-源码分析-绘制与 3D 场景分离的“前景”元素
  • 【harbor】--harbor仓库部署
  • win32相关(临界区)
  • 免费且好用的PDF水印添加工具
  • 【图像处理入门】2. Python中OpenCV与Matplotlib的图像操作指南
  • 第304个Vulnhub靶场演练攻略:digital world.local:FALL
  • 考研系列—操作系统:第四章、文件管理(part.1)
  • 软件工程方法论:在确定性与不确定性的永恒之舞中寻找平衡
  • CSS专题之水平垂直居中
  • Unity3D仿星露谷物语开发58之保存时钟信息到文件
  • java 微服务中,微服务相互调用 feign 和flux 如何选择
  • 在 RK3588 上通过 VSCode 远程开发配置指南
  • 基础补充(扩展方法/协变)
  • 设计模式——建造者设计模式(创建型)
  • Spring Boot 自动参数校验
  • 基于大模型预测带状疱疹(无并发症)诊疗方案的研究报告
  • 基于图神经网络的自然语言处理:融合LangGraph与大型概念模型的情感分析实践
  • 每日c/c++题 备战蓝桥杯(P2240 【深基12.例1】部分背包问题)
  • Photoshop智能图层 vs 普通图层:核心差异与适用场景对比
  • 进程间通信(消息队列)
  • 11.21 LangGraph多轮对话系统实战:三步构建高效信息整理引擎,效率提升300%!