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

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

[复制链接]
小萝卜啦啦啦 发布时间:2024-11-30 19:25
BootRom启动FSBL(TF-A BL2)是MP15启动的第一次跳转,对应到第一篇文章的这个图
7 I6 o1 P% E/ B( K8 d
5.png
/ r* n9 J7 B  _
我是按从头到尾的流程来写的,和官方视频会有一些差异
" m/ f5 e# U/ L! c6 C3 U8 @+ d
+ Y! o8 x7 a0 O" |$ b6 A/ ]
一、第一步:生成秘钥对

2 }! z" j4 R8 {! L9 p4 t
首先说一下官方是提供了PC端上位机工具的(名字叫KeyGen_tool,这个工具在STM32CubeProgrammer是自带的),其中加密方式使用ECDSA 256加密算法,椭圆曲线提供P-256 NIST、Brainpool 256 T1这两种,我们可以自行选择
& I0 Q7 x/ x/ ?8 l1 G! r
! c1 {+ S$ e! G
我们需要在PC上生成PB key和PV key,最后我们还要计算PB key的hash值(简称PKH)(使用SHA-256计算hash)
  E7 q  E  i  e: |
0 b! h6 w3 N; E- L7 |2 e- j  i& y
使用ST的工具生成的话,PKH是直接提供二进制的文件,这样我们就不需要自己再做转换了,下一步的烧录可以直接用

) c" j& b2 a% E8 k& R
3 O/ E1 ?3 e" W2 ?
6.png
0 A0 N2 R( @- o
具体如何使用KeyGen,我这边就不赘述了,大家看下面这个视频

2 t5 J2 b; \# i: L- z$ ]2 W$ m
[media=x,500,375]【【STM32MPU 安全启动线上课程】2.1.2 MP15x SecureBootROM 如何使能】 【精准空降到 03:14】 https://www.bilibili.com/video/B ... 43b6b7afd3cc3&t=194[/media]
+ E8 s- P0 O$ W9 Q# |

$ N0 \, |( h3 x5 X0 X& N) z( l
7 h- p0 B4 z- W" w: e. J4 Y
二、第二步:编程OTP区数据

! r9 V7 t: v# r5 Q% b' P9 G! `
刚才第一步生成了一个PKH,他是要被写入到芯片的OTP中的,存放到OTP的第24-31字中

0 Q: ^0 K8 k: R
具体如何写入的操作这里就不展开了,可以看一下这个视频
9 {1 y' t3 |! y4 e- I
[media=x,500,375]【【STM32MPU 安全启动线上课程】2.1.2 MP15x SecureBootROM 如何使能】 【精准空降到 07:02】 https://www.bilibili.com/video/B ... 43b6b7afd3cc3&t=422[/media]

+ y  k, T5 ~4 x8 s( b$ f# y; M4 h* u$ s. S5 \
这边我就简述一下有几种方法:

% I, t! M3 q7 Z$ b5 I& P! h, {# r+ E
方法1:使用STM32CubeProgrammer写入,可以使用命令行 或 GUI界面(作为开发人员,在开发阶段我首选就是GUI)
/ j5 |- t- s! [. \* ]/ J( r1 s. F$ I
方法2:使用U-Boot,可以使用stm32key command 或 fuse command
7 I$ M8 X  B3 L, }; Q9 A
方法3:SSP(Secure Secret Provisioning),这是给代工厂生产时使用的,主要目的时实现在不安全的环境中安全的烧录这些敏感的数据到OTP中,他本质也是一些加密算法和加密硬件(ST有一个类似于身份认证的卡片,用于实现验证),对需要写入的数据做加解密,这样工厂就只能看到加密后的密文,解密后的明文都在ST的工具中执行,是一个黑盒,第三方是无法知道的,这样来实现安全烧录。对这个感兴趣的可以看一下这个视频

5 k) x+ D# }- T1 z4 b( ?
[media=x,500,375]【【STM32MPU 安全启动线上课程】2.4 OTP安全烧录介绍】 https://www.bilibili.com/video/B ... 8fc87a43b6b7afd3cc3[/media]

+ |9 Q* q& f9 e8 v# }. ?4 T* W# d  U/ U9 Y, W% Z( P
三、第三步:对TF-A固件签名

$ s- Y$ d9 ]- K6 G4 G6 A- H
ST也提供了签名用的工具,我们只需要把TF-A的固件、PV Key提供给工具就好,工具会使用PV Key对TF-A固件进行加密计算(加密方式就是我们之前说的ECDSA 256加密算法,2种椭圆曲线自己选择),这样得到的结果就是签名的结果了,可以放到header中。

/ `5 z8 g( c: }" K/ A' T9 @+ k! [3 W% C9 s, \. f: y
最终你会得到一个经过签名的TF-A固件(他就=header信息+原来的TF-A固件)
7 R: N" `! Z: b  T' k
1 A# u6 G' r0 {3 a" ~: t
当然header里面还会有其他东西,下图是整各header的内容,可以做一些了解,但我这边不会详细展开

: o' R) \4 p% y$ \! g
7.png

4 m6 Z  I; ]/ p- x
我们重点需要知道的是header里会储存PB Key(表中的ECDSA public key)、签名信息(表中的Image signature)、椭圆曲线(表中的ECDSA algorithm)

4 S( Y% t# ~2 V; T9 i  X4 E, X# d0 n
8.png

, W# C0 t) n( Y4 `
还有一个Version number,这个也很重要,是用于防回滚的,我会在下面章节说这个,这里就不说了
2 K$ x5 }' d. J+ l1 X8 J* u$ k

0 K& ]2 g) ~# b/ j
四、第四步:close device(非必选)

) o1 V5 ^: A' P4 d5 j
什么是close device?
5 o8 `5 t: C6 k4 ~: ~+ E- R' o
要解释这个东西,我们就要了解一下STM32MP15的Product Life Cycle,它覆盖了一个试用MP15的产品从开发、生产、市场问题排查三个阶段,下图为他的状态流程

% N( Z& c& Z/ l9 }8 ^# D; w
9.png
: K8 a$ o5 H, \/ E' h. k- @
我们就看C/F系列产品就好,其他系列都不支持安全启动,那也就没有close device这个操作了
1 V7 G4 n; P" C6 F" j$ M
7 S# E, N6 [( ~$ n; _
UNDER_PROVISIONING状态时SSP时会经历的,我们开发阶段可以忽略
' U' A' O; u0 \

! n% q8 t; q% m- y$ i! z+ y
那么对于我们开发来说就只有3种状态了:LOCK、UNLOCK、RMA
# r; s  C) X+ H! L
+ d2 u4 v: `! i( i) s6 D0 ?4 k6 B
接下来我就描述一下这3种状态的具体含义
0 ]$ o6 ^4 }4 V
1.UNLOCK:出厂的默认状态,当产品为这个状态时,安全启动的业务都会执行,但是即使固件校验不通过,也会启动下一级的固件,可以用于早期调试阶段,这样旧不用每次都对固件签名,节省工作量
/ h* N3 m/ d+ W" F% b
2:LOCK:UNLOCK的设备可以经过close device变成LOCK状态,在这个状态下会严格执行安全启动业务,校验不通过,就不会执行下一级的固件,并且各种调试接口都会被关闭。这个一般就是在生产阶段做的,生产好后的产品都是LOCK状态
4 K5 h, g* T5 ~+ \( b1 M8 T- x5 Z
3:RMA:用于处理市场问题时使用,刚才说了LOCK阶段所有调试都会关闭,那么有问题的产品回来后,研发人员如何排查问题呢?RMA状态就是在这个时候用的,我们可以使用密码,让固件进入RMA状态,此时我们就可以使用JTAG调试了
% T! `8 M' S1 D6 p
11.png

6 H' r5 k* y0 w" L: Y3 S! K
还有一张图展示这三者的关系,虽然名字换成了open与close,但是是同一个意思

/ ?! h/ t5 o7 ^# @# g' {
10.png
/ ?& m0 l" N! Y
# S/ i9 B3 ^( K9 Y, c: a
设备当前是否为open或close,是根据OTP中的一个flag来决定的,也就是说,我们close device的这个动作的本质就是往OTP中写入一个数据(图里也说了,如果OTP中没有数据的话,并且在没有干扰或错误的情况下完成了初始化OTP,设备就会处于open状态,这就是刚才说的出厂默认为UNLOCKJ)

$ i0 D& X, W. p0 h: @( V: I" T& J# Z; G" s! Q
五、第五步:运行时如何验证

2 j! U3 b7 I/ E: }- P2 T0 h
简单流程如下图所示
. M! ]9 M1 ~3 P  e4 D, E: M
2.png

( x: d* K% T4 g6 E7 B5 f6 M0 a: O
1.上电后运行ROM Code,也就是BootRom,当要跳转到TF-A时,他会先加载FT-F的分区(这里面有2个东西,一个是TF-A固件代码,还有一个是TF-A的header,这个就是完成签名后的固件)

* A& G& z2 k- E
3.png

) P/ B: K8 g6 i
2.在芯片的OTP区中有PB key的hash值,还有一个version(这个用于防回滚,配合header中Version number实现的,他的具体机制后面会讲)
4 ~+ t) Q7 `* J8 c2 R- o+ }
4.png
0 p6 ?) o: ?( S  e* [$ ?
3.

) @0 m; l! c% f! m1 _" X
3.1 验证PB Key是否有效

3 j- U0 T% a- i- N' `
        在header中有一个信息就是PB key,可以算出他的hash值,现在我们就可以用OTP中的hash值和header中的做个对比,看看是否一致,验证PB key是否有效。

1 z3 }2 r5 A9 J/ K6 j
3.2 验证image是否有效

$ Y& d* G5 F* B7 c/ A- g6 p8 Z
        如果PB Key有效,就可以开始验证TF-A固件,用PB key对TF-A固件代码进行ECDAS 256计算,和header中的Image signature作对比,验证固件是否被篡改(当然,如果设备为UNLOCK,即使验证失败,固件也会被启动)

" F+ ?7 L6 J4 @% \0 o+ @
3.3 防回滚机制
, V8 _# h- h8 ~* \
        下面有防回滚机制,这里不展开说
& J! L' j! v; ^. }$ w9 J
5.png

+ v, e. i. W1 k+ J) i2 ^& Y
  P0 ^0 Q& F6 z( {4 `$ m
六、防回滚机制
+ d% {- \1 w! U
刚才说了在OTP中会有一个version,TF-A的固件中也有一个version,他俩配合实现防回滚

9 Y- _) M/ B$ g7 \/ n3 A' h4 O' R7 Z; e4 i9 g
其中OTP的是一个单向计数器,也就是说这玩意儿他只能++,看了一下header中的version,有32bit,也足够大,不管怎么++,也肯定够用了
# }; D* {. b8 J: z7 T

9 f/ }! ^1 K. F5 v. s
当OTP中的version比header里的高,那么这个固件就不会被启动,这就是触发了防回滚的机制
" B3 z+ n1 a* ~9 a- C, P: c
- O, V8 m: }: A  b: g% B1 ~; P; h2 s
如果我想退回到旧版本的固件应该怎么办?可以重新生成一个新的带签名的固件,但是header中的version写大一点,比OTP中的大,这样就可以达到目的啦

/ F  I6 p& Q/ u" _  Z6 ?
4 q, [0 l# D0 P6 v* Q# I
七、疑问与思考
/ j! b6 H: v8 k/ x6 |
6 V3 C3 m9 b3 I% X
这里我有几个疑问
  Q2 W6 D" p$ z! d( i1:既然保存在OTP中的UNLOCK与LOCK判定相关的数据这么重要,那么在LOCK后,我们应该是无法再次改写OTP了(这不是废话吗,这么明显的漏洞ST肯定堵住了),我想知道ST是否还做了其他的保护措施,例如给芯片一些干扰,让他读取到错误数据后,是否会阴差阳错的进入到UNLOCK状态?还有我直接磨芯片是否可以实现篡改OTP数据实现攻击?(有些产品使用单片机,会把关键数据储存到片内flash,有些攻击就是直接磨芯片,飞线直接读写flash)
" X( {& [( J3 ^8 W1 v2.LOCK与RMA之间relock最多就3次?为什么要这样设计?超过3次就永远锁死芯片?万一有一些玄学问题,需要反复LOCK与RMA之间切换该怎么办?
5 Z3 f! K+ f8 t0 m  Y3 R7 Z+ ~3.如果我header中的version不小心写成了0xFFFFFFFF,是不是这颗芯片就废了?因为OTP中的version无法再++了: s5 r3 J5 I, M! R) J/ L4 S
4.OTP中的version是在什么时候增加的?是当TF=A固件成功运行后,直接把OTP中的version加到和header中的version一致?
# d& n$ K) m5 {. f5。我如果生成新的TF-A固件,但是header中的version还是和上一个可以正常运行的固件的版本一样,那设备会怎么样呢?会正常启动吗?还是说有一些什么其他机制来做判断8 j, F+ i! k" r* \/ P( ]
! f. ^+ n- x* V1 R! s
! h- r* B) C+ ?: L
2 ^8 Y+ D; r. i5 f8 A
+ Q; v7 Q0 ~1 `) k0 m
收藏 评论0 发布时间:2024-11-30 19:25

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版