Secureboot概念
1、前言
最近在微信公众号接触到了一个Secureboot这个概念。通过这个认识可以让我们穿起来一些知识,站在稍高一点的位置去看我们所学的东西处在整个系统的位置。
什么是Secureboot?
借用一句广告词:业务安全的基石是APP安全,APP安全的基石是操作系统安全,操作系统安全的基石是SecureBoot安全。
Secure Boot是验证应用域内的一个/多个应用CPU子系统执行的一个/多个应用程序映像的完整性和真实性(多应用核和多内存段),验证策略由用户定义,包括:被验证的内容、验证方式、验证结果分析处理。
是不是有点绕?
来先看看背景:
手机厂商建立了手机内部处理器与手机操作系统的绑定关系(也就是说**开启 SecureBoot 功能的手机是「不能刷非官方系统」**的),一旦刷入第三方系统后,手机则会不开机。这也是利用上文提到的公钥、私钥实现的,来具体看一下:
-
手机的处理器内部存在一块只能写一次数据的 OTP 区域,出厂时会将厂商的公钥写入。物理上就保证了这部分不可更改。
-
手机操作系统固件会使用厂商的私钥进行加密。
-
手机处理器的第一部分启动程序(这部分程序也是固化在处理器内部的不可更改)会使用 OTP 中的公钥对操作系统进行解密,解密成功才可以启动,否则立马变"砖"。
这个过程就叫做「安全启动」,即 SecureBoot 。实际过程中为了加快校验速度也使用了哈希值算法,但此处仅用于说明加密启动的过程,忽略了部分细节。(电脑端 Intel 处理器中其实也存在类似的机制,但一般情况下 PC 都希望能够灵活的安装系统,因此默认没有开启 Intel 芯片中的 SecureBoot 功能。)
有了这个应用背景!!!
继续看
安全启动(SecureBoot)使用非对称加密与数字签名技术提供了一种从硬件到操作系统的安全启动信任链。
Secure Boot的目的,是防止恶意软件侵入。它的做法就是采用密钥。UEFI规定,主板出厂的时候,可以内置一些可靠的公钥。然后,任何想要在这块主板上加载的操作系统或者硬件驱动程序,都必须通过这些公钥的认证。也就是说,这些软件必须用对应的私钥签署过,否则主板拒绝加载。由于恶意软件不可能通过认证,因此就没有办法感染Boot。
实际一点:在安全启动中,证书颁发机构 (Ca) 包括 OEM (或其委托) 和 Microsoft。Ca 生成构成信任根的密钥对,然后使用私钥对合法操作(如允许的早期启动 EFI 模块和固件服务请求)进行签名。对应的公钥将嵌入到启用了安全启动的 Pc 上的 UEFI 固件中,并用于验证这些操作。
啰里啰嗦到了现在我们下总结:
- 1、Secure Boot就是安全启动,我们之前学习的ATF、启动流程、安全操作系统(TEEOS)都是它的子集
- 2、完整的Secure Boot包含两个部分:
- 第一部分为Linux的Secureboot,
- 第二部分为Android特有的AVB(Android Verified Boot)。
开启了Secureboot的设备,会在启动时逐级校验各分区,一旦某一级校验不通过,则设备就无法启动。
Secureboot分为安全性校验与完整性校验。
-
安全性校验: 为公钥的校验,借助于芯片的一次性可编程安全存储模块(OTP 或 efuse), 在rk3399上称为efuse。该检验流程为从efuse中读取公钥 hash,与计算的公钥 hash 先做对比,如果相同,则再将公钥用于解密固件 hash。(嵌入式设备就是对应的bootrom)
-
完整性校验: 为校验固件的完整性,计算固件的 hash 与用公钥解密出来的 hash 对比是否一致。
AVB阶段安全性校验和完整性校验需要依赖于vbmeta.img,相关的公钥及描述信息存储在vbmeta.img中。(这个流程可以看看AVB专栏的内容)
2、Secureboot要学习什么?
密码学算法
efuse(OTP)
RPMB
启动流程
secureboot原理
简单的secureboot(不带证书)
官方推荐的secureboot(不带证书)
encrypted_image
efuse不安全
TEE验证TA程序的设计
Android Verified Boot(AVB)
https://mp.weixin.qq.com/s/q65dbOg49syB3IVfgnMGEw(UEFI SecureBoot简介)
https://mp.weixin.qq.com/s/gJST89ei_JHwyIGl3XzKfQ(UEFI之 Secure boot)
https://mp.weixin.qq.com/s/6mHbtrsCFh-gg_6vyB9WTw(rk3399 android 平台下的 secureboot 介绍)