Secure Boot Part 2 —— 安全启动流程

简述

当前boot的设计逻辑是:一级boot对二级boot的进行验签,通过后,启动二级boot;二级boot启动后,首先查看是否有刷新请求,如果有,进入刷写流程,刷写完毕后,在线校验APP的hash值和签名,校验通过启动APP,如果没有,则进入APP的hash验证流程,验证通过后启动APP。

一级boot对二级boot校验过程详解

根据Secure Boot Part 1 ------ Flash分区-CSDN博客,我可以知道二级boot中有一个区域结构如下:

typedef struct {

uint32_t magic; // 标志位,如 0x544F4F42 (BOOT)

uint32_t firmware_len; // 2级 Boot 实际代码长度

uint8_t signature64; // ECDSA R+S 签名

uint8_t sha256_hash32; // 预留,可选

} fw_header_t;

一级boot根据二级boot的长度firmware_len,读取flash中二级boot的内容,然后在线计算二级boot的hash值,然后将计算出来的hash值和对应公钥作为输入,进行非对称加密计算,得出一个结果,将该结果与signature64进行比较,如果相同,则验证通过。这一步通过不仅可以验证二级boot的完整性,还可以验证二级boot身份的有效性,因为先计算了二级boot的hash值,如果二级boot被篡改过,那么hash值就对不上,后续身份肯定也过不了,如果二级boot被黑客篡改了,那么即使hash值验证没有问题,由于黑客没有正确的私钥对app进行签名,所以在用公钥对app进行验签时,必然也不能通过。

二级boot对APP的校验过程详解

如上所述,二级boot的启动流程主要分两路,有刷写请求和没有刷写请求。同样APP区域中有这样一个结构的区域:

typedef struct {

uint32_t magic;

uint32_t length;

uint8_t hash32;

uint32_t version;

uint8_t reserved20;

} FlashConfig_t;

没有刷写请求时,根据会length计算hash值,并将该值和hash32进行比较,对APP进行验证,并且当前设计中只验证了hash值,也就是说只对APP的完整性进行了验证,并没有验证APP的身份(这一点后续可以继续论证)

有刷写请求时,会首先进行刷写,当刷写完毕时,首先会对刷写的数据进行完整性校验,如果校验没有问题,会继续校验签名,如果都没有问题,才会将该结构FlashConfig_t区域进行更新。

相关推荐
Thneonl13 小时前
Flink Operator 的隐藏陷阱:容器名不是你以为的那个
安全·kubernetes
Thneonl13 小时前
kubectl scale ds 是个 404:DaemonSet 没有 replicas
安全·kubernetes
青Cheng序员石头13 小时前
失控之前 | AI 安全到底在保护什么?
后端·安全·aigc
龙亘川6 天前
一网统管AI平台民生业务实践:基于城市数字底座赋能公积金业务服务升级
大数据·安全·智慧城市·开源软件·数据可视化·政务
女神下凡6 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
kybs19916 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
LorryJovens6 天前
【LAAP科研】双系统具身AGI范式研究——基于LAAP认知架构与Jev概率决策模型的系统性技术调研与范式验证
人工智能·gpt·安全·架构
其实防守也摸鱼6 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
山东科恩光电6 天前
提升安全性的关键技术:安全触边在工业自动化中的应用解析
安全