NSFOCUS 滲透低性能智慧設備的關鍵技術-固件提取
2017-11-06

滲透低性能智慧設備的關鍵技術-固件提取

       近十年,隨著感測器技術、無線通訊技術的迅速發展,越來越多的物聯網產品出現在我們的視野中,Gartner預測,到2020年,物聯網設備的裝機量將超過200億,但很多物聯網設備受到成本、研發人員安全素質等因素的限制,存在大量的安全問題。例如2016年底的Mirai事件,就是因為弱口令和未修復的設備漏洞引起的。物聯網終端的安全,也越來越受到人們的關注。
 

       2017年10月,物聯網安全研究人員滲透進了某智慧燈泡,獲取到了Mesh網路內傳輸的WiFi資訊(包括WiFi密碼)。儘管在該案例中WiFi密碼被加密,但是研究人員依然通過獲取設備的底層固件,得到了加密演算法和金鑰資訊,最終得到了明文的WiFi密碼。固件提取進而分析固件是攻擊者常見的滲透手段,反之如果廠商想要生產出高安全級別的智慧燈泡,第一步就是要防止固件內容被竊取。

       接下來,我們對這次案例做個簡單的分析,然後進一步分析固件提取原理和過程,最後總結在現有的技術背景下獲取固件的方法和相應的防護方法。為了描述方便,我們把這種獲取固件的技術稱為固件提取。

案例重播

(圖片來源於FreeBuf)

文章中提到的攻擊,可以分3步:

1.利用單片機和支援IEEE 802.15.4無線通訊的模組來抓取6LoWPAN流量中的資料,提取出WiFi資訊(此時加密的)。

2.通過提取固件、分析固件,分析出其採用的是AES加密演算法,並提取出加密金鑰和初始向量等資訊。

3.根據2中獲取的資訊來解密得到WiFi密碼。

       這是一個典型的針對家庭區域網路內的嗅探攻擊。今後的物聯網設備將有一大部分是作為Mesh網路節點存在,只不過閘道可能是手機、路由器、筆記型電腦等一切具備藍牙、ZigBee、WiFi等無線聯網能力的設備。基於現有的網路來看今後的物聯網,設備如果想要具有聯網能力,則必須利用至少一條有線或無線的通道連接到互聯網。如果是通過WiFi連接,必要的資訊就是WiFi的SSID和密碼。

       案例中,攻擊者通過分析固件得到瞭解密WiFi密碼所需的資訊——加密金鑰和AES初始向量。那為什麼研究人員可以獲取到固件呢?下面我們將分析固件提取的原理,並且分析在現有的技術背景下,提取低性能的物聯網節點上的智慧設備的固件方法。

固件提取的原理

       我們已經理清楚了攻擊的方法,本次就針對其中重要一環——固件提取,談一談固件提取的原理,進而總結現有的固件提取方法。

以STM32F103系列單片機為例。該單片機基於ARM Cortex M3內核,片內帶有64KB的Flash和20KB的SRAM。單片機讀取程式到SRAM再進行解碼。目前已知的有兩個地方會存儲需要運行的程式:

1.單片機內的Flash/ROM。

2.單片機外掛的Flash/ROM。

       對於記憶體來說,讀和寫的操作是最基本的,即:必然存在一種方式,可以把記憶體中的資料讀取出來。如果讀取的資料是單片機需要翻譯的機器碼,那麼我們就把讀取的過程叫提取,把要讀取的資料稱為固件。

       stm32f103c8t6單片機的片內Flash的地址是0x08000000-0x0801ffff(如上圖所示),總共64KB。如果要提取出固件,有必要瞭解代碼是如何燒寫進晶片內的Flash區域裡面的。

在開發過程中,會有如下過程:

1.搭建好編譯環境,編寫程式碼(一般採用高級程式設計語言,如C語言),編譯、生成可執行檔。

2.搭建好燒寫環境,把可執行檔傳到單片機晶片中,使單片機上電可以運行。

       編譯環境就是用把單片機C語言程式編譯成彙編、機器碼等,生成16進制hex檔或者二進位bin檔,一個編譯器即可。燒寫環境就是把機器碼下載到上圖的Flash區域的過程中所需的工具,包含J-link、U-link、ST-LINK(stm32單片機專用)等硬體工具和STVP、mcuisp等軟體(使用一套軟硬體即可)

       請注意,燒寫、下載、上傳、提取這四個詞,說白了,就是對Flash區域讀寫的過程。目前發現兩種讀取固件的方式,第一種是依託于生產廠商固化在晶片內的bootloader,把Flash中的固件讀取出來,第二種是通過調試介面把固件讀出來。第一種需要bootloader支援,而且一般是支持的。第二種是依靠硬體調試工具直接讀取,在前面的案例中,研究人員通過PCB上保留的JTAG調試介面,把固件讀取了出來。

       篇幅所限,讀取過程中的交互細節不多介紹,直接介紹兩類固件提取的工具和方法,一類是以stm32單片機為例的單片機固件提取的工具和方法,一類是外掛Flash形式的Flash固件提取的工具和方法。

單片機片內Flash的固件提取的工具和方法

單片機固件提取方式有兩類,一類是通過bootloader讀取,一類是通過調試介面讀取。

1. 利用bootloader提取。

通過串口,把晶片和電腦相連,運行mcuisp軟體,點擊讀Flash即可。

       mcuisp軟體通常被用來通過串口通信下載固件到單片機。串口通信也是通信技術的一種,目的是實現晶片A到晶片B的資料傳輸,是晶片之間經常用到的通信方式。例如:如果我的目的是把程式碼“abcd”傳輸到晶片A中,但是,我僅僅通過電腦與沒有bootloader的單片機進行串口通信,“abcd”是沒辦法直接儲存到Flash區域的,必須在單片機內部寫好一段代碼,在“abcd”已經通過序列介面,一個一個的到達單片機內部的緩衝器時,把 “abcd”一個一個的轉存到Flash區域。這樣就實現一種電腦直接寫入“abcd”到Flash的假像,達到用戶無感知或是透明傳輸的效果。提取固件的過程相反與上述過程相反,只需要利用bootloader把Flash的內容通過串口通信發送給電腦即可。

2. 利用硬體調試介面提取。

      在開發單片機程式時,會用到硬體調試工具,實現單步運行來查看程式即時運行的效果。一般可以通過下面兩類調試介面,把Flash中的資料讀取出來。

(1)SWD介面,利用硬體:J-LINK OB或者J-LINK或者ST-LINK;利用軟體:J-LINK驅動程式自帶的J-FLASH或者ST官網提供的STVP。

(2)JTAG介面,利用硬體:J-LINK;利用軟體:J-LINK驅動自帶的J-FLASH。

       如果找不到序列介面,可以用這種方式,當然,前提是產品電路板上可以引出這兩類介面之一,否則只能取下晶片了。

單片機片外Flash的固件提取工具和方法

       作為一個記憶體,上電之後不可能自己就把資料顯示給我們,就好像U盤買回來,得插電腦上,載入完驅動才能讀取到裡面的資料。對於片外Flash,需要把Flash晶片從產品的電路板中取下來,再放到另外一個帶有MCU的電路板上來讀取資料。萬能的淘寶提供了程式設計器,方便了對眾多Flash晶片的內部資料的提取。

       這種方式有兩個缺點:一是比較暴力,需要把Flash晶片從電路板上取下來,再把Flash晶片放到程式設計器上面,利用配套的PC端軟體,把固件讀取出來。二是Flash晶片型號需要得到程式設計器的支援。那問題來了,如果這個程式設計器不支持我的Flash的型號呢?那就自己寫個單片機程式把程式讀出來吧。一般,在大學本科修讀電子資訊工程、通信工程或自動化專業的,有獨立硬體專案開發經驗的同學,都可以獨立實現。

防護措施

       介紹了這麼多提取固件的工具和方法,那現在有哪些方法能有效防止產品固件被提取出來呢?

       針對單片機固件提取的防護:我們可以通過程式設計的方式,把內部Flash區域設置為讀保護狀態,這樣只要不對MCU進行解封,利用顯微鏡對內部Flash的電平狀態進行破壞,是很難篡改固件的,至於讀取固件,基本上不可能。例如,我們對stm32單片機的RDP寄存器進行設置,使記憶體保護等級提升至level 2,或者把重要的程式和資料利用PCROP功能保護起來,防止讀取。

      對外掛的Flash內的固件,目前,就本人所知,只要能取下來,獲得型號,就可以得到固件。那問題就變成了:如何不讓攻擊者把Flash安全地取下來?我建議硬體設計工程師把PCB上的Flash晶片,依靠電路設計保護起來。例如:設計Flash晶片線上檢測電路,一旦Flash晶片的引腳出現斷線,則立刻發動強電壓攻擊,將Flash晶片破壞,防止攻擊者讀取出Flash晶片中的固件。

總結

我們通過分析固件提取的原理,介紹固件提取可用的方法和工具以及相應的防護措施,希望可以使更多的電子工程師、嵌入式軟體工程師重視智慧設備固件的保護。同時,我們希望這篇文章可以給物聯網安全從業人員帶來一些物聯網設備的防護建議。希望在智慧設備開發工程師和安全測評工程師的共同努力下,我們身邊的智慧設備變得越來越安全。

 

如有任何問題,查詢或意見請直接與我們聯繫:

電子郵件:pm@fairline.com.tw

電話號碼:02 2658 1818 Ext.221 聯絡人: 林 先生

辦公地址:台北市內湖區瑞光路583巷32號五樓