本文是我们在DEF CON
29大会上的演示视频的配套文章,视频的链接地址为https://www.youtube.com/watch?v=z4gIxdFfJDg。
要想在安卓手机上获得root权限,通常需要解锁引导加载程序,禁用手机的签名验证,这样的话,我们就可以部署一个修改过的安卓引导映像了。在Qualcomm芯片组上,这是一个标准化的过程,可以使用安卓引导加载程序中的命令来执行解锁。智能手机制造商经常修改引导加载程序以增加特定的限制,但是,这通常要求使用他们自家的工具。
这些自定义的限制通常包括:强迫创建一个用户账户来请求解锁,并在允许解锁之前强制等待一段时间,等等。
那么,手机制造商为什么要添加这些限制呢?原因如下所示:
◼ 防止没有经验的用户因为受骗而削弱手机的安全性;
◼ 防止第三方在售前给设备加载恶意软件(如供应链攻击);
◼ 制造商可以跟踪是谁解锁了他们的引导加载程序。
我购买的手机就有这些限制,要求我等待七天后才能获得设备的root权限。由于这个原因,我决定调查我是否可以绕过同一制造商生产的旧智能手机的等待期。我给自己设定了一个挑战,即在七天等待期结束前绕过引导加载程序的保护。
标准绕过方法
实际上,现在已经有一些标准方法可以绕过这些限制,然而,它们都具有相应的风险。
其中,最常用的方法就是进入高通公司紧急下载模式。这是一种低级别的紧急状态启动模式,可以使用诊断工具将具有签名的“加载器”有效载荷上传至芯片,这样,就可以直接修改设备的分区了。虽然这种方法是有效的,但这要求用户先引导进入该模式(并非所有用户都可以直接进入该模式),并且需要访问可能无法用于该设备的已签名加载程序ELF文件。
第二种常见的方法是在硬件层面上攻击设备。通过拆卸手机,并连接电路板上的EMMC芯片,就能在配置分区中设置“解锁”位,从而获得解锁权限。现在,已经有一些这方面的公开资料,其中说明了应该连接到哪些引脚,但是这通常需要一些硬件知识和动手能力。此外,硬件一旦受到物理损坏,手机就可能永远变砖了。
因此,我可不想使用这两种方法,相反,我的目标是攻击第二阶段的引导加载程序。这是因为,虽然通过第一阶段的引导加载程序可以进入紧急下载模式,但是在引导过程的下一个阶段,却可以获得额外的诊断和管理工具。
SDM660安卓手机
目标设备是2017年发布的一款中档手机,它使用Qualcomm Snapdragon 660作为核心芯片组。
对制造商实现的自定义解锁功能的分析表明,它会将一个较小的唯一值从手机发送到解锁工具,并在其服务器上生成一个签名。七天后,这个签名将被发送到手机上并进行验证,从而完成解锁。我是借助于Windows主机和USBPCAP USB分析软件对这个过程进行分析的。
我发现,对唯一值的请求、签名的发送以及对引导加载程序解锁的请求,都是通过安卓引导加载程序的Fastboot界面完成的。通过手机上的ADB重新启动到引导加载程序模式,或者在启动时按住音量下降键,就可以访问这个界面。然后,我们可以使用命令行工具“fastboot”,通过USB访问该界面。
Fastboot工具
这个工具能够简化对标准和定制的功能的访问,包括闪存分区、获得OEM特定的数据,或引导至不同的模式。对这个工具的分析表明,fastboot协议非常简单,可以用基本的C++代码和LibUSB进行实现。
分析表明,这个工具的所有的命令都是通过一个USB端点以ASCII文本形式发送的,而对命令的响应则是由另一个端点异步发送的。同时,虽然可以借助于某些程序库来简化对fastboot界面的访问,但是,我还是决定使用LibUSB,因为这样能够更好地控制通信过程。
ABL引导加载程序
实际上,fastboot界面是由安卓引导加载程序提供的,它属于第二阶段的引导加载程序,存储在手机的“abl”分区中。这个引导加载程序的作用,就是验证和加载手机的安卓映像和恢复映像,以实现其标准功能,或接收fastboot命令。需要说明的是,这个引导加载程序的高通版本是完全开源的,以便于手机制造商对其进行修改。