> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs-staging.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 安全功能

Qualcomm<sup>®</sup> Linux<sup>®</sup> 集成了多项旨在保护设备和应用程序的安全功能。这些功能对于防御漏洞、确保数据完整性和机密性、维持行业标准合规性以及支持整体系统稳定性至关重要。

Qualcomm<sup>®</sup> 可信执行环境 (Qualcomm TEE) 进一步增强了这些安全功能。它提供了通过受信任的应用程序扩展安全功能集的接口。硬件支持的 TrustZone 架构集成了某些功能,提供系统安全配置。这些功能可以进一步自定义以满足特定要求。

在本节中探索以下安全功能和视频。

[加密](/zh/System/Security/security-features#cryptography)

[密钥管理](/zh/System/Security/security-features#key-management)

[安全启动](/zh/System/Security/security-features#secure-boot)

[存储安全](/zh/System/Security/security-features#storage-security)

[存储加密](/zh/System/Security/security-features#storage-encryption)

[QCOMTEE 驱动程序](/zh/System/Security/security-features#qcomtee-driver)

[访问控制](/zh/System/Security/security-features#access-control)

[安全外设镜像加载](/zh/System/Security/security-features#secure-peripheral-image-loading)

[SELinux](/zh/System/Security/security-features#selinux)

[Qualcomm TEE](/zh/System/Security/security-features#qualcomm-tee)

[安全加固](/zh/System/Security/security-features#security-hardening)

[Qualcomm WES](/zh/System/Security/security-features#qualcomm-wireless-edge-services)

[独立可信平台模块](/zh/System/Security/security-features#discrete-trusted-platform-module)

[观看有关安全启动技术的视频](/zh/System/Security/security-features#watch-a-video-on-secure-boot-technology)

[观看有关 Qualcomm Type-1 Hypervisor 和可信执行环境的视频](/zh/System/Security/security-features#watch-a-video-on-qualcomm-type-1-hypervisor-and-trusted-execution-environment)

## **加密**

加密是通过使用算法和密钥将可读数据转换为不可读格式来保护信息的过程。Qualcomm Linux 支持全面的加密功能,利用硬件加速和基于软件的实现来增强系统安全性。

关键功能包括:

* 具有直接基于内存访问的寄存器和总线访问管理器。
* 与加密硬件的接口。
* Linux 内核加密驱动程序 (qcrypto) 提供对硬件加密的访问,独立于受信任的应用程序。
* Qualcomm TEE 为受信任的应用程序提供硬件和软件加密应用程序编程接口 (API)。

Qualcomm TEE 支持以下加密算法:

**表:加密算法**

| **算法** |                                       **硬件**                                      |                                                              **软件**                                                              |
| :----: | :-------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: |
|   哈希   |                                   SHA-1/SHA-256                                   |                                <ul><li>SHA-1/SHA-224/SHA-256/SHA-384/SHA-512</li><li>SM3</li></ul>                               |
|  对称密码  | <ul><li>AES-128/AES-256 CBC、ECB、CTR、CCM、GCM</li><li>Triple-TDES CBC/ECB</li></ul> | <ul><li>AES-128/AES-192/AES-256 CBC、ECB、CTR、CCM、XTS、CFB、OFB、CTS</li><li>Triple-TDES CBC/ECB</li><li>PBKDF2</li><li>SM4</li></ul> |
|   MAC  |                                      AES-CMAC                                     |                                                         基于哈希的消息认证 (HMAC)                                                         |
|   RNG  |                                        HRNG                                       |                                                                 –                                                                |
|  HMAC  |                                 HMAC-SHA-1/SHA-256                                |                                            HMAC-SHA-1/SHA-224/SHA-256/SHA-384/SHA-512                                            |
|  非对称密码 |                                         –                                         |             <ul><li>RSA 具有 1024/2048/3072 模数</li><li>ECDSA 具有 P224、P256、P384、P521</li><li>ECDH</li><li>SM2</li></ul>             |

### **内联加密引擎**

<Warning>
  ICE 现在支持 ufs 和 emmc 存储变体上的标准和包装密钥。

  iq-9075(emmc)、iq-x7181(ufs) 目前不支持 ice。
</Warning>

内联加密引擎 (ICE) 对存储数据执行高吞吐量的加密加密。

ICE 支持:

* AES 128/AES 256 ECB/XTS
* 多个加密流以满足高吞吐量
* 每个加密流有多个 AES 核心
* 提供 32 个软件可配置密钥
* 启用对称和非对称操作的能力
* 支持 emmc 和 ufs 存储变体。
* 默认配置中的标准密钥。
* 通过 module\_param(use\_wrapped\_keys) 可配置的包装密钥支持。

## **密钥管理**

密钥管理是指如何安全地创建、存储、使用和删除加密密钥。这些密钥有助于保护敏感数据。Qualcomm Linux 安全解决方案通过实现 PKCS#11 API 支持公钥加密标准。这允许应用程序以独立于平台且标准化的方式管理和使用加密密钥和证书。

Qualcomm 在 `libckqteec` 库中实现 PKCS#11 接口,在 `libminkteec` 库提供的 GlobalPlatform 标准接口之上,用于与 Qualcomm TEE 中的受信任应用程序进行通信。

### **使用 PKCS#11 开发用于密钥管理的 Linux 用户空间应用程序**

要执行密钥生成、存储、检索和删除等密钥管理操作,请从 Qualcomm Linux 上的用户空间客户端应用程序使用 PKCS#11 服务 API。您的应用程序应与 Cryptoki 客户端库 `libckqteec` 交互以访问 PKCS#11 接口。

下表列出了支持密钥管理功能的通用 API。

| API 名称              | API 用途     | 支持的算法                                 |
| :------------------ | :--------- | :------------------------------------ |
| `C_GenerateKey`     | 生成密钥       | AES - CBC、CTS、CTR、CMAC                |
| `C_GenerateKeyPair` | 生成公钥/私钥对   | RSA、ECDSA                             |
| `C_WrapKey`         | 包装(加密)密钥   | RSA、AES                               |
| `C_UnwrapKey`       | 解包(解密)密钥   | RSA、AES                               |
| `C_DeriveKey`       | 从基础密钥派生密钥  | AES-ECB、AES-CBC                       |
| `C_DigestKey`       | 将密钥摘要为消息摘要 | SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 |

下图显示了从客户端应用程序到 PKCS 受信任应用程序的与密钥相关的用例的调用流程。

**图:客户端和 PKCS 受信任应用程序调用流程**

<img src="https://mintcdn.com/qualcomm-staging/uWQLnBcS9sxlZhgB/System/Security/media-security/k2c-qli-security/key-management-function.png?fit=max&auto=format&n=uWQLnBcS9sxlZhgB&q=85&s=8d038a1d84c7e54bc85a95d945b258b4" alt="客户端和 PKCS 受信任应用程序调用流程" width="768" height="604" data-path="System/Security/media-security/k2c-qli-security/key-management-function.png" />

有关更多信息,请参阅以下文档:

* [PKCS #11 加密令牌接口基础规范](http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/os/pkcs11-base-v2.40-os.html)
* [PKCS #11 加密令牌接口使用指南](https://docs.oasis-open.org/pkcs11/pkcs11-ug/v2.40/cnd01/pkcs11-ug-v2.40-cnd01.html)

### **限制**

不支持以下功能:

* 随机数生成器功能
* CKM\_ECDSA 中的 P-192
* CKM\_RSA\_PKCS 模式下的 RSA PKCS 密钥生成和签名
* EDDSA 密钥生成和签名
* RSA 互操作性有限;不支持多种传统格式、专用 RSA 模式和基于 SHA3 的 RSA 组合。
* 对于较新的 PKCS#11 v3.0 功能(如 Edwards/Montgomery 曲线、EdDSA、XEdDSA 和高级 EC 派生/KDF 变体),椭圆曲线支持不完整。
* 不支持基于 SHA3 的机制,如摘要、HMAC、密钥派生和相关的签名组合。
* 不支持高级 AES 模式,如 AES-OFB、AES-CFB、AES-XTS、AES-CCM、AES-GMAC 以及一些 AES MAC 变体。
* 几种对称 MAC 和键控哈希变体不完整,尤其是基于 SHA3 的和一些通用长度机制。
* 不支持特定于协议和专用机制,如 SSL/TLS/WTLS、PBE、HKDF、ChaCha20/Poly1305、Salsa20/Poly1305 和类似的高级机制。
* 某些机制仅部分支持或被后端/QTEE GP 限制阻止,包括 ECDSA 和某些与 EC 相关的测试流程

## **观看有关安全启动技术的视频**

**Qualcomm 处理器安全:基础**

*通过此综合教程解锁 Qualcomm 设备上安全启动技术的全部潜力。从生成加密密钥到编程硬件熔丝以及管理安全启动状态,此视频详细涵盖了每个步骤。非常适合旨在通过身份验证启动过程增强设备安全性的用户。了解如何有效使用 Qualcomm 工具,以确保您的设备每次都能安全启动。*

[<img src="https://mintcdn.com/qualcomm-staging/uWQLnBcS9sxlZhgB/System/Security/media-security/k2c-qli-security/video1-features-qualcomm-security-processor-foundations-pdf.svg?fit=max&auto=format&n=uWQLnBcS9sxlZhgB&q=85&s=1c0c9f2b2400d5f484875fbb08e9af47" alt="Qualcomm 处理器安全:基础视频缩略图" width="432" height="281" data-path="System/Security/media-security/k2c-qli-security/video1-features-qualcomm-security-processor-foundations-pdf.svg" />](https://players.brightcove.net/1414329538001/BJv5wEFt_default/index.html?videoId=6358216194112)

[观看视频:Qualcomm 处理器安全:基础](https://players.brightcove.net/1414329538001/BJv5wEFt_default/index.html?videoId=6358216194112)

## **安全启动**

安全启动是为整个软件栈建立可信平台的启动序列。

参阅工作流程以了解安全启动和 UEFI 安全启动过程。

**图:安全启动 vs UEFI 安全启动**

<img src="https://mintcdn.com/qualcomm-staging/uWQLnBcS9sxlZhgB/System/Security/media-security/k2c-qli-security/secure-boot-uefi-workflow-updated.png?fit=max&auto=format&n=uWQLnBcS9sxlZhgB&q=85&s=3de169ec53ce4b8c5d5fa5bcc7001111" alt="安全启动 vs UEFI 安全启动" width="913" height="578" data-path="System/Security/media-security/k2c-qli-security/secure-boot-uefi-workflow-updated.png" />

此过程使用加密身份验证来启动一个不可变的序列,该序列验证代码的来源,确保授权软件的执行。此过程:

* 确认由 Qualcomm 和用户签名的所有软件镜像(非 Linux 镜像)的真实性。该设备执行此过程。
* 防止任何未经授权或恶意修改的软件在设备上运行。

安全启动功能对非 Linux 镜像进行身份验证,而 UEFI 安全启动对 Linux 镜像进行身份验证。

### **UEFI 安全启动**

UEFI 安全启动是统一可扩展固件接口 (UEFI) 规范的一项功能,该规范定义了操作系统与平台固件之间的接口。

有关更多信息,请参阅 [UEFI 规范](https://uefi.org/specs/UEFI/2.10/)。

UEFI 安全启动的功能包括:

* 确保设备 UEFI 固件运行的代码在操作系统开始启动之前是安全且受信任的。
* 定义 UEFI 如何对 Linux 镜像、操作系统加载程序 (uki.efi)、systemd boot (bootaa64.efi) 和设备树 blob (DTB) 镜像文件等镜像进行身份验证。
* 确保仅在由有效且授权的用户签名时才加载镜像。此过程还确保了 Qualcomm Linux 安全性和运行在基于 UEFI 的固件上的系统的完整性。

UEFI 安全启动允许 Qualcomm Linux 用户:

* 验证 UEFI 加载镜像的完整性和安全性,确保以批准的方式加载。
* 管理由 UEFI 安全启动身份验证变量定义的 Qualcomm Linux 安全策略,包括:
  * 平台密钥 (PK)
  * 密钥交换密钥 (KEK)
  * 允许的数据库 (dB)
  * 禁止的数据库 (DBX)(本版本不支持。)

## **存储安全**

存储安全功能通过两个关键组件存储和保护敏感数据:安全文件系统 (SFS) 和重放保护内存块 (RPMB)。

### **SFS**

SFS 是一种受保护的存储功能,可安全地存储敏感数据,如加密密钥和生物识别信息。它在 Qualcomm TEE 中运行,使用加密和隔离来防止未经授权的访问。

它为受信任的应用程序提供机密性、完整性和防回滚支持,并安全地存储敏感数据。防回滚保护涵盖在 SFS 下创建或存储的文件。

SFS 功能使用:

* 每个受信任应用程序的加密密钥,以确保文件的机密性。
* 每个受信任应用程序的 HMAC 密钥,用于验证文件的完整性。

加密和 HMAC 密钥都使用设备唯一密钥派生,这取决于设备的安全启动状态。SFS 防回滚保护默认启用。

当设备启用了安全启动时,SFS 使用唯一的硬件密钥进行文件数据加密和解密,以确保它们彼此安全。

### **RPMB**

RPMB 是存储设备(如 UFS/eMMC 闪存)中的一个安全物理分区。此分区存储必须防止篡改和回滚的关键数据,并且只能从 Qualcomm TEE 访问。

要从 RPMB 分区读取和写入,需要 [RPMB 密钥配置](/zh/System/Security/customize-security-services)。这是一次性过程,完成后无法覆盖或擦除。

RPMB 的每次访问都经过身份验证,允许主机以经过身份验证和重放保护的方式存储数据。

## **存储加密**

<Warning>
  iq-9075(emmc)、iq-x7181(ufs) 目前不支持存储加密。
</Warning>

存储加密通过支持透明加密文件和目录来增强安全性。

Qualcomm Linux 支持使用 [ICE](/zh/System/Security/security-features#inline-crypto-engine) 和硬件包装密钥的存储加密。它提供了更好的效率和增强的密钥保护。

存储加密功能允许:

* 为内容加密提供 32 字节到 64 字节范围的标准密钥
* 为内容加密提供包装密钥
* 使用单独密钥加密文件名和文件内容
* 生成 32 字节密钥标识符

Qualcomm 通用闪存存储 (UFS) 驱动程序和 eMMC(sdhc) 可以支持 `fscrypt` API。

有关 `fscrypt` API 的更多信息,请参阅 [文件系统级加密 (fscrypt) Linux 内核文档](https://www.kernel.org/doc/Documentation/filesystems/fscrypt.rst)。

有关相关的内核文档,请参阅以下文件:

* [内联加密](https://www.kernel.org/doc/Documentation/block/inline-encryption.rst)
* [存储加密的 I/O 控制 (IOCTL) 支持](https://www.kernel.org/doc/Documentation/userspace-api/ioctl/ioctl-number.rst)

您可以使用开源 [fscryptctl](https://github.com/google/fscryptctl) 工具调用存储加密功能。

## **QCOMTEE 驱动程序**

QCOMTEE 驱动程序是 Qualcomm Linux 上安全通信的基石。通过将基于 Object-IPC 的 Mink 通信协议集成到标准 Linux TEE 子系统中,它提供了一种安全、可扩展且友好的上游方式来访问硬件支持的可信服务。它成功地弥合了 Qualcomm 的面向对象安全架构与 Linux 内核标准化安全框架之间的差距。

QCOMTEE 驱动程序是 Linux 内核中的专用后端驱动程序,专为 Qualcomm 平台而设计。它使用 Mink-IPC 协议促进高级操作系统 (HLOS) 与 Qualcomm TEE 之间的通信。

QCOMTEE 驱动程序作为传统下游 si-core (SMCInvoke) 驱动程序的现代、上游兼容替代品。其主要作用是为 Mink-IPC 提供安全传输层,Mink-IPC 是基于对象能力的 IPC 协议。与使用简单基于命令接口的传统 TEE 驱动程序不同,QCOMTEE 实现了基于对象的 IPC 模型。这允许用户空间应用程序和内核客户端与 Qualcomm TEE 服务交互,就好像它们是本地对象一样,支持嵌套对象传递和回调等丰富功能。

QCOMTEE 具有以下主要接口组件:

* Mink TEEC 库:公开 GlobalPlatform TEE 客户端 API 接口,允许客户端使用 Mink Adaptor 与 Qualcomm TEE 通信。
* Mink Adaptor 库:实现 Mink-IPC 接口,进而允许客户端使用 Mink-IDL 编程接口通过 QCOMTEE 跨安全域边界与 Qualcomm TEE 通信。
* QCOM-TEE 库:提供使用与 Linux TEE 子系统注册的 QCOM-TEE 驱动程序与 Qualcomm TEE 通信的接口。它支持通过 Linux TEE 子系统的 `TEE_IOC_OBJECT_INVOKE` IOCTL 与用户空间客户端使用 Qualcomm TEE 进行通用基于对象的 IPC。

下图显示了 QCOMTEE 驱动程序架构:

**图:QCOMTEE 驱动程序架构**

<img src="https://mintcdn.com/qualcomm-staging/uWQLnBcS9sxlZhgB/System/Security/media-security/k2c-qli-security/qli-2x-qcomtee-driver.svg?fit=max&auto=format&n=uWQLnBcS9sxlZhgB&q=85&s=564442d98ef279546aa06dc038854284" alt="QCOMTEE 驱动程序架构" width="443" height="370" data-path="System/Security/media-security/k2c-qli-security/qli-2x-qcomtee-driver.svg" />

## **访问控制**

访问控制确保只有授权实体可以在定义的条件下访问特定资源,使用策略、技术和信任模型。

访问控制信任模型通过管理各种资产、接口、片上系统 (SoC) 组件和镜像之间的访问控制配置,确保持续的安全性。此模型有助于支持敏感信息的完整性和机密性。

* Qualcomm 访问控制使用外部保护单元 (xPU) 从辅助端控制对寄存器、固定地址和动态内存区域的访问。
* 系统内存管理单元 (SMMU) 从主端控制访问,用于内容保护和子系统内存共享用例。

### **访问控制域**

两级控制是:

1. TrustZone 管理 TrustZone 域并使用 xPU 从辅助端控制访问。
   * xPU 是许多称为保护单元的安全块的组合。它允许基于一组可编程访问控制寄存器的条件访问。
   * 如果系统拒绝访问,xPU 会生成错误输出信号,并在必要时生成中断请求信号。
2. hypervisor (EL2) 管理非安全域,包括旨在防止访问优质视频的内容保护区域 (CPZ)。
   * 它通过 SMMU 通过第二阶段页表从主端配置访问控制。
   * 它管理第 2 阶段映射,以保护所有主域(Linux、显示器、GPU 和视频)中的资产。Linux 内核管理第 1 阶段映射,以保护在用户特权级别运行的应用程序中的资产。

下图显示了访问控制域。

**图:访问控制域**

<img src="https://mintcdn.com/qualcomm-staging/uWQLnBcS9sxlZhgB/System/Security/media-security/k2c-qli-security/access-control-trust-hierarchy-security-domain-updated.png?fit=max&auto=format&n=uWQLnBcS9sxlZhgB&q=85&s=87d8d7fc708f326633b2eb75f3e8d050" alt="访问控制域" width="833" height="342" data-path="System/Security/media-security/k2c-qli-security/access-control-trust-hierarchy-security-domain-updated.png" />

## **安全外设镜像加载**

TrustZone 的安全外设镜像加载 (PIL) 对不同的镜像进行身份验证,并为音频、摄像头和视频等所有子系统配置 xPU。

有关 xPU 的更多信息,请参阅 [访问控制](/zh/System/Security/security-features#access-control)。

## **SELinux**

SELinux 是 Linux 的安全增强功能,提供对系统访问的更多控制。它使用 Linux 安全模块 (LSM) 框架在 Linux 内核中实现强制访问控制 (MAC)。

有关更多信息,请参阅 [什么是 SELinux?](https://www.redhat.com/en/topics/linux/what-is-selinux)

LSM 框架包括以下控制:

* 自主访问控制 (DAC)
  * 这是 Linux 访问控制的标准形式。数据所有者对资源(如数据和文件)具有完全控制权,可以更新或修改数据。
  * 一些应用程序(具有 root 权限)可以覆盖此控制。某些资源(如套接字)未经检查。
  * 基于用户和组身份提供的访问控制粒度有限。例如,文件模式 `–rwxr-xr-x-`。
* MAC
  * 系统范围的安全策略确定所有进程、对象和操作的 Linux 访问控制。
  * 该策略可以限制有缺陷和恶意的应用程序或粗心的用户。它甚至可以防止用户提升权限(如 root 或 UID 0)。
  * MAC 提供了更精细的访问控制粒度,允许访问除文件之外的更多资源,并具有更具体的控制。例如,取消链接、仅追加或移动文件。

下图显示了 DAC 和 MAC 决策链中的步骤:

**图:Linux 安全模块:DAC 和 MAC**

<img src="https://mintcdn.com/qualcomm-staging/uWQLnBcS9sxlZhgB/System/Security/media-security/k2c-qli-security/selinux-mac-dac-updated.png?fit=max&auto=format&n=uWQLnBcS9sxlZhgB&q=85&s=07b9cbe68bd6d883ab465cc35d73c6e4" alt="Linux 安全模块:DAC 和 MAC" width="913" height="608" data-path="System/Security/media-security/k2c-qli-security/selinux-mac-dac-updated.png" />

SELinux 支持三种模式:

* 强制模式(默认):在此模式下,SEPolicy 在系统上强制执行。如果在运行软件时不满足 SEPolicy 规则,则会阻止访问。内核将尝试的访问违规记录为访问向量缓存 (AVC) 拒绝消息到 `dmesg`、`journalctl` 和 `/var/log/audit/audit.log`。
* 宽松模式:在此模式下,SEPolicy 不在系统上强制执行。所有拒绝都记录到 `dmesg`、`journalctl` 和 `/var/log/audit/audit.log` 日志中,但不禁止进程或软件的访问。
* 禁用模式:在此模式下,SEPolicy 既不强制执行也不记录。

有关启用 SELinux 的信息,请参阅 [启用 SELinux](/zh/System/Security/enable-se-linux)。要配置 SELinux 模式,请参阅 [SELinux 配置](/zh/System/Security/enable-se-linux)。

### **SELinux 层**

SELinux 动态层集成了必要的特定于 SELinux 的代码修改,这些修改在启用 SELinux 时激活并初始化设备,采用模块化设计。

**图:SELinux 层**

<img src="https://mintcdn.com/qualcomm-staging/uWQLnBcS9sxlZhgB/System/Security/media-security/k2c-qli-security/selinux-process-updated.png?fit=max&auto=format&n=uWQLnBcS9sxlZhgB&q=85&s=c800edaa6b5d077c1a4b811c07e0afc2" alt="SELinux 层" width="1170" height="306" data-path="System/Security/media-security/k2c-qli-security/selinux-process-updated.png" />

此层建立在 meta‑SELinux 层之上,meta‑SELinux 层是 Yocto upstream 的一部分。它包括:

* recipe‑kernel,包含用于启用 SELinux 所需的内核配置标志的配方。
* recipe‑security 包括:
  * 用于将设备启动到 shell 的策略
  * Qualcomm 服务和测试应用程序的策略
  * 补丁形式的上游服务策略
  * 管理 Qualcomm 策略编译的配方

### **Refpolicy**

[refpolicy](https://github.com/SELinuxProject/refpolicy) 是一个包含核心 SELinux 策略配置的 github 存储库。

上游 SEPolicy 在 `refpolicy` 中定义,在构建期间下载并使用 Qualcomm SEPolicy 进行修改,位于:`meta-qcom-distro/recipes-security/refpolicy/refpolicy-targeted/`。

下图显示了合并和编译以生成 `policy.35` 的高级目录结构,`policy.35` 是启动期间使用或加载的 SEPolicy 二进制文件。

**图:SEPolicy 高级目录**

<img src="https://mintcdn.com/qualcomm-staging/uWQLnBcS9sxlZhgB/System/Security/media-security/k2c-qli-security/sepolicy-figure-updated.png?fit=max&auto=format&n=uWQLnBcS9sxlZhgB&q=85&s=ad034118941ba8d5cf4f3c751b45e16e" alt="SEPolicy 高级目录" width="1144" height="531" data-path="System/Security/media-security/k2c-qli-security/sepolicy-figure-updated.png" />

有关更多信息,请参阅 [自定义内存和 SEPolicy](/zh/System/Security/customize-security-services)。

## **观看有关 Qualcomm Type-1 Hypervisor 和可信执行环境的视频**

**Qualcomm 处理器安全:TEE 和芯片组服务**

*通过此综合教程学习如何使用 Qualcomm:sup*`® `*Type-1 Hypervisor 和可信执行环境。深入了解平台虚拟化、安全通信以及 Qualcomm 提供的广泛安全功能。了解如何使用 Qualcomm 工具和 API 开发安全应用程序,并了解 Qualcomm 支持的关键安全用例和合规性标准。非常适合旨在增强设备安全性和功能的用户。*

[<img src="https://mintcdn.com/qualcomm-staging/uWQLnBcS9sxlZhgB/System/Security/media-security/k2c-qli-security/video2-features-tee-and-chipset-services-pdf.svg?fit=max&auto=format&n=uWQLnBcS9sxlZhgB&q=85&s=8a41233d2116d6814498a077ff55cbf5" alt="Qualcomm 处理器安全:TEE 和芯片组服务视频缩略图" width="432" height="279" data-path="System/Security/media-security/k2c-qli-security/video2-features-tee-and-chipset-services-pdf.svg" />](https://players.brightcove.net/1414329538001/BJv5wEFt_default/index.html?videoId=6358216309112)

[观看视频:Qualcomm 处理器安全:TEE 和芯片组服务](https://players.brightcove.net/1414329538001/BJv5wEFt_default/index.html?videoId=6358216309112)

## **Qualcomm TEE**

Qualcomm TEE 是在 Qualcomm 设备上的 Arm TrustZone 环境内运行的软件。

TrustZone 是通过 Arm 处理器的安全模式启用的基于硬件的安全架构。它建立了两个具有系统范围硬件强制隔离的执行环境。有关更多信息,请参阅 [什么是 TrustZone?](https://developer.arm.com/documentation/102418/0101/What-is-TrustZone-)

Qualcomm 提供带硬件虚拟化的 64 位 Arm 8.x 处理器系统,用于运行 TrustZone。

在 TrustZone 架构中,有两种安全状态:

* 安全
* 非安全

在 EL0、EL1 和 EL2 [异常级别](https://developer.arm.com/documentation/102412/0103/Privilege-and-Exception-levels/Exception-levels),处理器可以处于安全状态或非安全状态,而 EL3 始终处于安全状态。

操作系统在非安全 EL1 中运行。从非安全模式到安全模式的转换通过安全监视器模式促成。

Qualcomm TEE 提供以下功能:

* 从硬件保护内存操作
* 支持加密引擎、PRNG、内联加密引擎和外部保护单元 (xPU) 等安全块的电源崩溃
* 支持安全外设镜像加载器 (PIL)
* 支持子系统重启
* 提供内容保护
* 支持运行受信任的应用程序
* 支持熔丝管理

### **受信任的应用程序**

受信任的应用程序 (TA) 为非安全的 Linux 客户端提供安全环境内的服务。Qualcomm TEE 将以下服务扩展到受信任的应用程序:

* 支持受信任的应用程序在 EL0 的安全世界中运行
* 受信任应用程序的沙盒环境
* 受信任应用程序的位置无关加载
* 不同受信任应用程序之间的消息传递

受信任的应用程序从硬件保护的内存中运行。但是,需要更多内存的应用程序可以使用双倍数据速率 (DDR) 内存进行加载和运行。默认情况下,应用程序设置为从硬件保护的内存中运行。

## **安全加固**

安全加固是一种通过使攻击者利用系统漏洞更具挑战性来最小化系统攻击风险的过程。

内核安全加固与上游内核指南一致。启用了 KASLR、加固的用户复制、堆栈保护器和权限 (RWX) 等关键内核标志。

### **用户空间加固**

[security\_flags.inc](https://github.com/yoctoproject/poky/blob/scarthgap/meta/conf/distro/include/security_flags.inc) 文件是 [Yocto 项目](https://www.thegoodpenguin.co.uk/blog/yocto-security-hardening-security-flags/) 的一部分,用于为构建启用安全编译器和链接器标志。

要将此功能扩展到 Qualcomm 模块,请将以下命令添加到 `qcom-security_flags.inc`(文件路径:[qcom-security\_flags.inc](https://github.com/quic-yocto/meta-qcom-distro/blob/kirkstone/conf/distro/include/qcom-security_flags.inc)):

```text theme={null}
require conf/distro/include/security_flags.inc
```

添加这些标志可能会导致警告或错误,可能会中断构建。但是,Yocto 提供了一种为有问题的包禁用某些编译器标志的方法。GCC 和 Clang 等现代编译器提供了广泛的编译器标志,可以让攻击者更难利用某些类型的漏洞。

以下是 GCC 的示例标志:

* `Wformat` 标志添加编译时检查以检测 `printf`、`scanf` 和 `strftime` 等常见库函数中字符串参数格式相关的问题。
* `D_FORTIFY_SOURCE` 标志添加编译时和运行时检查以检测内存和字符串函数中的缓冲区溢出。
* `Fstack-protector` 标志添加运行时检查以检测缓冲区溢出和堆栈粉碎。
* `Fpie` 标志启用位置无关代码,允许在随机位置加载二进制文件,从而使某些类型的攻击(如面向返回的编程)更加困难。
* `Wl,-z,relro,-z,now` 标志使二进制全局偏移表更难被滥用。

如果出现警告和错误,为某些模块自定义这些标志可能会破坏构建。如果应用了编译器漏洞缓解功能,可以使用 Checksec 工具验证文件系统中的二进制文件。

有关如何使镜像更安全的信息,请参阅 [Yocto 项目文档](https://docs.yoctoproject.org/scarthgap/dev-manual/securing-images.html)。

## **Qualcomm 无线边缘服务**

Qualcomm<sup>®</sup> 无线边缘服务 (Qualcomm WES) 是一套植根于硬件的可信服务,可安全地连接和管理设备。

它提供以下服务:

* 功能许可通过功能 ID 和别名功能名称启用设备功能。这些功能通过安装相应的功能许可证或证书来启用。
* 设备证明提供加密签名和加密的数据项,描述设备及其软件的安全状态。这些数据项对于风险引擎和其他类似应用程序很有用。
* 安全配置支持使用唯一设备密钥保护的加密密钥的生成和使用。这些密钥用于:
  * 在销售后和无线 (OTA) 上安全地向设备配置数据。
  * 在设备上签名数据。

要安装或升级 QCS5430 SoftSKU 功能包,请参阅 [安装或升级 SoftSKU 功能包](/zh/System/Security/install-or-upgrade-the-soft-sku-feature-packs)。

要开发提供基于硬件的证明、零接触设备配置和芯片组功能管理的应用程序,请参阅 [Qualcomm Linux 无线边缘服务指南](https://docs.qualcomm.com/bundle/resource/topics/80-80021-11B/overview.html)。此功能对具有授权访问权限的许可用户开放。

<Warning>
  Qualcomm WES 不支持 Qualcomm Dragonwing™ IQ-615 版本。
</Warning>

## **独立可信平台模块**

独立可信平台模块 (dTPM) 是一个专用硬件模块,提供强大的安全功能,如安全密钥存储、加密操作、测量启动和平台证明。Qualcomm Linux 支持 dTPM 集成,特别适用于需要增强基于硬件保护的工业和安全导向的应用程序。

dTPM 的关键功能包括:

* TPM 2.0 合规性:完全支持 TPM 2.0 标准。
* 安全存储:加密密钥和敏感资产的硬件支持保护。
* 开源栈:与 TPM2 软件栈(TSS、tpm2-tools、tpm2-abrmd、tpm2-tss-engine、tpm2-pkcs11)集成。
* Linux 内核支持:适用于 TPM 2.0(SPI 接口)的上游驱动程序。

支持以下用例:

* 安全启动和测量启动
* 加密操作的密钥管理
* 工业 IoT 的平台证明
* 使用 TPM2 引擎与 OpenSSL 和 PKCS#11 集成

### **支持 dTPM 的 Qualcomm Linux 芯片组**

在以下 Qualcomm Linux 自定义软件发行版上启用并验证了 dTPM 支持:QCS6490(工业 Mez 套件)、Qualcomm Dragonwing™ IQ-9075 和 Qualcomm Dragonwing™ IQ-8275

它包括以下集成和功能:

> **注意**
>
> 在 **QCS6490 Industrial Mez Kit** 平台上,如果启动后 `/dev/tpm0` 和 `/dev/tpmrm0` 设备节点不存在,请执行以下命令并重启系统:
>
> ```bash theme={null}
> echo "tpm_tis_spi" > /etc/modules-load.d/tpm.conf
> ```
>
> 这确保在启动期间自动加载 `tpm_tis_spi` 模块,启用 TPM 设备节点。

* 硬件接口:dTPM 使用 SPI 连接,复位由 GPIO 控制。
* 设备树支持:仅需要设备树更改进行硬件检测;不需要修改内核驱动程序。
* 软件栈:基于 Yocto 的 Linux 发行版包括完整的 TPM2 软件栈(例如,tpm2-tss 和 tpm2-tools)。
* 虚拟化支持:支持多 VM (KVM) 配置,支持 dTPM 资源管理器透传到客户 VM。
* 平台特殊性:并非所有 Qualcomm SoC 都默认启用 dTPM;它旨在用于需要工业级安全和测量启动的平台。
* 可用性:TPM2 软件栈包含在支持平台的 QC Linux Yocto 层中。

#### **软件栈**

* Yocto 层:通过专用配方启用 TPM 用户空间栈(例如,tpm2-tss、tpm2-tools)。
* 内核驱动程序:使用上游 TPM 驱动程序;硬件启动所需的更改最少。请参阅 [Bootlin Source Drivers](https://elixir.bootlin.com/linux/v6.10.4/source/drivers/char/tpm)。
* 用户空间交互:应用程序通过 libtss 栈与 TPM 交互。请参阅 [Linux TPM2 和 TSS2 软件](https://github.com/tpm2-software)。

#### **硬件集成**

* SPI 接口:TPM 通过 SPI 线连接(例如,SPI11),复位由专用 GPIO 控制。
* 设备树配置:通过将 TPM 节点添加到设备树来启用 TPM 支持,允许开源 TPM 驱动程序探测硬件。
* GPIO 控制:更新 PMIC 节点以管理 TPM 复位功能。

#### **外部依赖**

* TPM2 软件栈:包括 tpm2-tss、tpm2-tools 和加密引擎等组件,用于用户空间交互。请参阅 [tpm2-tools git.X](https://layers.openembedded.org/layerindex/recipe/87697/) 和 [tpm2-software/tpm2-tools](https://github.com/tpm2-software/tpm2-tools)。
* UEFI 固件支持:需要实现 EFI\_TCG2\_PROTOCOL 的固件,用于测量启动和平台证明。
* Linux 内核集成:依赖于位于 `build-qcom-wayland/workspace/<linux_kernel_recipe>/drivers/char/tpm` 中的上游 TPM 驱动程序。

#### **软件启用**

要为 QCS5430/QCS6490 和 IQ-9075/IQ-9100 设置 Qualcomm Linux 自定义软件发行版,请参阅 [Qualcomm Linux 发行说明](https://docs.qualcomm.com/doc/80-80021-300)。

#### **内核**

* TPM 驱动程序支持:使用上游 Linux 内核 TPM 驱动程序;标准 dTPM 硬件启动无需更多更改。
* 设备树配置:设备树更新足以启用硬件检测。

#### **Yocto/用户空间**

通过 Yocto 配方启用 TPM2 软件栈,包括:

* `tpm2-tss` – TPM2 软件栈 (TSS) 库
* `tpm2-tools` – TPM2 的命令行工具
* `tpm2-abrmd` – TPM2 访问代理和资源管理器守护进程
* `tpm2-tss-engine` – 用于 TPM2 的 OpenSSL 引擎
* `tpm2-pkcs11` – 用于 TPM2 的 PKCS#11 接口

#### **安装示例**

下图显示了安装示例。

<img src="https://mintcdn.com/qualcomm-staging/uWQLnBcS9sxlZhgB/System/Security/media-security/k2c-qli-security/dtpm-installation-example.jpg?fit=max&auto=format&n=uWQLnBcS9sxlZhgB&q=85&s=42366dbbd71ba151643c31d7c15362c9" alt="dTPM 安装示例" width="851" height="229" data-path="System/Security/media-security/k2c-qli-security/dtpm-installation-example.jpg" />

#### **验证**

* 使用 tpm2-tools 进行功能验证,包括随机数生成 (RNG)、密钥管理和测量启动的测试。
* tpm2-tss 和 tpm2-tools 包中提供了单元测试,以验证 TPM2 功能。

#### **验证 TPM2 功能 - 测试示例**

**前提条件**

* 在开始设置之前,从官方上游源下载 TPM2 tools 包。
  * 请参阅 [tpm2-tools git.X](https://layers.openembedded.org/layerindex/recipe/87697/)。
  * 请参阅 [tpm2-software/tpm2-tools](https://github.com/tpm2-software/tpm2-tools)。
* 在宽松模式下启用安全外壳 (SSH) 以安全地访问您的主机设备。
  * 请参阅 [使用 SSH 登录](https://docs.qualcomm.com/bundle/publicresource/topics/80-80021-254/how_to.html#use-ssh)。

1. 使用 SSH 连接到设备控制台。
2. 启用写访问。
   ```text theme={null}
   mount -o rw,remount /usr
   ```
3. 从主机计算机上的另一个终端复制 TPM2 tools 包。
   ```text theme={null}
   scp /path/to/tpm2-tools_5.4-r0_armv8-2a.ipk root@<device-ip-address>:/data/
   ```
4. 安装 TPM2 tools。
   ```text theme={null}
   opkg install --force-reinstall --force-depends /data/tpm2-tools_5.4-r0_armv8-2a.ipk
   ```
5. 验证 TPM2 功能。
   1. 生成随机数据。
      ```text theme={null}
      tpm2_getrandom --hex -T device:/dev/tpmrm0 16
      ```
   2. 创建主密钥。
      ```text theme={null}
      tpm2_createprimary -C o -c primary.ctx
      ```
   3. 创建 RSA 密钥对。
      ```text theme={null}
      tpm2_create -G rsa -u key.pub -r key.pri -C primary.ctx
      ```
   4. 加载密钥。
      ```text theme={null}
      tpm2_load -C primary.ctx -u key.pub -r key.pri -n key.name -c key.ctx
      ```
   5. 加密文件。
      ```text theme={null}
      echo "wangdg love eating fruit" > secre.data
      tpm2_rsaencrypt -c key.ctx -o jiami_file.enc secre.data
      cat jiami_file.enc
      ```
      查看加密数据。
   6. 解密文件
      ```text theme={null}
      tpm2_rsadecrypt -c key.ctx -o jiemi.dec jiami_file.enc
      cat jiemi.dec
      ```
      查看原始消息。
   7. 哈希文件
      ```text theme={null}
      tpm2_hash -C e -g sha1 -o hash.bin -t ticket.bin secre.data --hex
      cat hash.bin
      ```

## **后续步骤**

* 要了解 TrustZone 和安全框架,请参阅 [安全架构](/zh/System/Security/security-architecture)。
* 要了解安全工具及如何将其集成到工作流程中,请参阅 [安全工具](/zh/System/Security/security-tools)。
