0x00 前言

在已往几年的研究之中,我们对于故障注入(Fault Injection,FI)格外关注。我们揭晓了许多文章,而且在学术集会和平安集会上揭晓过多次演讲。通过历久的研究,我们以为FI是绕过Secure Boot和实现Linux上特权提升的有用手艺。

与你们许多人一样,在研究的历程中,我的好奇心被不停引发,因此也在故障注入的领域越陷越深。本篇文章将主要先容我们在故障注入方面的最新研究成果。

0x01 历史研究成果(2016-2019)

我们在POC2019的演讲中概括地形貌了曾在2016年FDTC上揭晓的研究成果,在那时的研究中,我们证实了“数据传输”的历程中可以行使FI的方式实现“随便代码执行”。在现场演示中,我们使用了开源的iceGLITCH将电压Glitch(指电压颠簸,超压或欠压)注入到Espressif ESP32中。更详细地来说,我们展示了在攻击者仅能控制传输的数据的情况下,若何使用FI修改callx8指令,以实现对程序计数器的随便控制。

最主要的是,凭据我们在2016年的研究,程序计数器可以在直接寻址的处置器体系结构(例如ARMv7)上举行控制。凭据我们在2019年的研究成果,纵然程序计数器不能直接寻址(例如ARMv8),也可以对其举行控制。甚至,可以行使类似memcpy函数这样的通用软件结构。

当攻击者仅控制正在传输的数据时,就可以执行此类攻击。数据传输的泉源和目的都不需要控制,只需要控制数据自身。此外,攻击者可以行使由特权代码(例如内核)执行的通用软件结构,这些特权结构会从不受信托的域(例如通讯接口、U盘等外部数据源)复制数据,理论上可以从任何装备上获取数据。一旦底层硬件容易受到FI攻击,特别是许多尺度芯片都容易受到攻击,那么无论处置器是什么架构,都可以实现对程序计数器的完全控制。

在披露之前,我们已经首先将研究效果提交给了Espressif。我们重点剖析了ESP32芯片的潜在风险。只管如此,由于该效果是在针对测试代码的完全受控环境中实现的,因此我们一直以为那时的影响最小。

0x02 研究成果(2020)

时间快进到2020年头,我们有了新的硬件FI工具来支持我们的研究事情。我们实验在老目的上测试新的功效。在这里,我们决议专注于使用电磁(EM)Glitch。我们将这种手艺称为EMFI。

首先从一种经典的方式最先,我们使用完全受控制的测试代码作为目的,确认ESP32是否具有对电磁Glitch的弹性(鲁棒性)。若是能够确定ESP32存在风险,我们就可以将2019年的研究成果付诸实践。

首选要做的,是绕过ESP32的Secure Boot实现。在我们最先研究时,就有几位研究人员已经公布了针对这种实现的FI攻击,Espressif也为此公布了通告。与他们的攻击方式差别,我们设计使用电磁Glitch取代电压Glitch来触发类似的硬件破绽。我们设计接纳的EMFI方式具有许多优点,包罗:

1、通常不需要对目的举行侵入式修改;

2、由于电磁场具有确定的空间漫衍,因此只需在局部提议攻击。

值得关注的是,除了重现已被发现的攻击之外,我们还找到了几种行使破绽的新方式,这些方式可以让我们绕过Secure Boot和Flash Encryption。我们还发现了一些新的破绽,Espressif也同样真对这些破绽公布了通告。Espressif示意这些攻击不再适用于更新后的ESP32 V3和ESP32-S2芯片。

在这篇文章中,我们将深入探讨使用EMFI绕过未启用Flash Encryption的Secure Boot的方式,也就是复现CVE-2019-15894。我们接下来也会公布其他几篇文章,先容我们新发现的破绽,即CVE-2020-15048和CVE-2020-13629。

0x03 准备事情

经由十多年的FI测试与研究,我们从第一手履历中领会到,发现和行使FI破绽可能需要破费较长时间。只管理论上破绽发现与复现历程非常复杂,但若是使用一些专家级的工具,就可以大幅简化发现破绽、复现已知破绽的历程。因此,我们在FI研究的历程中,通常使用一些商业化的工具。

但与此同时,使用低成本(例如ChipShouter)或DIY(例如BADFET)的工具也可以实现相同的效果。然而,这种类型的工具可能有一定局限性,而且通常情况下不能充分地消灭故障参数搜索空间。只管如此,我们以为,一旦发现并行使了FI破绽,而且已知所需的故障参数,就可以调整或构建低成本工具,以实现乐成的故障注入。

为了增添乐成的概率,同时确保能够有用地扫描故障参数搜索空间,我们设计使用以下组件来举行FI研究:

· Riscure Spider

· Riscure XYZ stage

· Riscure EM-FI Transient Probe

· Riscure Inspector FI Python

我们在Intel NUC上执行Inspector FI Python框架,以便与上述组件举行通讯。准备历程的思绪如下所示:

电银付使用教程(dianyinzhifu.com):Espressif ESP32:使用EMFI绕过Secure Boot 资讯 第1张

下图展示了现实的准备事情,同时我们向ESP32注入了EM Glitch。

电银付使用教程(dianyinzhifu.com):Espressif ESP32:使用EMFI绕过Secure Boot 资讯 第2张

0x04 测试目的

我们使用了AZ Delivery提供的ESP32 NodeMCU模块,如下图所示。这些模块是基于ESP32-WROOM-32。

电银付使用教程(dianyinzhifu.com):Espressif ESP32:使用EMFI绕过Secure Boot 资讯 第3张

我们将ESP32-WROOM-32封装的金属外壳拆下,以便将EMFI探针的尖端放到芯片外面上。这是我们需要对目的举行的唯一修改,用于注入EM Glitch。

0x05 定位

在举行EMFI时,最主要的Glitch参数是位置、功率和时序。要调整这些参数并不容易,特别是在针对特定目的(例如Secure Boot)举行实验的时刻。组合后的参数搜索空间可能伟大,对于使用精致网格举行空间定位的场景来说难度较高。通常情况下,我们从一个中心步骤最先,该步骤可以让我们高效地确定芯片可能存在EM Glitch攻击的确切位置。

需要说明的是,在做好准备事情后,第一步是确定目的是否容易受到攻击。由于这种破绽是存在于芯片级别(即硬件)上,因此我们可以在开发板上测试,也可以在最终破绽上测试,都能到达同样的效果。对于我们来说,若是可能的话,我们通常更喜欢使用带有相同或相似芯片设计的开发板举行最初的研究。然后,将同样的攻击方式复现到最终装备上,特别是在软件相同的情况下(例如ROM代码),这种复现历程通常会对照简单。

5.1 测试代码

在中心步骤中,我们使用的测试代码通常是下令处置程序,其中包罗至少一个下令,该下令执行以下操作:

1、吸收下令字节;

2、将触发信号设置为高电平;

3、使用汇编程序,用已知值初始化未使用的寄存器;

4、使用汇编程序,增添带有增添指令的计数器(即:增添sled);

5、将触发信号设置为低电平;

6、打印计数器效果。

下面是我们在对ESP32举行研究历程中使用的一种实现。测试代码的作用是通过考察串行端口上的计数器来识别是否泛起了故障。若是计数器的值与预期值(即10000)差别,这说明我们注入的Glitch会影响目的的执行,但不会阻止程序的继续运行。

char cmd;
unsigned int counter;
 
while(1) {
       cmd = -1;
       uart_rx_one_char(&cmd);                                 // receive command
 
       if(cmd == 'A') {
              GPIO_OUTPUT_SET(26, 0);                        // trigger high
                           
              asm volatile (                                    // set unused registers
                     "movi a0, 0x40404040;"
                     "movi a1, 0x41414141;"
                     "movi a2, 0x42424242;"
                     "movi a3, 0x43434343;"
                     "movi a4, 0x44444444;"
                     "movi a5, 0x45454545;"
                     // "movi a6, 0x46464646;"
                     "movi a7, 0x47474747;"
                     "movi a8, 0x48484848;"
                     "movi a9, 0x49494949;"
 
                     "movi a6, 0;"
                     "addi a6, a6, 1;"                          // start add sled
                     < repeat 10,000 times >
                     "mov %[counter], a6;"
                     : [counter] "=r" (counter)
                     :
                     :      "a6", "a0", "a1", "a2", "a3", "a4", "a5", "a7", "a8", "a9" );
 
              GPIO_OUTPUT_SET(26, 1);                        // trigger low
       }
 
       printf("AAAA%08xBBBB\n", counter);   // send result back
}

我们通过GPIO引脚来天生触发高电平信号和低电平信号。这样一来,我们就拥有了一个可测量的攻击窗口期,能够充分行使增添指令的计数器。这样一来,就增添了故障注入的乐成概率,让我们可以识别硬件破绽是否存在。

5.2 定位

我们使用XYZ Stage自动地将EMFI探针在芯片外面移动。Spider会一直守候,直至触发器设置为高电平为止,这样一来就实现了在攻击窗口期内举行故障注入。窗口期由触发器为高电平和触发器变为低电平的时刻界说。我们将攻击窗口期的时间和EMFI探针的功率举行随机化。在最最先的实验中,使用了30x30的网格。

凭据考察到的行为,将所有的实验举行分组,并为每组确定一种颜色。经由多次实验,其效果如下:

1、绿色的点示意没有显著的效果;

2、黄色的点示意芯片泛起了重置(reset)或静音(mute);

3、红色菱形示意泛起了差别的计数器值,即乐成触发了故障注入;

4、红色十字示意泛起了异常,例如非法指令。

我们在8.5小时左右举行了约莫165000次实验,在每次实验中,我们都需要移动EM-FI探头,并在最大功率的10%到100%之间随机分配Glitch的功率。

电银付使用教程(dianyinzhifu.com):Espressif ESP32:使用EMFI绕过Secure Boot 资讯 第4张

电银付使用教程(dianyinzhifu.com):Espressif ESP32:使用EMFI绕过Secure Boot 资讯 第5张

实验效果如下。对于每种类型,我们都提供了一个在串行接口上考察到的示例。

,

联博开奖网

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

,

类型:预期

响应:AAAA00002710BBBB

数值:165404

类型:异常

响应:Fatal exception (0): IllegalInstruction

数值:6

类型:重置/静音

响应:ets Jun 8 2016 00:22:57….rst:0x1 (POWERON_RESET)

数值:1489

类型:乐成

响应:AAAA0000270ABBBB

数值:1

红色菱形示意我们能够乐成引入Glitch的位置,这个Glitch会引发故障,从而影响计数器的增量,但同时不影响芯片的延续运行。只管我们仅仅发现了一个乐成的Glitch,但它足以证实ESP32存在EM Glitch的风险。

我们实现了第一个目的,即确定了一个硬件破绽。接下来,让我们看看是否可以通过引入允许我们举行现实攻击的破绽来实现行使。我们决议将EMFI探针修复到绕过Secure Boot乐成的Glitch的位置。这样便可以将故障参数的搜索空间降低一个维度。

0x06 破绽行使

Espressif IoT开发框架(ESP-IDF)中包罗许多便捷的工具,包罗编译软件(idf.py)、刻录eFuses(espefuse.py)、天生密钥(espsecure.py)、对内存举行编程(esptool.py)。我们在寻找破绽行使方式的历程中,普遍行使了这些工具。

6.1 执行完整性检查

举行完整性检查的目的是验证Secure Boot是否已经启用并会根据预期事情,做到有备无患。一种思绪是让bootloader无效,然后考察串行接口输出存在的差异。若是没有串行接口输出,也可以适用其他信息,例如与闪存举行通讯或芯片的功耗。ESP32的串行接口无法禁用,因此这种方式是始终可行的。

重启电源后,ROM(绿色)和bootloader(红色)打印以下内容:

+ ets Jun 8 2016 00:22:57
+
+ rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
+ configsip: 0, SPIWP:0xee
+ clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
+ mode:DIO, clock div:2
+ load:0x3fff0008,len:4
+ load:0x3fff000c,len:3220
+ load:0x40078000,len:4816
+ load:0x40080400,len:18640
+ entry 0x40080740
- I (86) boot: Chip Revision: 1
- I (87) boot_comm: chip revision: 1, min. bootloader chip revision: 0
- I (42) boot: ESP-IDF v3.3.1 2nd stage bootloader
- I (42) boot: compile time 16:14:32
- I (42) boot: Enabling RNG early entropy source...
- I (46) boot: SPI Speed             : 40MHz
- I (50) boot: SPI mode              : DIO
- I (54) boot: SPI Flash Size  : 2MB
-
- Hello, I am the bootloader

我们通过将字符串bootloader(在上述串行端口输出的最后一行中可见)修改为Raelize!!!的方式,导致bootloader无效。然后,将修改后的bootloader编程到ESP32的外部闪存中。然后,当我们启动ESP32时,我们考察到串行接口上打印了以下输出:

+ ets Jun 8 2016 00:22:57
+
+ rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
+ configsip: 0, SPIWP:0xee
+ clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
+ mode:DIO, clock div:2
+ load:0x3fff0008,len:4
+ load:0x3fff000c,len:3220
+ load:0x40078000,len:4816
+ load:0x40080400,len:18640
+ csum err:0xb5!=0xdf
+ ets_main.c 371

ROM会验证bootloader的校验和,由于我们已经做了修改,因此校验和已经不匹配。由于在串行接口上打印了所需的信息,因此很容易识别内存映像中存在的校验和值。我们只需要将0xb5更改为0xdf,就可以使校验和与修改后的版本匹配。如预期的那样,ROM现在会提醒Secure Boot检查失败。

+ ets Jun 8 2016 00:22:57
+
+ rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
+ configsip: 0, SPIWP:0xee
+ clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
+ mode:DIO, clock div:2
+ load:0x3fff0008,len:4
+ load:0x3fff000c,len:3220
+ load:0x40078000,len:4816
+ load:0x40080400,len:18640
+ secure boot check fail
+ ets_main.c 371

现在,我们有了Secure Boot实现,可以思量通过行使硬件破绽来绕过它。

6.2 判断攻击时间

在定位阶段,我们已经明确了EMFI探针的位置,并深入领会所需的电源。遗憾的是,基于GPIO引脚的触发器已经无法使用,由于验证历程是由ROM代码执行的,这部门无法修改。因此,我们需要一个新的参考点,来确定FI攻击的时间。

我们实验使用复位信号作为触发,但发现这种方式存在显著的都懂。因此,我们决议使用闪存流动来盘算攻击时间,它通常可以作为触发的主要信号,由于它通常与软件执行密切相关,特别是在Secure Boot时代。

下图蓝色示意的是闪存pin1上的流动,红色示意的是我们在此流动中获得的触发信号。

电银付使用教程(dianyinzhifu.com):Espressif ESP32:使用EMFI绕过Secure Boot 资讯 第6张

在这个研究阶段,我们并不完全清晰每个时刻(从A到G)都发生了什么。然则,我们知道在A之前就让芯片退出的复位状态,而且可以假设bootloader是在F时代的最后阶段才复制的。若是在闪存上编写了有用的bootloader,则芯片会在G时代的某个地方最先执行bootloader。

6.3 执行攻击

我们决议在F之后,立刻在10玄妙的攻击窗口期注入Glitch。每个实验的攻击周期如下所示,这样一来我们每秒可以举行约10次实验。

1、下拉EN引脚,使芯片保持复位状态;

2、上拉EN引脚,使芯片从复位状态释放;

3、守候17毫秒,直到E和F之间的闪存流动间隙;

4、守候闪存引脚1的第一次下降,将触发器设置为高电平;

5、在攻击窗口内,注入使用随机功率和准时的EM故障;

6、将串行接口输出存储在数据库中以备后期处置。

经由约35000次实验(耗时约55分钟),我们考察到3个乐成的故障,行使电磁故障绕过了Secure Boot。我们可以轻松地识别乐成的Glitch,由于此时的Raelize!!!会在串行接口上打印,而非bootloader,如下所示。

+ ets Jun 8 2016 00:22:57
+
+ rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
+ configsip: 0, SPIWP:0xee
+ clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
+ mode:DIO, clock div:2
+ load:0x3fff0008,len:4
+ load:0x3fff000c,len:3220
+ load:0x40078000,len:4816
+ load:0x40080400,len:18640
+ entry 0x40080740
- I (86) boot: Chip Revision: 1
- I (87) boot_comm: chip revision: 1, min. bootloader chip revision: 0
- I (42) boot: ESP-IDF v3.3.1 2nd stage bootloader
- I (42) boot: compile time 16:14:32
- I (42) boot: Enabling RNG early entropy source...
- I (46) boot: SPI Speed             : 40MHz
- I (50) boot: SPI mode              : DIO
- I (54) boot: SPI Flash Size  : 2MB
-
- Hello, I am the Raelize!!!

下图展示了所有实验的效果,其中X轴是时间(纳秒),Y轴是功率(最高功率的百分比)。其中的三个红色菱形,示意三次乐成的Glitch。

电银付使用教程(dianyinzhifu.com):Espressif ESP32:使用EMFI绕过Secure Boot 资讯 第7张

这些实验的统计数据如下所示:

类型:预期

数目:19494

占比:56.54%

类型:重置/静音

数目:14981

占比:43.45%

类型:乐成

数目:3

占比:0.01%

我们可以通过调整故障参数来确定攻击的乐成率。当我们接纳完全相同的故障参数(包罗位置、功率和时序)时,就可以实现每分钟2次乐成Glitch的平均值。这表明,一旦获知了Glitch的参数,就能够轻松地复现攻击。

0x07 总结

我们已经证实,ESP32容易受到EMFI的攻击,而且乐成行使这个硬件破绽实现了对Secure Boot的攻击。只管此前已经有研究人员公布过类似攻击,但我们也证实了EMFI相对于其他故障注入手艺具有对照显著的优势。

对于这种Secure Boot攻击,我们没有假设任何特定的故障模子,由于我们仅仅行使了可考察到的芯片行为转变。使用完善的扫描手艺,再加上有用的准时触发,就可以构造出乐成的Secure Boot攻击。

此外,这些开端研究效果也表明晰,我们可能有机遇行使更为完善的故障模子实现破绽行使。我们期望可以将以前揭晓的研究成果付诸实践,将复现变为执行原语。若是一切顺利,也许可以发现壮大的新攻击方式,而不仅仅是使用单个Glitch来绕过Secure Boot。

除了本文所形貌的攻击之外,我们还举行了一些差别的实验。犹如任何研究一样,可能并不会一帆风顺,但我们照样使用了一种有创意的方式来绕过Secure Boot和Flash Decryption。

主要的不是破绽,而是若何行使破绽来展现出其真正的价值。

后续研究成果将在接下来的几周内公布,敬请期待。

本文翻译自:https://raelize.com/posts/espressif-systems-esp32-bypassing-sb-using-emfi/: Usdt自动充值接口声明:该文看法仅代表作者自己,与本平台无关。转载请注明:电银付使用教程(dianyinzhifu.com):Espressif ESP32:使用EMFI绕过Secure Boot
发布评论

分享到:

usdt充值(caibao.it):BTS防弹少年团《AMAs》入围两奖全拿 〈Life Goes On〉MV 破亿!
2 条回复
  1. 欧博在线官网
    欧博在线官网
    (2021-01-10 00:06:49) 1#

    还是熟悉的感觉

  2. allbet网址
    allbet网址
    (2021-01-12 00:05:21) 2#

    闪闪发光的文

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。