Android Bootloader分析

Bootloader基本背景

Bootloader是系统刚启动时运行的一段或几段程序,这些程序一般是初始化物理硬件设备,引动系统内核启动。在X86常说的grub就是一个bootloader,不过在移动平台用的较多的Bootloader是uboot。虽然移动平台大多使用uboot作为它们的bootloader,大部分厂商会在uboot之外额外有几个跟芯片相关的bootloader,启动处理流程均大不一样。处于安全方面的考虑,这些厂商的bootloader一般都是闭源的。由于bootloader在系统内核前运行,很多安全框架如三星的企业级解决方案kNOX都是需要将bootloader作为其安全架构的一部分,如果bootloader被攻破的话,危险级别几乎都会是致命的,所以这部分内容也一直是黑客们进行漏洞挖掘的领域。特别地,如果能够控制bootloader,iphone的越狱、Android的root以及在手机上安装第三方的ROM就都不成问题。由于手上折腾较多的是三星的exynos系列芯片的板子(像三星的Galaxy S、魅族MX等都是这款芯片),本文主要以这系列产品进行分析。

Bootloader组成

Bootloader中一般都会有好几个文件组成,如android手机一般会有:PBL(Prime Bootloader), SBL1/2/3(Second Bootloader), APPSBL(有的也称为aboot、hboot), HLOS(基带baseband相关)和TZ(TrustZone相关的镜像)。而iphone手机一般是:BootRom(PBL, SecureROM), LLB(Low Level Bootloader),iBoot(stage 2 bootloader,常用于recovery模式), iBBS(精简版的ibOOT)和iBEC(用于从DFU-Device Firmware Upgrade模式恢复)。对于我的Exynos板子,由于其并非手机设备,包含的bootloader相对较少,有:PBL( 也叫bl0,烧在iROM的只读代码), BL1(stage 1 bootloader), BL2(stage 2 bootloader,就是uboot中的spl), tzsw(trustzone firmware)和uboot

Bootloader处理流程

Bootloader分为多阶段的引导,这部分除了正常的硬件初始化工作外,还有我们更关注的一点是签名验证。每一阶段都先验证下一阶段的镜像病验证通过后才加载,形成一个安全信任链,保证这些bootloader和后面的内核的完整性。下图为系统启动的顺序图。

exynos secure boot sequence

exynos secure boot sequence

系统在通电时运行烧在iROM中的bl0代码,检查bl1的签名并将其加载到iRAM中并跳到bl1中运行,bl1运行完会加载bl2到iRAM,检查他们的签名然后运行bl2,bl2加载会tzsw和uboot到DRAM并验证他们的签名然后跳到tzsw中运行,直到这里为止,系统还处在安全世界(Secure World)中,在运行完tzsw之后将转到普通世界(Normal World)中并运行uboot。而uboot最主要的作用就是加载并运行系统内核(如Android内核)。我们也可以查看T6的启动过程了解详情:T6 boot.

总结下来,对于一般的系统,如果没有启用secure boot的话,启动过程如下图:

exynos normal boot

exynos normal boot

依次按照bl0->bl1->bl2->uboot进行,而启用了secure boot的启动顺序则如下:

secure_boot

了解完大致的启动过程后,接着我们就想知道烧在iROM中的bl0究竟做些什么事情呢?请看下图:

iROM BL0 boot

iROM BL0 boot

就两件事:初始化硬件并加载和验证bl1签名。 接着就是bl1的工作了,bl1做的事情依旧看图:

bl1 detail

bl1 detail

还有就是bl2的工作:

bl2 sequence

bl2 sequence

很多同学非常关注tzsw到底做了些什么事情,这部分内容我暂时不贴出来,稍微保留点干货(其实就是处理Linux kernel的smc请求,如初始化l2 cache、唤醒多核等等)。 在反汇编这几个镜像时会看到文件最后有一串不为0的内容,那部分就是签名内容,具体地,bl1镜像的布局如下:

bl1 memory layout

bl1 memory layout

最后的512或2014字节为签名。因为三星在出厂时将它的public key烧在了板子上,镜像的签名必须由三星的private key才可签,但是这样的话控制权全在三星手上,更新firmware或内核时都必须经过三星这边才行,如果产品公司如银联想自己控制这套流程的话,就可以将自己的public key发给三星,三星将银联的public key加到bl1签名最后,之后的验证就验证银联的签名即可,如此一来后面的镜像包括bl2, tzsw, linux kernel等的更新都可由银联控制。

已爆出的Bootloader漏洞攻击

Bootloader的漏洞已被爆出不少,相信还有很多的0-day漏洞有待挖掘,这里列举三个bootloader漏洞:

不知道什么时候能挖到前面几个阶段的bootloader的漏洞,这样就可以直接利用trustzone的特性控制系统了。

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章