安全

[English]

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

备注

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

目标

高级安全目标包括:

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

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

  3. 保护设备身份

  4. 安全存储机密数据

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

平台安全

安全启动

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

关于安全启动功能的更多详情,请参阅 安全启动 (secure boot) v2

重要

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

安全启动最佳实践

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

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

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

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

flash 加密

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

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

flash 加密最佳实践

  • 建议在生产环境中使用 flash 加密的发布模式。

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

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

设备身份

在 ESP32-H2 中,数字签名外设借助硬件加速,通过 HMAC 算法生成 RSA 数字签名。RSA 私钥仅限设备硬件访问,软件无法获取,保证了设备上存储密钥的安全性。

ESP32-H2 还支持 ECDSA 外设,用于生成硬件加速的 ECDSA 数字签名。ECDSA 私钥支持直接编程到 eFuse 块中,并在软件中标记为读保护。

DS 或 ECDSA 外设可以建立与远程终端之间的 安全设备身份,如基于 RSA 或 ECDSA 加密算法的 TLS 双向认证。

详情请参阅 椭圆曲线数字签名算法 (ECDSA)数字签名 (DS)

内存保护

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

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

备注

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

防御侧信道攻击

差分功耗分析 (DPA) 保护

ESP32-H2 支持针对 DPA 相关安全攻击的保护机制。DPA 保护通过动态调整加密外设的时钟频率,在其运行期间模糊了功耗轨迹。时钟变化范围会根据配置的 DPA 安全级别改变。更多详情请参阅 ESP32-H2 技术参考手册 > [PDF]。

通过 CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL 可以调整 DPA 级别。级别越高安全性越强,但也可能会影响性能。默认启用最低级别 DPA 保护,可以根据安全需求修改。

备注

请注意,为确保 DPA 保护机制正常工作,必须启用硬件 RNG

调试接口

JTAG

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

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

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

UART 下载模式

ESP32-H2 中,如果启用了任一安全功能,则会激活安全 UART 下载模式。

  • 要启用安全 UART 下载模式,也可以调用 esp_efuse_enable_rom_secure_download_mode()

  • 该模式下,禁止执行通过 UART 下载模式下载的任意代码。

  • 该模式将限制部分涉及更新 SPI 配置的命令,如更改波特率、基本的 flash 写入以及通过 get_security_info 返回当前启用的安全功能摘要。

  • 要完全禁用安全 UART 下载模式,可以将 CONFIG_SECURE_UART_ROM_DL_MODE 设置为建议选项 Permanently disable ROM Download Mode,或者在运行时调用 esp_efuse_disable_rom_download_mode()

重要

安全 UART 下载模式下,仅支持使用 --no-stub 参数调用 esptool.py

产品安全

安全 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 + HTTPBLE 安全地控制 ESP 设备。

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

安全策略

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

公告

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

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

软件更新

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

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

重要

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


此文档对您有帮助吗?