开源改变世界

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

推推 grbl 3年前 (2023-02-05) 387次浏览
关闭
m-sja 打开了这个问题 2021 年 12 月 1 日 · 25条评论
关闭

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32#149

m-sja 打开了这个问题 2021 年 12 月 1 日 · 25条评论

评论

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

您好,
我刚刚通过使用 Windows 批处理脚本闪烁 fuidnc 来砌砖 voidmicro.com laserenvraver 板。
上传 esp 后卡在启动循环中:

ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x37 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371

上传完美无缺,我能够使用 esptool.exe 验证闪存内容。

该问题是由制造商设置的 secureboot 和 flashencryption 引起的。
这些选项不会阻止用户刷新设备。
闪烁未加密的二进制文件将使设备无法使用。
这些安全选项一旦激活就无法禁用。

请参考:
https ://docs.espressif.com/projects/esp-idf/en/latest/esp32/security/secure-boot-v1.html
https://docs.espressif.com/projects/esp-idf /en/latest/esp32/security/flash-encryption.html
https://limitedresults.com/2019/11/pwn-the-esp32-forever-flash-encryption-and-sec-boot-keys-extraction/

刷入 esp32 后,原来的闪存内容不再存在。不再可能使用描述的攻击向量来获取 AES 密钥(而且非常复杂)。

我最终更换了那块板上的 esp32。

在刷入设备之前,应扩展刷入脚本以使用 expfuse.exe。
如果设置了安全选项,请告知用户:
由于制造商设置的安全选项,该芯片无法运行除原始固件以外的任何其他固件!
使用其他闪存方法似乎可行,但会使设备变砖!
不要这样做,严重的!

这是我变砖的 esp32 的 espfuse 摘要:

C:\Users\m-sja\Downloads\fluidnc-v3.2.5\win64>espefuse.exe -p com7 -b 115200 -c esp32 summary
Connecting...
Device PID identification is only supported on COM and /dev/ serial ports.
...........
espefuse.py v3.2
EFUSE_NAME (Block) Description  = [Meaningful Value] [Readable/Writeable] (Hex Value)
----------------------------------------------------------------------------------------
Calibration fuses:
BLK3_PART_RESERVE (BLOCK0):                        BLOCK3 partially served for ADC calibration data   = False R/W (0b0)
ADC_VREF (BLOCK0):                                 Voltage reference calibration                      = 1100 R/W (0b10000)

Config fuses:
XPD_SDIO_FORCE (BLOCK0):                           Ignore MTDI pin (GPIO12) for VDD_SDIO on reset     = False R/W (0b0)
XPD_SDIO_REG (BLOCK0):                             If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset    = False R/W (0b0)
XPD_SDIO_TIEH (BLOCK0):                            If XPD_SDIO_FORCE & XPD_SDIO_REG                   = 1.8V R/W (0b0)
CLK8M_FREQ (BLOCK0):                               8MHz clock freq override                           = 50 R/W (0x32)
SPI_PAD_CONFIG_CLK (BLOCK0):                       Override SD_CLK pad (GPIO6/SPICLK)                 = 0 R/W (0b00000)
SPI_PAD_CONFIG_Q (BLOCK0):                         Override SD_DATA_0 pad (GPIO7/SPIQ)                = 0 R/W (0b00000)
SPI_PAD_CONFIG_D (BLOCK0):                         Override SD_DATA_1 pad (GPIO8/SPID)                = 0 R/W (0b00000)
SPI_PAD_CONFIG_HD (BLOCK0):                        Override SD_DATA_2 pad (GPIO9/SPIHD)               = 0 R/W (0b00000)
SPI_PAD_CONFIG_CS0 (BLOCK0):                       Override SD_CMD pad (GPIO11/SPICS0)                = 0 R/W (0b00000)
DISABLE_SDIO_HOST (BLOCK0):                        Disable SDIO host                                  = False R/W (0b0)

Efuse fuses:
WR_DIS (BLOCK0):                                   Efuse write disable mask                           = 388 R/W (0x0184)
RD_DIS (BLOCK0):                                   Efuse read disable mask                            = 3 R/W (0x3)
CODING_SCHEME (BLOCK0):                            Efuse variable block length scheme
  = NONE (BLK1-3 len=256 bits) R/W (0b00)
KEY_STATUS (BLOCK0):                               Usage of efuse block 3 (reserved)                  = False R/W (0b0)

Identity fuses:
MAC (BLOCK0):                                      Factory MAC Address
  = 40:f5:20:81:b4:04 (CRC 0xe0 OK) R/W
MAC_CRC (BLOCK0):                                  CRC8 for factory MAC address                       = 224 R/W (0xe0)
CHIP_VER_REV1 (BLOCK0):                            Silicon Revision 1                                 = True R/W (0b1)
CHIP_VER_REV2 (BLOCK0):                            Silicon Revision 2                                 = False R/W (0b0)
CHIP_VERSION (BLOCK0):                             Reserved for future chip versions                  = 2 R/W (0b10)
CHIP_PACKAGE (BLOCK0):                             Chip package identifier                            = 1 R/W (0b001)
MAC_VERSION (BLOCK3):                              Version of the MAC field                           = 0 R/W (0x00)

Security fuses:
FLASH_CRYPT_CNT (BLOCK0):                          Flash encryption mode counter                      = 1 R/- (0b0000001)
UART_DOWNLOAD_DIS (BLOCK0):                        Disable UART download mode (ESP32 rev3 only)       = False R/- (0b0)
FLASH_CRYPT_CONFIG (BLOCK0):                       Flash encryption config (key tweak bits)           = 15 R/W (0xf)
CONSOLE_DEBUG_DISABLE (BLOCK0):                    Disable ROM BASIC interpreter fallback             = True R/W (0b1)
ABS_DONE_0 (BLOCK0):                               Secure boot V1 is enabled for bootloader image     = True R/W (0b1)
ABS_DONE_1 (BLOCK0):                               Secure boot V2 is enabled for bootloader image     = False R/W (0b0)
JTAG_DISABLE (BLOCK0):                             Disable JTAG                                       = True R/W (0b1)
DISABLE_DL_ENCRYPT (BLOCK0):                       Disable flash encryption in UART bootloader        = True R/W (0b1)
DISABLE_DL_DECRYPT (BLOCK0):                       Disable flash decryption in UART bootloader        = True R/W (0b1)
DISABLE_DL_CACHE (BLOCK0):                         Disable flash cache in UART bootloader             = True R/W (0b1)
BLOCK1 (BLOCK1):                                   Flash encryption key
  = ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? -/-
BLOCK2 (BLOCK2):                                   Secure boot key
  = ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? -/-
BLOCK3 (BLOCK3):                                   Variable Block 3
  = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W

Flash voltage (VDD_SDIO) determined by GPIO12 on reset (High for 1.8V, Low/NC for 3.3V).

以及我的砖砌 esp32 的 espfuses-dump:

C:\Users\m-sja\Downloads\fluidnc-v3.2.5\win64>espefuse.exe -p com7 -b 115200 -c esp32 dump fuse.hex
Connecting...
Device PID identification is only supported on COM and /dev/ serial ports.

BLOCK0          (                ) [0 ] read_regs: 00130184 2081b404 00e040f5 0000a200 00001032 f0000000 000003d4
BLOCK1          (flash_encryption) [1 ] read_regs: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
BLOCK2          (secure_boot_v1 s) [2 ] read_regs: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
BLOCK3          (                ) [3 ] read_regs: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

EFUSE_REG_DEC_STATUS        0x00000000

这是新 esp32 的 espfuse-dump:

C:\Users\m-sja\Downloads\fluidnc-v3.2.5\win64>espefuse.exe -p COM7 -b 115200 dump
Connecting.....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting...
Detecting chip type... ESP32
BLOCK0          (                ) [0 ] read_regs: 00000000 a49b4224 007a30ae 00008200 00000036 00000000 00000004
BLOCK1          (flash_encryption) [1 ] read_regs: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
BLOCK2          (secure_boot_v1 s) [2 ] read_regs: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
BLOCK3          (                ) [3 ] read_regs: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

EFUSE_REG_DEC_STATUS        0x00000000

Block0 的第一部分很有趣。

由于您的项目目标之一是降低新用户的门槛,因此显然也应尽可能保护他们的设备免于变砖。

非常感谢您在这些数控项目中付出的所有努力!!!
如果您有任何问题,我会尽力提供帮助。

最好的问候
玛丽安

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

感谢非常详细的报告和非常有用的数据。我会调查一下。请注意,正如您所发现的,这将很难测试/测试起来很昂贵。理想情况下,修复程序应该在 esptool 中,但我们会尝试掩盖它。

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149
所有者

voidmicro 一个合适的名字。

我们还没有听说过那个控制器。

你有它的照片吗?

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149
作者

当然,我还对引出线进行了逆向工程。
voidmicro_singlearm_engraver.pdf
我的计划是在一些小型 2 轴构建中使用它。
还有一个“框架雕刻机”版本,带有用于第二个 y 电机的第三个 4988 驱动器。

我喜欢这些,因为占地面积小和板载 8mb 闪存。由于没有 SD 接口,我认为他们使用了额外的空间来缓冲 gcode。但由于 esp32 是安全的,它不是“买即用”的选项。

也许你可以添加一个已知不兼容设备的部分,并使用我的第三张图片让其他用户识别他们的控制器。

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149
如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149
如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149
如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149
如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

似乎它们不容易通过焊接模块和锁定固件来重新利用。

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

是否可以将工厂签名的二进制文件放回砖砌模块中?

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149
作者

不,根据我的经验,我不会推荐那些。
如果你有合适的工具和一些经验,esp32 很容易交换,但不值得这么麻烦。
我在 ali 上遇到了这些板子。它们作为替换零件出售,我认为玩起来会很有趣。
不幸的是他们不是,但我学到了很多东西。所以这对我来说仍然是一场胜利。

我同意你的看法,最好的解决方法是在 esptool 中使用警告或 -f force 选项来防止此类问题,因为几乎所有其他闪存软件都使用了 esptool。

在刷新…这取决于。
据我了解,有加密方法。
a: 将工厂密钥闪存到 esp32 并上传预加密的二进制文件和签名的引导加载程序
b: esp32 可以生成一个随机密钥并在第一次启动时加密闪存(在这种情况下密钥是未知的)

我没有控制器的备份或工厂二进制文件。我也没有看到任何固件更新可供下载。
在刷入之前创建备份可能是一个选项,在这种情况下,您应该能够重新刷入备份(如果没有读出保护,我的模块没有)。

顺便提一句。我已经交换了 esp32 并成功地刷新了 fluidnc。无论如何我都会用它;-P

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

我想弄清楚如何在不花费太多时间的情况下将检查合并到安装程序中,以至于我最终对它表示不满。它可能涉及在三个操作系统版本中添加 espefuse.exe,一些用于解码输出的脚本,以及一大堆测试,如果不破坏某些硬件,我无法轻易完成这些测试。并且某些事情肯定会出错,从而阻止不会受到影响的人成功安装。我讨厌保安工作。

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149
所有者

之前有什么固件?

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149
作者

这是一些使用智能手机应用程序的库存固件。没有网络界面。没有什么是我真正想用的。
我不想从未知来源安装 android apks。所以从理论上讲,它是像您这样的优秀开源项目的完美人选。:-)
如果您有兴趣,可以在这里查看该应用程序:http: //voidmicro.com/Download/downloadApp-en.html?page=
page_download

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

为这三种架构添加 espefuse 二进制文件会将 .zip 版本下载的大小从 30MB 增加到 70MB,而对于典型用户而言,根本没有增加实用性。

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

我开始感受到“成本/收益远大于 1”的感觉。

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149
作者

我理解并分享这种感觉。
也许在 wiki 中添加“不支持的设备列表”更容易。
同时在 espressif esptool 上创建一个关于这个问题的问题将对世界其他地方更有好处。
(遗憾的是,我没有足够的经验来做这件事,也无法在适当的层面上与他们讨论这个问题)

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149
合作者
米奇布拉德利 评论了 2021 年 12 月 1 日  

所以从理论上讲,它是像您这样的优秀开源项目的完美人选。:-)

除了开源项目为开发人员带来大量工作而没有明显的补偿来源这一事实外。如果你像 Bart 那样销售硬件,那么你可以收回部分成本,但是当人们重新利用中国硬件而不是购买开发商的产品时,问题就不会回到中国供应商身上,而是回到开发商身上,好吧,你看我要去哪里…

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

我理解并分享这种感觉。也许在 wiki 中添加“不支持的设备列表”更容易。同时在 espressif esptool 上创建一个关于这个问题的问题将对世界其他地方更有好处。(遗憾的是,我没有足够的经验来做这件事,也无法在适当的层面上与他们讨论这个问题)

您与我们的讨论是完全恰当的,所以我鼓励您这样做。我需要回去做富有成效的工作。

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149
作者

就补偿部分而言,我完全同意你的看法。
继续努力,感谢您为我们带来的所有创新。

您与我们的讨论是完全恰当的,所以我鼓励您这样做。我需要回去做富有成效的工作。

谢谢!

随意关闭这个问题,但我仍然会建议一个“不兼容的硬件列表”至少这样可以节省你的工作和其他用户的挫败感。

如果启用了安全启动和/或闪存加密,则防止闪烁(变砖)ESP32 #149

我仍然会建议“不兼容的硬件列表”

这一点很好,但我不知道我们将如何维护这样一份清单,考虑到中国创造和淘汰难以识别的产品的速度。我认为我们能做的最好的事情就是笼统地描述潜在的问题——考虑到人们在遇到问题后才会阅读 wiki,即使这样的价值也值得怀疑。您会惊讶于许多人没有意识到 FluidNC 通常不需要重新编译,尽管事实上它位于第一屏文本的 README.md 中。