Android的安全启动称为“Verified Boot”。顾名思义,在启动阶段,通过执行“验证”动作来确保所有执行代码均来自可信来源(通常是设备的OEM方),以防在此过程中受到攻击或损坏。
进一步地讲,在启动过程中,建立了一条从受硬件保护的信任根到bootloader,再到boot分区和其他已验证分区的完整信任链。在整个设备启动过程中,在进入下一个阶段之前,都需要先验证下一个阶段的完整性和真实性。
以硬件保护的信任根为基础,到建立完整信任链,这套方法来自可信计算“Trusted Computing”,因此我们称之为“可信启动”。
一、信任根
信任根包含代码和密钥,代码通常是不公开的,仅为设备制造商或芯片厂商所知,该代码进行设备启动的初始化,并且使用密钥来验证下一阶段代码的完整性和真实性。
虽然Android官方资料指出:可以设置由最终用户设置的信任根,从而可启动由用户设置的信任根签名的Android版本。但是,通常都使用设备制造商所提供的Android版本,此时采用的是内置信任根。
二、Android系统的验证启动
启动过程的验证工作就是将系统镜像文件加载到内存中,计算其哈希值来进行验证,即:计算出来的哈希值与预期哈希值进行比较,如果值不一致,则意味着这个系统镜像文件被篡改或伪造,那么将无法加载该Android系统导致启动失败。
由于Android内核漏洞在不断被公开以及被修复,为了防止攻击者利用旧版Android内核漏洞来安装易受攻击的旧版Android系统,在启动过程中,有“回滚保护”的保护措施,即:使用防篡改的存储区域来记录最新的Android版本,并在Android版本低于记录的版本时候拒绝启动Android系统。
验证Android版本也是验证启动中的一个重要活动。
三、Andorid系统的启动流程
Android官方建议的设备启动流程如下所示:
图1:启动时验证流程
在上述启动时验证流程的过程中,验证问题(也称为“启动时验证状态”)分为以下几类:
-
橙色:针对未锁定设备的警告屏幕
-
黄色:针对设置了用户定义的信任根的已锁定设备的警告屏幕
-
红色(eio):针对针对dm-verity损坏的警告屏幕
-
红色(no os found):未找到有效的操作系统
一方面启动过程中通过屏幕提示来告知用户有安全风险,另一方面系统会删除手机上的个人数据,并且把该验证状态传达给Android系统(设置androidboot.verifiedstate选项的值:green、orange、yellow)。
以上内容,可以看出“Verified”这个动作贯穿其中。
在最前面提到“完整信任链”,那么,在Android系统被启动之前,设备(手机)需要做哪些活动,下面进一步描述。
四、可信启动
完整信任链的建立是需要从设备上电开始的,即:从CPU芯片的RomCode开始。
注:严格意义上来说,这部分不属于Android系统,但是它是保证Android系统安全的基础。
ROM CODE又称为ROM BOOT,是由CPU芯片厂家固化到芯片内部ROM中的一段代码。其主要功能是对CPU处理器进行初始化,识别加载boot loader到片内RAM,最后跳转执行boot loader(boot loader之后才是启动Android系统,即:图1中的“Start”)。
(1)ARMv8.4安全体系
ARMv8.4的安全特性在Android14开始逐步得到支持。
图2:ARMv8 安全体系
(2)可信启动的启动链如下所示:
图3:可信启动的启动链
该启动链的重点是:ROM CODE从EFUSE获取Super Root Key Hash(SRKH),来验证系统镜像文件是否合法。然后按照TF-A、TEE OS、Boot Loader和Linux/Android的顺序来逐一验证与启动,从而构建了完整信任链。
即,ROM CODE和一些预存的Key信息构成了完整信任链的信任锚点。
为了更好地确保和利用完整信任链来验证计算环境的安全可信,Google的安全体系中又增加新的安全组件:DICE。
第六篇将介绍DICE。
【参考资料】
1、https://www.android.com/
2、https://source.android.com/docs/security/
3、https://www.arm.com/
4、https://community.arm.com/