摘要
現在,每天都有大量新設備接入物聯網,但是迫于市場的壓力,這些設備的安全性和隱私性往往沒有得到足夠的重視。為了評估和改善這些設備的安全狀況,研究人員需要對它們進行逆向工程。不幸的是,這可不是一個容易的任務,因為他們需要面對各種不同的智能對象,并且它們經常使用定制的硬件、固件、操作系統和協議,這意味著每次逆向工程都需要從頭開始,這是相當費時費力的。
在本文中,我們將解決這個問題,并提出一個更容易的方法來逆向智能對象。我們的思路是,在許多情況下無需關注對象本身,而是關注相關的移動應用程序。我們詳細介紹了該方法在三個智能對象上的應用,結果表明這種方法的效果非常棒。實驗的設備包括:智能牙刷、智能手表和家用安全報警器。
引言
在牛津英語詞典中,將物聯網(IoT)定義為“互聯網的進一步拓展,能讓日常生活中的所有對象互聯互通,允許它們發送和接收數據”?,F在,物聯網正在逐步走入我們的生活。2014年,約有20億個物聯網設備,這已經超過了筆記本電腦和臺式電腦的數量(15億),并且與智能手機的數量(18億)相當。一些最常見的物聯網對象包括:智能手表(請注意,截止2015年第4季度,智能手表的出貨量就已經超過了瑞士手表)、健身腕帶(通常用于人類,但也可用于貓和狗的設備,如奧托寵物系統)、智能電視和智能眼鏡。但這些只是其中的很少一部分,物聯網設備實際上涉及廣泛的領域:
娛樂領域,例如Archos公司的音樂智能比尼帽,Mattel公司的智能芭比娃娃Hello Barbie。
高科技領域,例如Recon Instruments公司的增強現實防雪面罩,Narrative公司的可穿戴相機等。
時尚領域,例如Volvorii公司的物聯網高跟鞋或服裝。
農業領域,例如奶牛授精。
健康和安全領域,例如Netatmo June公司的皮膚暴露檢測儀,Vigo公司的睡眠檢測儀,Glow-Cap公司的藥物提醒帽。等等。
然而,這些設備的隱私和安全問題卻非常讓人擔憂。迫于市場壓力,這些物聯網設備通常會急不可耐的盡早面世,因此,通常都沒有經過適當的安全審查,有時甚至缺乏正確的安全設計。例如,HP研究發現,90%的IoT設備至少會收集一條個人信息,70%的設備使用未加密的網絡,10個UI中有6個設備容易受到諸如XSS和弱憑證的威脅。根據這些現狀,IDC預測到2016年12月,90%的IT網絡將因IoT的安全漏洞而遭受威脅。在消費者方面,埃森哲咨詢公司在28個不同國家對28,000個人進行了調查結果表明,47%的消費者對IoT存在隱私和安全擔憂。
為了評估智能對象的安全性和隱私性,研究人員需要密切分析它們的具體實現。但是,由于技術文檔很少,所以第一步通常需要對相關設備進行逆向工程。逆向工程本來就不是一個輕松的任務,對于物聯網設備來說,就更加困難了,因為(i)它們使用的組件越特殊,人們對它的了解就越少,以及(ii)因為智能對象彼此差異很大。前者需要了解陌生領域的專業知識(例如,Riot,Contiki,Brillo等操作系統),而后者則意味著需要逆向智能對象,但是逆向一個智能對象的經驗,在逆向其他對象的時候幫助不大。例如,智能手表的逆向工程與智能牙刷的逆向工程幾乎沒有共同之處。因此,在第一個任務期間獲得的經驗對第二個任務幾乎沒有幫助。
這些正是本文要解決的問題。我在這里提出了一種簡單的方法,并且我已經多次實踐,證明該方法確實有效。這種方法能夠使得逆向過程的前面幾步更加簡單,從而有助于研究人員更快地了解設備本身。此外,它還能提供許多有價值的信息,可以使進一步的逆向工作更集中、更有針對性。
在本文中,我們首先討論這個主題的前期工作(第2節),然后解釋我們使用的方法(第3節)。然后,通過三種不同智能對象舉例說明我們的方法:智能牙刷(第4節)、智能手表(第5節)和(第6節)。最后,我們將對這種方法進行總結。
發展現狀
雖然物聯網已經開始流行,但是,其安全研究仍處于早期階段,相關的出版物也遠少于其他領域,如操作系統安全。我們可以引用的文獻有NEST恒溫器、WeMo電源插座、健康輸液泵中的漏洞、在Fitbit Flex dongles中注入任意代碼、藍牙掃描、嬰兒監視器等等。一方面,這些研究為逆向物聯網設備提供了有趣的線索,同時,也說明了不同的智能對象的差距是多么大,以及研究人員為了了解它們而需要做的工作量有多么大。
參考文獻[14]將這項任務比作CTF競賽,這看起來是非常合適的,因為每個挑戰是不同的而且非常耗時,并且在網絡上也找不到立即可用的解決方案。
在學術界,一些研究人員提出了相關的方法或自動化方法來幫助逆向固件。文獻[15]給出了物聯網不同攻擊面的詳細清單。該清單有助于在安全審核/滲透測試時防止遺漏某些領域。然而,它對逆向工程本身沒有提供幫助,只是旨在幫助我們涵蓋安全相關的所有方面。對于自動化框架和工具,它們是有發展潛力的,但目前仍處于早期階段,因此現在還難以在實踐中大展拳腳。
方法論
為了簡化物聯網設備的逆向工程,本文提出了以下方法:這種方法不是直接逆向智能對象本身,而是首先側重于逆向與它們打交道的移動應用程序。
許多物聯網設備都是通過相關的移動應用程序來進行控制、監督或與之交互的。例如,Meian公司的安全報警器就提供了相應的Android應用程序,幫助最終用戶啟動、停止設備,獲取狀態或設置警報區域。類似地,Beam牙刷也配備了與智能牙刷等通信的iOS或Android應用程序。當有這樣的移動應用程序可用時,那就為我們提供了很大的優勢:
更簡單。有許多工具可以用來逆向移動應用程序(例如apktool、baksmali、clutch以及IDA Pro)。反病毒分析師經常使用這些工具來考察移動病毒,因此我們會有一個良好的支持社區。
安全性。物聯網供應商開發這些移動應用程序(因為它們對最終用戶很有吸引力)通常是處于營銷的角度來考慮的,所以不會將它們完全集成到其安全設計中(如果有的話)。因此,我們通常有機會訪問這些移動應用程序未經混淆的源代碼,更有甚者,我們還能在這些應用中找到危及智能對象本身的安全漏洞,具體參考第6節。
退可守。如果針對移動應用的分析不足以解決問題,則研究人員總是可以將逆向智能對象作為研究的第二步。在第一階段收集的信息很可能有助于在第二階段進行更有針對性的逆向工程。
Beam牙刷
概述
智能牙刷的問世已經有一段時間了,但直到2015年才引起了相關媒體的關注,因為當時Beam在一份圍繞其聯網設備的牙科保險計劃中提到了它。每支Beam牙刷都納入了牙科保險計劃,并且每支牙刷有自己的特殊優惠(例如免費牙膏)和附屬牙醫。
與胰島素泵或起搏器相比,牙刷可能還涉及不到最敏感的健康數據。然而,一旦與保險單掛鉤,就會引發多個問題,無論從安全教育角度還是從隱私角度考慮,考察該牙刷的工作原理都是非常有趣的。
該牙刷除了提供其商品規格:藍牙LE 4.0(BLE)、聲波電機、尺寸和顏色之外,沒有提供其他技術信息。此外,也沒有用戶論壇,沒有開發者社區,也沒有學術出版物。不幸的是,這種情況對于物聯網設備來說是非常常見的:我們必須從頭開始,因為沒有信息可供利用。
面對這種處境,一條路是拆卸牙刷的硬件:拆開它,拿到電子組件,探測測試點等。但是,這里我們決定重點探索該設備相關的iOS和Android移動應用。
逆向iOS應用程序
在逆向iOS應用程序的時候,它的架構對我們是很有幫助的。因為應用程序會使用名為BeamBrushData.sqlite的sqlite數據庫,其中包含多個表,如BrushEvent、ClientDevice和ClientSession(請參見圖1),所以,我們可以通過在函數名稱中搜索關鍵字“primaryKey”來列出這些表。
圖1:Beam牙刷的移動應用程序所使用的SQL表。
每個表的內容都是由mappings命名的函數進行描述的,例如Insured表的[Insured mappings]。
了解每個表的字段對于掌握哪些數據被存儲以及哪些數據可能泄露給對手是非常有用的。例如,BTStarCardInfo表包含最終用戶的積分的變化情況:name,beforeValue,afterValue,starCount,lastTotalStars,totalStars。積分是最終用戶完成指定挑戰(例如連續刷牙超過兩分鐘)時授予終端用戶的虛擬點數。攻擊者當然可以嘗試修改這里的值來獲取積分——當然,還可能存在其他相關的檢查,例如在遠程服務器上的檢查事項等。
存儲在這些表中的信息對于廣告工具包或廣告軟件來說,可能是非常有價值的。例如,Insured表保存被保險用戶的稱謂,名字,中間名,姓氏,性別和出生日期,當然用戶也可能是家庭中的成年人(通常是父親或母親)。然后,User表為家庭的其他成員(例如兒童)提供相同的信息。因此,通過分析這些表中包含的數據,間諜軟件可以了解特定家庭的組成成員,然后給他們發送有針對性的廣告等。
除了數據庫結構之外,通過反匯編iOS應用程序還能揭示它實現的類的結構。移動應用程序二進制文件的objc節提供了每個類的方法和字段的完整概述。例如,圖2示出了UserSummary類的字段——也稱為屬性(例如,beamScore,numberOfBrushDaysLeft)和方法(例如,beamScoreRoundedInteger)。此外,IDA Pro中的注釋也特別有用,甚至為每個字段的類型和方法都提供了簽名。
圖2:IDA Pro顯示了UserSummary類的方法和屬性。屬性的注釋顯示了該字段的具體類型。
從這里我們可以了解到:
牙刷提供了加速度計和陀螺儀。兩者都在BTBrushData類中提供了一個三軸向量。牙刷就是通過它們來了解最終用戶是否正在刷牙,如果是的話,當前位于哪個象限(口腔被分為四個區域,或象限:左上,右上,右下,左下)。
固件的空中下載服務。BTFirmwareUpdater類的內容表明,該固件提供了通過空中下載進行的更新服務。更新固件時,會將新固件的字節發送到牙刷,直到寫入所有字節為止。
char *firmware;
unsigned int totalLength;
unsigned int written;
unsigned int toWrite;
unsigned int loopCount;
int state;
CBService *otaService;
CBCharacteristic *otaControlPoint, *otaDataPoint;
這些積分只是軟件而已。特定最終用戶的積分數量并不存儲在牙刷本身上,而是存儲在移動電話上(并且可能在遠程服務器數據庫上)。事實上,類BTBrushData,BTBrushEvent,Device和ClientDevice中沒有積分相關的字段。從這些類的內容可以看出,牙刷是由固件、硬件、序列號、閃光燈、電池電量、電動機(其速度是可控的)、三軸陀螺儀、三軸加速度計、自動關閉定時器和具有BLE功能的芯片構成的。
逆向Android應用程序
通過逆向該Android應用程序,我們可以獲得更多的詳細信息。例如,雖然我們知道牙刷導出了幾種BLE服務和characteristic(參見圖3),但是除了標準的服務之外,大多數都是未知的。
圖3:牙刷的BLE characteristic。
通過逆向Android應用程序,能夠更輕松地找到每個characteristic的意義。例如,圖4中的代碼給出了牙刷的電動機速度(其轉換為刷子每分鐘的行程)的UUID和象限蜂鳴(當最終用戶在特定象限中的刷牙時間足夠長時,牙刷就會振動)。我們在表1和2中分別列出了已知的BLE服務和characteristic。
圖4:用于電機速度和象限蜂鳴的BLE characteristic。
UUID 描述
00001800-0000-1000-8000-00805f9b34fb 通用訪問(標準)
c05fc343-c076-4a97-95d3-f6d3e92a2799 固件 OTA 服務
04234f8e-75b0-4525-9a32-193d9c899d30 Beam 服務
89bae1fa-2b59-4b06-919a-8a775081771d 可能是加速度計/陀螺儀芯片服務
表1:Beam牙刷的BLE服務。
UUID 描述
a8902afd-4937-4346-a4f1-b7e71616a383 布爾指示器,指示牙刷處于活動狀態
267b09fd-fb8e-4bb9-85ccade55975431b 電機狀態
3530b2ca-94f8-4a1d-96beaa76d808c131 當前時間
833da694-51c5-4418-b4a9-3482de840aa8 電機速度
19dc94fa-7bb3-4248-9b2d-1a0cc6437af5 自動關閉和象限蜂鳴指示器(2位)
6dac0185-e4b7-4afd-ac6b-515eb9603c4c 電池電量(2字節)
0971ed14-e929-49f9-925f-81f638952193 牙刷顏色(1 byte)
0227f1b0-ff5f-40e3-a246-b8140205bc49 加速度計數據(6字節)
ed1aa0cf-c85f-4262-b501-b9ddf586a1db 陀螺儀(6字節)
cf0848aa-ccdb-41bf-b1e1-337651f65461 按鈕狀態
表2:我們對Beam牙刷最感興趣的BLE characteristics
有了這些信息,我們便可以使用自己的實現代碼來控制自動關閉和象限蜂鳴功能了。
我們可以控制的功能包括:
打開與牙刷的BLE連接。
將字節值寫入相應的characteristic UUID中。最低有效位用來控制象限蜂鳴,第二位控制自動關閉。
斷開牙刷的連接。
BLE命令可以使用諸如建立在bluez(藍牙棧實現)之上的gattlib [21]之類的庫和簡單的BLE USB dongle來發送。
利弊
通過對Beam牙刷的移動應用程序進行逆向,我們發現了下列有效信息。
存在陀螺儀和加速度計。這一點上,通過拆卸牙刷的硬件也能達到同樣的效果,只不過做起來可能會有點難度,具體取決于芯片的封裝方式。顯然,逆向移動應用程序的優點是我們不需要拆開牙刷,并且也沒有毀壞它的風險。缺點是我們看不到組件的銘牌和型號,因此也無法了解其電器規格。
存在固件更新服務。對于這一點來說,很難通過其他方式(例如通過監聽BLE流量)來獲得。
積分并未存儲在牙刷本身中。這一點很難通過硬件探測或BLE掃描找到。
實現代碼的設計。顯然,沒有反匯編代碼的話,是沒有辦法了解這一點的。我們唯一不知道的部分,就是硬件設計。
識別BLE服務和characteristic。這一點也可以使用BLE掃描器應用程序(例如nRF主控制面板[22])來達到目的,但需要消耗更長的時間,因為必須通過嘗試各種值,然后通過觀察牙刷的行為差異來進行識別。
智能手表
架構
我們對索尼的智能手表SmartWatch 2 SW2進行了相應的實驗。
與Beam牙刷不同,這款智能手表提供了很多技術信息和開發人員信息,這主要得益于索尼鼓勵開發人員為其編寫新的應用程序。索尼為該產品提供了相應的API、文檔、示例和教程。該智能手表含有STM32F439 SoC(包括ARM Cortex-M4和加密加速器)、光傳感器、加速器,支持NFC和藍牙3.0(注意不兼容低功耗藍牙技術)和LiPo電池。它運行的是Micrium的μC/ OS-II實時操作系統。
知道了這一點,那么就可以請μC/ OS-II或ST微電子SoC專家繼續對設備的相關部件進行深入調查。在本文中,我們假設研究人員無法接觸這方面的專家,相反,我們將重點研究該智能手表的應用情況。要使用智能手表,必須至少安裝兩個Android應用程序:一個名為Smart Connect的應用程序以及一個名為SmartWatch 2 SW2的應用程序。這里,我們將重點考察這兩個應用程序。
要了解這些應用程序,必須首先掌握索尼的有關術語。對于索尼而言,智能手表更一般的稱呼為智能配件,因為還有其他類型的配件,如耳機等。一個智能手表的“應用程序”(我們稍后就會發現,實際上根本沒有這樣的東西)被稱為智能擴展。
要創建新的智能擴展程序,開發人員需要對使用了索尼的智能擴展API的代碼進行編譯,從而得到一個Android應用程序(即一個.apk程序,研究人員可以使用標準工具,如apktool,baksmali等對它們進行逆向)——但需要注意的是,只有將我們前面提到的兩個應用程序都安裝之后,該應用程序才能正常運行。
因此,為了安裝智能擴展程序,最終用戶需要安裝開發人員的apk,即Android應用程序。該應用程序由兩個強制性應用程序之一的Smart Connect自動找到,并添加到相應的智能配件中。這樣,新的智能擴展圖標就會出現在智能手表上。
需要注意的是,我們沒有在智能手表本身上直接安裝軟件。事實上,根本就沒有智能手表應用程序的概念。實際上,智能擴展的所有工作都是在智能手機上完成的。智能手表基本上只是充當一個遠程顯示器。智能擴展生成的各種事件和消息都是由兩個強制性應用程序中的第二個,即SmartWatch 2 SW2生成的。這個應用程序實際上就是索尼所謂的主機應用程序,即專門用來跟給定智能附件(就本例而言,就是SW2)通信的Android應用程序。我們在表3和圖5中對相關的術語進行了詳細的解釋,需要注意的是,其中一些很容易引起誤解。
圖5:索尼SmartWatch 2 SW2的架構。
名稱 說明
主機應用程序專門用于跟特定智能配件通信的Android應用程序的通用術語。
智能配件 智能手表、智能耳機等的通用術語
Smart Connect這是必須安裝在智能手機上才能使用智能手表的兩個強制性Android應用程序之一。這是一個官方的索尼應用程序。它管理哪個擴展使用哪個配件。它的軟件包名稱是com.sonyericsson.extras.liveware。
智能擴展 這是一個Android應用程序,它在手機上運行,但可從智能手表遠程訪問/控制。索尼提供了幾個擴展(Twitter feed,Facebook feed,Chrono),并鼓勵開發人員創建自己的擴展。
Smart Watch 2 SW 2這是SW2的兩個強制性Android應用程序中的另一個。實際上,它是SW2配件的主機應用程序。這是一個官方的索尼應用程序,該軟件包名為com.sonymobile.smartconnect.smartwatch2。
表3:索尼的智能手表術語。
推論
知道了智能手表的架構之后,可以得到下列推論:對于智能手表上的任何擴展,實際上都可以通過逆向其Android應用程序的代碼來進行安全分析。
我們假設,需要考察發送SMS消息的擴展。智能手表本身沒有什么可逆向的,相反,我們需要做的是反匯編相關的Android應用程序,這樣,就能找到像smsManager.sendTextMessage(mPhoneNumber,null,message,...)這樣的代碼。如果智能手表惡意軟件的確存在并在傳播的話,防病毒供應商只需要為相應的Android應用程序寫簽名即可,這些事情正是他們所擅長的。
此外,我們還可以對官方SmartWatch 2 SW2主機應用程序也進行逆向工程。逆向結果表明,與遠程智能手表的通信是通過“Costanza”消息來進行處理的。這些消息由類型(消息類型),消息標識符和打包的緩沖區字節組成。打包或解包是通過名為“protocol”(libprotocol.so)的本機庫進行處理的。一旦打包完畢,這些消息就可以通過藍牙進行發送了——這里是通過Android API來打開藍牙套接字的。Costanza消息的類型有多種,例如:
電池電量指示(id = 18),電量水平以百分比形式表示。
恢復出廠設置的請求和響應(id = 20或21)。
'Force crash'(id = 666)。源代碼表明,這里有一個隱藏的調試界面,其中含有“Force crash on watch”按鈕。這將創建以下消息:
public RequestForceCrash(int
newMessageId) {
super(newMessageId);
this.type = 666;
this.mMagic = 0xC057A72A;
}
注意類型666和魔法值,可能與前面講過的'costanza'消息相匹配。
Fota請求(id = 6)。這可能意味著空中下載更新固件。
傳感器數據(請求或響應)(id = 127或128)。
滑動指示(id = 116)。
版本請求和響應(id = 4和5)。
振動請求(id = 129),其中包括振動的持續時間等。
這些消息的用法和標識符將很難通過其他方式找到(特別是在正常情況下不出現的Force Crash消息)。同樣,這也證明了通過考察移動應用來分析物聯網硬件是多么的有價值。
安全報警器
Meian公司是一家家用安全報警器的制造商。該公司的一些報警器可通過SMS進行遠程控制:您可以遠程啟動/停止報警器、獲取其當前狀態、啟用/禁用某些監控區域等。當然,這些命令必須符合特定的格式,同時,還必須提供正確的密碼。為了控制報警器,最終用戶必須按照特定格式把相應的命令寫入SMS,并將其發送到報警器。當報警器接收SMS后,會對傳入的消息進行處理,并回復執行結果。由于Meian對于SMS消息的格式的要求非常嚴格,所以Meian專門實現了一個Android應用程序來自動格式化短信。在配置期間,最終用戶需要提供報警器的具體配置:報警器的電話號碼、管理密碼、輸入密碼時可接受的延遲、緊急電話號碼(如果檢測到入侵,則撥打該號碼)。然后,該應用程序就會提供用于啟動/停止/獲取警報的狀態(等等)的各種按鈕(參見圖6),這給用戶的操作帶來了極大的便利。
圖6:用于遠程控制家用安全報警器的Android應用程序的主屏幕。
同樣的,這里我們還是通過分析設備的移動應用程序來考察該設備的安全問題。這里存在兩個安全問題:
短信未刪除。發送的短信會繼續保留在智能手機上,除非手動刪除。因此,如果攻擊者能夠讀取它的話,就能得到報警器的密碼。注意,無論最終用戶是否使用該應用程序(手動寫入SMS),都會出現此問題。
報警器配置的弱保護。該應用程序使用了一個弱加密算法來保護配置數據(電話號碼、密碼、緊急電話號碼和延遲。請注意,配置數據是非常敏感的,因為任何人都可以用它來控制報警器。攻擊者可以輕松逆向該加密算法,從而解密所有的設置(參見圖7中的概念證明)。該漏洞在2015年就報告給Meian [23]公司了,但是一直沒有回應。在Play商店中的這個應用程序仍未修復該漏洞,截至目前已被下載了1,000到5,000次。
圖7:解密安全報警器的所有主要機密設置的概念證明。
這個家用安全報警器的安全狀態總結在表4中。遺憾的是,它的相關移動應用實際上給該設備的安全性帶來了很大的麻煩,這也正是其他物聯網設備正面臨的問題之一。
情形:攻擊者可以獲得報警器的密碼或電話號碼... 從發件箱的命令SMS中...? 一旦SMS消息被刪除...?
手動SMS是否
使用Meian的Android應用程序是是
表4:使用Android應用程序前后報警器的安全狀況比較
結束語
物聯網設備的安全分析具有很大的挑戰性,主要是因為它們的多樣性所導致的,有時研究人員根本就不知道如何開始或從哪里開始。本文表明,在這種情況下,我們不妨從相關的移動應用程序開始下手,因為它們通常會與物聯網設備進行通信,這是一個不錯的起點。此外,這些移動應用在物聯網設備中是非常常見的。
在本文中,我們通過相關移動應用程序分析了三種不同的設備:智能牙刷,智能手表和家用安全報警器。在所有三個案例中下,我們所用的策略都能夠快速揭示其安全設計、協議詳細信息和相關漏洞。當然,這些信息也可以通過其他方式發現,例如藍牙掃描和模糊測試,但這樣會需要消耗更多的時間,因為我們不得不猜測多種可能,而移動應用程序逆向工程則能夠直接給出結果。
事實上,物聯網和移動應用程序的結合會帶來多個問題。為此,供應商應該設法完善設備的安全設計和實現,以及提高相關的移動應用的安全性。注意,對代碼進行模糊處理的快速修復方案將很難奏效,而應該下大力氣改進安全設計和實現。另外,防病毒行業需要為IoT惡意軟件做好準備,無論來自設備本身還是來自移動應用程序。這可能是安全行業的下一個主戰場。