
以前开发者在谈到嵌入式设备的时候,常常忽略嵌入式设备的安全性问题,想当然地认为嵌入式设备不易受到网络攻击,也不是黑客攻击的目标,或者只需要做加密和身份验证就能达到足够的安全性。6 C* n$ ~9 m9 \- R! V2 \ 但在万物智联的今天,联网设备成指数级增长,嵌入式设备受攻击的量级及复杂度也在同步增长。嵌入式系统需要更多的安全措施是开发者们的共识。 - d- S' {. c# M! o/ r# V 本文基于STM32为大家梳理了嵌入式软件漏洞及安全隔离措施。, {6 b3 C( n. R! e/ o7 ? 4 b- o! n/ M0 A. n( d: g& A 典型的嵌入式设备安全威胁和对策 6 g0 }+ N5 ^8 ]% z) ?" @, a& Z: H L( \ 对于安全通信、安全存储、安全启动、安全升级等等大家可能多有耳闻,对于相关的概念也相对熟悉。而软件漏洞可能带来的风险往往被忽视,对于与之相关的安全隔离的概念可能也还比较陌生。 ![]() . f" }. n7 r9 z, U) Z$ |# \* ?5 s 安全隔离 / E7 s" S! j+ {9 l) D 隔离到底解决什么问题,有什么用处呢? ! G6 R7 M: }: R a* B 首先,隔离主要针对逻辑攻击,它的一个假设前提是软件可能存在漏洞,软件漏洞可能被利用,导致关键信息受到损害,被盗取、被修改等等。0 E; X3 ^2 u% m ![]() 隔离的思想首先是区分资源的不同访问权限,然后软件运行在不同状态,对资源的访问权限是不同的,这里的资源可能是存储器,也可能是外设,甚至是内核的中断、寄存器之类,从而对不同软件进行区分,关键资源只允许一小部分代码能够访问,其他的应用程序部分即使存在漏洞,关键资源也还是一个安全的状态,不能够被恶意代码获取。比如说有 buffer overflow 可能导致恶意代码的注入和执行,即使有这样的情况发生,关键资源仍是安全的。这样的隔离可以降低软件漏洞可能带来的风险。+ ~5 H- U) |. I1 B& O ` $ U4 z9 l3 W9 J- Z7 T6 v0 h0 n+ O / u' k; S. K8 N& t6 b' j. z( s 哪些应用场景用到了隔离? , J' A }5 H& d& f# f 其实我们每天使用的手机上的 TEE 就是隔离的一个典型例子,指纹匹配算法、支付相关的交易认证、手机银行App的关键操作等等,其实都是运行在 TEE 中的,TEE 是从区别于 RichOS 单独隔离出来的一个独立的部分,这些关键操作都运行在TEE的安全环境中。 ' ]- g, ~; N% n5 y # h9 l b9 O: M7 a( Z MCU上的隔离的概念可能大家听的不多,但是其实MCU中也带有隔离功能,随着 V8-M TZ 的出现,Trustzone以及TEE概念也可以在MCU上使用了。" f0 `9 q( a- v- L! E- W : [8 P4 h2 F* y. G# n0 | 利用软件漏洞窃取MCU代码的攻击演示以及对抗攻击可采取的STM32硬件安全防护 ) s6 Y8 }, s; k+ C! ^% j1 C6 }$ `7 f+ C 接下来我们就来看一个逻辑攻击的示例,这个示例通过利用软件漏洞的一个常见问题 —— stack/buffer overflow,实施攻击,从通信端口注入恶意代码,绕过调试端口直接获取MCU内部数据,这意味着即使调试端口已经完全保护,软件漏洞依旧可能使攻击者有机可乘,造成关键数据从其他端口泄露。& M' \* P* U1 E( Q8 k ; F! }0 M4 C G/ G! e3 s+ K ' T! s( R- V4 j+ q# E* @% x STM32 MCU 的隔离机制 ![]() 利用Arm Cortex内核自带的MPU的隔离功能 i/ | ]! O# {3 }, L: \ . Z% x# C! O$ W" c* Q 绝大部分的STM32 MCU(除了M0内核的MCU以外)内核都带有MPU单元 MPU单元可以将4G的地址空间划分出几个region,每个region可以设置不同的属性,实现一定的隔离保护功能 s! ^$ O' r, m* m' R' n1 g ➤ 如对于前面提到的例子,如果使用了MPU,就可以通过定义对应片上SRAM地址的region,并将该region设置XN(execute never)属性,避免注入到片内SRAM的恶意代码的执行 ( e1 e4 F% P( F! ^1 d MPU配合内核的User和Privilege模式,还能够实现对所需关键资源的访问控制?关于这部分,可以参考:" n, t1 D, f/ {% D' k" a R3 T # n1 W7 G! l1 b ➤ STM32微信文章:使用STM32的MPU(Memory Protection Unit)实现代码隔离和访问控制) s; F& C. }+ @1 g& {9 V/ S8 L6 @3 f5 Q 4 Z/ K) I0 P% i3 i0 W9 [5 e ➤ STM32中文官网LAT:使用STM32的MPU实现代码隔离和访问控制 7 |! f2 g1 F Z+ c4 D; j1 x STM32 MCU不同系列的硬件特性实现隔离5 |1 q8 @& W4 L5 N% _* t ; e& |( e3 D" Y4 \5 X; L 除了MPU以外,某些STM32系列还有一些特别的硬件单元,同样可以起到隔离的作用,例如:Firewall、Flash安全存储区 % o3 o i6 G7 D. V* M ( t* X& A1 O' o/ \' O L0、L4的Firewall ➤ 带有Firewall硬件的STM32,片内的Flash和RAM可以通过Firewall进行保护 ➤ 被Firewall保护的region与region外的部分隔离开来,CPU和DMA都无法直接访问,只能通过唯一的入口函数地址通过函数调用的方式使用Firewall里面的代码提供的服务 ➤ 利用Firewall的机制可以降低软件漏洞的风险,例如前面提到的例子,如果使用了Firewall,即使恶意代码被注入且成功运行,该代码也无法直接读取Firewall保护区内的任何内容 ➤ 使用Firewall进行数据保护的示例可以参考 STM32微信文章:信息安全专题| 手把手教你如何在STM32L0上实现关键数据和代码保护. {2 ?6 \8 h$ |2 `# l9 } STM32中文官网LAT:关键数据和代码在L0上的保护_基于防火墙和PCROP; l/ Z ~6 s: g4 Y# w ; ?% v' Y: q- h# n4 n " b: O9 ~/ t$ }! L/ f G0、G4、H7、L5及最新的U5上的Flash安全存储区 ➤ Flash安全存储区(Secure Area)也叫做(HiDeProtect)隐藏保护Flash区,其大小可以通过Option Byte进行配置) [, f! r! | ]) w5 Z ➤ 通过寄存器设置使能该区域的保护后,在复位前将无法再次访问安全存储区内的任何内容,包括读、写、擦- E e' J- U( M4 U! V9 i5 d* N ➤ 安全存储区同样可以和将安全区内和区外的Flash隔离开来,起到保护区内数据的作用。4 B3 x% |& d0 @9 J2 n1 E. h1 G 对于前面提到的例子,如果使用了安全存储区并且打开安全存储区的保护,即使注入的恶意代码运行起来也无法获取安全存储区内的任何数据4 F+ ^! S& X# G1 g- M) Y6 W- S; E 安全存储区的使用示例可以参考/ \! f: J" I& s- k# d- k ➤ STM32中文官网LAT:0 @* t0 P7 x: M/ I5 z 使用STM32H7安全用户存储区8 U- u% [* }4 P 使用STM32H7安全新特性实现敏感数据的安全存储与使用 ➤ STM32微信文章: 信息安全专题 | 代码保护(1)使用STM32H7新特性保护片上代码的机密性 信息安全专题 | 安全存储(1)STM32H7的密钥存储 - R/ U- B& M: W: Y$ S- w 0 y' [# s9 X+ S, i# I STM32 MCU的双核间隔离; k; W) D1 P+ L6 b. w1 b+ b5 H' G/ k) Q ; x$ ?0 y$ {" j7 j 某些带有双核架构的STM32还提供双核间的隔离机制 ➤ 支持双核隔离的系列包括WB和WL. E2 o$ Y0 T5 \$ I" Q7 t" O ➤ 双核间隔离利用的是M0+和M4对资源的不同访问权限,实现代码、数据以及其它硬件资源的安全隔离, ~7 P7 w& a/ B" N6 ` 1、M0+内核可以访问所有的片上资源! L8 T1 R. g8 s 2、M4内核(运行应用程序的内核)不能访问分配给M0+的部分资源,包括Flash,SRAM,相关的选项字节,Crypto以及其它一些外设 2 o# y8 I$ G1 c0 i3 c2 ~; b3 ^ 在WB和WL上利用双核隔离的一个典型应用就是密钥存储服务(Customer Key storage). P$ e) q: y& ?4 H/ E j8 Q ➤ 相关内容可以参考7 E- C5 }1 T3 C& N5 O# X STM32中文官网LAT:STM32WB的密钥安全存储和使用* S. v' D0 F% K9 z: o4 E6 I STM32微信文章:信息安全专题| 安全存储(2)STM32WB的用户密钥存储(CKS), v$ ?( x: F$ r1 `1 d0 Y 3 k. s5 b& h" G2 {: X( d; J STM32基于TrustZone架构的系统级隔离 最新的CM33内核的STM32L5和STM32U5系列中,采用的是基于TrustZone的隔离技术5 e8 V6 G' x/ V4 Y: @$ k' @ ! m S! l; @9 E. D: v3 y ! d6 v% f) s7 k1 Y/ Q* E 从内核到memory到外设,整个系统的资源可以配置为安全和非安全两种属性,CPU运行代码的时候具有安全和非安全两种状态,安全代码和非安全代码对不同安全属性的资源也有着不同的访问权限9 x* k9 Z, H* Q# R: r3 U+ ]6 o, G & o$ l- b0 V( p0 {6 a3 _0 P STM32基于TrustZone的系统及隔离机制有着非常大的灵活性,不仅仅可以实现简单的密钥存储以及crypto操作,还可以在安全区运行更复杂的软件逻辑,比如运行一段指纹比对的算法等等,具有非常大的灵活性0 n( e/ Q' t0 S |0 ~+ p% t 1 a2 w& U: s$ _% ~5 I( w # X9 Z, h3 d+ N* f% ]! r 利用基于TrustZone的隔离机制,也可以很好地针对软件漏洞的问题,降低系统风险 ➤ 对于前面提到的例子,如果使能了TrustZone,那么代码就分成了安全区和非安全区两部分,即使处于非安全区的通信代码有漏洞,出现了类似的问题,处于安全区的代码和数据等等也不会受到任何损害% g0 @# S6 }- Z* h! @3 |5 w TrustZone架构的隔离机制的更多内容,可以参考- d5 N' l" L5 e, u% ^: N ➤ STM32中文官网:0 Y8 H% F/ t* ^2 y4 S4 L7 m# X L5系列课程:STM32L5入门课程(一) 从Cortex-M33内核认识TrustZone等 视频:STM32L5 Trust示例 8 h% W: g$ `3 t* ?& \ q" ^- B7 P4 @ {" W. q 总结:STM32 MCU的安全隔离特性% Y' m v" r, a& l* n ![]() |
是不是类似【沙箱】?+ X8 `. T* r9 I$ P. r* { |