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

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

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

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

案例回放

文章中提到的攻擊,能夠分3步:網絡

1.利用單片機和支持IEEE 802.15.4無線通訊的模塊來抓取6LoWPAN流量中的數據,提取出WiFi信息(此時加密的)。工具

2.經過提取固件、分析固件,分析出其採用的是AES加密算法,並提取出加密密鑰和初始向量等信息。性能

3.根據2中獲取的信息來解密獲得WiFi密碼。ui

這是一個典型的針對家庭局域網絡內的嗅探攻擊。從此的物聯網設備將有一大部分是做爲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讀取,一類是經過調試接口讀取。

利用bootloader提取

經過串口,把芯片和電腦相連,運行mcuisp軟件,點擊讀Flash便可。

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

利用硬件調試接口提取

在開發單片機程序時,會用到硬件調試工具,實現單步運行來查看程序實時運行的效果。通常能夠經過下面兩類調試接口,把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芯片中的固件。

總結

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

相關文章
相關標籤/搜索