赞
踩
2017年换手机之后,中途尝试登录结果被告知需要验证手机号,但是没有验证码,之后就再也没有登录过CSDN了。近期通过邮件方式,终于找回CSDN的账号密码,感谢CSDN,丢而复得感觉真棒。
2021年,立个Flag,“每个月更新一篇博文”,希望自己能够坚持。嘿嘿嘿~
本文主要介绍TEE、ARM TrustZone由来、以及实现ARM TrustZone技术硬件基础。
参加工作后就一直从事硬件安全工作,第一系列博文就从可信执行环境(TEE)内容开始总结。
首先,我们先理解一下业界具有统一认识的一些概念:
安全启动 :启动过程中,前一个部件验证后一个部件的数字签名,验证通过后,运行后一个部件,否则就中止或复位系统。因此它是一个防恶意篡改的手段。
可信启动 :启动过程中,前一个部件度量(计算HASH值)后一个部件(通常在后一个部件被签名校验过之后),然后把度量安全的保存下来,比如扩展到TPM的PCR中。后续接入平台后,部件的度量会上报到认证平台,认证平台会有配置一个可信白名单,如果某个部件的版本信息不在白名单里,则认为此设备是不受信任的,因为它可能使用了一个虽然有签名,但可能BUG的版本。因此它是一个可信版本的管理手段。
安全启动/可信启动 是确保系统级别的安全手段,适用于有可信诉求的整机系统,终端设备如手机、STB、路由器等,当然也适用于通用服务器设备。
以上安全启动和可信启动的概念,然而,如果仅从字面要求试图实施时,我们又会发现许多新的问题,举个例子:安全启动时,确实每一级都被签名校验了,但确定安全吗? 某一级如操作系统1分钟前刚刚被校验过,1分钟后还是可信的吗?不见得,这个过程中,操作系统完全有可能已经被非法修改过了。
要做到相对更安全,要么能够做到Runtime的实时校验,即每次使用那一刻都要校验。如果做不到Runtime校验,那就想办法将校验过的数据安全保存起来。
这个前提是指系统需要是不开放的嵌入式系统,因为不开放,可定制,提供特定的功能/服务,因此整机系统的保护是可行的,并且方案都是很成熟的。
那对于通用计算设备比如服务器产品是个什么样的情况呢? 基本上就是这么个事实:
1. 系统“全局保护”越来越难以实现,且不切实际
原因是当前开源共享,并且是自由的大环境。操作系统开源,应用开源,用户自由地选择不同版本的操作系统和应用,一切都不在设备厂商的控制中。
2. “全局保护”不可行,那就将保护范围缩小到应用的部分片段
这就是Intel SGX或ARM TrustZone的由来。因此,Intel SGX或ARM TrustZone是传统的系统保护手段不可行,通用系统设备的保护方案无法借鉴嵌入式系统的方案后,安全技术工作者转变思路后的产物。
Intel SGX基础概念后续有计划再更新。
ARM公司(嵌入式处理器的全球最大方案供应商,它们架构的处理器约占手机市场95%以上的份额)于2006年提出了一种硬件虚拟化技术TrustZone及其相关硬件实现方案。TrustZone即是支持TEE技术的产品,TrustZone 是所有Cortex-A 类处理器的基本功能,是通过 ARM 架构安全扩展引入的,而ARM也成为了TEE技术的主导者之一。那什么是TEE技术呢?
可信执行环境(TEE)是一种环境,其中执行的代码和访问的数据在机密性(没有人可以访问数据)和完整性(没有人可以更改代码及其行为)方面被隔离和保护。
软件越来越复杂,像Linux内核和Android开源项目(AOSP)这样的大型项目有数百万行代码,这意味着会有很多bugs。在修复某个漏洞时,有时还会造成新的bug,虽然我们可以防止某些类型的错误,但软件中总是会有错误。其中一些漏洞可能会暴露安全漏洞,更糟糕的是,如果bug在内核中,整个系统就会受到损害。
那么如何解决这个问题呢?如果软件遭到破坏,如何保护您在系统中的资产?
解决这个问题的一种方法是创建一个隔离的环境,在这个环境中,即使操作系统受到破坏,您的数据也会受到保护。这就是我们所说的可信执行环境或TEE。
在具有TEE的系统中,我们有运行在富执行环境(REE)上的不可信应用程序或者叫客户端和运行在可信执行环境(TEE)上的可信应用程序(TAs)。
只有运行在TEE(安全世界)上的受信任应用程序才能完全访问主处理器、外围设备和内存,而硬件隔离保护这些应用程序不受主操作系统(非安全世界)上运行的不可信应用程序的影响。
在TEE中,所有受信任的应用程序(TAs)和相关数据都与正常(不可信)操作系统及其应用程序完全隔离。另外,受信任的应用程序必须与其他受信任的应用程序以及TEE本身隔离运行。
另外,TEE只接受经过适当授权并由其他授权代码检查的代码来执行。因此,在TEE中,我们需要一个安全引导特性来检查所有操作系统组件(引导加载程序、内核、文件系统、可信应用程序等)的完整性和真实性。这样可以确保在设备关机时没有人篡改操作系统的代码。另外TEE也需要做到以下内容相互隔离,才能保证可信执行环境本身隔离的可信。
我们可以在“沙箱”中隔离应用程序,例如使用容器。这将阻止应用程序查看和访问来自其他应用程序的数据。
但是内核呢?如何防止在内核空间中运行的代码被利用来访问受信任应用程序使用的某个外围设备或内存区域?
软件不能保护软件!!!
所以我们需要硬件上的支持来实现TEE。我们需要一种方法来划分和隔离硬件(总线、外围设备、内存区域、中断等),以便运行的代码不能访问受保护的资源。
这就是ARM的TrustZone、RISC-V的多区域和许多其他解决方案的用武之地。
在现代处理器中有许多技术可用于实现TEE:
基于TEE环境的操作系统由不同的企业在推行,例如华为海思有自己的Trustzone的操作系统,高通的QSEE、ARM的Trustonic、还有Linaro开源的OPTEE等。下图为几家主要的TEE解决方案提供商以及相关方案。
可参考帅风云老师的博客
trustzone的硬件框架和安全扩展](https://blog.csdn.net/shuaifengyun/article/details/72854501)
从 2008 年 12月 ARM 公司第一次 release Trustzone 技术白皮书,已经过去了十年。2013 年 Apple 推出了第一款搭载指纹解锁的 iPhone:iPhone 5s,用以保证指纹信息安全的 Secure Enclave 技术据分析深度定制了 ARM trustzone 架构,印象中这大概是 Trustzone 技术第一次走进大众视线。到如今 Trustzone 技术已经成为移动安全领域的重要基础技术,你也许不了解它的技术原理,但它一直默默为你守护你的指纹信息,账户密码等各种敏感数据。
Trustzone 是 ARM 公司为了解决可能遇到的软硬件安全问题提出的一种硬件解决方案。基于 Trustzone 这种硬件架构设计的软硬件,能在很大程度和范围内保证系统的安全性,使软硬件破解都变得相对很困难。
我认为这套硬件架构的核心设计思想,关键词在于“隔离”。简单描述就是人为将系统运行环境划分为 TEE (Trusted Execution Environment) 和 REE ( Rich Execution Environment),所有的安全资源只能由 TEE 访问,而 REE 根本touch 不到。TEE 中运行的通常被认为是 trusted OS,一般为独立的 binary。REE 中运行的 rich OS 大多是指常用的 Linux 和 Android 操作系统。直观的例子就是 Android 系统下的各个应用是无法直接访问指纹信息的,只有切换到 Trusted OS 下才可以访问。当然这个过程:
要实现这样一套硬件架构,首先需要SoC中的各个硬件模块都实现对 Trustzone 的支持,才能称之为完整的 security system。常见大致上需要以下几个模块:
1. Bus
这里涉及的总线分为两种,一种是 AMBA3 AXI system bus(系统总线),一种是 AMBA3 APB peripheral bus(外围总线)。
前面说到 trustzone 技术会将系统划分为两种模式:secure 和 Non-secure。而划分的基础就是 AXI 系统总线一条控制线的电平高低。简单来说,就是 ARM 为 AXI 总线每个信道的读写操作都新增了一个标记位:NS bit。主设备为Non-secure 状态时,发起读写请求,NS bit 必须置为高电平;主设备为 Secure 状态时,发起读写请求,NS bit 必须置为低电平。
APB 外围总线通过 AXI-to-APB bridge 连接到系统总线,可以实现对外设的安全访问管控,这里的外设可以包括 interrupt controller,timer 等。
2. Processor
在 ARM core 的 technical reference manual 中,对 Trustzone 技术的支持一般被描述为 security extension。目前主流使用的 ARM core architecture 主要是 ARMv7 和 ARMv8。两种架构下的 CPU security extension 差异巨大,但总的来说,都是将 CPU 的每个 core 都虚拟出 secure 和 Non-secure 两种模式,当 core 为 Non-secure 时,Secure Configuration Register 的 NS bit 置为 1,为 secure 模式时,NS bit 置为 0。NS bit 默认为 0,也就是说,CPU 上电后每个 core 都默认为 secure mode。
除此之外,两种模式下 CPU core 对中断的处理,MMU / Cache访问,Timer,Debug 等等都做了相应的安全扩展,每个 model 都值得详细研究。
3. Interrupt controller
常见支持 Trustzone 的 interrupt controller IP 有 PL390,GIC-400,GIC-500,简单说就是能够区分 secure interrupt 和 Non-secure interrupt,实现对中断处理的隔离。同样 GIC 的不同版本对 security extension 的设计也不尽相同,常见的 GICv2 和 GICv3 就有着较大差异,同样值得详细说明。
4. Trustzone Address Space Controller
CPU core MMU 的 security extension 主要是针对 CPU 内存空间的安全访问控制,而 TZASC 主要是针对 DRAM。TZASC通常布置在 CPU 和 DRAM controller 之间,通过新增一条地址线表示 NS bit,可以将 DRAM 划分为 secure CPU core 可访问区域和 Non-secure CPU core 可访问区域,实现 DRAM 的隔离。常见的 TZASC IP 有 PL-380 和 TZC-400。针对 on-SoC 的静态内存(ROM 和 SRAM)的区域划分,则需要通过使用 Trustzone Memory Adapter (TZMA)来完成。
5. Trustzone Protection Controller
挂在 AXI-to-APB bridge 上,用以区分外设是 secure 还是 Non-secure。
这样介绍可能有些抽象,用白皮书里示例图做个简单说明:
上图中,支持 Trustzone 的 ARM core 通过 AXI 总线和 TZMA,SRAM,AXI-to-APB bridge 相连,其中 AXI-to-APB bridge 上挂了四个外设,TZPC 永远配置为 secure peripheral,timer 和 RTC 是 Non-secure peripheral,而 KMI (Keyboard and Mouse Interface)为 secure peripheral 还是 Non-secure peripheral 是 software programmable。KMI secure 和 Non-secure 的切换,由软件配置 TZPC 来完成,而由于 TZPC always 是 secure 外设,所以 TZPC 的配置只能在 CPU 是 secure mode 下才能实现。从软件层面来看,就是只有 Trusted OS 才能配置 TZPC。那么将 Keyboard 设置为 secure 的一个作用就是可以在安全环境下让用户输入密码。
同样,当有外设需要访问 DRAM 或者 SRAM 的 secure region 时,也需要通过 TZPC 实现对外设的控制。
所以说 Trustzone 技术的实现,并非某个单一模块的功能可以完成,需要参与到整个系统中的所有硬件模块共同协作才能实现一个安全的硬件系统。而 Trustzone 技术面世以来,也并非牢不可破,一方面 IC design 的方案各大厂商都不相同,另一方面 Trusted OS 由各家 OEM 或者第三方 Trustzone vendor 提供,软硬件的漏洞也不断被发现。因此独立的硬件安全单元近年渐成趋势,尤其是 Android 9.0 Keymaster 从对 Trustzone 的支持提升到对独立 Security Elements 的支持,让人感慨技术更新的迅速。然而回顾 Trustzone 技术的发展,还是觉得 ARM 公司的前瞻性和技术实力实在让人很是佩服。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。