Android Root权限检测以及规避方式

posts/android-root%E6%9D%83%E9%99%90%E6%A3%80%E6%B5%8B%E4%BB%A5%E5%8F%8A%E8%A7%84%E9%81%BF%E6%96%B9%E5%BC%8F

警告

给手机获取 Root 是非常危险的行为,如果你不知道自己在什么请不要尝试轻易的 Root。本文章只介绍 Root 的获取与 APP 检测以及如何绕行的方式,并不鼓励任何人尝试去 Root 手机系统,如有且造成的风险与本文无关。

前言

最近自己使用多年的小米 Mix 3 使用 MIUI EU 仍存在待机一晚上会掉 15% 左右的电量的问题(所有 Google 全家桶都已被停用,且电池还是最近换过的)。并且通过 battery-historian 查不出来耗电问题后将系统换成了 XDA 上 非官方的 LineageOS 编译版本。起初使用还挺好的,而且耗电原没有 MIUI 耗电严重,但后来当我在安装米家后却被提示手机已经 Root。当我通过 Termux 通过 su 程序的调用,以及 AIDA64 都没有检测到手机被 Root(而且当前系统现在还是开着 SELINUX 的)。这已经超出了我默认对应用程序检测手机是非被 Root 的知识范围。出于好奇,我打算研究下现在的应用是如何检测 Root 的。通过查阅网上的资料发现,检测的方式如下几类。

Root 检测及规避方式

SU 二进制文件和包扫描

对于早期的 Android Root 可以追溯到 RageAgainstTheCage 的方式,即 adb fork 漏洞获取最高权限后添加 su 文件进行 root。

后期通过采用 SuperSU 方式,从 TWRP 进行刷入 Root。这些方式显然有一个特点,就是生成的 su 文件容易被 APP 通过故意调用的方式主动检测。

再后有了 Magisk 应用,通过替换 boot.img 在不修改系统的前提进行 Root 获取。且可通过 Magisk Hide 针对应用主动规避调用 su 文件的方式进行检测。但是仍有部分应用通过添加包名黑名单方式来对手机安装的程序进行扫描来判断手机是否 Root,而 Magisk 可通过随机包名绕过检测。

但后来出于 Magisk 开发者本人专注于开发 Magisk 核心功能且自带的 Magisk 仍有很多缺陷的原因,在 v24.1 版本移除该功能模块并停止该功能开发,但现在仍存在一些出色的 Root Hide 模块,例如 Shamiko


以下三种方式但我目前不清楚是否和 Root 有关,只能认为设备处于不安全状态。

自定义 ROM

通过检测自定义 ROM 中的 Build Tags 为 test-key 可以认定该设备是否 Root,此方式可通过修改build.prop方式将test-release改为release-key绕过。

build.prop 危险属性

build.prop 存在一些危险属性,例如ro.debuggable以及ro.secure。程序可通过检测这两个设备判定设备是否 Root。确保系统安全这两个属性应为 0 和 1。

路径权限

由于 Android 系统内核还是 Linux 内核采用 EXT4 文件系统,虽然 Android 系统提供了 Sandbox 的运行模式,但是如果路径权限是开放的,那么任何人都可以写这个路径。比如/data/system等。现在的 Android 系统版本默认都设置了不可写,甚至/为不可访问状态,只能通过系统的 API 访问一些关键信息。至于路径权限被篡改的原因应该很少见。

总结

通过上述检测方式筛查后发现 Build Tags,以及 build.prop 中的 ro.debuggable 属性处于危险状态。进入 TWRP 后通过命令行修改 build.prop 文件后问题就解决了。大概是因为编译 CUSTOM ROM 的原因,之前也用过第三方 ROM,但都是 OFFICIAL 的,所以没有遇到这个问题。

参考链接