乐鑫特权隔离机制 #4 | 用户应用程序的安全启动
乐鑫特权隔离机制 系列文章 #4
目录
安全启动 (Secure boot)
受保护应用程序的安全启动 (Secure boot for protected app )
用户应用程序的安全启动 (Secure boot for user app)
基于证书的验证方案 (Certificate-based verification scheme)
- 必要条件
- 验证过程
在上一篇文章中,我们演示了如何在乐鑫特权隔离框架中,独立地更新用户应用程序。简单来说,通过将受保护的应用和用户应用程序相互隔离,即可轻松实现对其中任意程序的独立更新。在这个框架下,为单个受保护的应用程序提供多个用户应用程序也成为可能,类似于应用程序的“应用程序商店”。然而,随着这些应用程序功能的日益丰富,提高其安全性的需求也随之增加。
本文中,我们将介绍“用户应用程序的安全启动机制”,该机制确保只有受信任和授权的用户应用程序,才能在设备上执行。
安全启动 (Secure boot)
安全启动流程可以确保仅有授权和受信任代码才能在设备上执行,常见的实现方法是通过构建“信任链”,即通过从一个受信任且无法更改的实体开始(例如硬件中的一次性可编程存储器),一步步构建完全值得信任的完整信任链。
使用乐鑫特权隔离框架的项目具有两类相互独立的应用程序二进制文件:受保护应用程序 (protected_app) 和用户应用程序 (user_app) ,可以独立完成更新。
乐鑫特权隔离框架可以为这两类应用程序提供安全启动流程,通过基于信任根的信任链,验证受保护应用和用户应用程序文件。
受保护应用程序的安全启动 (Secure boot for protected app )
受保护应用程序的安全启动遵循 ESP-IDF 中传统应用安全启动方案。

传统安全启动过程概述如下:
1. 芯片上电/复位时,ROM 引导加载程序开始执行。注意,这里的 ROM引导加载程序已经烧录在芯片中,无法改变,因此是可信的,将作为信任链的信任根。
2. ROM 引导加载程序在 flash 中查找有效的二级引导加载程序,如果找到,则使用 eFuse 中烧录的公钥哈希值,验证文件附加 RSA-3072 公钥。
3. 公钥验证完成后,继续使用经过验证的公钥验证整个二级引导加载程序文件的数字签名。如果数字签名验证成功,ROM 引导加载程序将二级引导加载程序加载到内存中,并开始执行。
4. 一旦二级引导加载程序开始执行,它就被视为受信任的实体。然后,二级引导加载程序将初始化系统,并尝试以类似的方式使用 eFuse 验证和加载受保护的应用程序。
更多详情,您可以查看 ESP-IDF 编程指南中的安全启动章节。
用户应用程序的安全启动 (Secure boot for user app)
如前所述,受保护应用程序和用户应用程序都可以独立开发,因此这两类应用程序的所有权可以属于不同单位,也就是说它们可能都需要单独的签名密钥。为了验证受保护应用程序,我们会在 eFuse 中烧录受保护应用程序公钥的哈希值,但出于节省 eFuse 内存的目的,并没有同样地烧录用户应用程序公钥的哈希值。
对此,我们特别为用户应用程序的安全启动设计了基于证书的验证机制。
基于证书的验证方案 (Certificate-based verification scheme)
在此方案中,受保护应用程序被视为受信任的应用程序,因此可以在受保护应用程序的固件中烧录一些信息,用于后续验证用户应用程序的真实性。
-
必要条件
采用该方案的受保护应用程序和用户应用程序必须满足一些条件。
受保护应用程序:
1. 受保护应用程序的所有者必须维护两组单独的 RSA-3072 私钥。一组用于对受保护的应用程序的固件进行签名,另一个用于创建 CA 证书。
2. 必须提供某种途径,允许用户应用程序开发人员获取签名证书。
3. 必须在其固件中嵌入 CA 证书。
用户应用程序:
1. 用户应用程序的所有者需要生成 RSA-3072 私钥,用于对用户应用固件进行签名,还用于生成证书签名请求(CSR)。
2. 必须将此 CSR 发送到受保护的应用程序 CA,并获取已签名的用户应用证书 (UAC)。
3. 必须使用 RSA-3072 私钥对固件签名。签名和用户应用证书必须随附在应用程序文件的末尾。
-
验证过程
该方案的验证流程如下:

1. 芯片复位时,ROM 引导加载程序将验证二级引导加载程序,然后验证受保护应用程序的RSA-3072 公钥,具体方式为:对比 eFuse 中烧录的 RSA 公钥哈希值与受保护应用程序文件末尾处附加的公钥哈希值。
2. 公钥验证完成后,继续使用经过验证的公钥验证受保护应用程序的 RSA-PSS 签名。如果验证成功,则可以将受保护的应用程序视为受信任的应用程序并允许启动。
3. 受保护应用程序启动后,会在 flash 中搜索有效的用户应用程序,如果找到,则将使用嵌入在受保护应用程序中的 CA 证书,来验证附加至用户应用程序文件末尾的用户应用证书 (UAC)。UAC 由受保护应用程序的 CA 私钥签名,因此可以通过 CA 证书中的 CA 公钥进行验证。
4. UAC 中包括相应用户应用程序签名密钥的公钥,一旦 UAC 通过受保护应用程序的验证,UAC 内部的公钥也可以被视为受信任。此后,受保护的应用程序使用此公钥,验证用户应用程序的 RSA-PSS 签名。
更多详情,您可以查看乐鑫特权隔离文档中的安全启动章节。
如有任何问题或反馈,欢迎随时在 GitHub 仓库中提交 issue。您可点此 乐鑫特权隔离机制 系列文章 查看往期,敬请期待后续的更多内容。
相关文章:

乐鑫特权隔离机制 #4 | 用户应用程序的安全启动
乐鑫特权隔离机制 系列文章 #4 目录 安全启动 (Secure boot) 受保护应用程序的安全启动 (Secure boot for protected app ) 用户应用程序的安全启动 (Secure boot for user app) 基于证书的验证方案 (Certificate-based verification scheme) 必要条件验证过程…...

剑指 Offer 46. 把数字翻译成字符串
摘要 剑指 Offer 46. 把数字翻译成字符串 一、递归算法解析 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。…...
tar命令——归档/压缩和解压缩文件
tar命令的功能是将一个或多个文件归档成一个文件,同时可结合gzip、bzip2和xz等压缩命令实现文件的压缩和解压缩。 tar 命令的语法格式如下: tar [选项] 文件或目录 常用选项如下: 选项作用/含义-c建立归档文件-x从归档文件中解出文件-z通…...

Softing smartLink网关——推进过程工业数字化转型
虽然在过程工业中各工厂所投入的运营时间千差万别,但仍需按照新标准来进行有效控制和管理,而这就需要使用一种能够聚合其异构数据的数字通信架构。对此,Softing提供了两种网关解决方案,可用于将过程工业通信架构集成到现有以太网系…...
Spark的常用算子
Spark的常用算子 目录内容Spark的常用算子一、转换算子(Transformation)二、行动算子(Action)三、键值对算子(PairRDDFunctions)四、文件系统算子(File System)Spark 内置算子是指 S…...

Unity Avatar Cover System - 如何实现一个Avatar角色的智能掩体系统
文章目录简介变量说明实现动画准备动画状态机State 状态NoneStand To CoverIs CoveringCover To Stand高度适配高度检测脚部IK简介 本文介绍如何在Unity中实现一个Avatar角色的智能掩体系统,效果如图所示: 初版1.0.0代码已上传至SKFramework框架Package…...

steam/csgo搬砖项目到底真的假的?
搬砖是从国外steam市场置办游戏装备回来,在国内网易buff售卖,低买高卖,产生利润的一个项目。 但我真正上手后,才知道steam是面向全球的游戏平台,用户真的大的夸张!!市场非常巨大,一…...

【Python笔记20230307】
基础 编码、解码 str.encode(utf-8) # 编码 str.decode(utf-8) # 解码关键字 import keyword keyword.kwlist格式化输出 % 占位符:%s 字符串%d 整数%f 浮点数Hello, %s % world Hi, %s, you have $%d. % (Michael, 1000000) 占位符的修饰符 -左对齐 .小数点后位数 0左边补零…...

SBOM应该是软件供应链中的安全主食
当谈到软件材料清单(SBOM)时,通常的类比是食品包装上的成分列表,它让消费者知道他们将要吃的薯片中有什么。 美国机构有90天时间创建所有软件的清单 同样,SBOM是一个软件中组件的清单,在应用程序是来自多个来源的代码的集合的时…...

[计算机组成原理(唐朔飞 第2版)]第一章 计算机系统概论 第二章 计算机的发展及应用(学习复习笔记)
第1章 计算机系统概论 1.1 计算机系统简介 1.1.1 计算机的软硬件概念 计算机系统由“硬件”和“软件”两大部分组成。 硬件 是指计算机的实体部分,它由看得见摸得着的各种电子元器件,各类光、电、机设备的实物组成如主机、外部设备等 软件 软件看不见…...
Python的数据分析相关的框架
Python特别强大,也是一款可以实现可数据分析语言,它有很多开源的库和工具,可以帮助数据科学家处理和分析数据。 以下是一些常用的Python库和工具: NumPy:NumPy是一个Python库,用于处理大型多维数组和矩阵&…...

为什么会出现植物神经紊乱 总是检查不出来该怎么办
植物神经紊乱是一种很多人都害怕的疾病,你们知道是为什么吗? 植物神经紊乱是一种神经系统失调导致的多种症状的总称,这种疾病是由于社会因素所诱发的脏器功能的失调,是一种非常复杂的疾病。而这种疾病是可能会发生在任何年龄阶段的…...

宏任务和微任务
JavaScript 把异步任务又做了进一步的划分,异步任务又分为两类,分别是: ① 宏任务(macrotask) 异步 Ajax 请求setTimeout、setInterval文件操作其它宏任务 ② 微任务(microtask) Promise.then…...

使用WebSocket、SockJS、STOMP实现消息实时通讯功能
客户端 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head><title>websocket client</title><script src"http://cdn.bootcss.com/sockjs-client/1.1.1/sockjs.min.js"></script>…...

C++回顾(十一)—— 动态类型识别和抽象类
11.1 动态类识别 11.1.1 自定义类型 C中的多态根据实际的对象类型调用对应的函数 (1)可以在基类中定义虚函数返回具体的类型信息 (2)所有的派生类都必须实现类型相关的虚函数 (3)每个类中的类型虚函数都需…...

雷电模拟器安卓7以上+Charles抓包APP最新教程
一、工具准备: 证书安装工具全局代理工具下载: https://download.csdn.net/download/weixin_51111267/87536481 二、Charles设置 (一)电脑上证书安装 (二)安卓模拟器上系统证书安装(RooT权限打…...
vsvode 配置sftp,连接远程linux全过程
在本地安装sftp插件,配置参数https://blog.csdn.net/u011119817/article/details/106630599在linux机台安装vscode-service服务https://zhuanlan.zhihu.com/p/294933020连接超时,将配置文件添加超时时间遇到的错误处理:(272条消息) 【vscode插…...
C++类转换为蓝图、打印日志、蓝图关卡、删除C++文件
蓝图宏 UCLASS(Blueprintable)//c脚本可转换为蓝图 UPROPERTY(BlueprintReadWrite)//蓝图中可创建set,get节点 UFUNCTION(BlueprintCallable)//可创建函数节点 UPROPERTY(BlueprintReadWrite,Category”My Variables”)//节点进行分类打印日志 UE_LOG(LogTemp, Lo…...

elasticsearch高级篇:核心概念和实现原理
1.elasticsearch核心概念1.1 索引(index)一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母&#…...

部署安装Nginx服务实例
其他服务: 搭建zabbix4.0监控服务实例 普罗米修斯监控mysql数据库实战 Linux安装MySQL数据库步骤 一. Nginx概念介绍 1.介绍Nginx程序 Nginx (engine x) 是一款开源且高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。主要特点是占用…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...