# 安全概述

[English]

本指南概述了乐鑫解决方案中可用的整体安全功能。从 安全 角度考虑，强烈建议在使用乐鑫平台和 ESP-IDF 软件栈设计产品时参考本指南。

备注

在本指南中，最常用的命令形式为 `idf.py secure-<command>`，这是对应 `espsecure <command>` 的封装。基于 `idf.py` 的命令能提供更好的用户体验，但与基于 `espsecure` 的命令相比，可能会损失一部分高级功能。

## 目标

高级安全目标包括：

1. 防止执行不受信任的代码

2. 保护存储在外部 flash 中代码的可信度和完整性

3. 保护设备身份

4. 安全存储机密数据

5. 设备身份验证与加密通信

## 平台安全

### 安全启动

安全启动功能可以确保设备仅执行通过身份认证的软件。安全启动时，会验证 应用程序的启动流程 中所涉及的所有 可变 软件实体，形成信任链。设备启动以及 OTA 更新过程中都会进行签名认证。

关于安全启动功能的更多详情，请参阅 安全启动 (Secure Boot) v2。

重要

强烈建议在所有生产设备上启用安全启动功能。

#### 安全启动最佳实践

- 在具备高质量熵源的系统上生成签名密钥。

- 签名密钥始终保密；签名密钥泄露会危及安全启动系统。

- 不允许第三方使用 `idf.py secure-` 或 `espsecure` 命令来观察密钥生成或是签名过程的任何细节，这两个过程都容易受到定时攻击或其他侧信道攻击的威胁。

- 确保正确烧录所有安全性 eFuse，包括禁用调试接口以及非必需的启动介质（例如 UART 下载模式）等。

### flash 加密

flash 加密功能可以加密外部 flash 中的内容，从而保护存储在 flash 中软件或数据的 机密性 。

关于该功能的更多详情，请参阅 flash 加密。

如果 ESP32-H4 连接了外部 SPI RAM，那么写入或读取到 SPI RAM 的内容将会分别进行加密和解密。当启用 flash 加密时，上述过程将通过 MMU 的 flash 缓存实现。以上加密和解密过程为存储在 SPI RAM 中的数据提供了额外的安全层，有助于安全地启用 `CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC` 等特定配置选项。

#### flash 加密最佳实践

- 建议在生产环境中使用 flash 加密的 量产模式。

- 建议为每个设备生成唯一的 flash 加密密钥。

- 启用 安全启动 作为额外保护层，防止 flash 在启动前遭受恶意攻击。

### 内存保护

ESP32-H4 可以通过架构或 PMS 等特定外设实现 内存保护，强制执行和监控内存以及某些外设的权限属性。使用相应外设，ESP-IDF 应用程序启动代码可以配置数据内存的读取/写入权限以及指令内存的读取/执行权限。如有任何操作尝试违反这些权限属性，如写入指令内存区域，将触发违规中断，导致系统 panic。

使用该功能需启用配置选项 CONFIG_ESP_SYSTEM_MEMPROT，该选项默认启用。请注意，该功能的 API 是 私有 的，仅供 ESP-IDF 代码使用。

备注

内存保护功能可以防止因软件漏洞导致的远程代码注入。

### 防御侧信道攻击

#### AES 外设的伪轮次功能

ESP32-H4 在 AES 外设中集成了伪轮次功能，使该外设能够在原始操作轮次前后随机插入伪轮次，并生成一个伪密钥来执行这些虚拟操作。 这些操作不会改变原始结果，但能够通过随机化功耗特征，提高实施侧信道分析攻击的复杂性。

可以使用 CONFIG_MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC_STRENGTH 选择伪轮次功能的强度。提高强度会增强该功能所提供的安全性，但会减缓加密/解密操作的速度。

伪轮次功能的不同强度对 AES 操作性能的影响
强度 | 性能影响 [1]
--- | ---
低 | 20.9 %
中 | 47.6 %
高 | 72.4 %

[1]

上述性能数据通过 mbedtls 测试应用中的 AES 性能测试 test_psa_aes_perf.c 计算得出。

考虑到上述性能影响，ESP-IDF 默认关闭伪轮次功能，避免对相关性能造成影响。但如果需要更高的安全性，仍然建议启用。

### 调试接口

#### JTAG

- 如果启用了任一安全功能，则 JTAG 接口将保持禁用。更多详情请参阅 JTAG 与 flash 加密和安全启动。

- 如果不启用其他安全功能，也可以使用 eFuse API 禁用 JTAG 接口。

- ESP32-H4 支持软禁用 JTAG 接口，并且可以通过 HMAC 烧录密钥重新启用，请参阅 HMAC 启用 JTAG 接口。

#### UART 下载模式

## 产品安全

### 安全 OTA 更新

- OTA 更新必须通过安全传输进行，如 HTTPS。

- ESP-IDF 为此提供了一个简化的抽象层，即 ESP HTTPS OTA 升级。

- 如果启用了 安全启动，则服务器应托管已签名的应用程序镜像。

- 如果启用了 flash 加密，则服务器端不需要额外操作，在 flash 写入时，设备将自动加密。

- OTA 更新的 回滚过程 可以在验证完应用程序的功能后，再将应用程序切换为 `active` 状态。

#### 防回滚保护

防回滚保护功能确保设备仅执行特定版本的应用程序，即应满足设备 eFuse 存储的安全版本条件。因此，即使已由合法密钥信任和签名，应用程序可能包含已撤销的安全功能或凭据，因此设备必须拒绝执行此类应用程序。

ESP-IDF 仅支持在应用程序使用该功能，并通过二级引导加载程序管理。安全版本存储在设备 eFuse 中，并在启动时和 OTA 更新期间与应用程序镜像头进行比较。

关于启用此功能的更多详情，请参阅 防回滚。

#### 加密固件分发

OTA 更新期间，使用加密的固件分发，可以确保在从服务器 传输 到设备的过程中，应用程序保持加密。OTA 更新期间，这可以作为在 TLS 通信之上的额外保护层，保护应用程序身份。

关于加密固件分发的工作示例，请参阅 使用预加密固件进行 OTA 升级。

### 安全存储

安全存储指在设备上以安全方式存储应用程序的特定数据，即将数据存储在外部 flash 中。外部 flash 通常是可读写的 flash 分区，用于存储设备特定的配置数据，如 Wi-Fi 凭据。

ESP-IDF 提供了 NVS（非易失性存储） 管理组件，允许加密数据分区。该功能与上文提到的 flash 加密 平台功能相关。

关于该功能的工作原理和启用说明，请参阅 NVS 加密。

重要

ESP-IDF 组件会默认将 Wi-Fi 证书等设备特定数据写入 NVS 默认分区，建议使用 NVS 加密 功能来保护这些数据。

### 安全设备控制

ESP-IDF 提供了 ESP 本地控制组件，可以通过 `Wi-Fi/Ethernet + HTTP` 或 `BLE` 安全地控制 ESP 设备。

关于该功能的更多详情，请参阅 ESP 本地控制。

## 安全策略

ESP-IDF GitHub 代码库内含 安全政策介绍。

### 公告

- 乐鑫会发布重要 安全公告 ，包括硬件和软件相关公告。

- ESP-IDF 软件组件的相关安全公告会发布在 GitHub 仓库 。

### 软件更新

ESP-IDF 会及时处理针对组件和第三方库的相关报告，并修复关键安全问题。修复内容会逐步同步到 ESP-IDF 的所有适用版本分支中。

ESP-IDF 的发布说明将涵盖各 ESP-IDF 组件和第三方库的相应安全问题和 CVE 编号。

重要

为获取所有关键安全修复，建议定期更新到 ESP-IDF 的最新 Bugfix 版本。

此文档对您有帮助吗？

- 反馈已收到，谢谢！
- 如果您有其他意见，欢迎填写乐鑫文档反馈表。

- 我们重视您的反馈。
- 您可以填写乐鑫文档反馈表告诉我们如何改进该文档。