一. 簡介
隨著物聯網的不斷髮展,感測器的廣泛應用,MCU的效能也經歷了滿足產品介面與穩定性的需求到效能過剩的階段。近幾年,物聯網終端的安全問題的源頭大部分指向了終端韌體的保護不周,所以,各個MCU的廠商也在其晶片內植入了類似於安全晶片的能力,比如ARM提出並實現了TrustZone技術滿足Cortex A和最新的Cortex M系列的晶片安全需求;NXP實現了CRP技術保護LPC1788等MCU的韌體安全;ST公司實現了RDP功能實現韌體保護。如果攻擊者或者研究員想進一步讀取韌體,必須突破晶片廠商設定的這些保護能力。
本文解讀的就是這樣一篇論文1,來自Fraunhofer AISEC的兩位研究員Johannes Obermaier和Stefan Tatschner,在2017年的USENIX Workshop中介紹瞭如何突破STM32F0系列微控制器的韌體保護功能。在破解過程中,研究員突破了很多困難,最終成功降級其安全級別,並順利讀取到韌體資訊。STM32微控制器在國內被廣泛用於智慧門鎖、共享單車、LoRa無線產品等低功耗產品中,這次突破將對這些弱效能的終端造成嚴重的影響。
這種安全問題的出現,會導致大批的終端的韌體被人提取,進而分析出安全問題。好像是我們家的門鎖能被萬能鑰匙開啟一樣,物聯網終端研發廠商也對晶片自身的安全能力能提供的安全程度產生了擔憂。
研究員以STM32F051R8T6這款MCU為實驗平臺,如圖 1所示,透過配置其相關暫存器設定讀保護級別,使MCU在上電後可以執行在Level 0,Level 1,Level 2這三個安全級別下。Level 0不提供任何形式的安全防護,Level 1提供Flash訪問限制和SWD除錯限制,Level 2則完全禁止了SWD的除錯能力,Level 2狀態下的晶片無法解除該安全級別,即便是開發人員自己都無法透過除錯介面再次燒寫和除錯韌體。論文中,研究員經過實施攻擊實驗,最終得出一個結論:STM32F051R8T6微控制器韌體的讀保護功能(RDP)的Level 1級別下存在重大缺陷,Level 2級別可被降級為Level 1。
圖 1 STM32F051R8T6晶片實拍
接下來筆者就給大家解讀一下中提到的三個安全問題,希望能使更關心物聯網終端安全的人能對一些方案的安全性有更加清晰、深入的認識。
二. 問題1:Level 1下的SRAM資訊洩露
SRAM是靜態的隨機儲存器,是RAM的一種,其特點就是不需要持續重新整理也可以保留資料。在MCU中一般用於存放執行時的資料,如變數。研究員的攻擊效果是:可以定時地取樣晶片執行過程中的SRAM中的資料,定時的精度可以達到微秒級別。這將有助於研究人員從SRAM中分析到金鑰等認證、加密引數,突破整體方案的安全性。
那研究人員是怎麼發現這樣的問題,又是怎麼讀取到的資料呢?在Level 1模式下,官方手冊說透過ST-LINK這種偵錯程式是可以連線到MCU上,而且SRAM中的資料是可以訪問的。經過測試,MCU被重置以後,SRAM中的資料沒有被清除,所以在這時候可採集到SRAM中的資料。但是由於程式已經停止執行,SRAM中的資料只是當前程式執行時的狀態,有一種給虛擬機器設定快照感覺。
研究員的實驗如圖 2所示,首先使用ST-LINK連線MCU和筆記本,這樣可以保證可以使MCU暫停程式執行。但是要想保證能定時讀取,需要每次讀取前能給MCU上電,上電之前還要保持復位訊號,這樣MCU每次上電後會停止在初始狀態,透過控制復位訊號使晶片執行程式。將ST-LINK連線到MCU,此時可傳送復位指令並讀取SRAM的資料。為了保證每次試驗開始時候,SRAM必須是經過斷電清除資料的狀態,這樣經過執行一段時間後,SRAM中的資料才是從上電後,ST-LINK控制其復位的時刻的資料。還需要做一個高速可控的開關以保證採集資料的精度,這個高速的開關由三極體、電感、二極體、電阻組成,經過一個MCU的IO引腳控制。由於時間精度要控制到微秒,所以,安裝消費級作業系統的電腦無法滿足微秒級別的響應,即便是經過實時處理的Linux核心也無法滿足亞微秒響應級別的開關電路。所以研究員直接利用MCU的IO實現亞微秒級別的IO控制後面的硬體開關電路,進而實現高速開關,最終實現了可以控制到微秒級別的攻擊週期。
圖 2 SRAM快照測試實驗器材及連線方式
假設一次操作週期是T,則其可控的時間是nT(n是自然數),即取樣時間週期的整數倍,實現了在Level 1的安全模式下類似單步執行的效果(每一步花費一個或者幾個週期,而現在控制精度達到微秒級,最多也就幾十個指令的執行時間,所以控制到微秒級別已經足夠有說服力)。此功能有助於研究員進行單步除錯,結合韌體的資訊能挖掘出更多的其他資訊,以致嵌入式系統“裸奔”在研究員的手中。那SRAM資訊洩露會帶來哪些風險呢?相比於韌體資訊的洩露,SRAM中的資訊更有價值,如果終端金鑰透過安全地交換演算法從雲端獲得,終端的韌體中是沒有金鑰的,只有從RAM中獲取,又因金鑰本身格式特徵很強,所以很容易從RAM中提取到通訊金鑰。用於校驗完整性的校驗結果或者簽名資訊,也會儲存在RAM中。
三. 問題2:Level 1完整韌體被洩露
研究員發現的第二個問題是Level 1下完整韌體會被洩露。也就是說,Level 1的防護大門是可以被開啟的。接下來我們看看研究員是怎麼把這扇門開啟的。
前面提到,在Level 1模式下,SWD偵錯程式可以連線到MCU上。那連線上以後為什麼不能讀取flash中的韌體資訊呢?這個問題的答案一定可以從SWD偵錯程式和MCU的互動中得出。由於ST-LINK偵錯程式本身的限制,當連線到MCU,向MCU發起讀取一個位元組操作時,MCU的flash立即被鎖定了,而且ST-LINK的韌體除錯起來有限,所以ST-LINK不滿足實驗需求。於是研究員利用MCU簡單實現了一個SWD的簡單功能,由於程式碼完全可控,所以能非常方便地看到SWD除錯工具和MCU的所有互動流程。又因實驗需求比較明確,流程可以自動化地實現,所以膝上型電腦需要和SWD模組通訊起來,“告訴”SWD模組使用哪些功能對MCU做操作。於是實驗的方案如圖 3所示。
圖 3 自定義SWD模組讀取韌體
實驗過程中,在除錯板上設定LED以保證當flash被鎖定時,LED不亮,當flash沒有被鎖定時,LED一直亮著,以此判定是哪些操作會觸發flash的保護。最終證實:鎖定是由相應的SWD訪問系統匯流排的資料包傳輸的最後一個SWCLK上升沿觸發的。也就是說,SWD連線到MCU以後,只要不訪問到系統匯流排,那flash就不會被鎖定,而flash剛剛在系統匯流排上。如果想理清透過系統匯流排鎖定flash的所有細節,需要SWD在連線上MCU以後什麼資料包都不傳送,以保證flash沒有被鎖定。接著,傳送讀取flash某個地址一個字(32位)的請求,觀察都有現象,最終研究員發現:當SWD像flash發起讀取一個字的請求後,flash被鎖定,但是,該地址的一個字的內容已經被讀取到SWD偵錯程式中,且任意flash地址是可以這樣被讀取到。
有了以上結論,只要不斷地把地址從flash初始地址在每個讀取迴圈中+4即可,直到所有的flash的資料被SWD模組讀出,Level 1下的flash韌體也就被全部讀取到了。
到此為止,已經能證實Level 1的保護失效了。研究員還深入地研究了讀取效率,最終在2小時內將256k位元組的韌體讀取完成,這個大小的flash在MCU中已經很大,所以該測試結論已經有足夠的說服力。
四. 問題3:Level 2可被降級為Level 1
STM32的最高安全級別為Level 2,該級別下的MCU不可被逆為Level 1。然而,研究員在其設計上找到了缺陷。由於安全級別是可以被長期儲存的,所以不會把狀態設定在RAM中,一定有個flash區域存放Level級別設定資訊。該設定資訊由一段選項位元組表示,所以,如果要把Level 2降級,則需要把這段選項位元組改掉。由於Level 2模式下無法將SWD模組和MCU之間建立連線,所以研究員採取光照方式把該區域的值改掉,使其脫離了Level 2模式。
為什麼這麼容易被脫離Level 2模式下呢?這和Level級別的設定方式有關:只有兩個特定的值能被用於設定Level 2和Level 0,其他值得狀態下都是Level 1。也就是說,我只要翻轉Level 2下的選項位元組的任意一個位,就一定能改變安全級別,相當大的機率會降為Level 1。如圖 4所示。如果Level 1也只能被一個特定值設定,那問題也不會這樣嚴重。
圖 4 選項位元組值與安全級別對應關係和降級思路
根據flash區域的材料特徵,其值會被光照條件下發生臨時或者永久性的改變。只要將晶片剖開,使flash區域暴露出來,把該選項位元組暴露在光照條件下,保證有至少一個位翻轉,則攻擊也就成功了。
圖 5 STM32F051R8T6破封后的影像
為了不讓光照影響flash的其他區域,研究員利用掩膜,經過多次光照實驗,最終確定了該選項位元組的位置,如圖 6所示。在研究員寫入帶level 2的flash韌體做光照測試後,偵錯程式在幾個小時後成功連線到了晶片上。也就是說選項位的值已經被更改到Level 1或者Level 0的級別。
圖 6 flash的佈局以及選項位元組的位置(紅色框框)
Level 2的安全級別被降級,其實是在晶片被剖開的場景下成功的。且如果要完整地無錯誤地被讀取,是需要器材控制其光照位置的,所以帶有一定的攻擊成本。這一點能確保Level 2在沒有被拆解晶片的場景下可以保證終端韌體的安全。
五. 總結
該研究員做的工作非常有價值,得出的結論也非常具有參考性。在MCU的效能、穩定性已經逐步滿足市場所需時,安全能力的加入讓終端安全的攻防格局變化起來,晶片方面的攻與防也正在慢慢的變得愈發激烈。物聯網產品設計廠商也需要足夠了解MCU的安全特性後,才能真正給出一個相對安全的方案。如果現有的方案使用的STM32,那麼直接把安全級別設定為level 2才是最好的選擇。
參考文獻
1. Shedding too much Light on a Microcontroller’s Firmware Protection,https://www.usenix.org/system/files/conference/woot17/woot17-paper-obermaier.pdf