检查安全配置 & 构造安全执行环境
同一般的 MCU 启动比较,STM32 安全启动多了一些步骤。首先,安全启动检查相关的安全静态配置是否已经设置完毕,例如 RDP 的级别,PCROP,WRP。如果首次启动则需要配置这些选项字节。然后,安全启动会去设置那些每次运行都需要重新设置的硬件配置 Firewall,MPU,IWDG 的配置。用户可参考下图图示理解安全启动的过程。最后,是对下一级固件进行验证。这个安全的执行环境保证了启动的顺序不会被改变,以及启动代码的保密性。
防外部攻击
此处谈及的外部攻击不是把芯片剖开,使用光学显微镜进行拍照,从而进行逆向工程;或者使用激光对芯片线路进行切割或者连接。这种攻击的成本非常高,需要丰富的专业知识,也不是通用 MCU 所设计防护的目标。还是那句话,没有绝对的安全。我们所做的防范都是根据安全风险分析而制定的。
MCU 的内置 Flash、内置 SRAM 的特点决定了 STM32 可以很容易做到防外部攻击。因为外部攻击的主要手段会来自 JTAG。而不像非单片机那样,你需要担心外置的 Flash,是否直接被 Solder off, 然后放在其他读写器进行修改。也不需要担心外置的 SRAM 会不会被攻击者进行探测。
STM32 防外部攻击主要通过将 RDP 设置成2。
RDP
读保护 RDP 是 STM32 系列一个非常重要的安全设置,而且设置特别简单。
芯片默认的 RDP 一般是等级 0。这个时候任何人可以通过 JTAG 访问所有资源,可以擦除、读写 Flash,可以进行调试,可以通过 JTAG 直接从 SRAM 启动,也可以修改 boot pin 脚从 system memory 进行启动。
若需要达到的一般化的安全等级,RDP 要设置成 1。这个时候通过 JTAG 就没有办法直接访问 Flash 了。在这种情况下,固件的知识产权受到了保护。
为了更好的安全性,一般将 RDP 设置成2。
◎ JTAG 不能连接 STM32
◎ 选项字节再也不能修改;例如 WRP 所保护的区域就是一个真正的 ROM 了,再也不能修改了。
不过 RDP 设置成2,就再也不能回退了。所以,如果代码还没有测试好,例如通过软件更新系统的功能还没有测试好,那么就不要急着把 RDP 设成2。
STM32 全系列都有 RDP 的设置。当然 STM32F1 系列不具有 RDP2 的设置。使用 STM32F1,又想达到比较高的安全性,需要自己考虑软件中的设计。或者,简单一点,可以考虑去使用其他兼容 STM32F1 的系列,例如cSTM32F4 替换。
RDP 的设置非常简单,开发时可以通过 ST-Link 直接选择。也可以通过 STM32 CubeProgrammer 来完成。更方便的途径,是可以在程序里直接完成。若想了解在程序里直接设置 RDP 的代码,可以参考 SBSFU 开发包。
其他手段
外部攻击还有一些手段,例如操纵电压、操作芯片的温度、操纵时钟,将设备打开让开发板的布线暴露,针对这些攻击,STM32 也有相应的技术。我们把它归结为系统监控类。这些防护我们后面会提到。
防内部攻击
内部攻击的表现形式一般是注入恶意代码,或者缓冲区溢出。通过这些攻击手段,攻击者的目的就是为了盗取密钥,固件代码或者其他敏感信息,达到破解设备或者仿冒设备的结果。“外敌易挡,家贼难防”,如果有恶意代码混进来,我们需要额外的多项 STM32 安全技术来保护。
MPU
内存保护单元是来自 ARM 的一项技术。在所有的 STM32 系列除了 STM32F0,都有该硬件单元。STM32F0 的用户,也不用着急。为了更好的安全,用户可以选择产品 STM32G0。STM32G0 是可以看成是 STM32F0 的升级版本。
MPU 是一种权限设置保护。通过MPU,可以将内存分成多个单元。每个单元可以单独的设置权限。例如,若将 RAM 设置成不可执行,那么代码注入和 Buffer overflow 到 RAM 就不能工作。
MPU 是一种内存保护技术,主要保护内核所访问的内存,缺点之一它不能保护DMA,缺点之二是它不能自己保护自己。默认情况下,后面的代码依然可以修改MPU 配置。也就是说,如果如果你前面使用了MPU 保护一段内存单元,后面的其他代码还可以修改MPU 配置将保护去掉。
解决这个问题的办法是结合内核的特权模式与非特权模式。我们可以查阅 STM32 的编程手册。手册里写到,某些寄存器只有在特权模式下才能访问。这些只有在特权模式下才能访问的寄存器,就包括了 MPU 的控制寄存器。即只有特权模式才能将 MPU 的配置 修改。如果我们将整个代码分成两部分:安全敏感性操作工作在特权模式,一般用户固件工作在非特权模式下。那么非特权模式下的用户代码就没有办法直接修改 MPU 寄存器,也就是没有办法将配置好的 MPU 关掉或者修改掉。STM32 SBSFU 对 STM32F4、STM32F7 就使用了 MPU 结合特权用户模式,来达到更好的安全效果。
值得强调的,MPU 作为动态保护技术,无法单独存在,必须结合防护外部攻击的 RDP 一起使用。但是,MPU 也可以被用来做开发诊断。MPU 的分区权限设置这个功能,可以帮助开发人员定位错误。