具有信任区的 ARM 处理器实现了架构安全性每个物理处理器内核提供两个虚拟的扩展 核心,一个被认为是不安全的,称为不安全的世界,另一个被认为是安全的 称为安全世界,以及两者之间的上下文切换机制,称为监视模式。
来自 ARM 的架构:
如图所示,TrustZone 由监视器、可选操作系统和可选应用程序组成,所有这些都在安全世界中运行。 Trustzone实现可以是所有这些组件,例如在Qualcomm或Trustonic实现上, 或者像Nintendo Switch实现那样仅是一个监视器。
实施 TrustZone 操作系统为添加可信功能提供了一个更灵活的模型,这些功能旨在为普通世界提供额外的安全服务。
这些功能可作为签名的第三方应用程序(称为trustlet)提供,并由在TrustZone(SecureOS)中运行的操作系统在Secure World中安全地加载和执行。
这些安全加载功能之一(即高通)在高通公开之前由Gal Beniamini完全复古设计。
trustlet完整性检查过程是相对标准的,由一个哈希表组成,每个哈希代表ELF二进制文件一段的哈希。然后,此哈希表由 trustlet 颁发者签名,并且可以通过直接放置在签名之后的证书链来验证此签名。由于将 SHA256 放置在保险丝 (QFuse) 中的根证书,可以验证此信任链,从而确保其完整性。
TrustZone 用于多种用途,包括 DRM、访问平台硬件功能,例如在 eFuse 中存储的 RSA 公钥哈希、硬件凭据存储、安全启动、安全元件仿真等。
处理器当前运行的世界可以是由安全配置寄存器中可用的非安全位确定。 物理处理器可以从非安全世界可以通过执行名为安全监视器呼叫(SMC),它可以被视为监视器模式的例外软件。 此外,主存储器也标有非安全位,允许内存安全和非安全世界之间的隔离。
ARMv7 中的异常处理要求安全世界注册遇到 SMC 指令时处理器将跳转到的向量。 此处理程序位于与存储在监视器矢量中的地址的偏移量0x8 ARMv7 中的基址寄存器 (MVBAR)。
在 ARMv8 中,引入了一个新的异常模型,该模型定义了异常级别的概念。例外级别确定权限级别(PL0 到 PL3) 在哪些软件组件运行以及哪些处理器模式(不安全和安全) 应用于运行它。在 ELn 处执行对应于特权 PLn,并且 n 越大, 执行级别具有的权限越多。 发生异常时,处理器分支到异常向量表 并运行相应的处理程序。在 ARMv8 中,每个异常级别都有自己的异常级别异常向量表。
安全监视器调用 (SMC) 生成由存储在 VBAR_EL3 + 0x600 的处理程序(同步 EL3 异常处理程序)
已经开发了几种商业实现,其中三种最普遍 在移动平台上:
1、来自Trustonic的Kinibi
2、来自高通的QSEE公司
3、可信核心(华为TEE操作系统)
在TrustZone的不同实现中发现了许多漏洞, 但在多个平台的安全启动中也发现了几个, 允许在信任区中获取代码执行。下面讨论其中一些漏洞及其影响。
Gal Beniamini 发现了几个漏洞,包括安全世界用户空间权限提升中的代码执行,以通过 SMC 处理程序在安全世界内核中获得代码执行或通过SVC(ARM中的系统调用)处理程序允许KeyMaster Keys从TrustZone提取Linux内核劫持,和引导加载程序解锁
Azimuth Security发现了两个漏洞,包括在Qualcomm Trustzone中写入原语和任意代码执行
一个漏洞允许将零字写入信任区内核中的任何地址。它可用于禁用 TrustZone 内存边界验证函数, 制作任意写入基元。
正如本文所示,高通TrustZone遭受单点故障,存在许多个人 TrustZone中的参与者,但其中一个玩家的一个错误会影响所有其他组件。 单个任意内存写入漏洞(尤其是在安全世界内核中)可使整个安全模型崩溃。
最后,使用有符号比较而不是无符号比较会导致信息从安全世界泄漏到正常世界
正如本文所示,高通TrustZone遭受单点故障,存在许多个人 TrustZone中的参与者,但其中一个玩家的一个错误会影响所有其他组件。 单个任意内存写入漏洞(尤其是在安全世界内核中)可使整个安全模型崩溃。
最后,使用有符号比较而不是无符号比较会导致信息从安全世界泄漏到正常世界
与QSEE不同,由Trustonic开发的TrustZone以前称为t-base,然后更名为Kinibi,具有微内核,这意味着不再有单点故障。 尽管关于Trustonic的TrustZone的公开研究较少,但仍有一些文章详细介绍了t-base内部结构和在Secure World用户空间中发现的一些漏洞。
从Qualcomm TrustZone收购TEE OS比从Trustonic TrustZone更容易。例如,Qualcomm TrustZone 可以直接从 /dev/block 下的块中获取,而 Trustonic TrustZone 必须通过反向启动来获取。
TrustZone 强化是获得良好安全属性并减缓逆向工程和利用过程的关键点。 尽管如此,下面列出的几个经典硬化点并未应用:
这两种实现在生产中都存在许多调试字符串。
Kinibi上没有ASLR,QSEE上只有9个ASLR位。
Kinibi上没有Stack Cookie。相反,QSEE上有Stack Cookie。
有趣的是,一些TrustZone实现,例如为Nintendo Switch开发的实现,是加密存储的,并在启动过程中解密,这给攻击者增加了额外的难度。
一方面,使用 TrustZone 技术实施的安全模型通过分离安全世界和正常世界提供了额外的分段,例如,允许 DRM 解决方案来防止敌对环境,例如用户土地和内核土地上的受感染系统。
另一方面,整个操作系统的开发是一项艰巨的任务,通常涉及许多错误。运行TrustZone的操作系统也不例外。导致安全世界内核内存损坏的开发错误会导致安全世界中的系统完全损坏,从而使其安全性过时。它还完全损害了可以从安全世界访问的正常世界。
最后,如果在安全启动链中发现漏洞,则可以在执行TEE操作系统之前对其进行破坏,例如多次
本博客源于https://blog.quarkslab.com/introduction-to-trusted-execution-environment-arms-trustzone.html,仅供笔记参考。