---
# System prepended metadata

title: An Efficient Feedback-enhanced Fuzzing Scheme for Linux-based IoT Firmwares
tags: [paper]

---

# An Efficient Feedback-enhanced Fuzzing Scheme for Linux-based IoT Firmwares

## Abstract

* 隨著 IoT 設備數量增加，其安全性也越來越重要
* Fuzzing 是大規模動態測試的方式，在 IoT 設備上應用可發現設備的漏洞
* 提出一種 feedback-enhanced fuzzing 方法 for Linux-based IoT firmwares

## Introduction

* 因為 IoT 設備資源有限，優先考慮性能而非安全性，因此容易受到攻擊
* Fuzzing 可以透過提供隨機 data 來找到程式或系統中的異常
* 模擬的技術也常用於 IoT fuzzing
    * Firm-AFL 結合 user-level 和 system-level 的模擬，提供高吞吐量的 fuzzing
    * FirmFuzz 和 EWVHunter 設計爬蟲去瀏覽 IoT 的 web 介面，將收集到的資料突變重新餵給設備
    * SIoTFuzzer 在有爬蟲的 fuzzer 之上，分析資料間的關係生成有狀態的 input

### Challenges

* FirmFuzz 和 SIoTFuzzer 的 input 是由收集到的資料變異而來，然而每次變異時只修改一個 field 是找不到某些漏洞的
    * 原來: `Type=t&Addr=192.168.1.1`
    * 變異 A: `Type=XXX&Addr=192.168.1.1`
    * 變異 B: `Type=t&Addr=XXX`
    * 有漏洞的: `Type=p&Addr=A*100`
* FirmFuzz 使用爬蟲得到資料後沒有過濾重複的資料，SIoTFuzzer 雖然有過濾，但依然沒有考慮到優先度

### Solution

* 為了解決這些問題，提出一個 feedback-enhanced fuzzing scheme
    * 追蹤每個 input 的 coverage 來管理 seed
    * 當找到一個會增加 coverage 的 input 時，該 seed 在 seed pool 的分數就會提高
* 在 SIoTFuzzer 之上實現
* 評估方面，使用 FirmAE 模擬四個 routers 和一個 IP camera
    * 在更短時間找到比 SIoTFuzzer 更多的漏洞
    * 找到未知漏洞


## Overview

* ![](https://i.imgur.com/KYsQ9VM.png)
    * 方法的重點在於從最近的種子開發新的輸入
    * 分析種子的屬性，使用 two level 排序

### Workflow

1. 將爬蟲爬到的資料做第一次 fuzzing
2. 從 monitor 收集 syscall 和 basic-block 等數據評估 seed
3. 依據前面的數據算出分數，將 seed 放入 two-level queue 中
4. 循環，從 queue 裡面拿出優先度最高的 seed，並使用各種變異生成新的輸入
* 如果有新的 block 被覆蓋，將該 seed 保留
* 如果發現漏洞，保存到漏洞 report 之中

### Feedback-enhanced Monitor

* Monitor 主要收集 system call 和 basic block coverage
    * system call 使用 hook 來收集
    * coverage 使用 QEMU 插件來追蹤
* Monitor 會做三件事情
    * 收集 Basic block coverage 更新 seed set
    * 檢查設備狀態，必要時利用 snapshot 回到初始狀態
    * 輸出漏洞報告
        * Buffer Overflow (BO)
        * Command Injection (CI)
        * Cross-Site Scripting (XSS)

### Two-level Scheduler

* 如果 input 被使用在 execve 之中，將它的特權設為 1，表示更容易有漏洞
* 初始的 seed 一定會在 queue 之中；後續生成的 seed 在覆蓋率增加時會在 queue 之中
* 如果 seed 的 特權是 1，push 到 Level 1 queue，否則 Level 2
* push 到 queue 的時候根據 $Score = \frac{inc\_kernel + inc\_program}{field\_num}$ 排序
    * field_num 越小模糊測試越快

### Fuzzing Policy

* 優先從 Level 1 queue 拿 seed，全部空了才從 2 拿
* seed 變異策略
    * 更改 string 長度或是數字大小 for BO
    * 嘗試 \<script\> 標籤等等 for XSS or CI
    * 將數字改成 0 1 或是負值 for 邏輯漏洞

## Implementation and Evaluation

* 用五個 Linux-based firmware 評估，與 SIoTFuzzer 比較
* 使用 python 和 C 實現系統
* 使用 mitmproxy 和 selenium 收集資料
* Patch Linux kernel 來 hook system call
* 開發 PANDA 插件來收集 QEMU 中 coverage 的資訊
* fuzzing 階段，在 SIoTFuzzer 之上建立系統

---

* 用 FirmAE 配置 4 個 router 和 1 個 IP camera
* ![](https://i.imgur.com/cXgr4SD.png)
* 測試環境
    * Intel Core i9 quad-core 3.6 GHz CPU
    * 8G RAM
    * Ubuntu 18.04
* 跑 24 小時

---

* ![](https://i.imgur.com/chwOEgO.png)
* 發現 12 漏洞，4 個 BO、4 個 CI、4 個 XSS
    * SIoTFuzzer 只發現 6 個
* 大多數的漏洞都比 SIoTFuzzer 更快找到漏洞
* 找到 6 個 0-day 漏洞，其中一個被分配了 CVE

## Conclusion

* 提出一種 feedback-enhanced 的 fuzzing 方式 for Linux-based firmwares
    * 收集數據並選擇新 seed
    * 基於屬性跑 two-level 排序
* 比 SIoTFuzzer 發現更多漏洞，還有 5 個未知漏洞

###### tags: `paper`