yaboPP电子
行业的文章

如何利用LPC5500的Arm TrustZone安全特性

2020年6月25日通过马克·邓尼特,我是NXP的代表

了解LPC5500系列的ARM TrustZone扩展如何以及如何利用自定义安全和非安全应用程序中的安全措施。

随着连接设备的日益增多和黑客的日益复杂,许多公司——比如NXP半导体——已经意识到有必要采取对策。NXP开发了LPC5500系列MCU,该系列具有增强的安全特性,可用于保护嵌入式项目。

NXP采用了符合fips的随机数生成器,选择了“王子”解密算法(允许核心执行对称加密代码),并采用PUF技术实现了4096位短暂片上密钥。当与片上加密硬件加速器“CASPER”结合时,LPC5500 mcu适用于需要健壮的网络安全对策和全生命周期密钥供应的网络边缘物联网应用。

此外,该芯片利用Arm TrustZone技术用于基于cortex - m的设备。在本文中,了解LPC5500系列的TrustZone扩展如何工作,以及如何开始在自定义应用程序中使用安全措施。

什么是Cortex-M Arm TrustZone技术?

最好通过一个例子来说明TrustZone的核心原则。MCU制造商通常提供自定义专有代码,如安全库,引导加载程序,或快速DSP算法在微控制器的ROM.然而,这些应用程序的作者往往有很好的理由来保护他们的知识产权-他们可能不希望用户或竞争对手反编译二进制文件来对算法进行逆向工程。

一方面,程序员希望利用这些预定义的软件库。然而,另一方面,制造商不希望代码暴露给可能是恶意的一方。

非安全用户代码和安全ROM内容驻留在同一物理MCU上。

图1所示。非安全用户代码和安全ROM内容驻留在同一物理MCU上。

供应商希望隐藏实现细节,同时仍然确保开发人员可以访问这些函数。用户代码能够调用隐藏软件的暴露方法,但它不能直接访问安全ROM所拥有的内存。结果是一个由两个隔离的子系统组成的结构。这两个世界之间的过渡由TrustZone安全扩展管理。

这意味着利用TrustZone的微控制器将被架构成两个独立的项目。第一个项目以安全状态启动。然后,它为片上资源配置安全属性,并可能在非安全状态下可访问的表中发布安全功能。第二种包含非安全代码,对安全世界中暴露的功能的访问是有限的。

与早期架构的差异

Cortex-M3和-M4核心知道两个处理器模式:线程模式和处理程序模式。应用软件以线程模式运行,处理程序模式处理异常。代码可以在特权或非特权级别运行,该级别可控制访问某些CPU功能。

与Cortex-M33核心中的TrustZone扩展,如上所述,引入了两个新州。该更改导致四种不同的处理器模式:非安全处理程序,安全处理模式,非安全线程和安全线程。

M33核心中的TrustZone扩展名创建了四种处理器模式。

图2。M33核心中的TrustZone扩展名创建了四种处理器模式。

除其他更新之外,还有新的州推出了新的Systick计时器。所以现在,存在安全状态的单独计时器和非安全状态。

内存分区

如前所述,单片机的内存被划分为安全区域和非安全区域。单片机的CPU核心只有在其中一种安全模式下才能访问安全存储区域。它不能访问驻留在其他内存分区中的任何指令。然而,它可以读写数据RAM的安全段和非安全段。如果CPU核心处于非安全状态,则只能访问非安全指令块和数据内存块。

TrustZone在内存映射中使用安全属性装饰地址范围。有三种安全性属性:安全(S),非安全(NS)和非安全可调用(NSC)。允许或拒绝访问每个内存区域,具体取决于核心的当前安全状态。

CPU可以通过安全模式和非安全模式访问不同的区域。

图3。CPU可以通过安全模式和非安全模式访问不同的区域。

在LPC55S69设备上,根据地址将内存分为安全段和非安全段。如果内存地址位28为LOW,表示内存不安全。否则,它是安全的。唯一的例外是程序内存,它可以通过安全归因单元配置。

安全应用程序的构建块

非安全代码无法对应用程序的安全部分进行任何直接调用。相反,安全部分公开了用户可以访问的功能列表。该列表名为Veneer-table,因为它是一个非常薄的层,从外部可见,但隐藏内部细节。单板表位于内存区域中,带有TrustZone属性NoneEcure可调用。

通常,受保护部分的来源是不可见的。相反,它被编译,给出一个对象库和贴面表作为头文件。注意,这两个文件都不包含任何实际的指令,但是它们一起包含调用安全函数所需的信息。贴面表只包含一个网关和一个到安全内存位置的分支指令,安全内存位置是真正指令所在的位置。

在安全功能和非安全功能之间转换

具有TrustZone扩展的cpu支持在安全与不安全之间进行转换的两个新功能:SG和BXNS指令。

当用户代码需要一个安全的函数时,它通过贴面表进行调用,贴面表位于内存的NSC部分。然后利用SG指令将CPU切换到安全模式。当执行完成时,该控件将通过BXNS指令返回给用户代码:

用户代码必须通过TrustZone gatekeeper调用安全函数。

图4。用户代码必须通过TrustZone gatekeeper调用安全函数。

如果用户尝试非法安全相关的操作,例如直接访问受保护区域,则提出了安全的故障异常。

一个安全Hello World示例

LPCXPRESSO55S69的SDK附带了一些可在MCUXPRESSO中加载的少数俄视侦听示例。如前所述,这些示例包括两个单独的项目:安全部分和非安全用户代码。

安全部分看起来几乎和任何其他MCUXpresso项目一样。但是,有一个区别,就是下面的函数调用:

安全模式下的函数调用

此功能应尽早调用。之后,配置内存和非安全项目是安全的项目的责任:

配置内存是安全项目和非安全项目的责任

因为安全项目处理所有的setup调用,非安全项目没有必要这样做,所以它的main函数很短:

主要功能很短

但是,这个应用程序只调用在其他项目中定义的安全函数。PRINTF_NSE函数的定义如下:

PRINTF_NSE函数

如果遵循该定义,则指向在受保护项目中定义的贴面表。重要的是要记住,非安全项目只知道描述贴面表的头文件。然而,在这种情况下,我们可以看一下源代码中相应的函数:

" __attribute__((cmse_nonsecure_entry)) "装饰强制将函数导出到对象文件中。

分区的内存

安全性属性定义存储器的内存部分,NSC或无担保。每次访问都会检查。为此目的,MCU与处理这些检查的硬件扩展,包括三个逻辑块:

  1. 安全归因股(SAU)
  2. 实现定义属性单元(IDAU)
  3. 安全归因逻辑

SAU是由BOARD_InitTrustZone()函数中的安全项目编程的。这允许将内存划分为8个具有不同安全设置的区域。注意,任何未显式设置的区域在默认情况下仍然是安全的。

IDAU允许MCU制造商(这里是NXP)定义更多的定制区域。在这里,区域取决于地址的第28位。在LPC55S69单片机上,内存映射的底部(0x0000_0000到0x2FFF_FFFF)默认为不安全,因此可以通过SAU自由配置。

仲裁器确保IDAU和SAU设置匹配。对于要标记为不安全的存储区域,必须将两个逻辑块设置为非安全性。否则,内存将返回到默认安全状态。这同样适用于NSC内存区域。对于要NSC的部分,SAU必须标记为NSC,而IDAU必须设置为非安全性。

在MCUXpresso中有一个工具可以让用户快速轻松地定义内存区域。要访问该工具,请使用IDE的主菜单栏并打开TEE透视图:

这个MCUXpresso工具允许用户查看和编辑MCU的内存映射。

图5。这个MCUXpresso工具允许用户查看和编辑MCU的内存映射。

工具左侧的表可以更改内存区域的安全级别。右边的内存映射说明了如何对内存进行分区。

TrustZone提供必要的安全组件

On the LPC5500 MCU series with TrustZone technology, the memory is split into a secure and a non-secure world — it’s possible to allow users to access parts of the non-secure memory, and a secure application can also be written to be utilized by others. TrustZone acts as a gatekeeper between the two worlds and manages how the core transitions between them.

为此目的提出了两项新指示。安全应用程序提供了一个面板表,其中公开了可从非安全上下文调用的函数。单片机的硬件保证了不进行非法的内存访问操作。该硬件还可以用于配置内存映射中的区域。为此,MCUXpresso提供了TEE透视图。对LPC5500系列mcu的安全性有了更深入的了解,可以获得更好的设计体验。更多关于TrustZone的信息可以通过观看找到TrustZone:致电安全的世界

行业文章是一种内容的形式,允许行业合作伙伴分享有用的新闻,消息和技术,所有关于电路读者的行为编辑内容并不适合。yaboPP电子所有行业文章都受到严格的编辑准则,目的是提供读者有用的新闻,技术专业知识或故事。在行业文章中表达的观点和意见是合作伙伴的观点,不一定是关于电路或其作家的所有人。yaboPP电子