---
# System prepended metadata

title: FIRMNANO：Toward IoT Firmware Fuzzing Through Augmented Virtual Execution
tags: [paper]

---

# 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`