在本文中,我們將為讀者詳細(xì)介紹如何挖掘物聯(lián)網(wǎng)設(shè)備中的復(fù)雜惡意軟件。
這篇文章的動(dòng)機(jī)之一,就是鼓勵(lì)對(duì)這個(gè)話題感興趣的其他研究人員加入進(jìn)來(lái),分享自己的想法和知識(shí),建立更多的安全工具,以便更好地保護(hù)我們的智能設(shè)備。
研究背景
智能手表、智能家居設(shè)備甚至智能汽車(chē)……隨著越來(lái)越多的聯(lián)網(wǎng)設(shè)備加入物聯(lián)網(wǎng)生態(tài)系統(tǒng),確保其安全性的重要性已經(jīng)變得不言而喻了。
眾所周知,現(xiàn)在已經(jīng)成為我們生活中不可分割的一部分的智能設(shè)備,在面對(duì)各種網(wǎng)絡(luò)攻擊時(shí),還不是非常安全。實(shí)際上,針對(duì)物聯(lián)網(wǎng)設(shè)備的惡意軟件已經(jīng)存在十多年了。其中,Hydra是第一個(gè)已知的自動(dòng)化路由器惡意軟件,于2008年以開(kāi)源工具的形式被公之于眾。不過(guò),Hydra只是一個(gè)開(kāi)源的路由器惡意軟件原型。在Hydra問(wèn)世之后不久,安全專家又發(fā)現(xiàn)了針對(duì)網(wǎng)絡(luò)設(shè)備的在野惡意軟件。此后,不同的僵尸網(wǎng)絡(luò)家族相繼出現(xiàn)并廣為流傳,包括Mirai、Hajime和Gafgyt等家族。
除了以上提到的惡意軟件外,在物聯(lián)網(wǎng)設(shè)備中使用的通信協(xié)議中也爆出了許多漏洞,比如Zigbee協(xié)議,攻擊者可以將某一設(shè)備作為攻擊目標(biāo),并在得手后向網(wǎng)絡(luò)中的其他設(shè)備傳播惡意軟件,這種行為非常類似于計(jì)算機(jī)蠕蟲(chóng)。
在這項(xiàng)研究中,我們重點(diǎn)挖掘針對(duì)物聯(lián)網(wǎng)設(shè)備的低層復(fù)雜攻擊。準(zhǔn)確來(lái)說(shuō),我們將特別關(guān)注物聯(lián)網(wǎng)設(shè)備的固件,以挖掘后門(mén)植入、對(duì)引導(dǎo)過(guò)程的篡改以及對(duì)固件其他部分的惡意篡改。
下面,讓我們先來(lái)介紹物聯(lián)網(wǎng)設(shè)備固件的結(jié)構(gòu),以便更好地了解其中的各個(gè)組成部分。
IoT固件結(jié)構(gòu)
無(wú)論物聯(lián)網(wǎng)設(shè)備的CPU采用了哪種架構(gòu),啟動(dòng)過(guò)程由以下幾個(gè)階段組成:引導(dǎo)加載程序、內(nèi)核和文件系統(tǒng)(如下圖所示)。當(dāng)物聯(lián)網(wǎng)設(shè)備啟動(dòng)時(shí),板載SoC(片上系統(tǒng))上的ROM中的代碼首先會(huì)將控制權(quán)轉(zhuǎn)移到引導(dǎo)加載程序,之后,引導(dǎo)加載程序?qū)⒓虞d內(nèi)核,而內(nèi)核則會(huì)掛載根文件系統(tǒng)。
引導(dǎo)加載程序、內(nèi)核和文件系統(tǒng)也構(gòu)成了典型的物聯(lián)網(wǎng)固件的三個(gè)主要組成部分。
物聯(lián)網(wǎng)設(shè)備的引導(dǎo)過(guò)程
物聯(lián)網(wǎng)設(shè)備中使用的CPU架構(gòu)有很多種。因此,為了分析和理解固件的不同組件,就需要對(duì)這些深入了解這些架構(gòu)以及其指令集。在物聯(lián)網(wǎng)設(shè)備中,最常見(jiàn)的CPU架構(gòu)包括:
- ARM
- MIPS
- PowerPC
- SPARC
可能的攻擊場(chǎng)景
了解了固件結(jié)構(gòu)后,我們就可以考察攻擊者在部署難以檢測(cè)的隱形攻擊時(shí),會(huì)如何利用這些組件了。
引導(dǎo)加載程序是第一個(gè)獲得系統(tǒng)控制權(quán)的組件。因此,以引導(dǎo)加載程序?yàn)槟繕?biāo)的攻擊,為攻擊者提供了執(zhí)行惡意任務(wù)的絕佳機(jī)會(huì)。這也意味著攻擊可以在重啟后保持持久性。
除此之外,攻擊者還可以操縱內(nèi)核模塊。實(shí)際上,大多數(shù)物聯(lián)網(wǎng)設(shè)備使用的都是Linux內(nèi)核。就像開(kāi)發(fā)者很容易從Linux內(nèi)核中定制和選擇他們需要的任何東西一樣,一個(gè)能夠設(shè)法訪問(wèn)和操縱設(shè)備固件的攻擊者也可以添加或編輯內(nèi)核模塊。
下面,我們來(lái)考察文件系統(tǒng)。實(shí)際上,許多常用的文件系統(tǒng)都可以用于物聯(lián)網(wǎng)設(shè)備。這些文件系統(tǒng)通常很容易被攻擊者所利用。攻擊者可以從固件中提取、解壓縮并安裝原始文件系統(tǒng),添加惡意模塊,然后使用通用實(shí)用程序再次對(duì)其進(jìn)行壓縮。例如,SquashFS是一個(gè)Linux的壓縮文件系統(tǒng),在物聯(lián)網(wǎng)廠商中相當(dāng)流行。通過(guò)Linux實(shí)用程序“squashfs”和“unsquashfs”,我們就可以非常輕松地掛載或解壓SquashFS文件系統(tǒng)。
本研究所面臨的挑戰(zhàn)
獲取固件
實(shí)際上,有多種獲取固件的方法。在進(jìn)行調(diào)查時(shí),有時(shí)我們希望獲得的固件屬于規(guī)格完全相同的設(shè)備。同時(shí),我們還希望通過(guò)某些特定方式將其部署在設(shè)備上。例如,您懷疑用于更新固件的網(wǎng)絡(luò)存在安全問(wèn)題,并且考慮到在供應(yīng)商的服務(wù)器和設(shè)備之間進(jìn)行過(guò)渡時(shí)固件存在被篡改的可能性,因此,您想調(diào)查更新的固件以驗(yàn)證其完整性。在另一個(gè)示例場(chǎng)景中,您的設(shè)備可能是從第三方供應(yīng)商處購(gòu)買(mǎi)的,并懷疑固件可能被動(dòng)過(guò)手腳了。
除此之外,還有大量的物聯(lián)網(wǎng)設(shè)備,其制造商根本就沒(méi)有實(shí)現(xiàn)任何獲取固件的方法,甚至根本沒(méi)有考慮要更新固件。也就是說(shuō),這些固件從設(shè)備出廠之日開(kāi)始,終生不變。
在這種情況下,獲取這些固件的最可靠方法是從設(shè)備本身提取固件。
這里的主要挑戰(zhàn)是,這個(gè)過(guò)程不僅需要特定領(lǐng)域的相關(guān)知識(shí),還需要具備使用嵌入式系統(tǒng)的專業(yè)硬件/軟件經(jīng)驗(yàn)。如果要挖掘針對(duì)IoT設(shè)備的復(fù)雜攻擊,這種方法也缺乏可擴(kuò)展性。
在獲得IoT固件的各種方法中,最簡(jiǎn)單的方法就是從設(shè)備制造商的網(wǎng)站下載固件。但是,并非所有制造商都在其網(wǎng)站上發(fā)布其固件。通常情況下,大部分IoT設(shè)備只能通過(guò)設(shè)備物理接口或用于管理設(shè)備的特定軟件應(yīng)用程序(例如移動(dòng)應(yīng)用程序)來(lái)進(jìn)行更新。
當(dāng)從供應(yīng)商的網(wǎng)站下載固件時(shí),一個(gè)常見(jiàn)的問(wèn)題是,你可能無(wú)法找到特定設(shè)備型號(hào)的舊版本固件。我們也不要忘記,在許多情況下,發(fā)布的固件二進(jìn)制文件是加密的,它們只能通過(guò)設(shè)備上安裝的舊固件模塊來(lái)進(jìn)行解密。
了解固件
根據(jù)Wikipedia的說(shuō)法,“固件是一種特殊的計(jì)算機(jī)軟件,用于為設(shè)備的特定硬件提供底層控制。固件既可以為更復(fù)雜的設(shè)備軟件提供標(biāo)準(zhǔn)化的操作環(huán)境(提高硬件的獨(dú)立性),也可以為不太復(fù)雜的設(shè)備充當(dāng)設(shè)備的完整操作系統(tǒng),來(lái)提供所有的控制、監(jiān)視和數(shù)據(jù)處理功能?!?/p>
盡管固件的主要組件幾乎都是一樣的,但固件并沒(méi)有標(biāo)準(zhǔn)的架構(gòu)。
固件的主要組件通常是引導(dǎo)加載程序、內(nèi)核模塊和文件系統(tǒng)組成。但是,在固件二進(jìn)制文件中還可以找到許多其他組件,例如設(shè)備樹(shù)、數(shù)字證書(shū)以及其他設(shè)備特有的資源和組件。
一旦從廠商網(wǎng)站上獲取了固件的二進(jìn)制文件后,我們就可以著手進(jìn)行分析,并對(duì)其進(jìn)行反匯編處理了。鑒于固件的特殊性,其分析過(guò)程不僅具有很大的挑戰(zhàn)性,并且非常繁瑣。要獲取有關(guān)這些挑戰(zhàn)及其解決方案的詳細(xì)信息,請(qǐng)參閱“IoT固件分析”部分。
查找固件中的可疑元素
在固件的組件被提取后,您就可以開(kāi)始尋找可疑的模塊、代碼片段或針對(duì)組件的惡意篡改了。
首先,我們可以根據(jù)一組YARA規(guī)則來(lái)掃描文件系統(tǒng)內(nèi)容,并且,這些規(guī)則可以基于已知的IoT惡意軟件或啟發(fā)式規(guī)則。此外,我們還可以使用防病毒掃描程序來(lái)掃描經(jīng)過(guò)解壓縮處理的文件系統(tǒng)的內(nèi)容。
同時(shí),您還可以在文件系統(tǒng)中查找啟動(dòng)腳本。這些腳本中通常會(huì)包含每次系統(tǒng)啟動(dòng)時(shí)所加載的模塊列表。而惡意模塊的地址就很可能會(huì)被插入到這些腳本中。
在這里,我們可以利用Firmwalker工具來(lái)掃描解壓縮的文件系統(tǒng),查找潛在的易受攻擊的文件。
Firmwalker的功能(https://craigsmith.net/Firmwalker/)
另一個(gè)需要研究的地方是引導(dǎo)加載程序組件,盡管這更具有挑戰(zhàn)性。
在物聯(lián)網(wǎng)設(shè)備中有很多常用的引導(dǎo)加載程序,其中U Boot是最常見(jiàn)的。實(shí)際上,由于U Boot具有高度的可定制性,這使得確定編譯后的代碼是否被操縱變得非常困難。另外,在不常見(jiàn)或自定義的引導(dǎo)加載程序中查找惡意修改將會(huì)更加繁瑣。
IoT固件分析
目前,已經(jīng)有許多開(kāi)源和閉源工具可以幫助我們來(lái)分析固件。不過(guò),實(shí)際工作中我們最好采用經(jīng)驗(yàn)豐富的固件分析師所推薦的工具和技術(shù)組合。
下面,讓我們從功能最為豐富的固件分析工具Binwalk開(kāi)始介紹。Binwalk可以用來(lái)掃描固件二進(jìn)制文件并查找已知的模式和簽名。
該工具不僅擁有IoT設(shè)備各種引導(dǎo)加載器和文件系統(tǒng)的簽名集合,還提供了用于普通加密和壓縮算法的簽名,以及用于解壓縮和解碼的相應(yīng)例程。
除此之外,Binwalk還能夠提取在固件二進(jìn)制文件中發(fā)現(xiàn)的組件。
下面的截圖顯示了Binwalk掃描一個(gè)樣本固件二進(jìn)制文件后的輸出結(jié)果:
Binwalk工具的掃描結(jié)果
在上圖中,Binwalk已經(jīng)找到并打印出了頭部信息、引導(dǎo)加載程序、Linux內(nèi)核以及文件系統(tǒng)。此外,還輸出了從頭部信息和組件本身提取出的元數(shù)據(jù)的相關(guān)細(xì)節(jié)信息,如每個(gè)組件的類型和大小、CRC校驗(yàn)和、重要地址、CPU架構(gòu)、鏡像名稱等。現(xiàn)在,我們可以繼續(xù)使用Binwalk來(lái)提取上述組件,或者根據(jù)Binwalk找到的起始偏移量手動(dòng)計(jì)算其大小,并提取相關(guān)組件。
提取完固件的組成部分后,我們還可以繼續(xù)提取、解壓甚至掛載文件系統(tǒng),以考察文件系統(tǒng)的內(nèi)容。當(dāng)然,我們也可以在反匯編器中查看引導(dǎo)加載程序的代碼,或者通過(guò)調(diào)試器對(duì)其進(jìn)行調(diào)試。
然而,固件分析并不總是那么簡(jiǎn)單。實(shí)際上,由于固件種類太過(guò)繁多,以至于理解其結(jié)構(gòu)和提取組件通常是相當(dāng)繁瑣的。
下面,讓我們仔細(xì)考察另一個(gè)樣本固件,并嘗試了解它的結(jié)構(gòu)。
1. Binwalk firmware.bin
Binwalk的掃描結(jié)果中沒(méi)有顯示任何內(nèi)容。這意味著B(niǎo)inwalk沒(méi)有發(fā)現(xiàn)任何已知的簽名。
Binwalk的掃描結(jié)果
在這種情況下,我們發(fā)現(xiàn)簡(jiǎn)單的Binwalk掃描沒(méi)有太大的幫助。但是,請(qǐng)注意,我們還可以使用其他工具和技術(shù)來(lái)深入了解固件的結(jié)構(gòu)。
2. File firmware.bin
下面讓我們利用Linux系統(tǒng)的file實(shí)用程序來(lái)考察這個(gè)固件的二進(jìn)制文件。
File實(shí)用工具的輸出結(jié)果
File實(shí)用程序?qū)⒃撐募念愋惋@示為T(mén)arga圖像數(shù)據(jù)。通過(guò)查看二進(jìn)制文件的頭部,并對(duì)Targa圖像數(shù)據(jù)簽名進(jìn)行Google搜索,發(fā)現(xiàn)這顯然是誤報(bào)。
固件二進(jìn)制文件的第一個(gè)字節(jié)的內(nèi)容
之所以出現(xiàn)這種誤報(bào),是因?yàn)檫@個(gè)固件文件的第一個(gè)字節(jié)的內(nèi)容0x01010000與Targa圖像數(shù)據(jù)的簽名相匹配,具體請(qǐng)看上面的截圖。
3. Binwalk -E firmware.bin
現(xiàn)在,讓我們開(kāi)始使用Binwalk工具的另一個(gè)功能:檢查固件二進(jìn)制文件的熵。
使用“-E”命令選項(xiàng)運(yùn)行Binwalk時(shí),會(huì)輸出固件二進(jìn)制文件的熵圖,以及一些額外的詳細(xì)信息,如熵增和熵減的起始處的偏移量。
與熵相關(guān)的詳細(xì)信息
熵圖
熵值接近1的內(nèi)容表示經(jīng)過(guò)了壓縮處理,而熵值較低的內(nèi)容表示未壓縮和未加密。從上面的截圖可以看出,偏移量55296(0xD800)開(kāi)始,熵值進(jìn)入高值區(qū)。
此外,還有另一個(gè)工具可以用來(lái)對(duì)二進(jìn)制文件進(jìn)行可視化處理:binvis.io。通過(guò)它,我們可以通過(guò)兩個(gè)并排的窗格來(lái)考察固件文件的內(nèi)容,并將其可視化。對(duì)于文件的不同的部分,會(huì)根據(jù)熵值以不同的顏色加以顯示。
由binvis.io創(chuàng)建的固件的可視化結(jié)果
4. Binwalk -A firmware.bin
此外,Binwalk還可以掃描二進(jìn)制文件,以尋找常見(jiàn)的可執(zhí)行操作碼的簽名。
在文件中發(fā)現(xiàn)的第一個(gè)函數(shù)序言
在文件中發(fā)現(xiàn)的最后一個(gè)函數(shù)序言
從上面的截圖中我們可以看到,操作碼簽名檢查結(jié)果其實(shí)是非常有用的! 首先,我們可以藉此判斷出該固件屬于ARM設(shè)備。
其次,如果我們考慮到第一個(gè)和最后一個(gè)函數(shù)序言簽名的偏移量,我們可以得到這樣一個(gè)結(jié)論,即這些偏移量指向固件二進(jìn)制文件中存放代碼的段(sections)。
從截圖中我們還可以看到,最后一個(gè)函數(shù)是在地址0xD600處找到的,也就是在熵上升的部分之前的0x200字節(jié)處。由此,我們可以進(jìn)行一個(gè)有根據(jù)的猜測(cè):這個(gè)偏移量很可能指向引導(dǎo)加載程序代碼的結(jié)束位置,同時(shí),也是壓縮后的內(nèi)核模塊的開(kāi)始位置。
5. Hexdump -C
hexdump-Cfirmware.bin|grep-C4-e“^*$”
現(xiàn)在,我們知道了固件文件中一些組件的大致邊界,接下來(lái),我們就可以通過(guò)查看這些區(qū)域周?chē)碳募膶?shí)際內(nèi)容來(lái)確認(rèn)這些邊界的具體偏移量了。
如果我們通過(guò)hexdump來(lái)處理固件文件,并尋找只包含星號(hào) "*"的代碼行,我們就可以找到每個(gè)固件組件的編譯器添加的填充字節(jié)。
固件二進(jìn)制文件的內(nèi)容
固件二進(jìn)制文件其他部分的內(nèi)容
通過(guò)Hexdump實(shí)用程序的輸出內(nèi)容,加上之前的發(fā)現(xiàn),我們就能確認(rèn)該固件二進(jìn)制文件中包含ARM代碼的部分。我們之前曾懷疑這段代碼屬于引導(dǎo)加載程序。
6. Strings –radix=x firmware.bin
接下來(lái),讓我們從固件中提取ASCII字符串以及相關(guān)的偏移量。
最后在固件二進(jìn)制文件中找到的ASCII碼字符串
從上面的截圖來(lái)看,其中有一些是與模塊入口點(diǎn)相關(guān)的字符串。這些字符串可以幫助我們更好地了解相關(guān)代碼的性質(zhì)。
在下面的截圖中,我們可以從固件二進(jìn)制的開(kāi)頭部分看到一些讓人感興趣的字符串。例如,庫(kù)名“MctlApplet.cpp”可以用來(lái)查找來(lái)自同一開(kāi)發(fā)商的其他二進(jìn)制文件或軟件包。擁有來(lái)自同一廠商的其他固件鏡像有助于更好地理解這些二進(jìn)制文件的結(jié)構(gòu)。
從同一截圖中,另一個(gè)引起我們關(guān)注的字符串是“Not Booting from softloader”,它可能用于表示進(jìn)程狀態(tài),或這個(gè)模塊的性質(zhì)。
同時(shí),含有“Assert()”的字符串也可能暗示代碼的不同信息。使用Asserts函數(shù)是固件開(kāi)發(fā)中非常常見(jiàn)的一種做法,因?yàn)樗梢詭椭_(kāi)發(fā)人員在開(kāi)發(fā)和生產(chǎn)階段調(diào)試和排除代碼中的故障。
在固件二進(jìn)制文件中找到的第一個(gè)ASCII字符串
7. IDA -parm firmware.bin
到目前為止,我們已經(jīng)從這個(gè)固件二進(jìn)制中收集到了很多有價(jià)值的信息,而這些信息在一開(kāi)始看來(lái)是相當(dāng)難以理解的。
現(xiàn)在,讓我們使用IDA來(lái)考察這些代碼。由于這個(gè)二進(jìn)制文件不是一個(gè)具有標(biāo)準(zhǔn)頭部的ELF文件,因此,我們需要顯式地告訴IDA使用ARM指令集來(lái)反匯編代碼。
IDA中函數(shù)部分的反匯編視圖
上面來(lái)自IDA的屏幕截圖顯示了如何使用在前面的分析步驟中找到的字符串來(lái)幫助查找對(duì)內(nèi)核模塊入口點(diǎn)的調(diào)用。
8. dd
現(xiàn)在,我們可以繼續(xù)提取固件二進(jìn)制代碼部分,我們分析后發(fā)現(xiàn)該部分屬于引導(dǎo)加載程序模塊。
9. Qemu
從固件二進(jìn)制文件中提取所有模塊(文件系統(tǒng)內(nèi)容、內(nèi)核模塊和其他組件)之后,我們就可以使用Qemu來(lái)運(yùn)行這些二進(jìn)制文件了,甚至可以模擬運(yùn)行與我們自己機(jī)器的體系結(jié)構(gòu)不同的文件,并與它們進(jìn)行交互。
小結(jié)
如今,物聯(lián)網(wǎng)設(shè)備的數(shù)量正在與日俱增。從工業(yè)控制系統(tǒng)、智慧城市、汽車(chē)到消費(fèi)級(jí)設(shè)備,如手機(jī)、網(wǎng)絡(luò)設(shè)備、個(gè)人助理、智能手表以及種類繁多的智能家電等,到處都可以看到物聯(lián)網(wǎng)設(shè)備的身影。
物聯(lián)網(wǎng)設(shè)備源自于已經(jīng)存在多年的嵌入式系統(tǒng)。由于這些設(shè)備的自身特性的緣故,嵌入式設(shè)備軟件的制造和開(kāi)發(fā)一直有著不同于通用計(jì)算機(jī)系統(tǒng)的優(yōu)先考慮事項(xiàng)。這些優(yōu)先事項(xiàng)是由設(shè)備本身的有限和特定功能、底層硬件的有限能力和容量以及所開(kāi)發(fā)的代碼無(wú)法進(jìn)行后續(xù)更改和修改所決定的。同時(shí),物聯(lián)網(wǎng)設(shè)備與傳統(tǒng)的嵌入式系統(tǒng)還是具有顯著的差異的。如今,大多數(shù)物聯(lián)網(wǎng)設(shè)備都在具有與通用計(jì)算機(jī)系統(tǒng)相似功能的硬件上運(yùn)行。
隨著物聯(lián)網(wǎng)設(shè)備變得越來(lái)越普遍,它們現(xiàn)在正在訪問(wèn)和控制我們生活和日?;?dòng)的許多方面。物聯(lián)網(wǎng)設(shè)備現(xiàn)在有可能給攻擊者帶來(lái)前所未有的入侵機(jī)會(huì)。這不僅凸顯了物聯(lián)網(wǎng)設(shè)備安全的重要性,也彰顯了圍繞這一主題進(jìn)行研究的現(xiàn)實(shí)意義。不過(guò),好消息是,目前已經(jīng)有許多工具和技術(shù)可用于協(xié)助安全研究人員進(jìn)行該領(lǐng)域當(dāng)前和未來(lái)的相關(guān)研究。掌握物聯(lián)網(wǎng)設(shè)備的架構(gòu),學(xué)習(xí)這些設(shè)備所用的語(yǔ)言,以及堅(jiān)定的決心和毅力是進(jìn)入這個(gè)研究領(lǐng)域所必需的。
編輯:hfy
-
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3606瀏覽量
129596 -
cpu
+關(guān)注
關(guān)注
68文章
10888瀏覽量
212360 -
智慧城市
+關(guān)注
關(guān)注
21文章
4269瀏覽量
97505 -
物聯(lián)網(wǎng)設(shè)備
+關(guān)注
關(guān)注
1文章
235瀏覽量
19779
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論