nRF52 平台芯片电压毛刺注入绕过调试保护

IoT 2年前 (2022) admin
817 0 0

漏洞原理

在nRF52芯片中为防止出现nRF51中所出现的漏洞,芯片厂加入了APPROTECT功能来防止调试接口在保护状态下被使用,此功能通过直接断开调试接口与cpu的通讯来进行实现

nRF52 平台芯片电压毛刺注入绕过调试保护

APPROTECT的启用为用户信息配置寄存器 (UICR)中的地址0x10001208写入0xFFFFFF00

nRF52 平台芯片电压毛刺注入绕过调试保护

在上电过程中AHB-AP(调试端口)会根据UICR中的值进行初始化,控制APPROTECT是否被打开。也就是读取地址0x10001208,判断其是否为0xFFFFFF00

而UICR中的值则保存在内存控制器中 因此AHB-AP的初始化的过程中需要读取地址,则需要和内存控制器进行通讯。这个过程会导致芯片能耗产生改变,以便通过芯片能耗对此过程进行定位。

基于以上,使用示波器对芯片能耗进行分析,可以通过电压捕获到AHB-AP的初始化的过程,并在初始化过程中进行对芯片施加一个极短的电压来干扰芯片正常运行,使芯片产生错误,这个错误将导致初始化出错,最终导致APPROTEC未按正常情况被启用。

nRF52 平台芯片电压毛刺注入绕过调试保护(示波器观察到的芯片能耗曲线)

环境搭建

这里为保险起见购买一块开发板,并没有在原设备进行复现,复现成功后再对设备进行

nRF52 平台芯片电压毛刺注入绕过调试保护(所使用的开发板nrf52832)

搭建开发环境

官网下载nrfjprog调试工具https://www.nordicsemi.com/Products/Development-tools/nRF-Command-Line-Tools/Download

查看芯片状态并备份固件(开发板里自带的流水灯)

nRF52 平台芯片电压毛刺注入绕过调试保护

APPROTECT未启用正常读取固件

使用指令nrfjprog –memwr 0x10001208 –val 0xFFFFFF00 写入地址启用APPROTECT。

nRF52 平台芯片电压毛刺注入绕过调试保护

修改完成,重启开发板

nRF52 平台芯片电压毛刺注入绕过调试保护

APPROTECT已被启用,可以开始进行攻击。

漏洞复现

根据漏洞描述,攻击流程为芯片上电后对CPU 电源线DEC1进行毛刺注入(短接接地)

nRF52 平台芯片电压毛刺注入绕过调试保护

根据芯片手册可以得知DEC1引脚位置,并根据走线配合万用表查找电容连接点

nRF52 平台芯片电压毛刺注入绕过调试保护

焊接导线进行测试,在这里去掉了C5电容,根据相关文章描述此电容去除后可以增加成功概率但会降低cpu稳定性。一般情况建议保留,在这里去除是因为操作失误碰掉了装不回去(我太菜了)(写完了才发现C11也不见了。。。对。。。也是我碰掉的。。这个根本不用去)

nRF52 平台芯片电压毛刺注入绕过调试保护

示波器探头接DEC1,捕捉电压

nRF52 平台芯片电压毛刺注入绕过调试保护

可看到1.3ms左右出现一个下降沿(200mv左右),此下降沿位置即为需要进行的注入点

由于属于芯片的启动过程较为固定,因此从芯片上电,到注入点的时间也相对固定。我们只需要通过示波器获得上电后至下降沿大致时间,并使用一个设备对芯片进行上电,并在上电后的指定时间进行短接即可完成攻击

攻击设备搭建

这里我选用了Arduino进行攻击,Arduino可以使用延迟函数delayMicroseconds(),让我们可以以微秒时间操作硬件上电后的毛刺注入时间(任何可以操作微秒的单片机等均可,比如树莓派或ESP32,这里用Arduino是因为较为便宜)

搭建电路如下,MOS管均为P沟道mos,Arduino 10口控制MOS进行芯片上电(因p沟道MOS特性,实际为控制芯片负极连接,因此会导致芯片在下电情况下示波器等设备测到的电压为高电平,使用N沟道可解决此问题,但并不影响漏洞复现)Arduino 9口控制MOS短接DEC1接地。

nRF52 平台芯片电压毛刺注入绕过调试保护接线示意图

nRF52 平台芯片电压毛刺注入绕过调试保护实际攻击现场

攻击流程如图

nRF52 平台芯片电压毛刺注入绕过调试保护

大致攻击流程如图所示,但是仍需要解决几点问题

1.如何准确找到注入点

2.短接DEC1时间需要多久

而这两点问题其实都可以通过爆破的方式进行解决

编写下位机

Arduino程序

nRF52 平台芯片电压毛刺注入绕过调试保护

大致思路为示波器获取到的时间减去50微秒 每次增加1微秒进行爆破,同时短接时间设定为1-12微秒进行尝试。在每次收到串口发送的1时开始一次尝试(这里有一点需要说明,delayMicroseconds确实可以微秒控制,但是Arduino自身存在延迟,导致即使不使用延时函数也将出现一个大约5微秒的延迟,使用delayMicroseconds则是在5微秒延迟上增加时间)

编写上位机

这里还需要一个上位机利用JLink尝试使用调试端口读取内存,如果读取失败通过串口发送指令到Arduino开始下一次攻击,直到攻击成功为止

nRF52 平台芯片电压毛刺注入绕过调试保护 nRF52 平台芯片电压毛刺注入绕过调试保护

CH0(黄色):DEC1电压 CH1(绿色):MOS控制电压

nRF52 平台芯片电压毛刺注入绕过调试保护

CH0(黄色):DEC1电压 CH1(绿色):MOS控制电压

可以看到JLink正常读取了内存地址,而内存地址显示APPROTECT被启用,攻击成功

nRF52 平台芯片电压毛刺注入绕过调试保护

CH0(黄色):DEC1电压 CH1(绿色):MOS控制电压

这里给出我成功的两个参数,攻击时间大致为上电后的1250微秒,短接时间大致在5-15微秒

攻击成功在示波器上的特征为电压不再下降,同时JLink可正常调试并备份固件。

完成备份后可以修改锁定位,并将固件重新刷回设备,使设备可以进行动态调试。

参考资料

https://limitedresults.com/2020/06/nrf52-debug-resurrection-APProtect-bypass/

https://blog.csdn.net/qq_33917045/article/details/120580025

https://www.shutingrz.com/post/voltage-fault-injection-nrf52/

https://limitedresults.com/2020/06/nrf52-debug-resurrection-APProtect-bypass-part-2/

 

 

原文始发于Seebug(轨道教主):nRF52 平台芯片电压毛刺注入绕过调试保护

版权声明:admin 发表于 2022年7月13日 下午8:41。
转载请注明:nRF52 平台芯片电压毛刺注入绕过调试保护 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...