# 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 *  * 方法的重點在於從最近的種子開發新的輸入 * 分析種子的屬性,使用 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 *  * 測試環境 * Intel Core i9 quad-core 3.6 GHz CPU * 8G RAM * Ubuntu 18.04 * 跑 24 小時 --- *  * 發現 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`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up