# FirmFuzz: Automated IoT Firmware Introspection and Analysis
## Abstract
* 漏洞搜尋應該要是自動化的,且對獨立於設備有擴展性
* FirmFuzz 適用於 Linux Firmware 的自動化模擬與動態分析框架
* 基於灰盒的模糊測試與靜態分析
* 透過模擬和動態分析 32 個 image 來評估
* 在六個不同設備發現七個以前未知的漏洞,分配四個 CVE
## Introduction
* 隨著物聯網的興起,攻擊也越來越多。
* 該論文主要分析 Linux Firmware,它由三個部分組成
* Linux kernel
* a set of open-source software packages
* a set of custom vendor-developed applications
* 第三個不是開源且不須公開審核,因此最有可能有漏洞。
* 評估應用程式會面臨三個挑戰
* 輸入語法(格式)
* 細粒度監控
* 依賴執行環境
* FirmFuzz 克服了這些挑戰
* 利用 Web 接口為入口點生成合法輸入
* 使用 monitor 監控執行環境
* 模擬 Firmware
* 為了增強模糊測試,利用靜態分析來指導
* 雖然使用 Web 當作起點,但在執行期間會與系統互動,進一步發現深層漏洞
* 目標不是分析的廣度而是深度
* 分析 Netgear, D-Link, TRENDNet 三個廠商中 6427 個 image
* 在六個不同設備發現七個以前未知的漏洞
* 1 個 CI
* 3 個 BO
* 1 個 XSS
* 1 個 NPD(Null Pointer Dereference)
* https://github.com/HexHive/FirmFuzz
## Firmware Preprocessing
* FirmFuzz 是一個框架,透過 QEMU 對 Linux-based 的 Firmware 分析和 Fuzzing
* 
* 分三步驟
* 資訊收集
* 準備
* 模糊測試
* 支援 MIPS 和 little endian ARM
### Information Gathering Phase
* 該階段有兩個目標
* 發現用於 Web 的帳密 pair 以增加模糊器的覆蓋率
* 對 PHP 靜態分析,找出常見漏洞
* 不安全的 CI 函數(system, shell_exec)
* 汙點分析 $_GET, $_POST 找出不安全的 code
### Firmware Preparation
* 該階段將 firmware image 模擬起來
* 使用 full system 模擬,注入輔助 binaries 檔案到 filesystem 和強化 kernel 來發現更多漏洞
#### Peripheral Mapping
* 對於未知的外部設備,FirmFuzz 總是回傳 True
* 可能造成模擬不穩定
#### Helper Injection
* 該程式會在 Firmware 執行時一起執行,檢查 CI 漏洞
* 自動化且不依賴 Firmware 上的程式
* Firmadyne 不支援檢查 CI 漏洞
* 而偵測 BO 漏洞,用 Firmadyne 的 kernel 異常處理機制
* 進一步檢查 NPD 漏洞
* 不須手動分析,利用 Fuzzing 自動觸發且打包成 PoC
* XSS 漏洞,利用 host-side 的 monitoring 來偵測
#### Network Configuration
* Firmware 命名和分配到 LAN/WAN 接口的方式不同
* 採用和 Firmadyne 一樣的方式,在推理模式下模擬,紀錄 Firmware 和網路的互動,再利用紀錄去做網路配置
## Firmware Fuzzing
* FirmFuzz 使用自訂的 Fuzzer 檢測漏洞
* 
* FirmFuzz 透過模擬環境幫助模糊器發現漏洞
* FirmFuzz fuzzer 三個主要特性
* Context-driven input generation: 結合 Firmware 提供的上下文生成輸入
* Deterministic vulnerability detection: 監控整個模擬環境確認漏洞
* "Fuzzing side-effects" elimination: 利用模擬優勢,連續模糊測試而不需重啟 Firmware
* 觸發所有按鈕,找出會和 Firmware 互動的按鈕;能填入字元的地方會用預設值或是根據 ID 的關鍵字自動填入(IP, mac 等等)
* FirmFuzz 的 Fuzzer 執行 Web 中的 JS code,收集互動資訊生成模糊測試的 input
* fuzzer 和 firmware 互動的流量都會通過 proxy server,這些流量資訊都會成為 input 的變異候選
* 檢測 CI, BO, NPD, XSS,將合法的 HTTP request 做為種子做 fuzz
* 根據目標漏洞變異 request payload
* 檢測到漏洞時會將 request 和 URL 記錄成 PoC
### Syntactically Legal Input Generation
* FirmFuzz 使用 headless 瀏覽器和 Firmware 互動,因此 HTTP request 格式是否良好取決於 Web application
* FirmFuzz 必須了解 Firmware 的 Web 配置才能與其互動
* 這需要分析人員的手動驗證
### Deterministic Bug Discovery
* 傳統的檢測方法依賴 server 端的 response,但這種方法不夠精準
* FirmFuzz 監控執行期間的 log 來檢測 CI, BO, NPD
* CI 監控 execve
* BO, NPD 監控 kernel log 查看是否嘗試存取沒 mapping 到的 memory
* XSS 可以執行在 host 端檢查 request 中的 JS code 是否被執行
### Elimination of Fuzzing Side-Effects
* 模糊測試 Firmware 時,如果 Firmware 沒有回應,通常需要手動回復穩定狀態
* FirmFuzz 利用 snapshot and rollback,將模擬的 Firmware 快速回復
### Payload Delivery
* 透過觸發 Web 上的按鈕來觸發 JavaScript,並對 input field 自動推斷填入合法值
* 如果按鈕觸發 request 就會把該請求當作種子,後續變異並模糊測試
## Evaluation
* 6427 個 firmware images
* Intel i7 processor and 16GB RAM and running Ubuntu 16.04.
* QEMU 2.5.0
* Selenium WebDriver version 3.4
* mitmproxy version 0.18.2
### Firmware Images
* 
* 6427 個 images 中,有1013 個有 Linux-based 的 File System
* 203 個網路配置有推斷出來,32 個有可訪問的 Web 介面
* 同個供應商的不同設備常常有同樣的介面
### Comparison with Existing Analysis Frameworks
* 
* Firmadyne 的檢測不夠自動,且擴展性差
* w3af 無法完成認證
* ZAP 不會和 Firmware 本身互動,因此只能發現 XSS 漏洞
### Vulnerability Detection Accuracy
* FirmFuzz 藉由監控 Firmware 來降低誤報率
## Conclusion
* FirmFuzz 是用於嵌入式設備的全系統模擬與模糊測試的自動化框架
* 發現四種類型的漏洞,並找到七個以前未知的漏洞
###### tags: `paper`