垂直应用

信息安全(六)

STM32的存储与执行保护





大家好,欢迎大家观看 STM32 信息安全(六):STM32的存储与执行保护。




本期内容完全围绕STM32展开。首先是一个概览,全图景展示STM32现有的所有安全特性,一目了然。


然后是STM32芯片上、支持安全应用的硬件IP。有两类,一个是做执行和存储保护的,一个是做加解密的。后者比较容易理解,前一章节的密码学技术是支持安全应用的一大利器;而这里的加解密技术模块,就是硬件实现了上述算法,有速度快、不占内存的优点。但是仅仅有密码学支持是远远不够的,加密通信的安全基础是密钥的机密性,如果谁都可以访问密钥,那么加密操作就是空中楼阁。另外,在设备端,固件的IP保护,如何不让产品里运行的,比如算法这样知识产权,泄露;如何防止来自调试端口的窥探;如何在一颗芯片里做物理上的隔离,区分可信代码和普通代码。这些都不是仅仅靠加解密技术能够解决的。需要的是我们的第一类硬件IP:存储与执行保护模块。


本期就着重介绍STM32的存储与执行保护模块




安全特性概览




STM32安全特性概览:蓝色的是硬件,各种蓝色。除了刚才提到的两类支持安全应用的模块,我们还提供Monitor监测类的模块,看门狗,Tamper防止外部入侵。芯片UID虽然不是直接和安全有关,但是也可以用到。


灰色的是软件包。基于存储与执行保护模块的小例程,加解密库,一方面有基于下面加解密硬件模块的实现,也有仅依赖于Cortex-M内核的软件实现。SBSFU安全包,是结合了基本所有硬件模块和加解密技术的应用。这里还有一个来自ARM的开源协议栈mbedTLS,在我们带以太网IP的STM32系列的Cube包中有集成。它是从软件上实现了前一章节讲的TLS协议的从握手、到应用阶段的全部过程。


作为STM32生态系统的一部分,工具的支持也是必不可少。STM32CubeProgrammer和TrustPackageCreator是后面在学习和操作SBSFU需要用到的软件工具。CubeProgrammer可能大家都很熟悉了,它是STLINKUtility的继承者,主要用来烧写、读取、擦除STM32片上闪存以及选项字节。当然它也提供flashloader接口,可以操作板子上的片外flash。TrustPackageCreator可能大家用的较少。顾名思义,它是专门服务于安全应用的,我们的SBSFU和SFI服务,都会用到它。TrustPackageCreator没有单独的下载包,它的GUI和命令行版本的程序,都是在CubeProgrammer的安装目录下。


SFI是一个全套的安全服务,解决固件安全烧录已经控制烧录次数的问题。和它相关的HSM是一个硬件,帮助SFI服务的实施。所有一切和STM32安全相关的特性介绍、文档下载、软件包下载,都可以从www.st.com/stm32trust获得。STM32中国官网上的安全版块,将作为生态系统栏目的一个分支,近期推出,大家敬请关注。



和安全相关的硬件IP,我们从这个表格里可以一目了然地看到哪些系列有哪些安全IP。一眼看过来,最全的就是STM32L5系列了。它比其他系列新增了对TrustZone和OTFDEC功能的支持。还有个PKA硬件模块,支持RSA、ECC、DH算法相关操作。MPU虽然很多系列都有,因为它是ARM Cortex-M内核的一部分,但是L5的MPU是ARMv8-M架构 新内核里 集成的新一代MPU,配置更灵活。   所有这些和L5相关的安全特性,时间关系今天不讲。我有专门的L5线上课程,下个月会开始陆续推出。


该系列的信息安全讲座,是以STM32G0为目标,后面的SBSFU分析和运行,也是基于STM32G0的Nucleo板。




UID



那么我们按照列的顺序,先来看UID。UID,全名unique ID,是ST提供给每个STM32芯片的唯一ID号,出厂前就写在了片上闪存的系统flash部分。


它有96位,12个字节。具体这个ID信息存放在哪个位置,不同系列的芯片可能有所不同,需要查阅对应芯片的参考手册。》》比如G0系列,它的ID信息时存放在0x1fff 7590这里,使用STM32CubeProgrammer连接我手上的G0-Nucleo板,可以读出信息,如图。


这12个字节里的内容并不是随机的,每个字节都有它的物理意义,从lot编号、到wafer编号、到wafer上这个晶元的坐标轴位置。


UID可以用来作为产品序列号,当然不是直接使用,通过某种算法生成,但是要保证单向性。不能多个UID经过算法映射成了相同的值或者字符串

在安全应用中,还可以作为密钥派生的一个输入,保证派生出的密钥的唯一性。


UID在全系列的STM32中都有。





写保护




写保护,大家都非常熟悉了,从STM32的第一颗产品中开始,F103开始就有的片上flash保护特性。保护的对象是:片上flash,防止什么威胁?内容被修改、被擦除。


WRP保护的区域,不能被修改,也不能被擦除,除非先去掉写保护。写保护的使能和撤销,都是在选项字节中设置,因此上电就生效,即使程序还没有开始运行。不同STM32系列,写保护的范围或者说粒度,稍有不同。G0的写保护是一共可以有两个连续区域,在选项字节中配置两个区域的起始地址和结束地址。有些系列,比如F4,按照flash的page或者sector为粒度,可独立配置,更加灵活


写保护功能,同UID一样,在全系列的STM32中都有。





PCROP



PCROP,私有代码保护。保护对象:还是片上flash,防止什么威胁?防止内容被读出,无论是使用代码读出,还是使用调试接口读出。


如何实现的?通过关闭对这段区域的数据总线访问。那么带来的额外保护,就是不仅不能读访问,也不能写访问,所以可以防止内容被读取、被修改、被擦除。那么这段flash的内容还能干嘛呢?除了数据总线,大多数Cortex-M内核还有一个指令总线,指令总线并没有关闭,这段flash上的内容还可以运行!即被执行。


这个安全模块有什么用?它设计来就是为了对某段IP代码进行保护。尤其是联合开发的时候,一段关键算法代码先被烧到flash的某段区间,加上PCROP保护,然后这个芯片再交给其他人继续开发。别人可以调用算法代码的API来执行,但是看不到代码的01 code,具体内容。但是,这并不是说这段受保护代码就不能被调试。在调试窗口里运行到PCROP保护代码后,从调试窗口只能看到0xFFFF,但是每一步运行的上下文,切片,即寄存器、SRAM里的堆栈,都能看得到。时间关系,今天对每个安全IP无法展开hands on’环节。大家可以回去自己试一下。如果要想把这段代码运行时用到的寄存器和SRAM区域也一起保护,那么还需要结合其他保护措施,比如MPU,对相关寄存器和RAM区域,设置成非特权模式不能访问。因此可以说,单独PCROP可以一定程度保护敏感代码的执行过程,但是不保护代码执行结果。


PCROP暗含了写保护;因此PCROP生效的时候,mass erase和erase该区域,都不会成功。


PCROP保护的使能也是通过选项字节,因此也是上电即保护,即使代码还没有开始运行。但是它这个保护的撤销,就没有写保护那么方便。选项字节中没有专门的撤销PCROP保护的开关,要撤销PCROP保护,要通过RDP降级,从RDP1降到RDP0,来实现。大家都知道RDP降级带来的额外结果就是用户flash被全片擦除。为了进一步精细化管理,有一个开关位,可以控制RDP降级导致的全片擦除是否可以让PCROP区域作为例外,不被擦除。



代码在编译连接时,相关的文字池,即literal pool通常会放在代码结尾。如果也放在PCROP区域,会造成执行失败,因为需要取常数的时候,无法读到。因此,需要在IDE的编译选项上,做一些特别的设置。


PCROP区域被关闭了数据总线访问,只允许指令总线访问,因此它的初衷是让这段代码只能执行,并不能保护数据。但是我们可以通过变通的方式,利用PCROP区域只能执行的特性,来保护关键数据。即,把数据内嵌在代码里,用户应用通过执行PCROP区域里的代码,来把数据恢复到到SRAM或寄存器中去。这种数据内嵌到指令中,通常是由用户自己写一段汇编指令来完成。G0上的SBSFU安全包就用到了这个技巧,来实现对密钥的安全存储。


PCROP保护的区域不能更新,除非和整个用户flash一起全片擦除。这是使用上的一个限制,但是我们也有对应的一些操作技巧。PCROP区域的范围,不能缩小,但是可以扩大。那么在前面整个存放密钥的应用中,如果之前的密钥不想用了,可以再编纂一段返回第二个密钥的汇编代码,烧到原来区域的旁边,然后扩大PCROP范围,覆盖住新的这段汇编代码。之后的用户应用调用这个新的代码,就可以使用新的密钥了。


理论都很简单,因为今天没有时间展开做每个安全模块hands-on,如果有兴趣了解详情,我推荐大家去看一下 X-Cube-PCROP以及 对应的应用笔记。里面详细描述了,多方联合开发,使用PCROP保护私有产权代码的开发流程。这里暂时不展开,会在后续的Security线上课程系列中来讲




PCROP是从F4开始引入的保护模块,所以前面F0、F1、F2、F3都没有。》》 F4、F7系列,也不是每个产品线上都有


但是在最新的L5系列上也没有PCROP。我猜一个原因可能是L5采用的Cortex-M33内核,不再分数据总线和指令总线,它的一条C-bus和一条S-bus,都能够取指令和访问数据。区别仅在目标地址的不同。更重要的是,L5的 trustzone + RDP0.5,可以实现PCROP的保护。




读保护




读保护,也是和写保护一样古老的一个安全特性了。从F103开始。只是F1的时候,读保护只有RDP0和RDP1,从F2开始,增加了RDP2,进一步提升了读保护的安全等级。

和前面一样,我们先回忆一下,读保护保护的对象是谁?防止的是哪种威胁?由于有RDP1和RDP2两种保护级别,我们需要了解在不同的保护级别下,都分别可以实现对谁的,什么保护。


保护级别有两种,RDP1和RDP2。有两个系列的例外,最老的F1,没有RDP2,最新的L5多一个RDP0.5,是结合TrustZone使用的。



保护对象,不再仅限于用户Flash了,选项字节、后备域存储区(包括后备域SRAM和后备域寄存器)、某些系列里的部分SRAM,都被列为了保护目标。



剩下最关键的问题是,RDP读保护措施,防止了什么样的威胁?从表格右边来看。如果芯片是从用户Flash启动,那么在RDP1时,对所有被保护对象的操作,和RDP0时是没有任何区别。只有当读保护级别升级到RDP2时,对从用户Flash启动的代码,出现了一个限制,而且是一个最关键的限制,即不能再修改选择字节了。也就是说,选择字节里面配置的各种系统特性,永远生效,无法修改。从用户Flash启动,是产品出厂后正常的工作流程。


出厂后,如果芯片要从SRAM、系统BL启动,或者企图通过JTAG/SWD等调试端口去连接,那么基本上芯片会认为这是一个非法入侵。那么芯片会做出什么样的反应呢?在RDP2的时候最简单,直接就是简单粗暴的,无法启动,或者无法连接。在RDP1的时候,除了选项字节,所有被保护的区域,用户Flash,后备域存储区,部分特殊SRAM,全部不能访问。你只可以访问访问选项字节,可以读、写、擦除。这就是给人家留下一个修改RDP从1到0的机会啊。当然RDP降级会造成芯片的擦除。注意如果此时写保护、PCROP还使能,全片擦除可能不成功,大家可以自己试一下。怎么办呢?那就先把PCROP,写保护这些给撤除呗,反正这个时候,选项字节是你可以完全操控的。




RDP2




RDP级别的转换,大家应该也很熟悉,就是到了RDP2,就再也回不了头了。

需要注意的是,不管是代码修改还是通过STM32CubeProgrammer去修改选项字节,操作的都是Flash模块里的对应寄存器值,写完后,功能并不会马上生效。需要产生一个复位,可以是软件复位,也可以是一个上电复位,或者从待机模式退出。总之要重新执行一次复位序列,在复位序列里,会把寄存器中的设置,装载到真正的选项字节里。对应功能才会生效。


胶片右下角的图示,是为了强调,SRAM1从头至尾没有被列入RDP的保护范围,是L4、L5、WB系列上的SRAM2,和G4上的CC-RAM被列入了保护范围。



RDP2保护比较简单粗暴,能做什么,不能做什么,一目了然。然而RDP1的时候,有些操作能不能做,大家可能就有点是是而非。这里列了一下我要强调能做的,和不能做的。首先,RDP1时,调试端口是可以连接的,你可以拿IAR或者STM32CubeProgrammer试一下。连接上来之后,选项字节是可以任意修改的。但是内核会把RDP1时的调试端口连接看成是一个非法入侵,它会立刻做一个复位。如果你是以hotplug的模式去连接,这个模式在CubeProgrammer中有的,你去试一下。如果连接之前代码有运行程序,这个时候连接上去后,内核复位,寄存器恢复成复位值,但是SRAM1和某些外设寄存器,是可以看到连接那瞬间的值的,所谓的上下文切片。


想象一下,如果芯片的代码,上电后执行读取Flash内容到SRAM1中去做CRC检查或者Hash检查的操作,那么通过在不同时刻的jtag连接,就能从不同时间点上的SRAM1切片内容,拼出flash的内容了。


知道了这个点,我们在设计代码的时候就会绕开一些可能存在的陷阱。比如,应尽量避免使用SRAM1作为堆栈或者其他敏感数据存放的区域,应使用SRAM2,甚至直接上采用RDP2 。



RDP2的时候,芯片永远只能从用户Flash启动,选项字节里的配置永远生效,无法更改。


但是不要有误区,以为芯片里的固件永远无法升级了?只要用户flash里的代码有这个IAP功能,它对自己的擦除、修改、读取,完全不受限制。


RDP2保护,和芯片固件升级,完全不搭嘎,不受限制。



RDP读保护,基本上在所有STM32系列上都有,这里F1留了空白,就是因为它没有RDP2。




UBE




唯一启动入口,UBE,unique boot entry。从H7开始,之后的系列,G0,G4,L5上都有支持。


现在以G0为例来看,UBE使能后,MCU启动地址被锁定到用户flash首地址,而不管BOOT0和BOOT1的状态如何。


UBE的使能和撤销,是在选项字节中控制,属于静态保护。因此也是上电就生效。



有一点需要注意,RDP0时,就是图中绿色标注部分,对BOOT LOCK的操作比较随意,使能UBE保护或者撤销UBE保护都可以。

RDP1时,一旦BOOT LOCK使能后,要撤销保护,只能通过RDP降级。RDP降级,会对芯片用户flash进行全片擦除,并复位BOOT LOCK控制开关。

为什么RDP1和BOOT LOCK同时使能后,就不能再通过操作BOOT LOCK来对其复位了呢?传统系列芯片在RDP1时,还是可以使用调试端口进行连接的。连上后虽然芯片复位不再运行,但是可以操作选项字节。但是G0不行了。


这是G0的Boot lock功能带来的一个安全保护机制,即BOOT LOCK和RDP1都有效时,调试端口就被关闭了。同时,由于启动位置固定了,从SRAM和系统BL启动也被禁止。


可以说,RDP1 + bootlock 约等于 RDP2,“约”就“约在” 选项字节还可以改,但是只能由用户flash上自己的代码来改。如果要撤销Boot lock保护,用户代码就去操作选项字节,做RDP降级;如果仅仅是使能调试端口,就去使能FLASH_ACR,访问控制器里的Debug access s/w使能位。那如果RDP1 + bootlock同时使能的情况下,PCROP设置成了全片保护会怎样?




安全用户闪存




唯一启动入口地址,是安全启动的前提条件,但是如果启动后运行的代码不安全,或者不做任何安全检查和设置,那也是白搭。因此Boot lock保护,通常是和“安全用户存储区”搭配使用的。这一段存储区是在用户flash里的一部分,起始地址固定在用户flash的首地址,长度可配置,是flash page的整数倍。


这段区域之所以叫做“安全用户存储区”,是因为这段区域通常用作放置一些关键、敏感的代码和数据,比如安全启动代码,以隔离用户的应用代码。一旦软件打开了secure开关,这段区域就不可见了。这个开关是寄存器控制,复位值是开关不生效,不在选项字节中,意味着一旦软件打开了开关,这段区域不可见,直到系统复位。复位起来的最初时刻,该区域是可见的,但是此时本来也是在运行自己区域里的代码,直到代码再次控制寄存器,打开开关。所以通常是在执行完这段区域里的代码后,打开开关,再跳到用户应用代码去执行。



为了进一步保护这段用户安全代码,还有一个寄存器开关,可以控制是否关闭调试端口。可以使得在关键代码运行时,不允许调试端口的连接。

如图所示,上电复位,装载选项字节,然后保护开关寄存器的复位值是不打开保护,调试开关控制位是可以调试。这个时候虽然保护开关没有打开,但是只要结合boot lock,使得只能从这里的安全用户代码启动,没法运行用户应用代码,也不存在谁会看到我们现在运行的关键代码的问题。


接着,安全用户代码可以清零dbg_swen位,来关闭调试。这在RDP0时是有用的。执行完了用户安全代码后,软件打开保护开关,在恢复调试功能,就可以去执行用户的。


当BOOT LOCK和RDP1同时使能,刚才讲了,硬件自动复位dbg_swen,关闭调试接口。如果芯片里运行的代码不能去恢复改位,调试器就永远连不上了。



G0产品就有锁定启动地址,以及安全用户存储区域的保护功能。


后面要讲的SBSFU,就会利用它们。




MPU




MPU也是ARM Cortex产品的老特性了,它提供了一种隔离,和权限控制的保护。

先来回顾一下MPU的保护原理。

首先,它的配置和使能,都是在内核寄存器中,因此属于动态保护。

第二,考虑它保护的对象是谁?写保护,保护的对象是片上用户flash;读保护,保护对象,除了片上用户flash,还扩展到备份域存储区,和一些特殊SRAM;MPU呢,它保护的对象最广,32位地址的4G空间,都可以列为被MPU保护的region。

第三,威胁来自谁?它能够防谁,不能够防谁?MPU处于内核的一部分,它防止的是内核的 违反纪律的读、写、执行访问;防的是内核;它不能防DMA。这一点请注意。


那么MPU监测内核的哪些“违反纪律”的访问呢?有哪些规矩,是MPU设置的纪律?一句话说下来就是,它设置了内核在不同特权级别,对不同region的读、写、执行访问的规矩。比如红色标注的两个区域,一个在SRAM,一个在Flash,内核对它们的读写,只能在特权级别。蓝色的四个区域,No access,表示一旦MPU配置被使能后,这些区域内核无法访问了。和刚才前面讲的用户安全存储区有点类似。只是这个MPU的region更广,除了图里示范的flash、ram,还可以是外设寄存器。但是MPU只能管理内核访问,用户安全存储区一旦保护开关打开,任何AHB主设备,无论内核,DMA都看不到了。


随着ARM v8-M规范的推出,Cortex-M33内核里的MPU有了升级,STM32L5上的MPU,在设置区域大小的时候,比以前更加灵活。现在大多数STM32产品内核集成的MPU,设置region的时候,区域起始地址要求是区域大小的整数倍。



典型的MPU用法,利用其基于特权非特权的隔离,把敏感数据和代码,放在仅特权级别能访问的区域。防止不可靠的普通代码,由于软件漏洞,或者被注入恶意攻击代码,来污染敏感区关键代码或者数据。


任务堆栈,即使都处于非特权级别可访问,也能通过在执行某个任务之前,才把它对应的堆栈区域设置成可读可写,其他任务的堆栈区域设置成不可访问,来实现隔离。


除了任务堆栈,普通共享堆栈区域,一般设置成不可执行,以避免恶意代码的注入。


另外,虽然MPU只能监测CPU的行为,管不到DMA的访问行为,但是毕竟DMA本身的控制寄存器是在32位地址的4G空间里,那么就可以作为一个region被MPU管理。MPU可以设置DMA寄存器不可访问。这样普通应用代码就无法启动DMA去做一些攻击。


需要注意到是,MPU本身的寄存器是不受保护的。


典型案例:

只能几个“高级函数”能访问OTP中的数据

用户应用需通过“高级函数”的wrapper API才能调用访问OTP的服务

用户应用直接调用“高级函数”会导致memory fault



MPU,是几乎所有STM32系列产品都集成的功能,这是内核的一部分。除了F0,它是Cortex-M0,内核本身就不带MPU。




防火墙




防火墙,在低功耗系列 L0和L4中集成的一个保护功能,又叫firewall。


MPU保护的是整个4G空间上的,具体目标叫做region;Firewall保护的是STM32片上flash和SRAM1,具体目标叫做segment。注意,有些芯片有SRAM2,但是它不在防火墙的保护范围内;这些SRAM2可能会被RDP1保护。

从右边的框图可以看到,防火墙能够监测不仅是内核CPU,包括DMA的违规访问,都能被逮住。


防火墙的实现原理:在用户flash上可以设置受保护的code segment,存放敏感操作代码;还可以在flash上设置受保护的data segment,存放敏感常数,比如密钥。还可以在SRAM1上设置受保护的data segment。一旦防火墙使能,所有来自未保护区域,对这些受保护区域的访问,都必须走一个统一的入口,而这个入口是在code segment或者sram上的data segment的最开始位置。对于SRAM1上的data segment,还有额外的一些属性,是否sharable,是否executable。


所有违反防火墙状态和segment属性的访问,都被视为非法,会触发系统复位。那什么是防火墙状态呢?



防火墙状态有这么几种:IDLE,Open,Close。按照时间顺序。。。


上电后,没有激活防火墙之前,firewall处于IDLE状态。所有代码也都处于未被保护的状态。一旦激活了防火墙,它的状态就处于Close。可以理解一个金钟罩放了下来,把受保护的区域盖在里面。这个金钟罩有一个门,所有要访问罩子里面内容的操作,都要从这个调用门进入。进去之后,防火墙状态切换到Open,可以操作里面的受保护资源。执行完毕后,正确的流程也是从这个调用门退出。然后防火墙的状态就自动切换回Close了。就是图中1/2/3,标志的三个序列。


什么叫做非法操作呢?当防火墙已经使能,并且状态是close的时候,如果外面的代码,不走调用门,直接访问墙里的资源,就会被视为非法操作,产生系统复位,防火墙状态也自动被复位成了IDLE状态。就是图示中的a。


正常情况下,如果是走调用门进的,一定也会从调用门出。因为里面的执行流程不是外面的caller代码可控制的。调用门提供给你一个API,和若干参数,以此根据不同的参数,你可以使用墙里的各种受保护服务。退出防火墙的代码也是安全代码的一部分,它会清除掉现场的敏感数据上下文,然后退出防火墙。


但是有一个情况,如果已经从调用门进入了墙里,防火墙状态处于Open的时候,发生了中断。接下来会出现什么情况?中断的响应是异步的,它会马上去向量表取中断处理函数的入口地址,显然这不会走调用门代码预习设置后的几个出口退出。于是非法操作发生了。要么立马触发系统复位,防火墙状态也恢复成IDLE;要么让中断继续执行,防火墙状态切换到close,在中断执行完成后,返回刚才墙里的位置,这个时候,显然也不是走调用门进来的,那么产生复位,防火墙状态还是回复到IDLE状态。即图中b、c表示的地方。走b流程还是c流程,取决于FPA寄存器的值。



所以使用防火墙的时候,要注意,进入墙里之前,最好把中断关闭。

防火墙的激活,是靠寄存器的,不像选项字节那样一上电,即使不执行代码都能生效的保护机制。所以它不是静态保护。但是呢,和MPU不一样,防火墙激活后不是可以靠寄存器操作再切回成IDLE,只能通过系统复位,让寄存器恢复复位值,从而让防火墙状态恢复成IDLE状态。这种保护周期,和安全用户存储区类似。


进入受保护的区域,防火墙状态为Open,此时这段关键代码时可以调试的,只是需要注意,汇编代码窗口,memory窗口中不能显示保护区域范围内的地址,否则这是一种debugger企图读取,但是又没有走调用门进入的非法操作。


G0没有集成防火墙功能,这里暂时不展开来讲了。大家可以参看AN4730这篇文档,还有STM32CubeL4固件包里的防火墙例程,体验一下,调用门函数的结构、如何进入如何退出。在防火墙里的时候,如何调试代码。



防火墙只在L4和L0上才有。


它是一种隔离,区分关键敏感代码,和普通代码;但是更多是“访问控制”,只能从这里调用,以API规定的方式访问;防火墙本身没有权限的区别,除非放在MPU的区域里




TrustZone




TrustZone 是ARM Cortex-M33内核的新安全特性。STM32L5把这种隔离的思想,从内核本身,进一步扩展到了整个芯片的片上系统。

基于TZ架构的MCU开发,应用开发的编程模型,与以往完全不同。


OTFDEC是on the fly decryption的简称。在外部flash里存储加密固件,通过OTFDEC,可以把加密固件实时解密并运行。


这两个安全相关特性都是,或者准确点应该说,一个安全架构,一个安全特性,这两者都是在STM32L5系列中最新引入的。》》我们在专门的L5系列课程来讲,不在今天的培训范围之内。




Tamper



入侵检测Tamper。在L5系列之前,所有的产品都是静态入侵检测,即只检测tamper引脚上设定的边沿变化。攻击者如果把这个引脚固定在“所谓合法”的电平,设备开盖就无法被阻止。因为它没有检测出来警戒的那个电平变化,无法触发入侵事件,去让硬件擦除备份域上的敏感信息。


动态入侵检测,检测引脚都是两两,一对一对的,一个输入一个输出。从tamper输出引脚输出一个随机序列,在tamper输入引脚,在芯片外部电路板上,弯弯绕绕走线,但是是和对应输出引脚短接。那么它会期望输入相同的随机序列。弯弯绕绕走线,可以确保,当产品外壳被破坏,能够检测到的破坏点更多。一旦这对tamper引脚回路上某个地方被破坏,tamper_in引脚就收不到了期望的随机数序列了。由此就判断,一个入侵事件发生,从而触发对应存储区的擦除。



Tamper 功能也是从始至终在每个芯片系列里都有集成的。这是L5的Tamper功能更强大。




本期回顾


回顾一下本期内容:



STM32的片上存储和执行保护模块。他们的保护对象不同,防止的威胁也不同。有的是着眼于隔离,有的着眼于区分权限,有的是做访问控制。这些保护功能的生命周期也有所不同,像RDP、WRP这种是一上电,马上生效,所谓“静态保护”,像防火墙、用户安全存储区是上电后要靠代码执行才能生效,但是保护的有效期会持续到下次系统复位之前,所谓“半动态保护”。还有一种保护的生效和撤销更加随意,在时间上没有什么限制,通过寄存器来使能和关闭保护。



本期的介绍就到此结束,下期我们会介绍STM32片上集成的另外一类安全模块,即支持密码学的加解密硬件模块。敬请大家关注。





微信扫一扫