目录
04 Attribution units (SAU and IDAU)
说明: 本文为转载文章,原文链接ARM精选:armv8-M(cortex-m) Trustzone总结和介绍
01 简介
先看一张软件架构图:
1.1 ARMV8-M Trustzone简介
TrustZone 技术的概念并不新鲜。该技术已在 Arm Cortex-A 系列处理器上使用多年,并且现在已扩展到涵盖 Armv8-M 处理器。
在较高层次上,Armv8-M 的 TrustZone 技术的概念类似于 Arm Cortex-A 处理器中的 TrustZone 技术。处理器具有安全和非安全状态,非安全软件只能访问非安全存储器。Armv8-M 的技术在设计时考虑了小型节能系统。与 Cortex-A 处理器中的 TrustZone 技术不同, Armv8-M 的Secure 和 Normal 世界是基于内存映射的,转换在异常处理代码中自动发生。
Armv8-M 和 Armv8-A所支持的Trustzone技术有以下方面的不同:
-
Armv8-M 的 TrustZone 技术支持多个安全entry points,而在 Cortex-A 处理器的 TrustZone 技术中,Secure Monitor 处理程序是唯一的entry points。
-
执行在安全状态时仍可处理非安全中断,在许多具有实时处理功能的微控制器应用中,确定性行为和低中断延迟是重要的要求。在运行安全代码时处理中断请求的能力至关重要
-
通过允许在安全和非安全状态之间共享寄存器组,Armv8-M 实现的功耗可以类似于 Armv6-M 或 Armv7-M
-
状态切换的低开销允许安全和非安全软件频繁交互,这在以下情况下很常见。安全固件包含软件库,例如 GUI 固件或通信协议栈。
在具有 Armv8-M 架构安全扩展的设计中,对系统安全至关重要的组件可以放置在安全的世界。这些关键组件包括:
-
安全引导加载程序。
-
秘钥。
-
闪存编程支持。
-
High value assets(高价值资产)。
安全(Trusted)和非安全(Non-trusted)软件可以一起工作,但非安全应用程序不能直接访问安全资源。相反,任何对 Secure 资源的访问都可以通过 Secure 软件提供的 API,这些 API 可以实现身份验证来决定如果允许访问安全服务。通过这种安排,即使非安全应用程序中存在漏洞,黑客不能攻击掉整个芯片。
1.2 Armv8-M Trustzone背景下的安全需求
安全这个词在嵌入式系统设计中可以有很多不同的含义。在大多数嵌入式系统中,安全性可以包括但不限于到:
-
通讯保护
这种保护可以防止数据传输被未授权方看到或拦截,并且可能包括其他技术,例如密码学。 -
数据保护
这种保护可防止未经授权的各方访问存储在设备内的秘密数据。 -
固件保护
这种保护可防止片上固件被逆向工程。 -
运行保护
此保护可防止关键操作出现恶意故意故障。 -
篡改保护
在许多安全敏感产品中,需要防篡改功能来防止设备的操作或保护机制受到影响。被覆盖。TrustZone 技术可以直接解决嵌入式系统的以下一些安全要求: -
数据保护
敏感数据可以存储在安全内存空间中,并且只能由安全软件访问。非安全软件只能访问安全 API 向非安全域提供服务,并且仅在安全检查或身份验证之后。 -
固件保护
预加载的固件可以存储在安全存储器中,以防止其被逆向工程和受到恶意攻击。Armv8-M 的 TrustZone 技术也可以与额外的保护技术一起使用。例如,设备级读出保护,一种技术当今业界常用,可配合Armv8-M的TrustZone技术,保护最终完成的固件产品。 -
安全启动
安全启动机制使您对平台充满信心,因为它始终从安全内存启动。
TrustZone 技术还可与面向下一代的高级微控制器中使用的附加保护功能一起使用物联网 (IoT) 产品。例如,为物联网应用开发的微控制器可以包含一系列安全功能。
TrustZone 技术的使用有助于确保所有这些功能只能使用具有有效entry point的 API 来访问,如下所示图显示:
通过使用 TrustZone 技术来保护这些安全功能,设计人员可以:
-
防止不受信任的应用程序直接访问安全关键资源。
-
确保仅在验证和检查后才重新编程 Flash 映像。
-
防止固件被逆向工程。
-
以软件级别的保护存储机密信息
无线通信接口的安全性
在其他一些应用场景中,例如带有经过认证的内置无线电堆栈的无线 SoC,TrustZone 技术可以保护标准化操作,例如无线通信行为。
TrustZone 技术可以确保客户定义的应用程序不会使认证失效,如下图所示。
02 Trustzone扩展的两种安全状态
Trustzone技术下的两个安全状态(Security State): Non-Secure State 和 Secure State。在TF-M中也称之为: NSPE(NON-Secure Processing Environment)和SPE(Secure Processing Environment
关于reset
-
如果实施了安全扩展,则标记为安全的内存区域和其他关键资源只有在 PE 以安全状态执行时才能访问
-
如果实施了安全扩展, 则在 Cold reset 和 Warm reset时,PE将进入Secure状态
-
如果实施了安全扩展, 则在 Cold reset 和 Warm reset时,PE将进入NON-Secure状态
关于banked
实施了安全扩展后,下列寄存器都是banked by security:
-
通用寄存器中的R13(SP)
-
特殊寄存器中的 : MASK寄存器(PRIMASK, BASEPRI, FAULTMASK)、CONTROL 寄存器、栈指针限制寄存器(MSPLIM ,PSPLIM)
-
System Control Space (SCS)
msr/mrs指令编码
MRS 和MSR指令编码中的bit[7]表示操作的是哪组寄存器(Secure or NON-Secure)
补充术语
RAZ : Read-As-Zero 读到的总是0
WI : Writes Ignoredx 写无效
RAO : Read-As-Oned读到的总是1
SBZP : Should-Be-Zero-or-Preserved on writes 写总是0
SBOP : Should-Be-One-or-Preserved on writes. 写总是1
UNK : unknown 读写时返回值未知
详见 : Arm Glossary
cortex-A Trustzone 和 cortex-M Trustzone的对比:
在cortex-M上,双系统的切换,使用的是 Secure Gateway (SG) 指令,但只允许在特殊的memory上调用SG,即使 NSC(non-secure callable)
安全状态的切换
切换安全状态的方式有以下两种:
-
直接函数调用和返回(non-secure callable)
-
异常/中断的进入和退出
03 内存的划分
如果实施了安全扩展,则 4GB 内存空间将划分为安全和非安全内存区域。
安全内存空间进一步分为两种类型:安全(S)和非安全可调用(NSC :Non-secure Callable)
NSC 是一种特殊类型的安全内存。这种类型的内存是 Armv8-M 处理器允许保存 SG 指令的一种内存,使软件能够从非安全状态转换为安全状态。
通过将 SG 指令的功能限制在 NSC 内存中,安全软件创建者无需在正常安全内存中意外包含 SG 指令或数据共享编码值,包含 NSC 内存位置。
通常 NSC 内存区域包含小型分支跳转(entry points)的表。为了防止非安全应用程序分支到无效入口点,这里有Secure Gateway (SG) 指令。
当非安全程序调用安全端的函数时:
-
API 中的第一条指令必须是 SG 指令。
-
SG 指令必须位于由 安全属性单元 (SAU :Security Attribution Unit) 或实施定义的属性单元 ( IDAU :Implementation Defined Attribution Unit) 定义的 NSC 区域中。
04 Attribution units (SAU and IDAU)
-
SAU :Security Attribution Unit
-
IDAU :Implementation Defined Attribution Unit
复位的时候SAU是disabled的
如果SAU是disabled的,且系统中也没有包含IDAU,又由于reset时默认的状态是Secure Security State,那么系统将无法切换到Non-secure状态,所有切换non-secure Security状态的操作都会产生Fault错误
SAU寄存器的总结
SAU开启之后:
-
没有在 SAU region 范围内的,都视为安全内存
-
SAU_RLAR.NSC=0 表示非安全内存
-
SAU_RLAR.NSC=1 表示NSC内存