验证启动(安全启动)功能旨在保证设备软件(从硬件信任根直到系统分区)的完整性。在启动过程中,无论是在每个阶段,都会在进入下一个阶段之前先验证下一个阶段的完整性和真实性。
设备启动安全级别状态,用绿黄橙红四种颜色表示:
绿色代表所有信任链关系上的镜像都被正常校验通过;
黄色代表boot分区不是被OEM key认证成功,启动bootloader显示警告和使用的公钥的摘要信息(fingerpring);
橙色表示系统软件是可自由烧写状态,其完整性需用户进行判断,bootloader显示警告;
红色表示启动过程中有校验失败,启动终止。
Device state - 设备状态分为unlocked和locked:
locked状态下,设备不能被烧写,可能启动到绿黄红三种状态。
Unlocked状态下,设备可以被自由烧写,启动到橙色状态。
dm-verity - Linux 内核驱动,用来作分区完整性检查。
OEM key - OEM提供的一个固定的不可被篡改密钥,在bootloader中可见,用来验证boot镜像。
设备处于“绿色”启动状态时,除了正常设备启动所需的用户互动外,用户应该不会看到任何其他用户互动。设备处于“橙色”和“黄色”启动状态时,用户会看到一条至少持续 5 秒的警告。如果用户在这段时间内与设备互动,该警告持续显示的时间至少会延长 30 秒,或者直到用户关闭该警告。设备处于“红色”启动状态时,该警告会显示至少 30 秒,之后设备将会关机。
要实现完整的信任链,需要启动分区上的引导加载程序和软件支持,这个引导加载程序需要完成:
1,初始化TEE及其绑定的信任根。也就是ROOT OF TRUST。
2,验证启动分区的完整性,并显示状态中的警告。
在启动分区验证和TEE初始化完成后,引导加载程序会将启动分区签名时的公钥和当前设备状态信息传递给TEE,绑定keymaster信任根。
下面简要说一说各个分区的启动验证!
BOOT ROM
BOOT ROM固化在芯片内部,不可被篡改。
Preloader
签名:编译时由OEM厂商将CHIP_KEY公钥预置到preloader镜像,并用CHIP_KEY私钥对镜像执行签名。
验签:BOOT ROM从外部存储加载preloader镜像,从签名头获取镜像签名信息和公钥地址,获取公钥,后从efuse分区加载efuse镜像,读取公钥hash值,计算公钥值并与之比较,若一致则认为公钥合法,用此公钥对preloader进行验签,若通过则说明镜像未变篡改。
TEE
签名:TEE镜像包括ATF和TEE OS镜像,两镜像由OEM/TEE厂商进行签名,组合成trustzone.bin再用mtk Sign-Tool进行签名。
验签:preloader先后分别对atf和tee内容执行验签。
LK,BOOT
lk和boot分区的保护都有两层签名,第一层使用VERIFIED_BOOT_IMG_AUTH_KEY进行签名,运行时验签,然后使用KEY_IMAGE_AUTH再次签名,Secure Download时验签。
MTK SecLib有实现MTK_SECURITY_ANTI_ROLLBACK,推测是在某片存储中记录了已安装过的所有版本号和摘要信息。