背景

ChipSHOUTER是 Colin 在NewAE Technology设计的高端电磁故障注入 (EMFI) 工具。它虽然不是第一个商业上可用的 EMFI 工具,却是第一个比较容易买到的工具,尽管其具备大量的开放文档,但高昂的价格仍然让很多人望而却步。
PicoEMP 填补了ChipSHOUTER 在低端领域留下的空白,是相较于 ChipSHOUTER 工具的一个稍微温和的版本。该工具的设计优化集中在:安全性、成本、可用性、性能,这四个方面。尽管降低了成本,但效果却出奇地好。
借助 PicoEMP ,任何人都可以使用电磁脉冲诱发可利用的硬件故障。

image-20220120171643288

在安全防护罩下面是这样的:

image-20220120213620047

不过,它也不是作为一个完整的产品出售,在制作和控制它的情况下使用PicoEMP需完全了解其操作和风险。

介绍

PicoEMP 使用 Raspberry Pi Pico 作为控制器,灵感来自 @nezza,使用它作为 debug-n-dump 工具。你也可以选择使用 Arduino 或其他微控制器。你基本上只需要几样东西:

  1. PWM 输出驱动高压变压器。

  2. 脉冲引脚产生脉冲。

  3. 用于监控高压(HV) 状态的状态引脚。

使用

PicoEMP 的一般用法如下:

  1. 按下“ARM” 按钮。红色的“ARMING”指示灯会立即亮起,告诉你它正在尝试为高压充电。

  2. 几秒钟后,红色的“HV”指示灯会亮起,表示已充电至“某个电压”。

  3. 将探头尖端放在目标上方。

  4. 按下“Pulse”按钮。

    CW322 Simple EMFI Target

关于高压隔离

大多数 EMFI 工具会产生高压(类似于相机闪光灯)。以前的许多开源 EMFI 工具的设计都能很好地工作,但是使用户暴露在高电压下。如果你正确使用这个工具,这是很好的,但是当然总是存在抓住电“热”工具的风险!之所以会出现这种常见的设计,是因为设计 EMFI 工具的最简单方法是使用“低端开关”。对于低端开关,输出连接器总是“热”的,这会带来严重的电击危险。

PicoEMP 通过浮动高压侧来解决这个问题,这意味着 EMFI 探头输出和输入电压接地之间没有电路。通过隔离的高压输出,我们可以安全地使用简单的“低侧开关”。由于高频尖峰,一些电流仍然会流动,虽然不完美,但它在实践中效果很好。

这里需要注意的是,要使其正常工作,你还需要隔离栅极驱动器。对此有多种解决方案,最简单的是栅极驱动变压器 (GDT)。 PicoEMP 使用变压器架构,并进行了一些简化以进一步减少 BOM 数量。

案例

Rasperry Pi 故障注入

型号:Rasperry Pi 2B

镜像:Raspberry Pi OS (32-Bit), Released 2021-10-30

测试源码:rpi-glitching

Glitch Loop

对于 Rasperry Pi 2B 的故障注入攻击简单示例,使用例程是glitchloop.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
//gcc glitchloop.c -o glitchloop
//./glitchloop
int main(void){
volatile int i, j, k,l;
char status[] = "<>";
while(1){
k = 0;
for (i=0; i < 10000; i++){
for (j=0; j < 10000; j++){
k++;
}
}
printf("%d %d %d %c\n", i, j, k, status[l++ % 2]);
}
}

Glitch Loop for Rasperry Pi

RSA Glitching

在签名操作期间插入故障,利用错误的 rsa 签名操作来恢复私钥。我们将使用 pycryptodome,但使用的是一个旧版本(pycryptodome3.1),因为当前的版本有故障保护。保护是进行验证,即生成的签名验证OK,但是你可以通过更有针对性的故障注入攻击绕过它。

要运行 rsaglitch.py,需要安装 pycryptodome 3.1 和一个加速库来执行因数分解。这可以通过以下方式完成:

1
2
pip install pycryptodome==3.1
sudo apt-get install python3-gmpy2

RSA Glitching for Rasperry Pi

其他开发板测试

在各开发板刷入 Glitch 循环例程固件,针对芯片发起故障注入攻击。

image-20220121183848703

STM32

MCU:STM32F407ZGT6

STM32

Arduino Uno

MCU:ATMEGA328P-PU

Arduino Uno

ESP8266EX