作者:軌道教主
原文鏈接: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/


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1929/