# [Toward Hybrid Static-Dynamic Detection of Vulnerabilities in IoT Firmware](https://ieeexplore.ieee.org/abstract/document/9246617)
## Abstract
* 嵌入式設備中的 Firmware 大多存在漏洞,如 hardcoded passwords、cryptographic keys、insecure configurations 甚至 backdoors。
* 設計了一個混合平台,利用 offline 靜態檢測和 online 動態檢測來偵測漏洞。
## Introduction
* 由於供應商缺乏資安意識,這些 Firmware 存在各種安全問題,使設備容易受到攻擊。
* 從可利用漏洞到殭屍網路。
* 為了緩解這種狀況,有人提出檢測 DDos 的方法;雖然緩解攻擊很有價值,但檢測和修復漏洞更根本更有效。
* 漏洞檢測的方法雖然很多,但面對 Firmware 的多樣性,大多無法直接應用。
* 獨特的外部設備或沒有OS。
* 該論文中。透過結合靜態動態分析來自動檢測 IoT Firmware 的漏洞。
* 根據實驗發現三個問題:
* 許多 key 被 hardcoded 到 Firmware 中,造成敏感資訊洩漏。
* 不安全的 processes 導致流量異常、占用大量記憶體等。
* 使用不安全的 library,容易導致 buffer overflow,提供了攻擊的可能。
* 開發的檢測平台得到的貢獻:
* 靜態檢測發現已知漏洞,如 hardcoded 或不安全的 key 等等。
* 動態檢測利用 fuzzing 發現未知漏洞,主要針對網路協議。
* 利用現有的分析工具,實現 Firmware 拆包、filesystem 辨識、關鍵資訊提取等。
* 對路由器、攝影機、NVR 進行離線的靜態檢測、對攝影設備進行 online 動態檢測。
## Related work
* 靜態分析
* Sachidananda et al. 提出靜態分析框架,但漏報率和誤報率高。
* Nilo Redini et al. 提出 KARONTE,用新的靜態分析技術降低誤報。
* 動態分析
* 與靜態分析不同,動態分析需要有實體設備或是模擬器。
* Alejandro et al. 提出 DICE 可分析 DMA 輸入通道。
* Chen et al. 提出 FIRMADYNE 可自動化模擬並進行漏洞驗證。
* Srivastava et al. 提出 FirmFuzz,適用於嵌入式 Firmware 全系統模擬和模糊測試的框架。
* 漏洞檢索
* Gemini 是一種基於深度學習神經網路的方式,可生成二進制函數來搜索已知漏洞。
## Proposed platform
### Offline 靜態檢測
* 
* 輸入是 Firmware 的 binary 檔案,第一個步驟是 Firmware stripping。
* 使用 MIME tools 確定各個元件的偏移位址和文件格式(e.g., SquashFS or Cramfs),再使用對應的工具解壓(e.g., dd, squashfs-tools or uefi-firmware-parse tools)。
* 也使用 Python 的 LIEF lib 來解析格式。
* 對於 MIME 無法識別的文件格式,使用 BINWALK 工具進行解包。
* 第二步驟是逆向模組,分為兩個分析子模組。
* 第一個模組透過 magic files 和 yala rules 整合和定位檔案,主要是針對 libraries、scripts、開機程式、網路元件和執行檔等。
* 第二個模組反組譯 binary 檔,判斷是否為 elf 檔案後根據不同的 CPU 架構反組譯(使用LIEF lib 的 PRASE)。
* 透過逆向工具得到符號表位址,對照 elf 標頭可還原函數名稱。搜尋 openssl 或是 busybox 等關鍵字可得知 lib 的版本資訊。
* 最後一個步驟是安全檢測。
* 利用前面得到的資訊,比較 CVE 開源漏洞庫,找出具體漏洞。
* 包含 hard-coded passwords、dangerous process execution、unsafe dependency library calls、dangerous string processing、unsafe random number processing 和 dangerous memory operation 等問題。
* hard-coded passwords 用正規表達式對照常見的帳號和密碼。
* dangerous process execution 指開機後自動執行的文件。
* unsafe dependency library calls 利用 yara rules 對照已知的 CVE。
* dangerous string processing 指 strcpy 或 strcat 等有危險的 functions。
* unsafe random number processing 是偽隨機數生成器導致的漏洞。
* dangerous memory operation 指溢位等情況。
* 工具 cwe_checker 可檢測後面三種問題。
* 全部功能結合 Python Flask 框架,可 multi-threading 執行。
### Online 動態檢測
* 
* 輸入是設備的 IP、username 和密碼,流程分為四個目標。
* 一開始先對 IP 位址掃描 ports。
* 常被攻擊的 ports 有`20`的 FTP、`554`的 RTSP 和`22`的 SSH 等等。
* 掃描 ports 的常見漏洞後,會登入設備得到更多 Firmware 的資訊和版本相關的資訊。
* 接著利用模糊測試檢測漏洞。
* 根據協議格式生成不同的數據包。
* 如果發生 crash,還是得手動檢查是否真的為漏洞。
* 常見的模糊測試策略有:
* 長字串,檢測 buffer overflow。
* 大數,檢測 integer overflow。
* Format string,檢測 format string vulnerability。
* 特殊字元,@#$%& 等等的特殊符號。
## Evaluation
* 機器:Intel i9、32GB RAM、Ubuntu 18.04。
* Dataset 是自己使用爬蟲從官網和論壇爬下來的。
* For 靜態檢測,抓了 300 多個不同版本的 Firmware(小米、ASUS、360、D-link、大華、海康威視)。
* For 動態檢測,對 cameras 做安全測試,品牌有大華和海康威視(DH-IPC-HDW2125S, DH-IPC-HFW1225M-I1, DS-2CD3T47EWD-L, DS-2CE16D1T-IT3F 等)。
### Experiment Results
* 
* 靜態分析檢測到 300 個問題。
* dangerous process execution 和 unsafe dependency library calls 最多。
* 與動態相比,靜態對於偵測 hard-coded passwords 更有效率。
* 
* 檢測出 200 個問題。
* 和靜態一樣,dangerous process execution 和 unsafe dependency library calls 最多。
* 和靜態相比,動態更可以確認漏洞的可利用性。
* 動態檢測有誤報的可能,需要透過手動檢查。
* 實驗中隨機選了 80 個檢測到的漏洞做手動檢查,發現 56 個為真漏洞,其餘為誤報。
* 研究發現危險的 process 和危險的 lib 漏洞是最主要的安全問題。
## Conclusion
* 設計了混和平台,結合靜態和動態檢測漏洞。
* 靜態目標為找已知漏洞或弱點等。
* 動態透過模糊測試發現未知漏洞。
* 借助該系統,可在 IoT 設備發布前發現安全漏洞。
###### tags: `paper`