STM32安全固件更新的设计与实现

发布者:TP9111最新更新时间:2023-02-28 来源: zhihu关键字:STM32  更新 手机看文章 扫描二维码
随时随地手机看文章

STM32 提供了安全固件更新的参考设计。为了理解STM32 安全固件更新,我们可以先去看一看普通的固件更新式如何设计,包括一般流程、端到端之间的传输以及为了支持传输的数据结构,在MCU 中的存储以及支持存储的数据结构。在对固件更新的一般原理有了基本认知后,我们看下安全固件更新需要额外引入哪些改变,以及目前STM32 如何在安全固件更新里实现这些额外的需求。一定要谨记,STM32 安全固件更新离不开STM32 安全启动这个平台安全做基础。


固件更新的总体设计

固件更新的流程



一般情况下,固件更新由近距离两方参与:

◎ 设备端:固件的接受方STM32 MCU

◎ 服务器:固件的提供方比如PC


例如:开发人员可以用ST-Link,直接将新的固件通过JTAG 烧入到STM32 MCU。这个更新的过程可以是:

◎ 一次性擦除整个Flash 并写入新固件

◎ 根据STM32 MCU 的规范,使用ST-Link 擦除一部分Sectors 或者Pages,然后对这些部分区块进行更新。


这种有两方参与的固件更新的通讯方式,并不限于ST-Link JTAG 通讯。它还可以通过UART。这个时候需要将STM32 MCU 切换至System memory bootloader 启动模式。或者,用户使用自己的启动加载器。


更复杂的情形,尽管也是两方参与,但是他们通过其他通讯协议,比如以太网通讯。不过, 这种复杂性,只是体现在底层协议栈上。对于固件本身来说,还是不需要做任何改变。例如,用户可以开发bootloader 充当服务器,允许其它网络用户连上来,发送指令,发送固件,然后来更新系统。


在IoT 时代,需要一对多的更新,那么参与者一般是三个。可以参考下图。



◎ 固件的提供方:一般是管理员

◎ 固件的存储方与管理方:一般是IoT 平台

◎ 设备端,也就是固件的接受者:STM32 MCU


一对多情况下,管理员将固件上传至IoT 平台,触发所有设备的更新操作。而IoT 平台则根据各个STM32 设备的具体情况下进行固件更新的消息通知 ,以及固件内容推送。IoT 平台也可以被动接受请求。在这种情况下,固件更新的操作不一定是同步的,也就是说固件的更新可能要花费几天,甚至好几个月。考虑到有些设备的离线,若需要等待全部设备的版本升级完成,我们可能需要等待的时间更长。


固件更新的网络拓扑结构的改变,不改变传输的固件更新的内容组织。传输的内容,依然可以是:

◎ 从头开始完整的传递一个固件

◎ 只更新一部分


固件传输

固件更新的设计,在通讯上需要考虑服务器与设备之间的距离的影响。是否需要远距离更新,例如选择什么样的通讯接口;是否不依赖通讯的可靠性---例如是否需要使用断点续传以及校验和;以及是否假定通讯带宽总是很低,例如是否需要差分更新以及是否需要压缩。


距离:本地更新与远程更新

◎ 本地更新:一般是通过JTAG 或者UART,近距离连接设备,所进行的本地更新。

◎ 远程更新:FOTA,这个名字,是指远程更新。远程更新是个非常重要的功能。想象一下遍布在地球上各个角落的IoT 设备,如果没有远程更新,那么这些设备很快就会功能过时或者安全无法得到保证。考虑远距离更新,仅仅在安全启动里支持下载是不够的 ,需要用户固件支持下载功能 。


可靠:断点续传与校验和

◎ 断点续传:简单的固件更新传输,可以要求要么全部下载成功,要么从头开始。然而,在不稳定的网络情况下,会出现多次尝试都失败的情况。因此,在不稳定的网络情况下,一般考虑保存固件下载的状态。当网络连接断开又恢复时,下载不需要从头开始,而只需要从网络断开处继续。这样可以减少重复的数据下载,从而减少对网络带宽的要求。

◎ CRC 校验和:简单的固件更新设计,可以无需在应用层加入校验和。下载一个固件包,收到的固件包的大小符合预先通知的大小,则下载完整。然后,系统就可以切换到新固件运行。然而,存在一种网络发生错误的可能性,在这种情况下,大小相同,而内容却不可用。所以,在无法确定通讯一定可靠的情况下,应该对整个固件加入CRC 校验字段,而不仅判断固件包的带下 。CRC 校验和可以检测是否在通讯过程中发生了错误。


带宽:差分更新与压缩

◎ 是否差分更新:简单的固件更新设计,可以使用完全更新,不需要理会版本之间的差异大小,一次性传输完整的固件。差分更新则是建立在新版本和旧版本的差异上,只传输差异部分,由设备端恢复出完整需要更新的固件。一般情况下,邻近两个版本不可能差别太大,这个时候采用差分更新,只需要传输较小的差异部分。差分更新可以节省网络带宽,也可以降低设备的功耗。

◎ 是否压缩

有些时候为了节省传输的带宽,会对固件进行压缩。但是压缩 可能会带来安全弱点。这取决于我们压缩的内容是否会自动包括一些敏感信息,同时是否有接口允许黑客选择要发送的内容。压缩后的大小会构成提示,例如黑客所选择的内容是否与自动包含的敏感信息相同。


传输中的数据结构:针对固件更新的传输过程,需要设计相应的数据结构,对固件进行打包。

◎ 无额外数据结构:一种最简单的固件更新是不需要添加任何额外的数据结构。在通讯链路上的实际应用负载就是固件本身。当STM32 完整的收到该固件,直接将固定位置的程序代码擦除,然后将新的固件写到该位置。

◎ 带有元数据:一般推荐传输的固件加入元数据信息。这些元数据信息可以包括:

• 固件名称

• 固件大小

• 固件版本

• 固件校验和

• 固件在Flash 里的起地址

• 本次传输起地址

• 本次传输结束地址

• 元数据校验和


为了断点续传或者差分更新,是需要标记所传输的数据,在固件整体中的位置;而校验和,则需要包括元数据以及实际固件。这样可以检测固件头部和实际固件是否在传输过程中是否都没有损坏。


在实际开发固件更新时,元数据可以细分为固件整体的元数据以及每次传输的元数据。


固件存储

◎ 位置:MCU 所运行的固件总是可以存储在MCU 内部,或者使用外扩Flash。不考虑安全的情况

下,这两者都没有什么不妥。如果考虑到安全,前面我们已经分析了外扩Flash 会带来很大的风险。

◎ Bootloader

- 无bootloader:无启动加载器则需要利用STM32 的双bank 特性。不少STM32 型号支持双Bank 功能,也就是Flash 可以分成两个Bank,Bank A 和Bank B。当系统从Bank A 启动时可以更新Bank B。

确保更新成功后,可以将系统设置成从Bank B 启动。使用双Bank 启动的固件更新功能,整个用户固件的代码都可以被更新。这是相对于 bootloader 更新的优点。值得一提的是,在使用双Bank 的启动功能时,要确保固件更新成功。即使不考虑受攻击的情况下,也要考虑通讯过程可能带来的破坏。如果一个错误的固件被更新到 Flash Bank 里,同时系统又设置成从该Bank 启动。那么这个启动过程是无法知道这个固件是错误还是正确,只是去加载代码并执行。当然这种情况下,还是可以使用ST-Link 或者 System memory loader 重新烧入正确的固件。

根据STM32 手册,双Bank 启动功能依赖于System memory loader。那么,若使用该功能则RDP 不能设置成2。

- 有Bootloader:有Bootloader 的简单固件更新,很好理解,就是由bootloader 去接收新的固件,然后由bootloader 将该固件写入固定的位置。一般推荐固件更新使用bootloader。


固件冗余:

固件冗余一直是个现实的问题。不存在固件冗余的话,也就是单镜像的优点是:① 更多用户空间;② 适合更小的Flash 要求;缺点是,代码从Flash 里运行时没有办法更新自己的,不支持用户更新。


存在固件冗余,双镜像的优点是:① 可以回退,更安全;② 用户固件也可以更新。缺点是,需要更多的空间。


Bootloader 和固件冗余并不冲突,我们可以同时拥有 Bootloader 和固件冗余。STM32 SBSFU 提供了bootloader+ 是否固件冗余的选择,包括bootloader +单镜像和 bootloader + 双镜像,供用户选择。


整体存储结构

固件的存储位置不影响固件更新的存储的逻辑数据结构。然而是否冗余则意味着我们在设计时是否需要预留足够的空间。如果是bootloader 加固件冗余,则Flash 会被划分成几个部分:

◎ 启动加载器

◎ 启动数据区

◎ 固件区

◎ 备份固件区

启动加载器根据启动数据区决定从哪个固件引导系统。启动数据区是需要重点保护的区域。


关键字:STM32  更新 引用地址:STM32安全固件更新的设计与实现

上一篇:STM32安全固件更新的安全挑战
下一篇:安全启动 - STM32安全启动应用

推荐阅读最新更新时间:2024-11-22 12:13

ad7190例程用stm32
  在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。   AD7190是一款适合高精密测量应用的低噪声完整模拟前端。它集成一个低噪声、24位Σ-Δ型模数转换(ADC)。片内低噪声增益级意味着可直
[单片机]
ad7190例程用<font color='red'>stm32</font>
STM32开发笔记4: STM32F407 UART的使用方法
STM32F4内嵌4个通用异步/同步收发器(USART1、USART2、USART3、USART6)和两个通用异步收发器(UART4和UART5)。本文讲解此6个串行口,在异步模式下的使用方法,如不加说明,以USART1为例。 可以按照下述步骤,对通用异步串行口进行设置。 1、打开config.h文件,对如下图所示的宏进行设置,0x0c表示将当前串行口UART1的波特率设为115200bps,无效验。 2、打开main.c文件,可以在其中断服务函数中,完成接收逻辑的代码编写,如下图所示。此代码表明,当串行口收到1个字节的数据后,将触发串行口中断,在中断服务程序中,将接收到的1字节数据取出,送u8_Ua
[单片机]
<font color='red'>STM32</font>开发笔记4: STM32F407 UART的使用方法
STM32开发笔记27:STM32L0低功耗设计-RTC模块1秒时钟的产生方法
单片机型号:STM32L053R8T6 在进行低功耗设计时,使用外部中断唤醒CPU是一个非常有用而且有效的方法,但是在某些特定的应用中,我们还希望CPU能够自己醒来去完成一些特定的操作,这就需要用到RTC模块,因为RTC模块在CPU进入低功耗状态后,是还可以工作的。使用RTC,也需要得到一个最小时间间隔,一般我们将其设置为1秒,本文介绍如何设置RTC的这个最小时间间隔。 先来看一下时钟图,RTC可以采用两个时钟模块,1个是外部的低频晶振,一般我们选择32.768KHz,这个比较精准;另一个则是内部的RC振荡器,是37KHz。 STM32L0的预分频器被分成两个预分频器。一个7位的异步预分频器(Asyn
[单片机]
<font color='red'>STM32</font>开发笔记27:STM32L0低功耗设计-RTC模块1秒时钟的产生方法
STM32单片机的Usart2串口的调试方法
先是参考http://wenku.baidu.com/view/78f6b1350b4c2e3f572763e9.html调通了usart1 然后将程序进行修改,对Usart2进行配置,配置完了之后,程序还是没有正确,然后在voidGPIO_cfg();函数中添加一句 GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE); 最后程序如下, #include“stm32f10x_lib.h” FlagStatusRX_status; FlagStatusTx_status; voidRCC_cfg(void); voidGPIO_cfg(void); voidUSART_cfg(void);
[单片机]
<font color='red'>STM32</font>单片机的Usart2串口的调试方法
STM32 GPIO模式理解
stm32的GPIO的配置模式有好几种,包括: 1. 模拟输入; 2. 浮空输入; 3. 上拉输入; 4. 下拉输入; 5. 开漏输出; 6. 推挽输出; 7. 复用开漏输出; 8. 复用推挽输出 如图是GPIO的结构原理图: 1.模拟输入 从上图我们可以看到,我觉得模拟输入最重要的一点就是,他不经过输入数据寄存器,所以我们无法通过读取输入数据寄存器来获取模拟输入的值,我觉得这一点也是很好理解的,因为输入数据寄存器中存放的不是0就是1,而模拟输入信号不符合这一要求,所以自然不能放进输入数据寄存器。该输入模式,使我们可以获得外部的模拟信号。 2.浮空输入 该输入状态,我的理解是,它的输入完全由外部决定
[单片机]
<font color='red'>STM32</font> GPIO模式理解
STM32外部中断操作
内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级可编程的中断优先级。 NVIC NVIC Nested Vectored Interrupt Controller 嵌套向量中断控制。在STM32的标准外设库和MDK定义的中断相关的变量和结构体类型,大多都是以NVIC开头的,例如 NVIC_InitTypeDef 。 NVIC_Type NVIC寄存器结构体。在MDK380a中,这个结构体是定义在stm32f10x_map.h中,具体的定
[单片机]
苹果在 iOS 14.5 测试版更新订阅服务界面
上周,苹果推送了 iOS 14.5 beta 2 版本,加入了多个 emoji 表情以及升级 Apple Music 页面外观等新特性。近日,我们在使用 App Store 时发现,此版本还有一个全新的视觉优化,可以让用户在 App Store 购买软件或者订阅服务时更清晰。 相比于明显的外观升级,App Store 这次的变化显得非常微妙 —— 支付页面上的文字变得更加清晰易读,他们还更新了政策解读,让客户更加清楚他们是在进行支付。最明显的变化,是用 Apple Pay 的 logo 取代了 App Store 的标记。 ▲ 左:iOS 14.4 右:iOS 14.5 beta 2 订阅一栏的格式变得更加直观,将试
[手机便携]
苹果在 iOS 14.5 测试版<font color='red'>更新</font>订阅服务界面
STM32单片机的模拟电压采集卡设计
要求: 采集16路模拟电压值(0~5V) 方案: 接口:与电脑USB口连接。采用USB转串口芯片,实际转化成串口,方便开发板上位机软件。 主控MCU: STM32 F103RBT6 硬件原理:CH340+STM32+LM324 CH340:USB转串口芯片 连接电脑USB口,方便, 实际为串口,写上位机软件方便。 STM32 F103RBT6自带16路ADC引脚。 LM324在系统中至关重要,它的作用是电压跟随器。 作用1:防止电压信号线直接连接 单片机 引脚,在电压意外突变时,烧毁单片机。 作用2:电压跟随器输入阻抗高,可有效防止 采集卡 影响电压信号数值。 电路图: PCB: 成品板: 装入外壳:
[电源管理]
<font color='red'>STM32</font>单片机的模拟电压采集卡设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved