对电子嵌入式系统的安全和安全保障需求从未有今天这样强烈。随着汽车的自动化程度不断提高,我们需要提高其安全保障水平,防止它们被黑客攻破。对于采用大量机器人与物联网(IoT)设备,需要处理敏感数据的工厂来说,同样如此。
对所有此类嵌入式系统来说,非易失性闪存存储器必不可少。闪存可用作代码存储、文件系统存储或直接运行代码的微控制器单元(MCU)存储器。如果要实现系统安全性,必须首先确保系统使用的闪存存储器是安全的。本文探讨闪存存储器的安全需求,帮助开发人员为汽车、工业和通信应用构建安全有保障的嵌入式系统。
闪存存储器的使用方式
如果我们仔细观察现代汽车的电子系统,我们会发现闪存在整车上都得到广泛使用。随着系统的复杂性增加,我们需要更大容量的代码存储和数据存储。车内的所有子系统,包括高级驾驶辅助系统(ADAS)、仪表系统(即将与信息娱乐合并)、传动和车身系统,都需要嵌入式系统才能实时运行。
所有这些嵌入式系统都需要某种类型的闪存存储器,用作代码存储和数据存储。例如,图1所示的是一个使用多个NOR闪存器件的ADAS子系统。
图1.该ADAS子系统使用多个NOR闪存
在当今的ADAS应用中,复杂的算法和人工智能流程依赖在闪存存储器中存储的代码和数据来运行。存储必须提供故障安全和安全保障,因为系统故障或恶意攻击可能导致严重的人身伤害乃至身故。
在工业和网络应用中,也存在对存储解决方案的类似安全与安全保障需求。在互联互通程度不断提高的大背景下,黑客能突破任何与互联网相连的薄弱实体,窃取敏感信息,或者将被攻破的设备当作跳板,在整个网络中的其他地方发起攻击。因此,构建有安全保障的系统,避免发生这种类型的攻击,变得至关重要。
有安全保障的闪存存储
多年来,闪存存储器厂商一直提供纯粹的数据存储。对于这些应用,耐久度和保持能力是衡量闪存存储器质量的两大指标。安全保障并非是对这类型闪存器件的要求,这就意味着存储在闪存上的数据要么完全不受保护,要么使用未经认证的命令进行保护。
例如,一些闪存器件通过正常命令集提供基本的保护功能,例如针对编程或擦除操作对扇区提供非易失性或易失性保护、针对编程或读取操作的密码保护等。这些功能虽是好功能,但不足以抵御手段高明的攻击。如果黑客能够访问闪存器件的总线接口,他们就能轻易地提取或修改设备上的数据。
为了保障安全,闪存器件必须保护存储的代码和数据免受多种手段的攻击。下面总结了闪存存储设备需要加以防范的几种攻击。
•中间人(MIM)攻击
MIM攻击中的黑客常模仿通信信道的发送方,发送命令或消息给另一侧,以窃取或修改数据(图2)。因此,有必要认证主机和闪存设备间的每一条消息。认证可通过在主机和闪存上使用公共密钥,生成伴随实际消息的消息认证码(MAC)来实现。接收方可以在对消息采取行动之前先验证MAC。
图2.中间人攻击常模仿通信的信道发送方发送命令或消息,最终目的是窃取或修改数据
为了防止在密钥受损时系统被永久破坏,通常需要使用临时密钥。临时密钥会在一定时间或在一定次数后失效。这样做的目的是尽可能避免密钥被破坏性物理分析(DPA)或其它迭代攻击等方法进行解密。
另一种中间人攻击则是在一定时间以后重放截获的合法消息。为了防范重放攻击,主机和闪存设备必须使用累加计数器(值随每个消息递增)生成MAC。由于当前的累加计数器值与上一消息的值不同。重放相同的消息就不能通过MAC验证,
•克隆
一些黑客可以使用先进的技术读取闪存芯片中的全部内容,通过非法克隆牟利。为了防范此类攻击,每个闪存芯片都必须拥有任何人都不能读取的唯一设备秘密(UDS)。UDS值具有唯一性,是每个芯片内的真实随机值。一个芯片和另一个芯片中的UDS之间毫无关联。
UDS可用于推导复合设备标识符(CDI),而这个标识符是生成可信计算工作组织(TCG)设备标识符组合引擎(DICE)规格定义的设备ID证书的基础。一般来说,设备也在CDI的基础上,为所有用主机导出的密钥生成别名私钥公钥对。这样就无需暴露设备ID的私钥。
有了UDS和DICE流程后,由于UDS在物理上不可克隆,因此黑客就无法克隆设备。
•窃听
被动侦听是另外一种已知的攻击方式。攻击者通过在总线上窃听,可从通过总线传输的数据中搜集敏感信息或机密情报。为保护重要数据,用户可选择在通过总线将数据发送到闪存设备,并存储数据前为数据加密。当主机从设备检索数据时,也应对数据进行加密处理,让潜在的黑客永远无机可乘。
也许有人会说,加密方法不需要有安全保障的闪存存储解决方案,因为主机可以直接加密数据并将其存储到闪存中。只有主机才能解密数据。
然而,这样做也有一定的缺点。其中之一是主机不能轻易地弃用加密密钥。例如,假设使用KeyA加密数据并将其存储在闪存中,后来用户发现KeyA已被攻破,就需要在系统上使用不同的密钥,即KeyB。
这时,主机陷入两难境地:它不能直接弃用KeyA,因为它需要保留该密钥,才能解密从设备读取的数据。然而,如果KeyA被攻破,用户可能不想永久保留它。如果要使用新的数据加密密钥,用户不得不采取更复杂的措施。先擦除闪存上的原始加密数据,再用新加密的数据为闪存编程。这种操作在现场并非易事,且存在一定风险。
另一方面,如果有安全保障的闪存能够提供加密和解密功能,它就能在其有安全保障的存储中安全地存放明文数据,并在将数据发回给主机之前进行加密处理。如果当前的加密密钥被攻破,主机可以简单地与设备交换新的密钥。存储中的数据保持完整且有安全保障,与存储加密数据相比,是一种简单得多的方法。
保护措施
下面介绍开发安全闪存存储的各个步骤:
•提供灵活的存储器架构
在现代的多核嵌入式系统中,多个MCU或硬件安全模块(HSM)可能可以访问同一个闪存存储。闪存设备有必要提供一种灵活的存储器架构,可以对其进行分区和配置,以便通过不同的内核管理不同的区域。这些不同区域可提供不同水平的安全保障,或者在完全不需要时,取消安全保障。
通过了解eMMC标准和UFS标准,我们显然可以看到支持多个安全区域的趋势。当前的eMMC标准规定了重放保护内存块(RPMB)。最新的UFS(v3.0)标准可为四个RPMB分区提供智能支持,它们由四个不同的密钥进行管理。这样的存储器架构灵活性在多核SoC环境中更加合适。
•提供快速的安全启动功能
众多嵌入式系统都在闪存中存储启动代码。部分是因为需要快速启动,例如汽车子系统需要在加电重置(POR)的100ms内处理CAN消息。系统不仅需要安全启动(即验证启动代码),还需要快速启动。这就给嵌入式设计师提出更高的挑战。
一般情况下,在运行存储并下载(SnD)模式时,主机从闪存读取引导加载程序并映射给RAM执行。然而,要想安全启动,就需要检查认证整个引导加载程序代码,以确保其可信性。这个过程需要在MCU上花费时间。有安全保障的闪存存储能够提供引导加载认证,大幅度缩短启动时间。
安全的闪存设备能够使用内部安全散列函数检查引导加载程序,并为主机提供验证用散列值。如果散列值未发生改变,就说明引导加载程序未被篡改,可以安全地用于启动。
•提供安全的固件无线更新(FOTA)
对于现代的嵌入式应用而言,现场升级是必备功能。通过远程升级系统的固件或软件,制造商能够快速解决问题、提供新增特性、提升用户体验。然而,远程升级也会对系统构成安全威胁。没人希望黑客利用现成的更新通道,让系统运行恶意固件或软件。
除了依靠CPU提供的安全保障,闪存设备内部的安全引擎也能大幅提高FOTA流程的安全水平(图3)。采用这样的安全引擎后,提供启动代码存储的闪存设备不仅可以用闪存设备旁边的主机认证固件提供商,也可以在远程云上进行认证。通过这种方式,可以为闪存中的固件更新或软件更新建立端到端的通道安全。
图3.闪存设备中的安全引擎有助于实现更安全的固件无线更新流程
现代汽车、工业、通信使用的嵌入式系统需要有高度安全保障的数据存储。嵌入式系统设计师面临的挑战是,如何构建能够抵御网络攻击的安全系统。集成安全保障特性的闪存,如赛普拉斯的SemperFlash,通过防范各种针对嵌入式系统的攻击,提高整体系统的安全性。