ARM系列之ARM 平台安全架构PSA 固件框架
1 Introduction
Arm的平台安全体系结构(PSA)是一套完整的体系结构,包括:
- 威胁模型
- 安全分析
- 硬件和固件架构规范
- 开源固件参考实施
- 独立评估和认证方案——PSA认证。
PSA提供了一个基于行业最佳实践的配方,使安全性在两个方面都得到一致的设计硬件和固件级别。
PSA固件框架规范定义了标准编程环境和固件,用于在设备的信任根内实现和访问安全服务的接口。安全的编程环境和应用程序编程接口(API)的标准化跨一系列安全硬件实现的服务允许并鼓励重用固件组件。这种重用对于可持续地降低开发和集成安全软件的成本至关重要设备。
本文内容包括:
- 设计的基本原理
- 架构的高级概述
- PSA固件框架组件的详细说明
- PSA固件框架接口的完整定义
1.1 Scope
本规范从中定义的总体系统安全体系结构中得出其要求PSA安全模型。PSA安全模型的图1显示了总体架构及其组件部分。
PSA安全模型将系统内的执行分为两个域:
PSA安全模型要求NSPE固件或硬件不能检查或修改任何SPE硬件,代码或数据。PSA将安全功能公开为信任根服务(RoT服务)的集合。每项服务是一组相关的安全功能。例如,可能存在用于加密操作的RoT服务,另一个用于安全存储。PSA将SPE进一步细分为两个子域:PSA信任根和应用程序信任根。PSA信任根为系统提供基本的RoT服务,并管理隔离的RoT应用程序服务的执行环境。
PSA信任根的主要组成部分包括:
- PSA安全生命周期,确定设备的生产阶段并控制设备机密和敏感功能的可用性,例如安全调试。
- PSA不可变信任根,即安装的硬件和不可修改的固件和数据在制造过程中。
- 可信引导和固件更新,确保设备的完整性和真实性固件。
- 安全分区管理器,管理RoT服务的隔离,IPC机制允许一个域中的软件向另一个域发出请求,并通过调度逻辑确保请求得到服务。
- PSA RoT服务,提供基本的加密功能并管理对应用程序服务的不可变信任根。
本规范:
- 提供SPM的实施要求
- 定义用于开发受保护RoT服务的标准运行时环境,包括安全分区管理器提供的用于实现和使用RoT的编程接口服务。
- 定义PSA RoT服务的标准接口。
2 Software architecture
本节概述了PSA固件框架定义的固件体系结构,以及介绍本规范描述的组件和接口。
2.1 Secure Partitions
PSA安全模型描述了作为系统信任根的一部分运行的各种安全服务,这些服务分为分为PSA RoT服务和应用程序RoT服务。
- PSA RoT服务封装和抽象特定于平台的安全实现硬件和不变的秘密。
- 应用程序RoT服务提供特定于应用程序和产品的安全服务。
在SPE中,RoT服务需要一个提供资源访问的执行环境,保护其自身的代码和数据,以及与系统中其他组件交互的机制。在PSA固件框架,一个安全分区就是这个执行环境。每个安全分区都是单个执行线程,是最小的隔离单元。如果最强烈的隔离级别,每个安全分区都与其他安全分区隔离。每个安全分区可以承载一个或多个RoT服务。通常,共享底层服务的相关服务功能或数据在同一个安全分区中实现。安全分区是PSA信任根的一部分或应用程序信任根的一部分,具体取决于它实现的服务。这一区别对于隔离级别2尤其重要。每个安全分区都有一个持久标识符,称为分区ID,可用于内部的访问控制系统。这些标识符在设备中必须是唯一的,并受安全分区管理器的保护重新启动或更新固件时运行时和未更改。
2.2 Secure Partition Manager
安全分区管理器(SPM)是最具特权的固件,它提供了基本的安全性用于保护PSA信任根并使隔离固件组件能够通信的服务。本规范定义了SPM实现的要求,包括它必须具备的接口提供给NSPE中的安全分区和RoT服务客户端,如图所示
SPM实现:
- 隔离安全分区的隔离逻辑。
- PC机制,允许一个分区中的软件向另一个分区发出请求。
- 访问安全外围设备(如需要)和中断。
- 访问PSA RoT服务的机制。这可以通过IPC或由定义的实现来实现机械装置
- 调度逻辑,以确保请求被传递到安全分区并由其处理。
SPM通过以下方式提供这些服务:
- PSA固件框架客户端API
- PSA固件框架安全分区API
- PSA RoT服务API。
某些平台包含的功能只能由最高权限级别的固件访问。对于例如,由安全和非安全固件共享的平台电源控制或控制寄存器。这些平台服务必须作为SPM的一部分实施,但NSPE固件使用的机制访问这些服务是由实现定义的。
2.3 Isolation
PSA安全模型描述了使用软件域之间的隔离来保护完整性和安全性数据资产的保密性。SPM负责隔离系统内的不同域。根据实施的隔离级别,这可能包括:
- 将SPE与NSPE隔离。
- 将PSA信任根与应用程序信任根隔离
- 隔离SPE内的安全分区
- 隔离必须由平台硬件实施,平台硬件必须由SPM配置。这确保
- 隔离适用于软件和硬件,并防止蓄意攻击和缺陷攻击
软件有关PSA硬件隔离要求和示例,请参阅Arm Trusted Base System Architecture for M实现。
增强的隔离通过降低系统对软件的脆弱性,提高了系统的安全性和健壮性缺陷,但这对额外的硬件、内存、性能或能量有负面影响。支持提供不同安全性、性能和成本权衡的实现,PSA安全模型指定多个隔离级别。
表1总结了三种受支持的隔离级别
每个隔离边界的属性在不同的实现之间以及在不同的应用程序之间也可能有所不同单个实现中的边界。每个实现都必须记录它强制执行的边界。隔离体系结构更详细地描述了每个级别,并指定了PSA固件框架实施的要求。
Arm建议将安全分区固件设计为在3级隔离的情况下正确运行。例如安全分区固件不假定数据可以与另一个安全分区或服务器共享NSPE。这种方法增加了固件在多个PSA实现上运行的可移植性,以及降低引入与数据共享相关的漏洞的风险。NSPE内的隔离应用程序固件中的沙箱任务是一种众所周知的提高健壮性的技术和安全。此技术通常使用MMU或MPU仅允许任务访问代码、数据和数据它需要正常工作的设备。例如,如果硬件平台包括非安全MPU,则非安全操作系统可以使用MPU在NSPE内实施隔离。以这种方式隔离应用程序固件需要使用专为将操作系统内核与应用程序任务分离。PSA固件框架支持这种不安全的要将应用程序任务的隔离扩展到每个任务使用的SPE资源中。
NSPE内的固件隔离独立于PSA固件提供的安全分区框架系统开发人员应该使用产品安全性分析来确定这一点的重要性缓解措施,这超出了本规范的范围。
2.4 RoT Services
PSA将安全功能公开为RoT服务的集合。每个RoT服务都是一组相关的安全功能,例如,可能存在用于对称加密操作的RoT服务,以及另一个用于生成随机数。
每个RoT服务要么是PSA信任根提供的PSA RoT服务,要么是应用程序RoT服务由应用程序信任根提供。对RoT服务的访问由编程API提供,该API通常用C语言定义。
PSA定义用于访问PSA RoT服务的标准编程API。RoT服务只能允许从SPE访问,也可以同时从SPE和NSPE访问。RoT服务通常在安全分区内实现。
每个安全分区可以实现一个或多个更多的服务。允许从NSPE访问的PSA RoT服务以及所有应用程序RoT服务必须在安全分区。必须使用本规范中定义的PSA安全IPC框架访问这些服务规格这为实现和访问服务提供了一致的可移植机制来自安全分区和NSPE。仅对SPE可用的PSA RoT服务可以使用IPC框架作为已在SPM和PSA信任根中描述,或以实现定义的方式。
RoT服务可以识别客户机的分区,使RoT服务能够对资源应用访问控制以及它向客户提供的服务。例如,安全存储服务可以使用特定于客户端的加密用于保护客户端的持久数据不受其他客户端影响的密钥。
2.5 Secure IPC
RoT服务通过在中实现的PSA安全IPC框架从其他分区访问SPM。IPC框架是一种基于连接的客户机和服务器模型,提供远程过程调用行为给客户打电话。客户端可以位于NSPE或安全分区中。服务器在服务器中实现RoT服务安全分区。
RoT服务通常会在客户机库中为其客户机提供API,该客户机库封装了PSA IPC接口,以及安全分区内的服务器实现。
安全IPC基于会话,请求总是通过客户端和RoT之间的连接发送服务IPC消息传递基于请求和响应模型。这是一个客户端被阻塞的模型直到RoT服务响应为止。这允许在更小的服务器上高效地实现在非安全应用程序固件中使用简单或无调度逻辑的系统。
IPC设计不在客户端和RoT服务之间共享内存。这提高了安全性和可靠性
实施的灵活性:
- 跨信任边界的共享内存是安全系统中的一个重要漏洞源,因为其内容必须被视为不可信和不稳定。限制访问共享资源的软件内存降低了系统中存在漏洞的风险。
- 要求实现提供共享内存限制了硬件系统设计,防止在硬件上实现NSPE和SPE之间的物理分离记忆力
IPC框架也不支持从RoT服务直接访问客户端内存。如果客户不信任服务器,为RoT服务提供对客户端内存的任意访问将违反安全模型。尽管在某些系统上允许从RoT服务直接访问客户机内存,例如这是隔离规则所允许的,Arm建议RoT服务不使用此直接访问,原因如下:
- 软件不能移植到所有系统,因为PSA隔离架构不能保证从RoT服务访问客户端内存。
- 服务器没有检查来自客户端的内存地址是否引用的机制允许客户端访问的内存。恶意客户端可能会尝试使用RoT服务泄露或篡改属于系统中其他组件的内存。
安全分区中的RoT服务可以是其他RoT服务的客户端,也可以使用与非安全客户端相同的RoT服务客户端库。IPC设计的阻塞性意味着安全分区不能依赖于它自己的RoT服务,因为IPC请求链将导致固件中出现死锁。SPE不能在RoT服务之间包含这样的依赖循环。
2.6 Startup
紧接着PSA Trusted Boot和固件更新所述的受信任引导的初始阶段,本规范中描述的组件必须按顺序安全初始化:
- 初始化SPM和安全IPC框架:
A.准备安全分区和RoT服务的注册表。 - 配置所有必要的硬件隔离组件。除非固件与引导固件强耦合,否则Arm建议SPM完全配置硬件隔离,而不是依赖引导期间设置的配置。
- 初始化所有安全分区:
A.初始化私有数据,例如变量、堆栈和堆。
B.创建所需的执行上下文。
C执行清单文件中声明的入口点。
4.处理安全分区之间的IPC连接和请求,直到它们都处于空闲状态。
5.加载并验证NSPE固件(如果未在早期引导阶段完成)。
6.开始执行NSPE。
3 Secure Processing Environment programming model
本节提供PSA固件中组件的详细定义、规则和指南框架清单定义和编程接口的规范在第页的编程API中48。SPE托管几个安全分区,由安全分区管理器(SPM)管理。
SPM被允许根据底层硬件彼此完全隔离安全分区能力。隔离体系结构中描述了这一点以及较低级别的隔离。安全分区为开发提供了一个简单、受保护的单线程运行时环境安全服务。安全分区描述了安全分区的属性,以及它们是如何工作的实例化和它们的运行时行为。
PSA固件框架定义了声明安全分区属性和提供实现了保护分区源代码的API。这允许安全分区的源代码级可移植性PSA固件框架不同实现之间的固件。
PSA固件框架未定义安全分区和应用程序之间的应用程序二进制接口(ABI)SPM,因为这是特定于平台和系统架构的。仅定义源代码API允许实现将提供设计时和编译时优化。
C语言用于定义接口,因为它通常存在于操作系统库、应用程序和应用程序中框架和易于绑定到其他语言。
定义了框架API的实现及其与SPM交互的机制由SPM提供商提供。PSA建议,SPM实施还应提供所使用的参考固件源代码用于访问SPM IPC功能的NSPE固件。
3.1 Isolation architecture
本规范为提供不同功能的固件和硬件定义了三个主要隔离级别安全性、性能和成本水平。Arm希望每个硅合作伙伴在每个隔离点提供产品级别,以便设备制造商可以根据其特定用例选择实现。
隔离级别由SPM提供和实施,并应用于内存可寻址数据和系统中的设备。
尽管安全应用程序需要对存储在设备上的持久数据进行类似的保护,但这种保护不是由SPM或隔离体系结构直接提供的。PSA固件的实现框架必须包括提供必要机密性的内部可信存储RoT服务以及PSA安全模型中描述的持久数据的完整性保护。
3.1.1 Memory Assets
隔离体系结构将系统内存映射中的项分为三类内存资产:
需要保护:
3.1.2 Memory access rules
有三种访问内存资产的方法:
- 读。
- 写。
- 执行。
SPM必须实施以下规则来保护内存资产:
NSPE对其自身资产的访问超出PSA固件框架规范的范围。然而,ARM建议NSPE对其自身资产的内存访问执行相同的规则。
3.1.3 Protection domains
每个隔离级别将系统划分为一组不重叠的保护域。在每个隔离级别上,都有一个包含SPM的保护域。其他所有保护域出于以下原因,必须信任SPM保护域中的代码:
- SPM配置强制隔离的保护机制。
- SPM需要访问使用PSA固件的任何保护域的内存资产
框架API来实现这些API。
SPM保护保护域中的资产不被其他保护域访问。最小集必须始终实施的保护由第23页的强制性隔离规则定义。SPM可以还应实施第24页上的可选隔离规则,以提高对攻击的抵抗力和抗攻击的鲁棒性实现错误。这些规则使用保护域定义和保护需求定义如下的保护域之间的关系:
3.1.4 Mandatory isolation rules
保护域是其内存资产的所有者。对这些资产的访问可以来自相同的来源域或来自其他域。
隔离规则包括直接和间接访问:
- 直接访问是由PE在域固件中执行加载或存储指令发出的访问。
- 间接访问是由域管理的外围设备发出的访问。
SPM必须实施以下规则来保护内存资产:
3.2 Secure Partitions
3.2.1 Secure Partition identity
每个安全分区都有一个标识(ID)。安全分区ID是一个32位有符号整数,它提供本地,IPC框架中客户端端点的唯一、持久和可信标识。
每个安全分区也有一个由安全分区开发人员定义的符号名,供用户使用安全分区源代码。安全分区ID由实现定义的机制分配。SPM实现将分配的安全分区ID绑定到安全分区名称在标准源头文件中。SPM为每个IPC中的RoT服务提供客户端安全分区ID传递的消息。
安全分区ID必须为正。为源于中的客户端终结点保留负值NSPE,因此NSPE无法伪造安全分区的客户端ID。
安全分区ID在系统中必须是唯一的。
安全分区ID必须在更新期间修复。拥有固定的安全分区允许它们用于
验证设备上数据的客户端端点所有权,并确保数据对客户端保持私有发起安全分区。
3.2.2 Secure Partition manifest
每个安全分区必须在清单文件中声明资源需求。SPM使用清单用于在SPE中组装和分配资源的文件。清单包括以下内容:
- 安全分区名称。
- 已实施的RoT服务列表。
- 获得其他RoT服务。
- 内存需求。
- 调度提示。
- 外围存储器映射的I/O区域和中断。
清单文件是安全分区开发人员和SPM环境之间的契约。舱单无法满足的需求将被构建系统拒绝。清单文件由SPE构建工具进行分析,以验证依赖关系,并生成一个运行时二进制文件满足所需的隔离级别。
清单文件定义安全分区源代码用于引用安全分区及其资源。SPE构建工具在处理安全分区源代码中包含的清单文件。必须在清单文件中指定安全分区之间的访问控制。访问控制通过以下方式实现:
列出与其他RoT服务的依赖关系。如果服务不可用,则不允许连接到RoT服务在客户端安全分区清单中声明。列出的每个RoT服务都会创建从客户机分区到RoT服务分区的依赖关系。在作为依赖关系网络的结果,安全分区之间必须没有循环依赖关系。如果有如果安全分区之间存在循环依赖关系,则会导致死锁,因为IPC请求阻止客户端。出于同样的原因,安全分区不得向正在运行的RoT服务发出IPC请求自我定义。
PSA建议构建系统删除无法在运行时调用的安全分区。安全的如果以下一项或多项为真,则调用分区:
- 清单定义了一个或多个可从NSPE调用的RoT服务。
- 安全分区中的RoT服务列在另一个安全分区的依赖项中。
- 清单声明了一个中断源。
必须在清单文件中显式声明其他内存区域。
有关清单属性的更多信息,请参阅第49页的清单定义,以及安全分区JSON模式请参见第87页的安全分区清单模式。
3.2.3 Secure Partition execution
每个安全分区都有一个由SPM管理的执行线程。安全分区从清单中声明的入口点符号开始执行。初始化之后,安全分区线程必须构造为一个循环,重复等待输入,在处理输入之前。
安全分区决不能退出其循环或从入口点返回。这样做将是一种编程错误如果被中断,安全分区将始终从被中断的位置恢复执行。安全分区的输入都是信号形式。每个信号代表一个不同的输入源安全分区。
信号
信号是发送到安全分区的异步通知,用于通知它需要操作的输入。每个安全分区最多有32个不同的信号。信号表示为32位内的单个位值整数。
每个信号必须是以下类型之一:
其余28个通用信号可以与安全分区的其他输入相关联。每个的使用信号值特定于安全分区,并且可以在另一个安全分区中不同或未分配。
安全分区清单列出了安全分区使用的所有中断,RoT服务和信号名称源代码。SPM实现为每个中断和每个RoT服务分配一个信号值,并且提供源头文件,将这些值绑定到安全分区定义的符号名称清单文件。预处理器符号的位置和名称在页面上的清单属性中。
等待信号
为了等待信号或测试当前信号状态,安全分区调用psa_wait()。
此函数采用指示以下行为之一的参数:
- 呼叫块,直到至少一个信号被断言。
- 呼叫调查当前信号状态。
呼叫返回一个信号掩码,指示一组断言的信号,这些信号可以是任何信号类型。该功能还采用信号屏蔽,指示呼叫者正在等待的信号集。信号不包含在mask中在等待时被忽略,并从返回的信号集中删除。在某些情况下,在调用psa_wait()时以这种方式过滤信号很有用,例如:
- 无需投票即可等待特定的外围中断信号。
- 如果硬件外设无法禁用中断源,则忽略特定的中断信号。
- 在处理该服务的消息时忽略RoT服务信号。这种技术允许
RoT服务可一次执行请求处理。
处理信号
信号一直被断言,直到它被安全分区处理。
安全分区表示已使用PSA功能完成对信号的处理。具体功能取决于信号的类型:
- 中断信号需要调用psa_eoi()来指示中断已在源,SPM可以重新激活中断线。呼叫psa eoi()将清除信号,除非来源重新确认中断。请参阅第42页的安全外围驱动程序。
- RoT服务信号要求psa_get()检索消息,然后进行适当的处理处理并完成消息。请参阅第35页处理RoT服务消息。
- 门铃信号需要psa_clear()来清除它。
调用psa_get()和psa_eoi()时使用信号值来指示正在处理哪个信号。如果psa_wait()返回多个信号,则安全分区决定处理它们的顺序。在再次调用psa_wait()之前,不需要安全分区来处理所有断言的信号。任何信号尚未处理的将保持声明,并将由psa_wait()返回。
信号传输
SPM立即将断言的信号传送到安全分区,导致从阻塞调用返回到psa_wait(),但在以下情况下除外:
- 如果安全分区在调用psa_wait()时提供了信号mask,则只有请求的子集考虑信令解除阻塞安全分区。
- SPM可以推迟交付RoT服务信号,直到SPM拥有必要的资源
例如,有足够的内存来存储活动消息。即使在安全分区中存在断言的信号,SPM也可以首先控制NSPE,然后仅在NSPE空闲时安排安全分区。
SPM最终必须传递所有信号和腐烂服务消息
3.2.4 Scheduling Secure Partitions
PSA固件框架允许多个客户端将请求发送到一个或多个RoT的情况服务,并且同时断言一个或多个中断信号。在这种情况下,SPM决定如何执行所有要处理信号的安全分区。
SPM必须满足以下要求:
- 将所有RoT服务消息传递到目标安全分区。
- 执行具有一个或多个要服务信号的安全分区。
SPM在满足这些要求方面具有灵活性。这种灵活性允许简单的SPM实现适用于受更多约束的设备,以及在支持它的系统上更复杂的,预先安排的SPM。不需要SPM实现来支持安全分区的公平调度。
调度规则
安全分区的调度状态如下:
- 如果安全分区正在等待之前需要外部事件的API调用,则会被阻止完成。阻止安全分区的API调用是psa_connect(),psa_call(),psa_close()和 psa_wait()。
- 如果安全分区当前正在处理器上执行代码,则正在运行。
- 如果安全分区未被阻塞或运行,则准备运行。
在以下情况下,阻塞的安全分区可以运行:
如果运行的安全分区被中断抢先,则可以运行。如果运行的安全分区进行阻塞调用,则会被阻塞。
所有SPM实现必须满足以下调度要求:
- 如果NSPE处于空闲状态并且有一个或多个安全分区准备运行,则SPM必须执行一个安全分区的数量。
- 当安全分区的执行被抢先时,必须存储其执行上下文,以便下一次安排安全分区时可以恢复它。上下文可以保存和恢复通过软件或硬件。
安排建议
在更复杂的系统中,Arm建议SPM遵循以下调度优先级规则多个安全分区准备运行时的实现。这些规则是按顺序应用的,直到一个选择安全分区执行:
-
具有断言的中断信号的安全分区比其他分区具有更高的执行优先级准备运行的安全分区。
-
具有高优先级断言中断信号的安全分区的执行优先级高于具有低优先级的安全分区断言中断信号。
-
执行优先级基于清单中请求的安全分区优先级。
-
最近抢先的安全分区比其他安全分区具有更高的优先级。
当psa_connect(),psa_call()或psa_close()请求发送到RoT服务时,可以是:
- SPM立即执行实现RoT服务的安全分区。
- SPM队列请求RoT服务,将RoT服务的安全分区标记为就绪运行,然后在客户端任务被阻止后重新安排安全分区。
3.3 RoT Services
在安全分区内实施的信任服务根(RoT服务)通常遵循结构如图5所示。
客户端固件使用安全的IPC连接来访问安全分区内的RoT服务。的客户如果清单中的RoT服务声明允许,服务位于安全分区或NSPE中文件夹。
RoT服务开发人员定义了一个IPC协议,它是消息结构和序列提供服务的客户端和服务器。
Arm建议RoT服务开发人员还定义RoT服务API和实现封装IPC协议的使用,并提高客户端固件服务的可用性。
安全IPC框架由SPM实现提供,SPM实现必须实现客户端API和本手册中指定的安全分区API。