我有一个生产固件的设备。我们启用了闪存加密,并启用了核心转储。不幸的是,我们没有在文档中的任何地方看到核心转储分区需要在分区表中明确标记为加密......
此时我们有我们的引导加载程序和 3 个应用程序分区(一个工厂和两个 OTA 分区) ,以及 FATFS 分区、核心转储分区和一些 NVS 分区等......对于我们现在运行此设置的(数千台)野外设备,我们希望能够将核心转储远程上传到我们的服务器,所以我们可以进行崩溃分析......
不幸的是,当我们在开发固件中启用代码时,我们在运行时尝试读取核心转储数据时很快遇到以下错误:
E (4122) esp_core_dump_elf:硬件和核心转储分区中启用的 Flash 加密未加密!
我从 coredump 函数中得到了 ESP_ERR_NOT_SUPPORTED。
该错误是由 esp_core_dump_get_summary 抛出的,我们只是将其用作测试,试图最初从标头获取摘要信息并通过 MQTT 发送它。
所以我有几个问题:
- 首先,有什么方法可以追溯地将加密标志应用于现有加密设备上的核心转储分区?
- 如果我们做不到,那么我们有什么方法可以使它工作(能够从“未加密”分区上的核心转储中读取数据以传输到服务器?)
- 最后,如果 coredump 分区未加密,这是否意味着尽管有 flash 加密设置,核心转储仍以纯文本形式存储?因此,我怀疑这对我们来说是一个主要的安全风险......
这是我们配置的分区表:
代码:
sec_cert, 0x3F, , 0x11000, 0x3000, , # Never mark this as an encrypted par
tition
nvs, data, nvs, 0x14000, 0x6000,
otadata, data, ota, , 0x2000,
phy_init, data, phy, , 0x1000,
rmaker, data, nvs, , 0x6000,
coredump, data, coredump, , 512K,
factory, app, factory, 0xB0000, 3M, encrypted
ota_0, app, ota_0, , 3M, encrypted
ota_1, app, ota_1, , 3M, encrypted
storage, data, fat, , 6M, encrypted
另外需要说明的是,现在我们在现场更新设备的唯一方法是我们的 OTA 过程,它通过安全的 MQTT 通道向设备发送 MQTT 命令,要求它从经过身份验证的 HTTPS 服务器获取新的应用程序图像使用 esp_https_ota 工作流程下载和应用。