Root,对于任何手机发烧友、玩机客、从事移动设备研发的人员来说,并不陌生,它代表绝大部分移动设备的使用者能够掌握到的最高权限。
从技术层次来讲,用户拥有了修改系统文件的权限,甚至可以控制账户、增加或删除硬件等,但对普通用户来说,最大的一个用处就是卸载“Root 之前无法卸载的软件”,部分品牌商在手机出厂之前内置安装了一些无法卸载的软件,这些软件在手机 Root 之后,都可以被卸载掉,Root 相当于让用户拥有了自由增减软件的权限。
Root 的前世今生
Root 一词起源于 Linux/Unix 系统,众所周知,Linux/Unix 系统的文件系统以根“/”出发向下形成一个倒置的树型文件系统结构,Root 即根的英文释义,那么 Linux/Unix 系统就以 Root 账号所拥有的权限作为系统管理员的权限,口口相传,Root 就代表了 Linux/Unix 上最高的权限。
在移动设备发展的初期,各种移动设备所使用的操作系统各不相同,比较出众的有塞班、Windows Phone、iOS、安卓。随着市场的选择,只有安卓与 iOS 留存下来,成为普及的手机操作系统。按照 POSIX 标准协议和开源协议的规定,安卓与 iOS 都应该保留了 Linux/Uinx 上的相应的功能。
其中,安卓就是以 Linux 作为基础进行构建的系统,而 iOS 则是使用了以 xnu 为内核的 Darwin(Darwin 来自于 BSD)。按照开源操作系统而言,安卓和 iOS 都理应保留所有用户使用 Root 账户去掌控自己设备的权限。
但现实情况是,安卓与 iOS 不允许用户使用 Root 权限,尤其是 iOS 对于 Root 权限的监控与封锁达到了前所未有的地步,以至于对 iOS 的 Root 被称作“越狱”。iOS 上的 Root 过程相对于安卓更为复杂与困难,所以本文主要以安卓系统的 Root 为主,详细介绍 Root 的前世今生。
安卓系统的三大 Root 方式
相较于封闭生态的 iOS 系统,安卓的 Root 方式可谓是从百花齐放到万物归一。不同安卓系统版本,获取 Root 权限主流方式不同。
在安卓手机上,获取 Root 权限主要有三种方式:漏洞、OEM 官方解锁、工厂方式。其中通过漏洞方式获取 Root,是开发者最早的探索;工厂模式获取 Root 则是通过如骁龙 9008 模式通过底层串口将特殊的 ROM 刷写入手机进而获取 Root;官方解锁的方式则是 OEM 产商提供给一些发烧友的“通道”,通过解锁 Bootloader 锁获取刷写 ROM 获取 Root。
第一阶段:百家漏洞齐争鸣,先驱 CVE-2009-2692 漏洞
在安卓系统早期时忽略了安全性问题,许多在 Linux 中产生的安全问题,都能在安卓得以复现,其中最早有公开记录并可追溯的是 Znix 利用 Linux 漏洞 CVE-2009-2692 编写的安卓版本提权程序,代码如下:
利用蓝牙协议触发 sendpage 漏洞
权限提升攻击载荷
该漏洞的产生主要是 sock_sendpage 没有对 socket_file_ops 数据结构的 snedpage 字段字段做指针检查,有些模块不具有 sendpage 功能,将指针初始化为 NULL,此时直接调用 sendpage 会导致直接调用空指针导致报错并进而进行权限提升。Znix 直接将现有有效用户 id(euig)与有效用户组(egid)的指针赋值为 0 即 Root 用户与 Root 用户组,再将有效用户与有效用户组指针赋给真实的用户指针与真实的用户组指针,从而达到权限提升的目的。然后利用蓝牙协议与 send_page 的漏洞触发这一攻击载荷。
Znix 发布该 exploit 的时间点在安卓 _ndk_r1 版本发布后的两个月。在该 exploit 发布后,人们发现在安卓上通过漏洞的形式获取 Root 权限方式大为可行,随即越来越多的安全人员与发烧友开始在安卓上挖掘系统漏洞,导致安卓的安全问题呈现井喷式的爆发。不过这场闹剧随着 Google 不断的修复与 SElinux 的引入,闹剧在安卓 4.4 戛然而止,安卓系统进入了一个稳定的时期,安卓的 Root 也进入了一个新的探索时代。
使用 Linux 系统的人都知道,在 Linux 上有一个程序叫/usr/bin/su,用户可以通过 su 命令来切换身份,安卓的基础是 Linux,在安卓版本 1.0-4.4 中,安卓默认安装了 su 程序,使用者可以通过使用 su 进行获取 Root,只需要 su 程序的权限为 Access: (4755/-rwsr-xr-x) Uid: ( 0/ Root) Gid: ( 0/ Root)。
第二阶段:混乱中的探索,supersu 与 superuser
Google 在安卓 4.4 版本,基本上将 Linux 中可提权的漏洞修复并限制利用漏洞进行提权的方式。安卓 4.4 及以上,Anroid 也不预装 su 程序,并且加入 SElinux,就算拥有 4755 权限的 su 也无法达到完美 Root。开发者们就尝试将改造后的 su 写入到安卓的/system 下,让需要 Root 权限的程序通过/system 下的 su 程序进行执行。
而向/system 下写入 su 需要提前解锁(unlock)安卓手机,该方式比利用漏洞提权稳定性更高。许多大神都开始编写不同的 su 程序,其中比较有名的就是 chainsDD 的 su 与 chainfire 的 suspersu,而单有获取 Root 权限的方式仍然不够,还需要一个分发 Root 权限的管理工具,koush 的 superuser 恰好补齐了这一缺点,让这一体系得以完善。
不过好景不长,该方法引起了 Google 的关注,Google 在后续发布的版本中对/system 等分区进行完整性校验,使得修改 system 分区变得不可行,在 2018 年 10 月,chainfire 宣布不再维护 supersu。而另一位开发者则以巧妙的方式,让 Root 又变为可能。
第三阶段:从混乱中受到启发,走向归一的 Magisk
一个名叫 topjohnwu 的开发者,从 supersu 中受到启发,他仍然使用 supersu 的原理获得 Root 权限,但是他并不对/system 等分区做额外的修改,他通过尝试发现,虽然/system 等分区无法修改,但是可以在/system 分区下进行添加挂载点,于是他用了一种 overlay 的方法,让用户刷写特殊的 boot.img,修改启动时的挂载操作,做出了一个 overlay 版本的 system,所有的操作都在这个 system 上进行,这样就避开了对原有 system 的修改,完成原有 supersu 的功能,而这款软件就是现在大部分人熟知的 Magisk。Magisk 不仅完成了获取 Root,并且集成了 Root 权限的管理器。
随着 topjohnwu 加入谷歌,magisk 的代码需要 google 安全团队进行审计,magisk 某种程度上拥有了官方背书,是目前最稳定的 Root 方式。
小白该如何 Root 安卓的手机
本文将使用 TWRP 方式教大家如何使用 Magisk 获得 Root 权限。在获取 Root 前,需要解除 BootLoader 锁,请读者自行联系 OEM 厂商解除 Bootloader 锁。
顶象特别提醒:Root 有一定的风险,或造成手机无法使用,请谨慎操作,本文不对任何后果承担相应责任。
1、准备 adb fastboot 命令工具、magisk 以及对应的 twrp.img(不同厂商需要的 twrp 镜像不同,请读者自行查询所需的 twrp 镜像)
2、使用 adb 命令将 Magisk 放入到 sdcard 中,命令如下:
3、进入 bootloader 界面,输入对应的 fastboot 命令,进入 twrp 界面。
4、选择 Install,然后选择 Magisk.zip。
5、进入安装 Magisk 的界面,将滑动条从左滑到顶端。如果出现如下界面,则证明安装 Magisk 成功。
6、重启手机后,使用将 maigsk.zip 改回 magisk.apk,使用如下命令安装 Magisk 管理器。
随后可以在手机中打开 Magisk,发现 Magisk 已经正常工作。
如何检测设备的 Root 操作
对于安全从业者与一些需要风控的企业,需要得知用户的手机是否处于风险状态,是否被 Root。
1、包名检测。
由于 Magisk 是通过 Maigsk.apk 进行管理它的 su 权限分发的,所以可以使用获取包名的方式检查用户手机是否存在 Magisk App 来得知用户是否使用了 Magisk Root,具体代码如下:
尝试运行程序,得到如下结果。
在上述方法中,虽然能检测到用户安装了 Magisk,但是由于法律对用户隐私的保护,获取包名的方式会触及隐私合规红线,所以这种方法需要一定的权限,在使用该方法时要慎之又慎。
2、专业安全产品。
顶象设备指纹、顶象业务感知防御平台能够实时有效识别 Root 风险。
顶象设备指纹:能精准识别模拟器、root、越狱、调试、代码注入、多开、VPN 代理等风险。包含,iOS 平台 hook、越狱行为,安卓 root、debug、内存 dump、注入、多开、模拟器、漏洞攻击等风险行为,WEB 平台下浏览器颜色深度、分辨率,浏览器与系统、UA 的匹配性和一致性、cookie 是否禁用等行为。
顶象业务安全感知防御平台:基于威胁探针、流计算、机器学习等先进技术,集设备风险分析、运行攻击识别、异常行为检测、预警、防护处置为一体的主动安全防御平台,能够实时发现摄像头遭劫持、设备伪造、设备 Root 等恶意行为,有效防控各类人脸识别系统风险。它具有威胁可视化、威胁可追溯、设备关联分析、多账户管理、跨平台支持、主动防御、开放数据接入、防御自定义和全流程防控等特点。
写在最后
本文从 Root 的历史出发,讲述了获取 Root 的发展历史以及轶事,教大家从 0 到 1 完成对自己安卓手机的 Root,提出了一些有效的检测 Root 的方式。Root 与 HOOK 一样,是一把双刃剑,在普通人手里,它可以让系统不再受到约束,可以带来更好的手机使用体验,但在黑灰产手里,会变成非法牟利的工具,作为安全从业者,我们要辩证地看待每项技术,对非法行为我们要重拳出击,为安全事业添砖加瓦。
在上一篇文章《欲知己之所防,先知彼之所攻——论 Hook 技术的攻防对抗》我们提到 Hook 的攻击,Hook 一定需要 Root 吗?答案是否定的。如果开发者有能力修改 art 源码、劫持 Zygote,是可以完成 Rootless HOOK 操作的,Root 是为了让 HOOK 及 HOOK 模块管理工具的使用降低成本,让 HOOK 操作者的重心不再放在 HOOK 的前置条件,而是更专注于 HOOK 模块的开发。