来自Fraunhofer AISEC的两位研究员Johannes Obermaier和Stefan Tatschner,在2017年的USENIX Workshop中介绍了如何突破STM32F0系列单片机的固件保护功能。在破解过程中,研究员突破了很多困难,最终成功降级其安全级别,并顺利读取到固件信息。STM32单片机在国内被广泛用于智能门锁、共享单车、LoRa无线产品等低功耗产品中,这次突破将对这些弱性能的终端造成严重的影响。
一、简介
随着物联网的不断发展,传感器的广泛应用,MCU的性能也经历了满足产品接口与稳定性的需求到性能过剩的阶段。近几年,物联网终端的安全问题的源头大部分指向了终端固件的保护不周,所以,各个MCU的厂商也在其芯片内植入了类似于安全芯片的能力,比如ARM提出并实现了TrustZone技术满足Cortex A和最新的Cortex M系列的芯片安全需求;NXP实现了CRP技术保护LPC1788等MCU的固件安全;ST公司实现了RDP功能实现固件保护。如果攻击者或者研究员想进一步读取固件,必须突破芯片厂商设置的这些保护能力。
本文解读的就是这样一篇论文1,来自Fraunhofer AISEC的两位研究员Johannes Obermaier和Stefan Tatschner,在2017年的USENIX Workshop中介绍了如何突破STM32F0系列单片机的固件保护功能。在破解过程中,研究员突破了很多困难,最终成功降级其安全级别,并顺利读取到固件信息。STM32单片机在国内被广泛用于智能门锁、共享单车、LoRa无线产品等低功耗产品中,这次突破将对这些弱性能的终端造成严重的影响。
这种安全问题的出现,会导致大批的终端的固件被人提取,进而分析出安全问题。好像是我们家的门锁能被万能钥匙打开一样,物联网终端研发厂商也对芯片自身的安全能力能提供的安全程度产生了担忧。
研究员以STM32F051R8T6这款MCU为实验平台,如图 1所示,通过配置其相关寄存器设置读保护级别,使MCU在上电后可以运行在Level 0,Level 1,Level 2这三个安全级别下。Level 0不提供任何形式的安全防护,Level 1提供Flash访问限制和SWD调试限制,Level 2则完全禁止了SWD的调试能力,Level 2状态下的芯片无法解除该安全级别,即便是开发人员自己都无法通过调试接口再次烧写和调试固件。论文中,研究员经过实施攻击实验,最终得出一个结论:STM32F051R8T6单片机固件的读保护功能(RDP)的Level 1级别下存在重大缺陷,Level 2级别可被降级为Level 1。
接下来笔者就给大家解读一下中提到的三个安全问题,希望能使更关心物联网终端安全的人能对一些方案的安全性有更加清晰、深入的认识。
二、问题1:Level 1下的SRAM信息泄露
SRAM是静态的随机存储器,是RAM的一种,其特点就是不需要持续刷新也可以保留数据。在MCU中一般用于存放运行时的数据,如变量。研究员的攻击效果是:可以定时地采样芯片运行过程中的SRAM中的数据,定时的精度可以达到微秒级别。这将有助于研究人员从SRAM中分析到密钥等认证、加密参数,突破整体方案的安全性。
那研究人员是怎么发现这样的问题,又是怎么读取到的数据呢?在Level 1模式下,官方手册说通过ST-LINK这种调试器是可以连接到MCU上,而且SRAM中的数据是可以访问的。经过测试,MCU被重置以后,SRAM中的数据没有被清除,所以在这时候可采集到SRAM中的数据。但是由于程序已经停止运行,SRAM中的数据只是当前程序运行时的状态,有一种给虚拟机设置快照感觉。
研究员的实验如图 2所示,首先使用ST-LINK连接MCU和笔记本,这样可以保证可以使MCU暂停程序运行。但是要想保证能定时读取,需要每次读取前能给MCU上电,上电之前还要保持复位信号,这样MCU每次上电后会停止在初始状态,通过控制复位信号使芯片运行程序。将ST-LINK连接到MCU,此时可发送复位指令并读取SRAM的数据。为了保证每次试验开始时候,SRAM必须是经过断电清除数据的状态,这样经过运行一段时间后,SRAM中的数据才是从上电后,ST-LINK控制其复位的时刻的数据。还需要做一个高速可控的开关以保证采集数据的精度,这个高速的开关由三极管、电感、二极管、电阻组成,经过一个MCU的IO引脚控制。由于时间精度要控制到微秒,所以,安装消费级操作系统的电脑无法满足微秒级别的响应,即便是经过实时处理的Linux内核也无法满足亚微秒响应级别的开关电路。所以研究员直接利用MCU的IO实现亚微秒级别的IO控制后面的硬件开关电路,进而实现高速开关,最终实现了可以控制到微秒级别的攻击周期。
假设一次操作周期是T,则其可控的时间是nT(n是自然数),即采样时间周期的整数倍,实现了在Level 1的安全模式下类似单步执行的效果(每一步花费一个或者几个周期,而现在控制精度达到微秒级,最多也就几十个指令的执行时间,所以控制到微秒级别已经足够有说服力)。此功能有助于研究员进行单步调试,结合固件的信息能挖掘出更多的其他信息,以致嵌入式系统“裸奔”在研究员的手中。那SRAM信息泄露会带来哪些风险呢?相比于固件信息的泄露,SRAM中的信息更有价值,如果终端密钥通过安全地交换算法从云端获得,终端的固件中是没有密钥的,只有从RAM中获取,又因密钥本身格式特征很强,所以很容易从RAM中提取到通信密钥。用于校验完整性的校验结果或者签名信息,也会存储在RAM中。
三、问题2:Level 1完整固件被泄露
研究员发现的第二个问题是Level 1下完整固件会被泄露。也就是说,Level 1的防护大门是可以被打开的。接下来我们看看研究员是怎么把这扇门打开的。
前面提到,在Level 1模式下,SWD调试器可以连接到MCU上。那连接上以后为什么不能读取flash中的固件信息呢?这个问题的答案一定可以从SWD调试器和MCU的交互中得出。由于ST-LINK调试器本身的限制,当连接到MCU,向MCU发起读取一个字节操作时,MCU的flash立即被锁定了,而且ST-LINK的固件调试起来有限,所以ST-LINK不满足实验需求。于是研究员利用MCU简单实现了一个SWD的简单功能,由于代码完全可控,所以能非常方便地看到SWD调试工具和MCU的所有交互流程。又因实验需求比较明确,流程可以自动化地实现,所以笔记本电脑需要和SWD模块通信起来,“告诉”SWD模块使用哪些功能对MCU做操作。于是实验的方案如图 3所示。
实验过程中,在调试板上设置LED以保证当flash被锁定时,LED不亮,当flash没有被锁定时,LED一直亮着,以此判定是哪些操作会触发flash的保护。最终证实:锁定是由相应的SWD访问系统总线的数据包传输的最后一个SWCLK上升沿触发的。也就是说,SWD连接到MCU以后,只要不访问到系统总线,那flash就不会被锁定,而flash刚刚在系统总线上。如果想理清通过系统总线锁定flash的所有细节,需要SWD在连接上MCU以后什么数据包都不发送,以保证flash没有被锁定。接着,发送读取flash某个地址一个字(32位)的请求,观察都有现象,最终研究员发现:当SWD像flash发起读取一个字的请求后,flash被锁定,但是,该地址的一个字的内容已经被读取到SWD调试器中,且任意flash地址是可以这样被读取到。
有了以上结论,只要不断地把地址从flash初始地址在每个读取循环中+4即可,直到所有的flash的数据被SWD模块读出,Level 1下的flash固件也就被全部读取到了。
到此为止,已经能证实Level 1的保护失效了。研究员还深入地研究了读取效率,最终在2小时内将256k字节的固件读取完成,这个大小的flash在MCU中已经很大,所以该测试结论已经有足够的说服力。
四、问题3:Level 2可被降级为Level 1
STM32的最高安全级别为Level 2,该级别下的MCU不可被逆为Level 1。然而,研究员在其设计上找到了缺陷。由于安全级别是可以被长期保存的,所以不会把状态设置在RAM中,一定有个flash区域存放Level级别设置信息。该设置信息由一段选项字节表示,所以,如果要把Level 2降级,则需要把这段选项字节改掉。由于Level 2模式下无法将SWD模块和MCU之间建立连接,所以研究员采取光照方式把该区域的值改掉,使其脱离了Level 2模式。
为什么这么容易被脱离Level 2模式下呢?这和Level级别的设置方式有关:只有两个特定的值能被用于设置Level 2和Level 0,其他值得状态下都是Level 1。也就是说,我只要翻转Level 2下的选项字节的任意一个位,就一定能改变安全级别,相当大的概率会降为Level 1。如图 4所示。如果Level 1也只能被一个特定值设置,那问题也不会这样严重。
根据flash区域的材料特征,其值会被光照条件下发生临时或者永久性的改变。只要将芯片剖开,使flash区域暴露出来,把该选项字节暴露在光照条件下,保证有至少一个位翻转,则攻击也就成功了。
为了不让光照影响flash的其他区域,研究员利用掩膜,经过多次光照实验,最终确定了该选项字节的位置,如图 6所示。在研究员写入带level 2的flash固件做光照测试后,调试器在几个小时后成功连接到了芯片上。也就是说选项位的值已经被更改到Level 1或者Level 0的级别。
Level 2的安全级别被降级,其实是在芯片被剖开的场景下成功的。且如果要完整地无错误地被读取,是需要器材控制其光照位置的,所以带有一定的攻击成本。这一点能确保Level 2在没有被拆解芯片的场景下可以保证终端固件的安全。
五、总结
该研究员做的工作非常有价值,得出的结论也非常具有参考性。在MCU的性能、稳定性已经逐步满足市场所需时,安全能力的加入让终端安全的攻防格局变化起来,芯片方面的攻与防也正在慢慢的变得愈发激烈。物联网产品设计厂商也需要足够了解MCU的安全特性后,才能真正给出一个相对安全的方案。如果现有的方案使用的STM32,那么直接把安全级别设置为level 2才是最好的选择。
参考文献
- ,https://www.usenix.org/system/files/conference/woot17/woot17-paper-obermaier.pdf