一、簡介
随着物聯網的不斷發展,傳感器的廣泛應用,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晶片實拍
接下來筆者就給大家解讀一下中提到的三個安全問題,希望能使更關心物聯網終端安全的人能對一些方案的安全性有更加清晰、深入的認識。
二、問題一
—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中。
三、問題二
——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中已經很大,是以該測試結論已經有足夠的說服力。
四、問題三
—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