将用户存储空间划分为安全区域
较新型NOR器件的用户存储空间能够划分成多个区域,每个区域可以单独配置,用于传统(非安全)访问或安全访问。配置为安全访问的区域能够设定为受控读/写访问或认证访问。
配置为受控访问的安全区域能够独立启用或禁用读/写操作。启用/禁用设置由认证序列(需要主机MCU证明其知晓共享密钥)进行管理。在制造过程中,共享密钥将被同时加载到主机MCU和存储器。试图访问禁用区域的读或写将在读取期间返回未定义数据,并且写入尝试将会被阻断。配置为受控访问状态的区域可以选择配置成加电读/写访问状态。例如,可以将启动区域配置为加电时可读不可写,而将其余区域配置为禁用所有读/写访问。
此外,安全区域也可以配置为只支持经认证的读写访问。认证区域不支持传统读写。认证读写操作是通过数据包传输来执行的,其中包含HMAC,表示知晓共享密钥和非易失性命令累加计数器值。在访问请求中使用命令累加计数器能防范重放攻击。
图3 - 用户阵列的安全分区
软件层之间的安全性
此外,分层验证软件也成为安全环境中的常见做法。可信计算组织的设备身份合成引擎(DICE)工作组已发布一项策略,即每层代码在释放控制前都需要向下一层代码进行证实。当主机MCU无法集成可编程存储器时,系统级场景会变得更加复杂。从NOR闪存CPUSS ROM开始(推定为可信),分立闪存器件开始支持DICE策略的变化。
NOR闪存CPUSS ROM在加电重置(PoR)时执行,在将代码执行移交给CPUSS闪存前,先验证其捕获的闪存器件启动代码(在CPUSS闪存内,未暴露给用户阵列)是否完整。完成这种DICE 0层复合器件识别符(CDI)计算需要结合使用唯一的器件密钥(对每个闪存器件有唯一性),以及对驻留在0层中的闪存器件启动代码的测量值。
国际标准文档NIST SP800-56C介绍了在CDI计算中使用的可接受的加密单向函数。唯一器件密钥用于0层CDI计算。0层CDI验证将计算值与NOR制造商提供的存储在片上的预期值进行比较。
在确认CPUSS闪存有效后,代码执行就从ROM启动代码传递到(0层)CPUSS闪存器件启动代码。接下来,NOR器件将验证由系统制造商编程到用户阵列中的系统级启动代码。测得的系统级启动代码值将被用于与器件配置过程中存储在片上的预期值进行比较。这两步验证发生在闪存器件运行其PoR序列的过程中,在可供主机MCU访问之前。请注意,在整个启动过程中,务必确保CDI值不被暴露给更高层的代码,当然还有恶意行为者。