# FIRMNANO:Toward IoT Firmware Fuzzing Through Augmented Virtual Execution ## Abstract * FIRMNANO是一個用於微控制器模糊測試的框架。 * 基於增強虛擬執行(augmented virtual execution),解決 1. MMIO 區域存取 2. 中斷觸發 3. DMA 支援 ## Introduction * Fuzzing 是常見的漏洞挖掘方法,但現有的測試框架缺乏 Firmware 執行的環境,無法直接用於 Firmware。 * 提出增強虛擬執行的新技術來模擬 Firmware。 * 引入 AFL * 實驗可用於現實世界 MCU ## Overview ### 挑戰 * MMIO 區域存取 * MCU 外設種類多,內存映射都不同,手動設定的話工作量太大。 * 中斷觸發 * 中斷是外設和 Firmware 互動的重要媒介,而一般的模擬器沒有中斷控制器。 * DMA 支援 * DMA 是常見的外設存取方式,如果不能模擬 DMA 控制器會缺乏 DMA 的支援。 ### 增強虛擬執行 (augmented virtual execution) * 預處理期間自動對外設 MMIO 區域進行建模,並收集中斷和 DMA 活動的資料。 * 正式執行時會自動映射 MMIO 區域,使用自訂的中斷策略發送中斷信號,並透過劫持 DMA function 來支援 DMA。 * 引入 AFL,結合 AFL-Unicorn 進行模糊測試。 ## Detailed Design ![](https://i.imgur.com/IUap9ut.png) * 使用 Unicorn-Engine CPU emulator 模擬。 ### MMIO * Firmware 透過 MMIO 暫存器來讀取外設的資料或是寫入數據。 * 預執行階段,捕捉`UC_HOOK_MEM_WRITE_UNMAPPED`和`UC_HOOK_MEM_READ_UNMAPPED`這兩個例外,然後在例外處理的 function 中紀錄外設種類和存取位置到`𝑝𝑒𝑟𝑖𝑝ℎ𝑒𝑟𝑎𝑙_𝑙𝑖𝑠𝑡`。 * 不停重複,直到沒新的外設,匯出文件`𝑝𝑒𝑟𝑖𝑝ℎ𝑒𝑟𝑎𝑙𝑠_𝑚𝑜𝑑𝑒𝑙.𝑗𝑠𝑜𝑛`。 * 正式執行時將文件導入 Unicorn-Engine 的 `mem_map` API 中。 ### 中斷 ![](https://i.imgur.com/fP2wOcw.png) * Unicorn-Engine 為了簡化 QEMU,刪除了中斷控制器等結構,因此實作了一個虛擬中斷控制器。 * 中斷觸發是外設本身的行為,因此這個中斷並不能完全模擬正常外設的操作,但依然可以幫助 fuzzing 過程。 ### DMA * DMA 讓外設不透過 CPU 就可以藉由 DMA 控制器讀寫記憶體。 * 需要了解外設的設計才能支援 DMA,但在模擬層面難以做到。 * 不直接模擬外設,而是分析符號表,劫持並抽換 DMA相關 HAL function。 ### Fuzzing * 引入 AFL 對 MCU 進行 fuzzing。 #### Hook * 預處理時透過Unicorn-Engine 的 `hook_add` API,加入`UC_HOOK_MEM_READ_UNMAPPED`和`UC_HOOK_MEM_WRITE_UNM APPED`來自動記錄 MMIO 的存取。 * 定義常用的 DMA 相關函數,形成對應符號表和起始地址的 list。 * 如果監聽成功,FIRMNANO提供接口可以自定義替換 DMA 函數。 #### Data Input * FIRMNANO 劫持了 MMIO 區域的存取,可將變異數作為 MMIO 區域讀取的回傳值達到 fuzzing。 * Firmware 也透過 DMA 傳輸資料,FIRMNANO同樣透過劫持 DMA 相關 function 實現 DMA 資料輸入。 #### 覆蓋率計算 * 使用 AFL-unicorn 執行**code-based** (我猜指 code coverage based) 的 MCU 模糊測試。 * 原始 AFL-unicorn 使用上需要手動實現內存映射、hook code、啟動 fork server,並無法支援外設和中斷,但 FIRMNANO 解決了這個問題。 ## Evaluation * 選了`4`個開源 Firmware 和`2`個自定義 Firmware。 * 中斷機制是每 `1000` 條指令就發送一個中斷。 * 建模情形如下: ![](https://i.imgur.com/zscpyzt.png) * 對所有 Firmware 執行`12`小時的 FIRMNANO,結果如下: ![](https://i.imgur.com/tLwev1V.png) ## Conclusion * 提出 FIRMNANO,是可以對 MCU 進行模糊測試的框架。 * MMIO 建模解決存取問題、實現中斷控制器解決中斷問題、劫持 DMA 相關 function 支援 DMA。 ###### tags: `paper`