作者:轨道教主
原文链接:https://www.bilibili.com/read/cv17283492
在nRF52芯片中为防止出现nRF51中所出现的漏洞,芯片厂加入了APPROTECT功能来防止调试接口在保护状态下被使用,此功能通过直接断开调试接口与cpu的通讯来进行实现
APPROTECT的启用为用户信息配置寄存器 (UICR)中的地址0x10001208写入0xFFFFFF00
在上电过程中AHB-AP(调试端口)会根据UICR中的值进行初始化,控制APPROTECT是否被打开。也就是读取地址0x10001208,判断其是否为0xFFFFFF00
而UICR中的值则保存在内存控制器中 因此AHB-AP的初始化的过程中需要读取地址,则需要和内存控制器进行通讯。这个过程会导致芯片能耗产生改变,以便通过芯片能耗对此过程进行定位。
基于以上,使用示波器对芯片能耗进行分析,可以通过电压捕获到AHB-AP的初始化的过程,并在初始化过程中进行对芯片施加一个极短的电压来干扰芯片正常运行,使芯片产生错误,这个错误将导致初始化出错,最终导致APPROTEC未按正常情况被启用。
(示波器观察到的芯片能耗曲线)
这里为保险起见购买一块开发板,并没有在原设备进行复现,复现成功后再对设备进行
(所使用的开发板nrf52832)
官网下载nrfjprog调试工具https://www.nordicsemi.com/Products/Development-tools/nRF-Command-Line-Tools/Download
查看芯片状态并备份固件(开发板里自带的流水灯)
APPROTECT未启用正常读取固件
使用指令nrfjprog --memwr 0x10001208 --val 0xFFFFFF00 写入地址启用APPROTECT。
修改完成,重启开发板
APPROTECT已被启用,可以开始进行攻击。
根据漏洞描述,攻击流程为芯片上电后对CPU 电源线DEC1进行毛刺注入(短接接地)
根据芯片手册可以得知DEC1引脚位置,并根据走线配合万用表查找电容连接点
焊接导线进行测试,在这里去掉了C5电容,根据相关文章描述此电容去除后可以增加成功概率但会降低cpu稳定性。一般情况建议保留,在这里去除是因为操作失误碰掉了装不回去(我太菜了)(写完了才发现C11也不见了。。。对。。。也是我碰掉的。。这个根本不用去)
示波器探头接DEC1,捕捉电压
可看到1.3ms左右出现一个下降沿(200mv左右),此下降沿位置即为需要进行的注入点
由于属于芯片的启动过程较为固定,因此从芯片上电,到注入点的时间也相对固定。我们只需要通过示波器获得上电后至下降沿大致时间,并使用一个设备对芯片进行上电,并在上电后的指定时间进行短接即可完成攻击
这里我选用了Arduino进行攻击,Arduino可以使用延迟函数delayMicroseconds(),让我们可以以微秒时间操作硬件上电后的毛刺注入时间(任何可以操作微秒的单片机等均可,比如树莓派或ESP32,这里用Arduino是因为较为便宜)
搭建电路如下,MOS管均为P沟道mos,Arduino 10口控制MOS进行芯片上电(因p沟道MOS特性,实际为控制芯片负极连接,因此会导致芯片在下电情况下示波器等设备测到的电压为高电平,使用N沟道可解决此问题,但并不影响漏洞复现)Arduino 9口控制MOS短接DEC1接地。
接线示意图
实际攻击现场
攻击流程如图
大致攻击流程如图所示,但是仍需要解决几点问题
1.如何准确找到注入点
2.短接DEC1时间需要多久
而这两点问题其实都可以通过爆破的方式进行解决
Arduino程序
大致思路为示波器获取到的时间减去50微秒 每次增加1微秒进行爆破,同时短接时间设定为1-12微秒进行尝试。在每次收到串口发送的1时开始一次尝试(这里有一点需要说明,delayMicroseconds确实可以微秒控制,但是Arduino自身存在延迟,导致即使不使用延时函数也将出现一个大约5微秒的延迟,使用delayMicroseconds则是在5微秒延迟上增加时间)
这里还需要一个上位机利用JLink尝试使用调试端口读取内存,如果读取失败通过串口发送指令到Arduino开始下一次攻击,直到攻击成功为止
CH0(黄色):DEC1电压 CH1(绿色):MOS控制电压
CH0(黄色):DEC1电压 CH1(绿色):MOS控制电压
可以看到JLink正常读取了内存地址,而内存地址显示APPROTECT被启用,攻击成功
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 Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1929/