“系统正在更新,请勿关闭电源。”我们都看到过这个警告,它通常在电子器件要在闪存安装代码更新时出现。如果更新被中断,闪存将无法正确更新,代码将会损坏,而器件无法运行,即“砖头化” (bricked)。这种大家熟悉的警告存在的原因,是因为使用闪存的大多数半导体器件在编程或擦除操作期间需要一直供电。显然,防止器件“砖头化”是非常重要的。但是,只发出警告就够了吗?有些嵌入式器件甚至都没有用户显示器,因此无法产生警告。在设计中如何才能确保可靠且安全的远程系统更新呢?
嵌入式系统远程升级的重要性远程升级对连接的嵌入式系统日益重要。通过互联网远程修复漏洞或增加新特性,可以节省大量的维护费用;当部署数千个嵌入式系统时,维护便是一个大问题了。随着嵌入式系统安全问题的不断增加,通过远程安全定向代码升级来修复潜在安全漏洞变得愈发重要。显然,升级必须安全地完成,否则,攻击算法便很容易利用不安全的更新来破坏系统。下面是一个典型系统的示例,有助于更好地了解安全可靠的远程升级设施的要求。
系统示例——控制平面桥通信或网络机箱内的控制平面桥(Control Plane Bridge),是需要远程更新的常见系统示例。这种子系统汇集了许多低速外设,比如模拟传感器、电源管理模块、风扇、故障记录存储器和利用I2C、SPI和GPIO接口的状态输出。然后,可以采用速度更快的总线——可能是通信和连网机箱内很常见的子系统接口PCIe,与低速外设直接通信。这种机箱控制子系统能够实施智能汇聚功能,当规定启动点被激活,例如到达最高温度或最低电压水平时,便会“推进”通信。图1所示就是这样一个系统,它是用配备片上微控制器的FPGA (通常称为SoC FPGA) 实现的。
图1 经PCIe远程升级的机箱控制平面桥
FPGA和闪存在上面的例子中,远程更新经由PCIe总线实现,但并未对编程期间可能出现的断电进行保护。让我们看看常见的FPGA实施类型,从而更好地防范闪存远程更新过程中突然断电时可能出现的重大故障。
几乎每个基于FPGA的系统都需要采用某种形式的非易失性存储器来储存配置存储。一般说来,配置存储器位于芯片外或芯片上。基于SRAM的FPGA需要外部闪存,用于上电时的配置。基于闪存的FPGA可以使用嵌在FPGA结构(结构嵌入闪存FPGA)内的配置存储器,或使用基于SRAM的结构,但将一个闪存块放在芯片上(侧面闪存FPGA)。
基于SRAM的FPGA通常使用NOR SPI闪存,因为它消耗的引脚数最少,几家供应商有同样的引脚输出,而且密度高达1 Gb。目前的NOR SPI闪存器件拥有32位地址选择,可扩展成为4GB器件,而且不需要改变指令和控制协议。当这种SPI闪存处于程序或擦除模式 (电荷泵启动) 且电力消失时,会发生什么事情呢?电荷在哪里消失?是否有电路检测到这些闪存的电力故障并将电荷安全地引导到地面?一般说来,正被写入的页面将出现数据损坏。
图2 三种FPGA配置图:带外部配置闪存的基于SRAM的FPGA、侧面闪存FPGA和嵌入闪存FPGA
侧面闪存FPGA系统采用较宽的片上数据总线在上电时载入基于SRAM的配置存储。通常,这种方法载入配置比基于SRAM的FPGA要快,因为后者是采用外部闪存来配置器件的。但是,这种方法存在程序或擦除周期期间功率损失的问题。电荷去了哪里?闪存是否被破坏?是否仅写入页面被破坏?整个闪存都存在风险?FPGA是否能够检测被破坏的片上存储器,或者,在上电期间,被破坏的数据是否被载入到配置存储器内?
闪存的破坏是个问题,如何确保远程数据的安全也非常重要。当嵌入式产品可由终端用户访问时,就存在被篡改的可能。为了防止攻击,必须同时采用软件和硬件的安全功能。仅对远程配置数据文件进行加密远远不够。虽然这种软件加密安全有用,但是还必须将解密数据的硬件 (FPGA) 置于安全保护内。当用户访问嵌入式器件时,加密数据文件很容易被提取。利用价格便宜的电磁探针和进行差分功耗分析 (DPA) 即可实现这一点。采用这种方法提取FPGA安全密匙的例子很多。如果FPGA并未内置DPA对抗措施,则任何远程更新都存在安全风险。当用户能够访问嵌入式产品时,如果没有DPA对抗措施,便如同中门大开,没有安全可言。
在嵌入闪存的FPGA中,配置储存在芯片上,并紧密集成在FPGA结构内。例如,在美高森美SmartFusion2和IGLOO2 flash FPGA上,可经由外部通信端口如USB、PCIe或JTAG等进行编程,整个编程过程由片上专用编程接口管理。此外,SmartFusion2和IGLOO2 FPGA使用了一种称为“在应用中编程”(IAP)的高级编程机制,即便在编程期间有功率损耗的情况下,仍可提供可靠且安全的编程。让我们看看如何采用IAP机制来实现目前嵌入式系统需要的可靠远程升级的能力。
在基于FPGA的嵌入式系统中实现可靠且安全的远程更新嵌入闪存的FPGA可以提供更容易支持安全可靠的远程更新所需的关键功能。例如,SmartFusion2拥有实施关键桥接功能及安全和IAP功能需要的所有主流FPGA特点。如图3所示,低速接口可以采用I2C和GPIO连接。高速主机接口PCIe则作为不需要FPGA结构的专用端口。
图3 SmartFusion2“在应用中编程”(IAP)支持机箱控制平面桥,以实现安全可靠的远程更新
片上处理器可以利用高速存储子系统(HSMS)访问大型内部闪存来进行代码储存,访问大型内部SRAM来进行数据缓冲,而专用DDR控制器则在有需要时访问其它外部存储器。专用系统控制器提供编程期间使用的安全功能,以及远程更新期间使用的IAP功能。图4详细描述了SmartFusion2 FPGA上可以提供的关键功能。
图4 美高森美SmartFusion2 SoC FPGA拥有主流特点及可靠的安全和远程更新能力
利用“在应用中编程”来实现安全可靠的升级SmartFusion2和IGLOO2提供的IAP机制是一种安全可靠地远程更新配置比特流的方法。IAP在FPGA内由专用系统控制器执行,因此并不需要使用任何FPGA结构或其它用户可配置逻辑。IAP功能采用一个外部SPI闪存器件,是一个两步过程。在第一步中,外部SPI闪存器件通过任何可用的接口,比如PCIe、USB、JTAG甚至以太网,用需要的比特流编程。用于SmartFusion2器件编程的所有比特流都进行了加密,以确保它们不会被篡改。
在第二步中,系统控制器通过系统服务请求执行IAP服务。用户向系统控制器提供指针,指向外部SPI闪存内比特流位置的初始地址。IAP系统服务请求也有三个用户选项:认证、编程或验证。认证通常是在FPGA配置存储器编程之前执行的,以验证SPI闪存内的比特流适用于正在编程的器件。在认证期间,器件正常运行。
包含新比特流的外部SPI闪存还包含一个额外的镜像,即用作恢复目的的一个好版本。用户可以在任何时间点使用恢复镜像将FPGA配置为良好状态。恢复镜像可以 “原样”保存,也可在需要时进行更新以便用于关键漏洞的修复。
IAP功能实施期间可以使用程序恢复功能。若编程期间断电,启动编程恢复,系统控制器会以可控的方式将编程FPGA的内部电荷泵禁动。在接下来的供电周期中,在启动FPGA结构之前,系统控制器将检测到器件编程操作已经被中断,它将从外部SPI闪存中的比特流启动编程周期。用户可选择从好的镜像进行更新或从刚刚推送到SPI闪存的远程更新镜像进行更新。当外部比特流被载入到SmartFusion2 FPGA内时,它采用内置的DPA对抗逻辑,以确保没有电磁探针能够将加密匙解密,从而为嵌入式系统提供可信任的安全器件。
与安全加密比特流和比特流验证一起使用,程序恢复可提供目前连接的嵌入式系统需要的安全可靠的远程编程更新机制,即使FPGA配置存储器在编程的过程中断电也一样。