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的前世今生。
相较于封闭生态的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方式。
本文将使用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。
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模块的开发。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。