ARM 信任区技术是一种系统范围的片上系统 (SoC) 设计安全性方法。它使得安全设计成为可能,从最小的微控制器(用于 Cortex-M 处理器的信任区)到高性能应用处理器(采用适用于 Cortex-A 处理器的信任区技术)。它是基于硬件的安全性,内置于CPU和系统的核心中,供希望为设备(如信任根)提供安全性的半导体芯片设计人员使用。TrustZone技术可用于任何基于ARM Cortex-A的系统,现在有了Cortex-M23和Cortex-M33处理器,它也可以在最新的基于Cortex-M的系统上使用(参见托马斯·恩塞尔盖克斯关于Cortex-M23和Cortex-M33的博客 - 数十亿台设备的安全基础)。
[图1|信任区安全性可实现共享资源的受控分离]
TrustZone 方法的核心是硬件彼此分离的安全和非安全世界的概念。在处理器内,软件要么驻留在安全世界,要么驻留在非安全世界中;这两个世界之间的切换是通过Cortex-A处理器(称为安全监视器)中的软件以及Cortex-M处理器中的硬件(核心逻辑)完成的。这种安全(可信)和非安全(非可信)世界的概念超出了 CPU。它还涵盖 SoC 中的存储器、片上总线系统、中断、外设接口和软件。
由 ARMv8-M 信任区保护的系统内的软件模块
对于安全解决方案,安全专家建议将受信任的代码减少到最低限度,以减少攻击面并简化安全审核。也就是说,只有在代码经过详尽的检查和攻击测试后,才将代码放在受信任的空间中。需要测试此受信任的代码是否适用于规范,并且需要对其进行测试以确保它不会按预期工作。如果我们应用此建议,则我们想象一个代码分布,如上面的图 1 所示。
安全启动、设备资源管理器和安全 API 将驻留在特权受信任的空间中。这是对所有资源具有访问控制并具有最高优先级的框。受信任的库驻留在无特权但受信任的空间中。这些库由资源管理器控制,并使用内存保护单元进一步相互保护。在不受信任的一面,我们看到与今天的任何Cortex-M相同的代码分布。特权框中的操作系统和用户空间中的应用程序。这是 TRUSTZone 为 ARMv8-M 带来的强大优势之一,在系统获得安全性的同时,用户端保持不变。高效和用户友好的安全性 - 这是信任区对ARMv8-M的承诺。
大部分工作是在受信任方的代码开发人员的阵营中进行的。建议对代码进行安全审核,这就是建议使用较小代码的原因。
顺便说一句,对于开发人员来说,新的机会将会打开。例如,现在物联网节点的“健康监视器”将出现一个新的市场,如果可信空间中的一小段代码将观察系统的行为以检测异常并破解采取纠正措施的尝试。如果我们认为物联网节点将在现场停留多年而无需人为干预,那么这可能是确保长使用寿命所需的最重要的代码。
对于那些对 TrustZone 的要素感兴趣的人,我向您介绍三大主要新概念:
概念1:由地址定义的安全
处理器使用新引入的安全归因单元来检查地址的安全属性。系统级接口可能会根据整体 SoC 设计覆盖该归因。选择状态后,地址也会通过相应的内存保护单元(如果系统中存在)。
概念2:附加状态
ARMv7-M 和 ARMv6-M 架构定义了两种执行模式:处理程序模式和线程模式。处理程序模式是特权模式,可以访问 SoC 的所有资源,而线程模式可以是特权模式,也可以是非特权模式。使用 TrustZone 安全扩展,处理器模式被镜像为形成安全状态和非安全状态,每种模式都有一个处理程序模式和一个线程模式。安全状态和处理器模式是正交的,从而产生状态和模式的四种组合。在安全存储器中运行软件时,处理器会自动设置为安全状态。同样,当处理器在非安全存储器中执行软件时,处理器会自动设置为非安全状态。这种设计消除了任何安全监控软件来管理状态开关的需要,从而减少了内存占用和功耗,如上文所述。
概念 3:跨域调用
ARMv8-M是为具有确定性实时操作的Cortex-M配置文件而设计的。任何状态下的任何函数都可以直接调用处于其他状态的任何其他函数,只要根据预定义的安全状态入口点遵守某些规则即可。此外,正如预期的那样,每个状态都有一组不同的堆栈和指向这些堆栈的堆栈指针,以保护安全端的资产。函数调用开销大大减少,因为不需要 API 层来管理调用。给定预定义的入口点,调用将直接进入被调用的函数。
现在您已经完全熟悉了ARMv8-M的TrustZone的工作原理,我们深入研究编写软件的机制,以便仅使用三个有用的提示来利用它。
提示 1:利用新的 ARM C 语言扩展功能
ARMv8-M 的信任区引入了一些新的指令来支持安全状态切换。软件开发人员不应创建程序集包装器来生成这些指令,而应利用 ARM C 语言扩展 (ACLE) 中定义的新编译器功能,使软件工具能够了解函数的安全用法并生成所需的最佳代码。ACLE功能由多个编译器供应商实现,因此,代码是可移植的。
例如,在创建可从非安全状态调用的安全 API 时,应在声明函数时使用名为“cmse_nonsecure_entry”的新函数属性。在函数结束时,以安全状态调用 - 处理器内的寄存器可能仍包含机密信息。使用正确的函数属性,编译器可以自动插入代码以清除 R0-R3、R12 和应用程序状态寄存器 (APSR) 中可能包含机密信息的寄存器,除非这些寄存器用于将结果返回给不安全的软件。寄存器 R4 到 R11 的处理方式不同,因为它们的内容在函数边界处应保持不变。如果它们的值在函数的中间发生更改,则在返回到非安全调用方之前,应将这些值还原为原始值。
提示 2:验证不受信任的指针
在某些情况下,非安全代码可能会根据设计提供不正确的指针,以尝试访问安全内存。为了对抗这种可能性,在ARMv8-M中引入了一个新的指令,即测试目标(TT)指令。TT 指令返回地址的安全属性,因此 Secure 软件可以确定指针是指向安全地址还是非安全地址。
为了使指针的检查更加高效,安全配置定义的每个内存区域都有一个关联的区域编号。软件可以利用此区域编号来确定连续的内存范围是否具有类似的安全属性。
TT 指令从地址值返回安全属性和区域编号(以及 MPU 区域编号)。通过在存储器范围的开始和结束地址上使用TT指令,并识别两者驻留在同一区域编号中,软件可以快速确定存储器范围(例如数据阵列或数据结构)完全位于非安全空间中。
[图2 |检查有效区域边界的指针]
使用此机制,为安全端提供 API 服务的安全代码可以确定来自非安全软件的指针引用的内存是否具有 API 的相应安全属性。这可以防止非安全软件在安全软件中使用 API 来读出或损坏安全信息。
提示 3:针对异步非安全内存修改进行设计
非安全中断服务例程可能会更改由安全软件处理的不安全数据。因此,在验证步骤之后,已由安全 API 验证的输入数据可以通过非安全 ISR 进行更改。避免这种情况的一种方法是在安全存储器中制作该输入数据的本地副本,并使用安全副本进行处理(包括验证输入数据),并避免读取非安全存储器。在不需要这种复制的情况下(例如,当处理特定内存区域中的大量数据时),则替代方法是对安全归因单元进行编程以使该内存区域安全。
总结
TrustZone 旨在成为一种高效的用户友好型技术,供所有开发人员创建安全的嵌入式解决方案。安全方的软件开发人员有责任确保整个系统是安全的,并且没有安全数据泄漏到非安全方。为了实现这一目标,概述了三个关键的 TrustZone 概念,以及安全软件开发人员可以采取的三个关键操作来帮助创建安全的系统。ACLE技术保护被调用函数寄存器中的数据。用于验证指针的TT指令,最后,开发人员需要记住,非安全端可能会通过中断安全端来更改数据。
审核编辑:郭婷
-
soc
+关注
关注
38文章
4199浏览量
218883
发布评论请先 登录
相关推荐
评论