你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

《STM32MPU安全启动》②MP15从BootRom启动FSBL(TF-A BL2)

[复制链接]
小萝卜啦啦啦 发布时间:2024-11-30 19:25
BootRom启动FSBL(TF-A BL2)是MP15启动的第一次跳转,对应到第一篇文章的这个图
& C  v' c" j( q( t" h  S" }
5.png

) {5 g+ D) H1 y
我是按从头到尾的流程来写的,和官方视频会有一些差异
- \& x) |4 e, s. P# N' l+ i

% _& n4 g8 G4 Y0 T  q9 J2 [/ U3 ]) Z
一、第一步:生成秘钥对

0 ^4 l( w1 L  h& J. b8 a
首先说一下官方是提供了PC端上位机工具的(名字叫KeyGen_tool,这个工具在STM32CubeProgrammer是自带的),其中加密方式使用ECDSA 256加密算法,椭圆曲线提供P-256 NIST、Brainpool 256 T1这两种,我们可以自行选择

0 l  W4 p4 Q* W5 }* w/ \8 L+ A: m0 Q% |
我们需要在PC上生成PB key和PV key,最后我们还要计算PB key的hash值(简称PKH)(使用SHA-256计算hash)

/ w7 Q$ c0 j' h. D
; l/ G% P% B' |
使用ST的工具生成的话,PKH是直接提供二进制的文件,这样我们就不需要自己再做转换了,下一步的烧录可以直接用

+ X2 Z4 n9 z% ]" j
2 w0 j/ y; Z& C4 \
6.png
- p. v  `2 j, U7 X$ w
具体如何使用KeyGen,我这边就不赘述了,大家看下面这个视频

  q. @' g; W( K  _  t
[media=x,500,375]【【STM32MPU 安全启动线上课程】2.1.2 MP15x SecureBootROM 如何使能】 【精准空降到 03:14】 https://www.bilibili.com/video/B ... 43b6b7afd3cc3&t=194[/media]
: B$ w) [9 @6 Q/ v

: h: q# @# k, V, P. _! H
( \( X! p; ]8 o8 h
二、第二步:编程OTP区数据
6 f- H7 U& O. E+ \% k3 e; \
刚才第一步生成了一个PKH,他是要被写入到芯片的OTP中的,存放到OTP的第24-31字中
5 O, @4 y9 L$ N8 A8 C0 }2 t9 @
具体如何写入的操作这里就不展开了,可以看一下这个视频

! P6 d# X2 s, l: ~
[media=x,500,375]【【STM32MPU 安全启动线上课程】2.1.2 MP15x SecureBootROM 如何使能】 【精准空降到 07:02】 https://www.bilibili.com/video/B ... 43b6b7afd3cc3&t=422[/media]

; h& r9 U$ |( H! w: v* ?$ e- [- M2 }8 r' A3 d& L4 `+ {, s
这边我就简述一下有几种方法:
8 r! s0 w; q3 p2 k" }7 J
方法1:使用STM32CubeProgrammer写入,可以使用命令行 或 GUI界面(作为开发人员,在开发阶段我首选就是GUI)
# |, F1 S& x/ P9 \
方法2:使用U-Boot,可以使用stm32key command 或 fuse command
- o( ^; E  P3 u1 q3 m
方法3:SSP(Secure Secret Provisioning),这是给代工厂生产时使用的,主要目的时实现在不安全的环境中安全的烧录这些敏感的数据到OTP中,他本质也是一些加密算法和加密硬件(ST有一个类似于身份认证的卡片,用于实现验证),对需要写入的数据做加解密,这样工厂就只能看到加密后的密文,解密后的明文都在ST的工具中执行,是一个黑盒,第三方是无法知道的,这样来实现安全烧录。对这个感兴趣的可以看一下这个视频
. J/ i2 Q1 A# z
[media=x,500,375]【【STM32MPU 安全启动线上课程】2.4 OTP安全烧录介绍】 https://www.bilibili.com/video/B ... 8fc87a43b6b7afd3cc3[/media]
% T9 ~) E& I+ J# [, S+ R+ [8 V
/ z+ z! b5 d# W! Z/ u1 }5 G
三、第三步:对TF-A固件签名
3 L' v3 R' i; ]. q" J" a" I, Y
ST也提供了签名用的工具,我们只需要把TF-A的固件、PV Key提供给工具就好,工具会使用PV Key对TF-A固件进行加密计算(加密方式就是我们之前说的ECDSA 256加密算法,2种椭圆曲线自己选择),这样得到的结果就是签名的结果了,可以放到header中。

( T- E! v9 E5 ^9 d7 M9 m0 ~3 v! r
最终你会得到一个经过签名的TF-A固件(他就=header信息+原来的TF-A固件)

! x6 A% b: f: m3 n& r1 E  s7 {6 a% f  S' v
当然header里面还会有其他东西,下图是整各header的内容,可以做一些了解,但我这边不会详细展开

# i  w( k! [5 C
7.png

& \# U2 i- h$ }8 ^
我们重点需要知道的是header里会储存PB Key(表中的ECDSA public key)、签名信息(表中的Image signature)、椭圆曲线(表中的ECDSA algorithm)

3 M* q+ u6 |" K  f8 p! n) I
8.png

  L0 J0 i( J* |  j. j1 Q( k  p, u
还有一个Version number,这个也很重要,是用于防回滚的,我会在下面章节说这个,这里就不说了
& [/ ~" R5 V) i% e9 V( `( h

. s# T* ~0 D  D4 A3 i- q5 `* _
四、第四步:close device(非必选)
$ n( i. i2 c/ T- x% x( h# ?/ F5 y
什么是close device?
; W% [' |& n8 L7 f6 D
要解释这个东西,我们就要了解一下STM32MP15的Product Life Cycle,它覆盖了一个试用MP15的产品从开发、生产、市场问题排查三个阶段,下图为他的状态流程
1 y' x$ ~( J$ u: l9 J
9.png

7 v; R3 x: w2 r% ~
我们就看C/F系列产品就好,其他系列都不支持安全启动,那也就没有close device这个操作了
. G5 Y. X$ O* ?& W' e2 o: J7 K' E
/ }# W+ w. P6 {- I* \( M0 L/ j
UNDER_PROVISIONING状态时SSP时会经历的,我们开发阶段可以忽略
# d& k0 h5 g/ }9 @% F4 o
' J/ b  E7 `5 C& M6 D7 [( x
那么对于我们开发来说就只有3种状态了:LOCK、UNLOCK、RMA
3 e8 n+ i. ]8 h( d; C

. ]9 h0 O6 t5 B5 l, ^. H7 v. b) v8 x
接下来我就描述一下这3种状态的具体含义

& b+ w' h* l: t% z* o# y) r9 u/ s
1.UNLOCK:出厂的默认状态,当产品为这个状态时,安全启动的业务都会执行,但是即使固件校验不通过,也会启动下一级的固件,可以用于早期调试阶段,这样旧不用每次都对固件签名,节省工作量

- Q7 _  Q. |" H- t  z3 R$ c0 y
2:LOCK:UNLOCK的设备可以经过close device变成LOCK状态,在这个状态下会严格执行安全启动业务,校验不通过,就不会执行下一级的固件,并且各种调试接口都会被关闭。这个一般就是在生产阶段做的,生产好后的产品都是LOCK状态
- q+ X* P$ j4 ]
3:RMA:用于处理市场问题时使用,刚才说了LOCK阶段所有调试都会关闭,那么有问题的产品回来后,研发人员如何排查问题呢?RMA状态就是在这个时候用的,我们可以使用密码,让固件进入RMA状态,此时我们就可以使用JTAG调试了

4 I# _" l3 R! l% y" D
11.png

6 m- v9 q3 \3 H( q; _& i1 U7 @
还有一张图展示这三者的关系,虽然名字换成了open与close,但是是同一个意思
% c6 l: K# s' m3 |) [! \9 M
10.png

: S9 U3 I. ]+ E! ?* o3 n) o1 c$ b& }# P. J" Z# h; x
设备当前是否为open或close,是根据OTP中的一个flag来决定的,也就是说,我们close device的这个动作的本质就是往OTP中写入一个数据(图里也说了,如果OTP中没有数据的话,并且在没有干扰或错误的情况下完成了初始化OTP,设备就会处于open状态,这就是刚才说的出厂默认为UNLOCKJ)

8 i" r8 ?1 i* E) O; {% n7 b
- D, Y! G( W( J+ a. b; Z! u* U
五、第五步:运行时如何验证
6 F- B3 o' u; a8 S7 o- Q
简单流程如下图所示
* S" q+ p5 A7 k4 K
2.png

, i3 D* D7 M- K2 a. g0 S% {
1.上电后运行ROM Code,也就是BootRom,当要跳转到TF-A时,他会先加载FT-F的分区(这里面有2个东西,一个是TF-A固件代码,还有一个是TF-A的header,这个就是完成签名后的固件)

6 B# H8 v; J; ?" S3 X
3.png

1 N, t9 U& T, F# N- Q
2.在芯片的OTP区中有PB key的hash值,还有一个version(这个用于防回滚,配合header中Version number实现的,他的具体机制后面会讲)
8 j3 m  u) X( O+ r+ I8 v. p
4.png
- ~+ G( K  k% f" h, w
3.
! P! c/ D, u! ]
3.1 验证PB Key是否有效

4 s7 h. ?9 Z) n0 N, T
        在header中有一个信息就是PB key,可以算出他的hash值,现在我们就可以用OTP中的hash值和header中的做个对比,看看是否一致,验证PB key是否有效。

& h6 H* t) e7 k  c$ N0 R% b# }
3.2 验证image是否有效

4 ^7 {+ |. A/ ^4 J& i
        如果PB Key有效,就可以开始验证TF-A固件,用PB key对TF-A固件代码进行ECDAS 256计算,和header中的Image signature作对比,验证固件是否被篡改(当然,如果设备为UNLOCK,即使验证失败,固件也会被启动)

" ^  h; |& n9 U7 Z( x! O* J# Y
3.3 防回滚机制
5 ~1 F2 K% j. s4 W+ _
        下面有防回滚机制,这里不展开说

4 b9 C& a4 V" r
5.png

8 U* S* b3 t) R$ ?% j+ m- s3 k
3 f# M% N$ ~' U# d' e
六、防回滚机制

2 s- P9 H% T  _* E* f
刚才说了在OTP中会有一个version,TF-A的固件中也有一个version,他俩配合实现防回滚

8 G7 o- i( I# R
( d8 D5 o6 L0 v3 l0 I, x. C0 _
其中OTP的是一个单向计数器,也就是说这玩意儿他只能++,看了一下header中的version,有32bit,也足够大,不管怎么++,也肯定够用了
/ i' K4 K3 K* A
9 J5 O% J0 k! N$ F. ~. a+ y$ Q
当OTP中的version比header里的高,那么这个固件就不会被启动,这就是触发了防回滚的机制
9 r  V% v- o) ]5 l$ m

# j. h+ f/ C+ Y" S, E
如果我想退回到旧版本的固件应该怎么办?可以重新生成一个新的带签名的固件,但是header中的version写大一点,比OTP中的大,这样就可以达到目的啦

/ D, z% e8 Y( L) y$ d( e) u% M8 ?- Y- r% i& b) P& V" f# m/ _: l
七、疑问与思考
# n$ N  K) ^& _* D8 \4 Y6 z

$ n5 h( ^  C+ ~+ X这里我有几个疑问
& Q" k( a( z- _6 @! Z, o1:既然保存在OTP中的UNLOCK与LOCK判定相关的数据这么重要,那么在LOCK后,我们应该是无法再次改写OTP了(这不是废话吗,这么明显的漏洞ST肯定堵住了),我想知道ST是否还做了其他的保护措施,例如给芯片一些干扰,让他读取到错误数据后,是否会阴差阳错的进入到UNLOCK状态?还有我直接磨芯片是否可以实现篡改OTP数据实现攻击?(有些产品使用单片机,会把关键数据储存到片内flash,有些攻击就是直接磨芯片,飞线直接读写flash)- x1 `9 {  P; g; a: f- m2 N2 K; r: f
2.LOCK与RMA之间relock最多就3次?为什么要这样设计?超过3次就永远锁死芯片?万一有一些玄学问题,需要反复LOCK与RMA之间切换该怎么办?
: o+ ~" o; W' w' U# N, f3.如果我header中的version不小心写成了0xFFFFFFFF,是不是这颗芯片就废了?因为OTP中的version无法再++了
$ J" ^* r* y6 g1 O4.OTP中的version是在什么时候增加的?是当TF=A固件成功运行后,直接把OTP中的version加到和header中的version一致?  T* _- ]9 g( D# `
5。我如果生成新的TF-A固件,但是header中的version还是和上一个可以正常运行的固件的版本一样,那设备会怎么样呢?会正常启动吗?还是说有一些什么其他机制来做判断
) G' z( X- n! @
6 I1 o0 }4 k; C6 C+ h+ b. m( ~9 D$ \- w
" u1 g& S& T. Q% f

, @/ R% u/ d  }: q) a, \
( \4 U, I9 Q$ T3 h' n1 _
收藏 评论0 发布时间:2024-11-30 19:25

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版