,,,
(1.陸軍裝甲兵學(xué)院 信息通信系,北京 100071; 2.73630部隊)
一般嵌入式產(chǎn)品應(yīng)用環(huán)境不會對硬件采取特殊的保護措施,而嵌入式系統(tǒng)的硬件又直接影響著系統(tǒng)工作的安全性,這為嵌入式系統(tǒng)帶來了許多安全隱患,同時近年來嵌入式設(shè)備信息安全事故頻發(fā),系統(tǒng)的信息安全問題引起社會的廣泛關(guān)注[1-4],越來越多的學(xué)者投入嵌入式系統(tǒng)漏洞的挖掘和研究工作。
林郭安、黃強等人[5]根據(jù)STM32芯片的啟動特點,設(shè)計了一種由后至前遍歷獲取程序入口地址,通過修改程序入口地址實現(xiàn)源碼復(fù)制竊取的目的,但該方法的遍歷階段具有盲目性的特點,攻擊效率低。Frank Altschuler和Bruno Zoppis等人[6-7]提出通過向RAM緩存區(qū)傳送大量數(shù)據(jù),造成緩存區(qū)溢出,從而覆蓋原程序跳轉(zhuǎn)地址以達到攻擊的目的,但這種方法并不適用于運行時直接從Flash區(qū)間讀取代碼的芯片。
本文針對STM32F10x系列控制芯片,根據(jù)其啟動原理,借助仿真器和下載接口,將惡意軟件載入目標(biāo)芯片F(xiàn)lash空余扇區(qū),在調(diào)試模式運行惡意軟件,并從中篡改原啟動文件的程序跳轉(zhuǎn)指針,從而改變原程序啟動時的運行順序,使得植入的惡意軟件得到執(zhí)行,實現(xiàn)攻擊目的,實驗證明該方法具有針對性強、攻擊效率高、方法簡單易于實施的特點。
STM32F10x系列芯片采用32位的ARM Cortex-M3內(nèi)核,主頻高達72 MHz,型號眾多、片上資源豐富,具有功耗低、性能強、性價比高的特點[8],可以很好地滿足各類中低端嵌入式產(chǎn)品市場需求,在ARM系列微控制器市場占有率高[9],對STM32F10x系列芯片的攻擊研究具有重要的市場價值和借鑒意義。
加載啟動文件是STM32微控制器在啟動時執(zhí)行的第一段程序,由匯編語言編寫,它的作用包括配置中斷向量、堆棧初始化、系統(tǒng)時鐘初始化以及跳轉(zhuǎn)至main函數(shù)等[10]。啟動文件根據(jù)STM32具體型號而定,STM32F10x系列芯片共有小型容量、中型容量、大型容量等8種啟動文件,這些啟動文件在ST官方網(wǎng)站即可獲取,芯片只有匹配了正確的啟動文件才能正常運行。在實施嵌入式系統(tǒng)攻擊時往往無法得知目標(biāo)芯片的代碼信息,但是獲取其型號信息并不困難,只要在植入惡意代碼中匹配相應(yīng)的啟動文件,就可以正確配置芯片,使得惡意代碼在芯片上正常啟動并運行。
Cortex-M3內(nèi)核規(guī)定[11],映射存儲空間的起始地址存放堆棧指針,第二個地址存放復(fù)位中斷向量指針,在芯片啟動時,硬件首先會根據(jù)復(fù)位中斷向量指針跳轉(zhuǎn)到復(fù)位中斷函數(shù),進行內(nèi)核堆棧初始化和中斷向量初始化工作,然后執(zhí)行System_Init進行系統(tǒng)時鐘初始化,最后通過__main函數(shù)跳轉(zhuǎn)到主函數(shù)執(zhí)行用戶代碼。本實驗根據(jù)Cortex-M3內(nèi)核啟動順序,重定位復(fù)位中斷向量指針,從而在復(fù)位時跳轉(zhuǎn)至惡意軟件執(zhí)行,然后跳轉(zhuǎn)回原啟動文件執(zhí)行原程序,保證了原代碼的完整性和嵌入式攻擊的隱蔽性。
對目標(biāo)實施攻擊后的代碼執(zhí)行流程如圖1所示。
圖1 攻擊目標(biāo)代碼執(zhí)行流程
一般情況下,映射存儲空間為MCU內(nèi)部Flash,出于產(chǎn)品優(yōu)化升級考慮,嵌入式產(chǎn)品都會在Flash內(nèi)部預(yù)留出多余扇區(qū)[5,13],這為惡意代碼的植入提供了可用空間,F(xiàn)lash的讀寫保護僅對外界讀寫操作有效,不能阻止原有程序?qū)lash的操作,這為惡意代碼提供了執(zhí)行條件。惡意代碼一經(jīng)執(zhí)行,就會篡改原程序復(fù)位中斷向量指針,在下次芯片燒錄之前,攻擊一直有效。
汽車實驗采用搭載STM32F103VET6芯片的指南者開發(fā)板,該芯片F(xiàn)lash容量為512 KB,應(yīng)用CMSIS-DAP標(biāo)準的仿真器,上位機系統(tǒng)環(huán)境為Windows7,使用ST公司提供的編譯開發(fā)環(huán)境MDK,以及串口調(diào)試助手。
首先利用MDK將惡意代碼下載至芯片F(xiàn)lash的最后扇區(qū),然后通過仿真器的Debug模式從惡意代碼區(qū)啟動,并在惡意代碼中修改原啟動文件的復(fù)位中斷向量指針,最后在惡意程序中跳轉(zhuǎn)回原啟動文件,重新初始化系統(tǒng)運行原代碼,之后系統(tǒng)每次復(fù)位都會優(yōu)先執(zhí)行攻擊代碼后再跳轉(zhuǎn)回原代碼執(zhí)行。
在指南者開發(fā)板上進行簡單的流水燈作業(yè),注入惡意代碼的功能為蜂鳴器響起并延時1 s,并向串口輸出“攻擊成功”的打印信息,同時可以在Debug模式下觀察PC指針的值以判定攻擊是否成功。
方案實現(xiàn)框圖如圖2所示。
圖2 啟動文件攻擊實現(xiàn)流程
(1)惡意軟件下載
為了最大限度確保注入惡意代碼的完整性并且不覆蓋芯片原有代碼,實驗首先分析惡意攻擊軟件的容量,在編譯好的文件中,通過map文件可以查看惡意軟件的大小為3.75 KB,STM32F103VET6芯片內(nèi)Flash容量為512 KB(0x08 0000),每頁扇區(qū)大小為2 KB,本實驗將惡意代碼燒錄到最后兩片扇區(qū)中,即0x0807 F000~0x0808 0000區(qū)間。通過修改MDK中Options->Target的設(shè)置可以實現(xiàn)定位下載地址。
圖3為map文件中惡意代碼大小信息以及Target Memory部分設(shè)置界面。
圖3 map文件代碼信息及Target Memory設(shè)置頁面
(2)仿真器啟動
為了在啟動時優(yōu)先運行惡意軟件,實驗借助DAP仿真器在Debug模式下復(fù)位運行,需要添加初始化文件Debug_RAM.ini,在該文件中設(shè)置堆棧指針和PC指針,這樣在Debug模式下啟動時,程序就會被強制跳轉(zhuǎn)到此位置運行,程序如下所示:
FUNC void Setup(void){
SP=_RDWORD(0x0807F000);
PC=_RDWORD(0x0807F004);
_WDWORD(0xE000ED08,0x20000000);
}
LOAD %L INCREMENTAL
Setup();
(3)跳轉(zhuǎn)地址重定位
由于Cortex-M3內(nèi)核在啟動時會根據(jù)映射存儲空間第二個偏移地址(復(fù)位中斷向量指針)跳轉(zhuǎn)到復(fù)位中斷函數(shù)執(zhí)行,用戶無法改變這一內(nèi)核啟動的順序,但是可以通過Flash自身程序修改復(fù)位中斷向量指針的值,從而改變默認跳轉(zhuǎn)地址。通過實驗發(fā)現(xiàn),STM32F10x系列芯片的復(fù)位中斷指針相對Flash的起始空間固定偏移0x145個字節(jié),當(dāng)Flash起始地址為0x0807 F000時,復(fù)位中斷指針應(yīng)修改為0x0807 F145,該過程由惡意軟件實現(xiàn)。
由于Flash在寫操作之前必須按頁擦除,故在代碼實現(xiàn)時需要先將Flash起始地址的第一頁內(nèi)容復(fù)制到至少2 KB容量的數(shù)組,將數(shù)組中第二個字的內(nèi)容修改成惡意代碼的復(fù)位中斷向量指針0x0807 F145,然后再將這一頁內(nèi)容重新寫入Flash,完成復(fù)位中斷向量指針的替換。當(dāng)開發(fā)板重啟時,系統(tǒng)就會先跳轉(zhuǎn)至惡意代碼區(qū)啟動文件進行系統(tǒng)初始化啟動,在執(zhí)行完惡意代碼內(nèi)容后跳轉(zhuǎn)回原啟動文件的復(fù)位中斷函數(shù),重新初始化系統(tǒng),運行原代碼。
對正在進行流水燈作業(yè)的指南者開發(fā)板進行攻擊后,每復(fù)位一次開發(fā)板,蜂鳴器鳴笛1 s,并在串口收到“攻擊成功”的調(diào)試信息,在單步調(diào)試模式下,對比攻擊前后映射存儲空間起始地址(0x0800 0000)的第二個字內(nèi)容,如圖4所示,可以清楚看出復(fù)位中斷向量地址已被篡改。
圖4 Debug_RAM.ini文件內(nèi)容
[1] 蔡舒祺.嵌入式系統(tǒng)安全性分析概述[J].電子技術(shù)與軟件工程,2017(3):210-212.
[2] 李冰冰,陳靜.物聯(lián)網(wǎng)時代的嵌入式系統(tǒng)安全性問題探討[J].數(shù)字技術(shù)與應(yīng)用,2016(12):217,219.
[3] 第88屆中國電子展.嵌入式應(yīng)用面臨新機遇,信息安全更加被重視[J].中國電子商情:基礎(chǔ)電子,2016(12):53-54.
[4] 趙國冬.安全嵌入式系統(tǒng)體系結(jié)構(gòu)研究與設(shè)計[D].哈爾濱:哈爾濱工程大學(xué),2006.
[5] 林郭安,黃強,許文煥.STM32F103RB的Bootloader軟件安全設(shè)計方案[J].單片機與嵌入式系統(tǒng)應(yīng)用,2009(9):73-75.
[6] Frank Altschuler,Bruno Zoppis.嵌入式系統(tǒng)安全性(上) -對攻擊狀況和防衛(wèi)策略的概述和分析[J].電子產(chǎn)品世界,2008(5):109-113.
[7] 王柳濱,魏國珩,李政.嵌入式系統(tǒng)緩沖區(qū)溢出攻擊防范技術(shù)[J].計算機應(yīng)用,2012,32(12):3449-3452.
[8] STMicroelectronics.STM32F103xE Data sheet,2008.
[9] 單祥茹.STM32教父新愿景:產(chǎn)品成嵌入式工程師的首選[J].中國電子商情:基礎(chǔ)電子,2017(7):10-11.
[10] 劉火良,楊森.STM32庫開實戰(zhàn)指南[M].北京:機械工業(yè)出版社,2017.
[11] Joseph Yiu.ARM Cortex-M3與Cortex-M4權(quán)威指南[M].北京:清華大學(xué)出版社,2015.
[12] 張宏財,趙曾貽.基于ARM核的Bootloader代碼分析與設(shè)計[J].微計算機信息,2006,22(5-2):137-139.
[13] STMicroelectronics.STM32F10xxx Flash programming manual,2008.