问题摘要
攻击者可以在 ESP32 芯片复位后读取 eFuse 数据的过程中,通过“故障注入”的物理攻击手段,破坏 ESP32 的 eFuse 读取值。具体来说,遭到破坏的部分可能包括 eFuse 中的读保护位(该位用于控制软件对 eFuse 其他区域的读访问权限)。
攻击者可通过这种“故障注入”攻击,绕过 eFuse 对保存的 “Flash 加密” (Flash Encryption) 和“安全启动” (Secure Boot) 密钥提供的读保护措施。通常来说,eFuse 中存储的密钥也会因“故障注入”一同遭到破坏,但攻击者可以通过不断重复攻击并对攻击结果进行分析,从而恢复出完整的 eFuse 密钥值。
在本文撰写之时,可能受到影响的产品包括 ESP32-D0WD、ESP32-D2WD、ESP32-S0WD、ESP32-PICO-D4 芯片及相关模组。ESP32-D0WD-V3 芯片会在 ROM 执行阶段进行检查,因此不受该攻击的威胁。ESP32-D0WD-V3 芯片及相关模组将于 2019 年第四季度上市,敬请期待。
该问题由 LimitedResults 最先发现,并披露给乐鑫。在此,我们诚挚感谢 LimitedResults 以负责任地态度向我们披露了此问题。
什么是“故障注入”?
“故障注入”是一种通过物理手段注入故障来破坏硬件系统正常工作的技术,常见手段为严格控制电压或时钟波动的时序。为了实现故障注入,攻击者必须首先具有对硬件的物理接触方法才能对其进行修改并注入故障。
通常来说,系统在遭受“故障注入”攻击后会直接崩溃。但是,攻击者也有可能通过严格控制故障的发生时间,使 CPU 或内部硬件流程跳过某些特定指令或者破坏特定计算结果。通过大量重复注入故障的过程,攻击者可能最终达到绕过安全措施的目的。
尽管“故障注入”的难度各不相同,但所有电子设备都无法完全避免此类攻击的威胁。
攻击的影响
“故障注入”攻击首先要求攻击者具有对设备的物理接触方法,而且还必须投入大量时间和资源才能实现攻击,并对设备进行修改。
攻击者可以通过“故障注入”的方法,成功从 ESP32 芯片中恢复加密密钥,进而利用该密钥读取设备 flash 中存储的固件和数据等内容,还能对 flash 中的加密内容进行非法修改。
攻击者一旦通过“故障注入”成功从 ESP32 中恢复出“安全启动”密钥,则还可以生成一套新的安全启动信息摘要,从而使设备启动经过非法修改的引导加载程序。
我们建议用户在使用“Flash 加密”和“安全启动”功能时,应为每个设备都生成“单独且唯一”的密钥。这样一来,攻击者将无法将从某个 ESP32 芯片中恢复的密钥,重复利用至其他 ESP32 产品,而是需要对每个设备进行逐个“故障注入”才能实现对更多芯片的攻击。
ROM 检查功能
2019 年 5 月,乐鑫与 Riscure 的安全分析师合作,审查了 ESP32 的引导 ROM 代码,包括针对“故障注入”攻击而进行的修改。
在此过程中,我们发现“故障注入”攻击可能发生在芯片复位后读取 eFuse 数据的过程中,从而破坏 eFuse 的读取值。对此,我们在 ROM 代码中添加了额外的检查步骤。目前,ESP32-D0WD-V3 芯片已经采用了更新后的代码。
此外,ESP32-D0WD-V3 还新增了“基于非对称加密机制的‘安全启动’(V2 版)”。“安全启动(V2 版)”无需安全启动密钥。ESP-IDF 对“安全启动(V2 版)”的支持将在 2019 年第四季度发布。此外,ESP32-D0WD-V3 还同时支持“安全启动”(V1 版),并在 ROM 中增加了预防“故障注入”攻击的检查。
即将面世的 ESP32-S2 芯片将增加更多硬件和 ROM 代码安全功能,防止“故障注入”(包括这些已发现的攻击手段)攻击的发生。ESP32-S2 也同样采用了“安全启动(V2 版)”。
披露历史
• 7 月 24 日:LimitedResults 向乐鑫披露了“攻击者可以通过‘故障注入’读取 eFuse 中存储的密钥”的漏洞。
• 9 月 12 日:LimitedResults 提供了一份概念验证报告,展示了如何通过“故障注入”攻击及结果分析,非法获得存储在 eFuse 中的密钥的过程。
• 11 月:该漏洞的约定公开披露日期。
给 ESP32 用户的建议
如需要使用 ESP32 Flash 加密和/或安全启动功能,建议使用我们的 ESP32-D0WD-V3 芯片或 ESP32-WROVER-E 模组。这些 ESP32 产品均已在 ROM 中增加了对“故障注入”进行检查的功能。具体需求,请与我们的销售团队联系。
对于其他 ESP32 芯片及相关模组产品,暂无针对该漏洞的补救措施。
其他一般建议:
• 如果可能,请从 flash 中删除所有不必要的敏感数据,其中包括提供“恢复出厂设置”选项,允许设备在售出或废弃之前删除 flash 中的所有客户数据。
• 每个设备在进行“安全启动”和“ Flash加密”时,均应使用不同的密钥。
• 每个设备均应生成独立的密钥,存储在 flash中供应用程序使用,而不要所有设备共享一个密钥。