二. 问题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控制后面的硬件开关电路,进而实现高速开关,最终实现了可以控制到微秒级别的攻击周期。
图 2 SRAM快照测试实验器材及连接方式
假设一次操作周期是T,则其可控的时间是nT(n是自然数),即采样时间周期的整数倍,实现了在Level1的安全模式下类似单步执行的效果(每一步花费一个或者几个周期,而现在控制精度达到微秒级,最多也就几十个指令的执行时间,所以控制到微秒级别已经足够有说服力)。此功能有助于研究员进行单步调试,结合固件的信息能挖掘出更多的其他信息,以致嵌入式系统“裸奔”在研究员的手中。那SRAM信息泄露会带来哪些风险呢?相比于固件信息的泄露,SRAM中的信息更有价值,如果终端密钥通过安全地交换算法从云端获得,终端的固件中是没有密钥的,只有从RAM中获取,又因密钥本身格式特征很强,所以很容易从RAM中提取到通信密钥。用于校验完整性的校验结果或者签名信息,也会存储在RAM中。 三. 问题2:Level 1完整固件被泄露 研究员发现的第二个问题是Level 1下完整固件会被泄露。也就是说,Level1的防护大门是可以被打开的。接下来我们看看研究员是怎么把这扇门打开的。 前面提到,在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所示。
图 3 自定义SWD模块读取固件 实验过程中,在调试板上设置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中已经很大,所以该测试结论已经有足够的说服力。
|