0x00 前言
随着物聯網IOT的飛速發展,各類嵌入式裝置, 路由器安全研究也越來越火. 但因為跟以往純軟體安全研究的要求不同, 這類研究往往需要結合相應的硬體知識. 很多朋友困惑如何開始, 甚至卡在了該選何種工具上. 是以汪汪将會在系列文章中分享一些實戰案例和相應的工具使用. 希望能對嵌入式安全研究起到抛磚引玉作用.
在WINKHUB這個案例中我們将使用幾款簡單的入門工具如萬用表; UART 轉接頭和導線等. 同時将介紹一種通過晶片阻斷的方式, 擷取系統ROOT權限的攻擊方法. 這種方法是俗稱邊信道攻擊中最容易上手的一種. 汪汪希望可以借此小文讓大家體驗下, 并不是所有的邊信道攻擊都那麼的高不可攀.

0x01 必備神器UART轉接頭
正所謂工欲善其事必先利其器, 擁有得心應手的輔助工具, 對我們研究嵌入式裝置安全将起到事半功倍的作用. 而說起嵌入式裝置不管是開發調試還是安全研究, 都會用到UART轉接頭 這個神器.
UART接口簡稱通用異步收發傳輸器, 是一種通用串行資料總線.我們可以通過它來調試目标裝置. UART 口在PCB上通常分為: Vcc; GND; TX; RX 這4口. 而UART轉接頭則在電腦USB 口之間取到轉接的作用.
UART轉接頭在配置上非常簡單. 隻需在目标PCB闆上找到正确的UART 端口, 并設定好如baud rate 這類參數便可以使用諸如Minicom這類程式跟目标進行通訊了. 凡是有配置過CISCO 路由器的朋友對此操作界面一定不會陌生.
但是通常PCB闆上會将用于調試的UART 端口隐藏 or 存在多個UART端口. 如何在目标PCB闆上找到正确的UART 端口, 也是個可以探讨的話題. 不過因為我們今天的目标WINKHUB已經明确的辨別出UART端口位置, 是以暫且不表.
還有個值得注意的地友善是正确的baud rate 參數. 比如常見的9600 or 115200. 如果此參數設定不對, 我們便無法看到正确的調試資訊. 這時我們可以使用專門用來确定未知串行行裝置波特率程式baudrate來發現正确的參數.而其工作原理是試圖把所有的baudrate都過一遍,直到螢幕上顯示清晰的調試資訊.
0x02 WINKHUB 物聯網關
終于到今天的主角上場了, 本次的攻擊目标是這款名為WINKHUB 的物聯網關. 你是否好奇為何需要此類網關裝置呢? 玩過IOT裝置的朋友就會發現, 現有的IOT産品僅同時支援1到2種互聯方式. 比如Philips的HUE智能燈系列采用Zigbee作為聯接技術. 而使用者若是想把HUE跟使用Bluetooth的智能門鎖互聯,還需要在添加額外裝置. 這從使用者體驗的角度上來說是非常不友善的. 而WINKHUB網關的優勢就在于其同時支援WIFI; Bluetooth4.0; Zigbee; Z-Wave 和 RF 等主流的IOT 聯接方式. 換句話說使用者隻需要買一個這樣的網關, 就不用擔心不同IOT産品間的相容問題.
然而成也蕭何,敗也蕭何. WINKHUB 在功能上的優勢, 也給攻擊者提供了更多的攻擊向量. 作為一款智能網關以往家用路由器上常出現的安全隐患也依然存在. 譬如在早期的固件版本中就存在Command execution 漏洞 (set_dev_value.php). 而在官方修複的新版本中又被發現了SQL Injection漏洞.
圖上為包含Command execution 漏洞的PHP 代碼段. 通過此漏洞我們可以root 權限執行任何系統指令. 比如讀取shadow 檔案.
0x03 邊信道 (NAND Glitch)
NAND Flash 在嵌入式系統中通常用來存儲固件, Bootloader, 核心以及root files. 是整個系統中最重要的. 同時也是攻擊者最想搞定的目标之一. NAND Flash 的容量大小, 接口數也跟晶片的不同而不同. 大家可以通過查datasheet 的方式來确認. 在前面提到代碼漏洞爆出後. WINKHUB的廠商通過軟體更新的方式迅速将其修複. 但對廠商來說, 還有一種攻擊方式卻沒那麼容易修複. 這便是用NAND 晶片作為切入點, 通過邊信道攻擊來得到ROOT權限. 而這也是當年成功拿下XBOX 遊戲機的方法之一.
(圖為XBOX 遊戲機NAND Flash)
有很多朋友一提到邊信道攻擊,就覺得是個特别高大上. 其實邊信道攻擊也分好幾種方式. 除了大家普遍了解的資訊洩露之外, 錯誤注入攻擊(Fault Glitch) 也是很常見的一種攻擊方式. 跟資訊洩露測量不同的是, 錯誤注入攻擊的目的往往在于改變程式的運作流程, 尤其是在安全認證機制上. 或者通過阻斷核心被正常讀取的方式, 強制系統進入U-boot shell模式.
錯誤注入攻擊通常使用雷射; 熱能; 噪音等作為而錯誤注入的傳輸源. 不過也可簡單到通過一條資料線接GND的方式來完成攻擊. 但是必須注意的是錯誤注入(Fault Glitch) 具有結果難于預測特性. 尤其是在 timing 的掌控上. 汪汪在實際測試過程中因操作不當, 曾毀壞過2台 WINKHUB.
0x04 NAND Glitch 實戰
本文中的錯誤注入攻擊便是通過阻斷核心被正常讀取的方式, 強制WINKHUB系統進入U-boot shell模式來得到root 權限. 通過讀datasheet 我們可以發現 WINKHUB 的NAND Flash 的第29号PIN 為資料輸入輸出口.
我們首先通過萬用表查找GND 口. 随後使用普通的資料線在系統啟動, 并嘗試讀取NAND晶片中的核心等資訊的瞬間短接以達到資料阻斷(NAND Glitch) 的目的.
但大家在完成這看是簡單的過程中一定要小心仔細. 原因可以看圖中29号PIN的實際大小來感受下.
不過多加練習幾次後, 也就運用自如啦. 再系統進入U-boot Shell 後, 我們便可以通過修改核心參數得到ROOT Shell. 整個過程大家可以觀看以下視訊.
0X05 總結
通過這個案例, 相信大家在嵌入式攻擊方式上有了更多的了解. 有時候純軟體的步驟無法達到目的時, 可以考慮下硬體比如邊信道的方式. 同時汪汪覺的開發者們在設計一款嵌入式裝置的時候, 也可以多從攻擊者的角度考慮. “ Think like an attacker ” 絕不僅僅是說說而已. 劍走偏鋒, 逆其道行之. 攻擊者往往會從你想不到的地方作為攻擊點.
0x06 參考文獻