avatar

目录
【翻译】使用OP-TEE进行可信软件开发

原文传递

本文旨在介绍Trusted Execution Environment(TEE)的概念,以及最终用户如何利用开源软件安全部署需要处理机密信息的应用程序。

可信执行环境(TEE)概述

什么是TEE?使用TEE能带来什么好处?

TEE提供了一个隔离的环境,以确保代码/数据的完整性和机密性。运行Linux或Android的典型嵌入式系统在内核和用户空间软件包中都存在大量安全漏洞。漏洞允许攻击者访问敏感信息和/或插入恶意软件。TEE增加了一个额外的安全层,在这里,TEE上运行的代码/数据不能从普通操作系统(如Linux/Android)访问/篡改。在TEE(安全世界)上运行的软件通常包括一个小型的面向安全的操作系统(例如:OP-TEE OS)以及可信的应用程序。受信任的应用程序旨在处理机密信息,如信用卡PIN、私钥、客户数据、受DRM保护的媒体等,并向普通操作系统提供服务,以便在不损害机密信息的情况下使用机密信息。

TEE是如何实现的?

TEE 需要软件和硬件(内置于处理器中)支持。
在硬件方面,基于ARM的处理器使用TrustZone技术实现TEE。TrustZone使单个物理处理器核心能够安全高效地执行来自正常世界(Linux/Android等丰富操作系统)和安全世界(OP-TEE等安全操作系统)的代码。这使得高性能安全软件能够在正常的操作环境下运行。TrustZone实现了基于“状态”的内存和IO保护。举个例子,当处理器在安全状态/上下文(安全世界)下运行时,它具有不同的系统视图,并且可以访问通常无法从非安全状态/上下文(正常世界)访问的内存/外围设备。更改当前运行的虚拟处理器时,两个虚拟处理器上下文通过监视器模式切换。

ARM信任区安全的简化硬件视图 Simplified hardware view of ARM TrustZone security

在软件方面,有一个正常的世界操作系统(例如:Linux、Android等)和一个安全的世界操作系统(例如:OP-TEE、Trusty、QSEE、SierraTEE等)都以特权模式运行。类似地,在正常世界中有用户应用程序,在安全世界中有可信用户应用程序,它们都以用户模式运行。安全世界的可信应用程序/操作系统旨在为普通世界用户应用程序提供安全相关服务。

ARM信任区安全的简化软件视图 Simplified software view of ARM TrustZone security

选择你的安全世界操作系统

非营利组织Global Platform开发了TEE API和框架规范,以标准化TEE并避免碎片化。TEE客户端、Core等有各种规范可供使用,这些规范指定了受信任应用程序与安全世界操作系统之间的交互、受信任应用程序与另一个受信任应用程序之间的交互、客户端应用程序与受信任应用程序之间的交互,等等。这允许最终用户(end users)切换安全操作系统,而无需更改其受信任的应用程序。选择安全世界操作系统时,既有商业/专有选项,也有开源选项。操作系统的选择取决于所需的功能和所需的支持级别,但谨慎的做法是选择符合Global Platform TEE规范的操作系统。

开源便携式TEE(OP-TEE)

Open-source Portable TEE

OPTEE是TEE的一个开源实现。OP-TEE由以下部分组成:

操作系统和客户端具有BSD 2-clause许可证,并且与Global Platform兼容。Linaro支持并积极维护超过28个平台/处理器,详见optee_os。下面是OP-TEE的软件架构图:

OP-TEE软件架构(图片来源:Linaro) OP-TEE software Architecture (Image Credit: Linaro)

产品开发团队负责开发在Linux上运行的客户机应用程序(CA)和在OP-TEE上运行的可信应用程序(TA)。
CA使用TEE客户端API与TA对话,并利用TA提供的安全服务。CA和TA使用共享内存在彼此之间传递数据。

OP-TEE入门

假设你正在使用的SoC (System on Chip,片上系统)已被OP-TEE OS支持,下面是构建软件的选项:

  • 最小OP-TEE生成系统:为了帮助快速开始运行OP-TEE,一些开发板维护人员(例如:Raspberry Pi 3和TI•AM43xx/AM57xx)提供生成所有所需映像的最小构建系统(引导加载程序、OP-TEE操作系统、Linux内核、•OP-TEE客户端和最小RFS)。
  • Yocto项目生成系统:在build中包括meta-optee层,并将相关包添加到 local.conf
  • 手册:交叉编译和构建各个部分
    • 请参阅CI脚本这里可以找到i.MX6/7平台的示例。

注意:OP-TEE OS中的各种功能可以通过在build命令行中提供CFG_=来启用/禁用。

对于具有不同内存大小的自定义开发板,您可能需要调整平台配置文件中的安全(CFG_TEE_RAM_STARTCFG_TA_RAM_START)和共享(CFG_SHMEM_START)内存位置。一些平台还允许代码从内部SRAM(CFG_WITH_PAGER)运行。

OP-TEE内存映射示例 Example OP-TEE memory map

如果您使用的SoC不受支持,请联系您的SoC供应商或DIY添加支持,联系OP-TEE维护人员,或寻求商业支持(Timesys、WindRiver等)。您还可以选择使用QEMU测试OP-TEE。

引导加载程序(Bootloader)支持和引导流

理想情况下,必须在引导过程中尽早加载OP-TEE二进制文件(OP-TEE之前运行的引导加载程序中的漏洞可能会危害敏感数据)。在典型的Linux引导(无TEE)中,ROM引导加载程序加载/执行第一阶段引导加载程序(例如:SPL、MLO、SBL1、FSBL),然后执行第二阶段引导加载程序(例如:U-boot、LittleKernel),执行Linux内核,所有这些都来自安全世界上下文。在基于ARMv7的处理器上,TEE的典型引导流程是:SPL加载OP-TEE和U-boot,跳转到OP-TEE,一旦OP-TEE完成初始化,它将切换到非安全上下文并跳转到U-boot。OP-TEE代码将继续驻留在内存中,为Linux内核提供安全服务。在基于ARMv8的处理器上,TEE引导流程涉及SPL加载ARM可信固件(ARM Trusted firmware)的附加步骤,以及OP-TEE和U-boot。SPL跳转到ARM可信固件,后者将控制权交给OP-TEE,OP-TEE在非安全上下文中又跳转到U-Boot。在ARMv8平台上,ARM可信固件提供监控代码来管理安全和非安全世界之间的切换,而对于ARMv7平台,它内置于OP-TEE中。

使用TEE时不同的引导流 Different boot flows when using a TEE

Linux 支持

OP-TEE的Linux内核驱动程序在内核4.12或更高版本中可用。如果您运行的是旧版本的内核,那么您将需要备份补丁。您还需要按照以下步骤启用驱动程序:

  • 在内核设置中设置 CONFIG_OPTEE=y
  • 如该所示,为OP-TEE添加设备树节点
    • ■ 或者,使用CFG_DT=y编译OP-TEE OS可以在运行时修改dtb以添加所需的节点

OP-TEE问题的故障排除

一旦引导加载程序、Linux和OP-TEE操作系统运行,您可能会在定制开发板上遇到问题。以下是了解和解决一些常见问题的指南:

  • 不精确中止:这些通常在正常操作系统访问安全外围设备和/或内存时出现。建议检查外围设备/内存区域的权限。
  • 内存映射冲突:OP-TEE OS和kernel/dtb/ramfs的加载地址和运行时地址需要仔细检查,否则可能导致内核试图将自身重新定位到OP-TEE运行时区域等问题。
  • 时钟设置:Linux内核对任何未使用的外围设备都禁用了时钟,但该外围设备可能被Linux不知道的安全世界操作系统使用。解决这个问题的一种方法是将clk_ignore_unused作为Linux内核引导参数的一部分。
  • 资源冲突:如果外设同时被正常和安全的世界代码访问,则没有可能导致冲突的锁定机制。在没有锁定机制的情况下,建议只有一个世界拥有对资源的访问权,并向另一个世界提供与资源交互的服务。

可信应用程序 (TA)

有许多教程可用于可信应用程序开发,因此本文将重点介绍一个高级概述。要开始编写CA和TA,请参阅hello world 应用程序。

有两种类型的受信任应用程序:动态应用程序 和 伪/静态应用程序

  • 动态应用程序 驻留在普通世界文件系统(RFS)中,并在运行时当Linux客户端应用程序想要使用时,加载到安全世界用户空间。TA已签名,OP_TEE OS在执行前验证签名。
  • 伪/静态应用程序 通常作为OP-TEE内核的一部分构建,并在内核模式下运行。这些应用程序主要提供涉及控制硬件的服务,而这些硬件很难在用户空间中运行的动态应用程序中实现。

OP-TEE 操作系统为TA提供安全的数据存储设施。数据以加密/认证(AES-GCM)的方式存储在Linux文件系统(/data/tee)上,或者存储在eMMC RPMB分区上。

Real world example

TEE可以通过用软件解决方案替换专用安全芯片(密钥存储或加密认证)来降低硬件成本。

为了访问硬件功能,许多安全芯片为用户空间应用程序提供了OpenSSL引擎接口。通过开发TEE客户端应用程序作为OpenSSL引擎的一部分与TA接口,可以使用类似的模型,从而最小化对用户空间应用程序的任何更改。受信任的应用程序需要实现密钥管理和加密操作的处理程序。OP-TEE OS包括libtomcrypt,它提供各种对称/非对称/椭圆曲线加密功能。因此,TA主要负责输入验证和调用适当的OP-TEE核心API。下面是实现相同功能的示例体系结构。

Example architecture for TEE protected cryptographic operations

受TEE保护的加密操作的示例体系结构 Example architecture for TEE protected cryptographic operations

Security considerations

在部署TEE之前,需要检查系统/平台级安全注意事项。下面介绍了一些常见问题:

  • JTAG: 在生产单元上,禁用JTAG或仅将JTAG限制为非安全访问,以确保无法通过JTAG访问/修改安全世界数据。
  • Secure boot: 为了确保设备上只运行经过身份验证的代码,必须建立安全引导和信任链。有关更多详细信息,请参阅 这篇文章
  • 许可审查: 一些OP-TEE平台没有显式设置非安全世界的权限,默认情况下允许访问所有外围设备/内存。此外,配置这些权限的寄存器也必须显式设置为仅安全访问,以防止普通世界代码更改权限。一旦正确设置了权限,从Linux用户空间使用devmem2/memtool访问安全内存区域,并验证是否报告了总线错误。
  • 密钥使用情况审查: 安全存储取决于向OP-TEE操作系统提供的唯一硬件密钥。请参阅此文档,以确保为您的平台正确设置。

Conclusion

使用TEE是可以为设备添加额外的安全层的一种相对便宜的方法。利用TEE的开放源代码软件的可用性使部署受信任的应用程序变得容易。除了额外的安全优势外,它还可以降低使用专用安全芯片/协处理器的平台上的硬件成本。

文章作者: TaQini
文章链接: http://taqini.space/2021/10/18/trusted-software-development-op-tee/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 TaQini
打赏
  • Wechat
    Wechat
  • Alipay
    Alipay

评论