---
# System prepended metadata

title: 'P2IM: Scalable and Hardware-independent Firmware Testing via Automatic Peripheral Interface Modeling'
tags: [論文]

---

---
tags: 論文
---

# P2IM: Scalable and Hardware-independent Firmware Testing via Automatic Peripheral Interface Modeling

## 0.摘要
* P2IM是一個根據自動生成模型產出各種外圍設備並動態處理I/O的框架，此篇論文介紹其原理。

### 模糊測試
https://zh.wikipedia.org/wiki/%E6%A8%A1%E7%B3%8A%E6%B5%8B%E8%AF%95

### 模糊器->執行模糊測試

## 1.引言
* 構建IoT(物聯網)的MCU(微控制器)對MCU設備的攻擊大部分因韌體漏洞導致，不僅會導致數據損壞，還可能導致設備本身損壞。

* 現有的模擬環境因為不能模擬一切外設，很難直接測試韌體本身。導致了許多韌體沒有經過充分的漏洞測試。

* 提出新的韌體模糊測試方法，使用QEMU透過P2IM將二進制文件輸入AFL(模糊器)，以執行韌體並處理其外設交互。自動模擬外設的I/O，滿足條件時，可順利進行韌體的執行。
![](https://i.imgur.com/5wzsrVX.png)

* 在真實的MCU的10個韌體上與70個範例韌體上評估了P2IM，執行成功率79%，並發現7個以前未知的漏洞。

## 2 路線圖&概述
### MCU韌體及測試
* MCU韌體通常包含外設驅動、小型OS或system library。
* MCU廠商很少使用Linux等通用OS來構建MCU韌體。通常是專為MCU設計的OS或system library.
* 最近有幾項用於模糊測試韌體的技術，但是外設仍需要轉送到實際的硬體，速度受到限制，很難擴大規模測試，且不具備可擴展性。

### 面臨挑戰
* ### Hardware Dependence:
	需要實際的外設，缺點是運行速度比模擬慢上許多，並且一個外設只能供一個韌體進行測試使用。
* ### Wide Range of Peripherals:
	由於多樣化的外設種類及其客製化的規格等因素使得完全模擬外設成為不切實際的想法。
* ### Diverse OS/System Designs:
	許多MCU設備沒有典型的OS，而是一個管理硬體和任務調度的system library。
	特定於OS的模糊測試方法（syscall）不適用於部分韌體。

* ### Incompatible Fuzzing Interfaces:
	外設有許多不同的類型並有各自有自己的交互需求。更複雜的是，韌體中的不同驅動也會以不同的方式配置相同的外設，使用不同的交互方式。


### 提出方法
* 設計一個支援模糊器作為嵌入式組件的框架解決MCU的模糊測試。允許模糊器在不了解MCU的軟體和硬體設計下測試韌體。只要仿真器為韌體提供可接受的、不使韌體中斷的外設輸入。便足以支持模糊測試和其他類型的分析。

### 處理器‑外設接口
![](https://i.imgur.com/keRzSQK.png)

* ### 外設I/O接口
	* #### exposed to firmware
	* #### namely memory-mapped registers
	* #### interrupts
	* #### direct memory access (DMA)
		
		DMA很難自動建模，而且它的I/O嚴重依賴於外設的內部設計，故排除在範圍外。
 

* ### MCU仿真器新屬性

	### P2IE
	1. 模擬器模擬韌體與外設交互， 而不是韌體使用的外設本身。
	2. 模擬接口與韌體預期的外設接口等效。
 
	### P2IE-empirical test
	never crashes, stalls, or skips operations due to peripheral I/O errors.
 
	#### Crash
	韌體嘗試從/向外設讀取/寫入數據但遇到如非法記憶體訪問或不受支持的外設操作等致命錯誤。

	#### Stall
	等待外設狀態發生變化，但仿真器未能認知並處理。導致韌體會放棄等待並跳過操作。

### 框架概覽
![](https://i.imgur.com/OgmUVdu.png)

Processor‑Peripheral Interface Modeling(P2IM)框架使用一種稱為explorative firmware executions的技術自動推斷特定於韌體的資訊。並支持模糊器作為嵌入式組件及向韌體提供模糊輸入，視為黑盒。

* ### 定義抽象模型。
	獲得韌體的通用模式以及訪問處理器外設時可接受的輸入。包含適用於整個MCU架構的可定制Interrupt觸發策略。大部分可從文檔中獲得。


* ### 模型實例化 
	實例化了為給定韌體的MCU架構定義的抽像模型，記憶體中的具體映射位置以及暫存器之間的相互依賴關係。


## 3.抽象模型定義
* 為目標MCU架構類構建一個抽象模型 。該模型將外圍暫存器分類為四種，並提供每種類型的訪問模式和處理策略。一般適用於 Cortex‑M 上的所有外設。
* 定義的暫存器類型普遍應用在所有外設
* 基於類型的訪問模式是從各種實際的MCU設備中觀察和歸納出來的
* 在設計基於類型的訪問模式時，仔細地進行權衡


### 3.1 暫存器類別、訪問模式和處理

#### Control Registers(控制暫存器)
韌體用於控制或配置外設。

* #### Access pattern
	read-modify-write(RMW)，讀取->修改->寫回。
韌體只能write at word/register避免了無意中更改了同一寄存器中共存的其他參數。
罕見的情況下，CR只包含一個配置參數，韌體可以直接寫入，不必走RMW，P2IM將其錯誤歸類在DR。這種情況下，這種暫存器不會再被讀取(一次性)，不影響韌體執行。

* #### Access handling
	一旦韌體配置了外設，外設通常會順利運行並且很少改變其設定。
P2IM將外設輸入的值定義為non-volatile，讀取CR時，return先前寫入的值，沒有明確寫入return 0，這是CR在大多數情況的預設值。


#### Status Registers(狀態暫存器)
韌體用來檢查外設狀態。SR是用以標示外圍設備內部狀態的flags(1~n bits)，隨著外設狀態變化更新。韌體會輪詢相應的SR以確保外設準備就緒，否則等待。未設置flag，韌體可能會停止啟動或無限期停止。設置錯誤flag，可能導致韌體崩潰。

* #### Access pattern

	第一次訪問是無條件存取，並且之後再根據條件評估value。對於某些SR，例如，當韌體確認外設錯誤時，第一次訪問可以是write。在這種情況下，P2IM可能會錯誤地將SR視作DR，但在之後P2IM會利用觀察(判斷是否有連續存取=>輪詢)修正此錯誤。

* #### Access handling
	不對外設本身建模，在每次SR讀取時使用探索性執行推測可接受的value，以讓韌體可以繼續執行。
	SR寫入處理:作为no-ops忽略，因為SR的寫入是單向的，不会影響韌體執行。
	SR運行時的value:


#### Data Registers(數據暫存器)
是原始數據從外設流向韌體的主要渠道。
大部分韌體讀取的數據都透過off-chip peripheral，off-chip:外接記憶體。
off-chip peripheral<--->DR<--->韌體


* #### Access pattern
	檢查相應的SR，確認外設處於準備狀態後才讀取DR。
P2IM categorizes a newly discovered register as DR if reading the register is preceded by an SR read and conditional on a flag in the SR.
讀取一個新發現的暫存器之前有一個SR讀取，並以SR中的一個flag為條件，P2IM將該寄存器歸為DR。
有時韌體不檢查任何SR就直接寫到DR。P2IM使用這種先寫後讀的方式作為識別DR的另一種存取模式。

* #### Access handling
	是很好的模糊測試接口，提供模糊測試輸入。輸入是由嵌入式模糊器生成。
DR寫入處理:同SR。
在DR上觀察到先寫後讀，但CR和SR也有。
1.最常出現在DR上。
2.被錯誤歸類的SR通常會在以後被輪詢所糾正。
3.被錯誤歸類的CR（只包含一個配置參數）不影響韌體的執行與測試。

#### Control-Status Register(控制狀態暫存器)
CR+SR，會使外設設計和韌體設計複雜化，MCU設備中不常用。

* #### Access pattern
	在同一時間是CR or SR，不能同時使用。
由於使用階段不同，一開始會被P2IM歸類到CR，之後會被修正到SR。

* #### Access handling
	不包含在抽象模型中，而是包含在實例化模型中。

### 3.2 中斷觸發
* 抽象模型定義了仿真器應該如何觸發外設必要的中斷。
* QEMU的中斷由於不模擬MCU外設，故不可用。
* 使用基於時序的輸入序列，輸入時，仿真器生成匹配的中斷並將其分派給韌體。
* 允許客製化中斷序列與時間，當前是使用已執行基本塊的數量固定間隔循環。
* 更高級的中斷觸發策略是嵌入式模糊器的工作，超出P2IM範圍。

### 3-3 不可行的外圍輸入和誤報
* P2IM 可以觸發韌體中程式的大部分路徑，而這在真實設備上是不對的，會導致誤報（崩潰是由不可行的輸入或程式路徑引起的，而不是韌體錯誤）
* 由於P2IM是通用的韌體測試框架故不會處理不可行的路徑，會留給測試工具。
* 在實驗中沒有看到任何不可行輸入或代碼路徑引起的崩潰。


## 4.自動模型實例化
* 模型實例化過程是全自動的，並使用探索性執行技術。
![](https://i.imgur.com/Y8d4qtq.png)

(1) 識別暫存器的位置和類型
(2) 處理每種類型的暫存器的訪問處理策略
(3) 中斷觸發策略

### 4.1 暫存器識別

* 檢測並且歸類外設已知的memorymapped registers，在過程中保留記憶體區段給暫存器。

* ### Peripheral Association:
	除了識別外設暫存器及其類型外，P2IM還根據是否屬於同一外圍設備對它們進行分組。

### 4.2 暫存器訪問處理和探索性執行
* type-based register access handling的策略，包含向韌體回傳值、更新內部狀態。
* 處理SR的策略較複雜，韌體執行時，設置SR1是必要條件，但在SR2設置會使韌體崩潰。
* 使用探索性執行的技術自動得出SR處理策略

#### 探索性執行
韌體執行遇到一個新的SR訪問點時，P2IM會暫停執行並快照，開始搜索SR的最佳值，恢復原始韌體執行，並將SR的值return給韌體。

#### Search Space Construction
* 一个SR的所有可能值(以32bits為例)是2^32，但是SR中的flag通常是獨立的，並且一次只檢查一個flag。因此可以優化。
ex:1000 0100 0010 0001
* 探索性執行结束時從工作線程中選出一個最佳解


#### Termination of ExplorativeWorkers
* SR讀取發生被pop時終止
* 韌體通常在同一函數中讀取SR，在該函數中，它根據SR的回傳值決定是否可以執行進一步的I/O操作。因此探索性執行超越函數邊界並不能帶來額外的好處。
* 許多工作線程在到達終止點之前就退出了，因為SR的回傳值對韌體來說是不可接受的。


#### Qualified Workers and SR Values:
* 線程沒有崩潰或停滯
* 如果所有線程都崩潰或停滯，選擇由其他因素引起的，而不是當前SR引起的。
* 發現N個同樣好的SR時隨機挑選並記錄該選擇(使模型實例化過程具有確定性和可重複性)


#### Minimizing Explorative Executions via SR Grouping:
* 目前為止討論的探索性執行的設計是獨立處理各個SR訪問，會導致頻繁的探索性執行。

* 透過SR分組優化，依據上下文對SR訪問進行分組，由四元組（r,cs,bbl,conf）定義，其中r是SR；cs是SR訪問時調用stack的sign；bbl是SR讀取發生的block ID；conf是SR訪問時的外圍設備配置Hash

* 通過SR分組，類似的SR訪問可以重複使用相同的處理策略，這就減少了P2 IM實例化模型時探索性執行的頻率。

### 4-3 Interrupt
* MCU架構（如Cortex-M）支持數百個不同的中斷
* 韌體只使用支持的中斷的一小部分
* 韌體需要動態地禁用和重新啟用中斷。如果仿真器發出了未使用或禁用的中斷，韌體可能會停滯或崩潰。
* 韌體通常使用一個簡單的死循環作為未使用中斷的默認處理程序。
* P2IM接入了QEMU的虛擬中斷控制器

### 4.4 P2IM 執行
* 用QEMU作為基本的處理器仿真器來實現我們的框架
* 添加到QEMU的2202行C
* 173行C代碼用於模糊器集成
* 1199行Python代碼用於P2IM的探索性執行部分。
* 在兩個QEMU函數，unassigned_mem_read和unassigned_mem_write內實現了暫存器分類、外設識別、基type-based register access handling、分組邏輯

## 6 討論

### Direct Memory Access (DMA):
* 不對DMA進行建模，DMA允許外設直接訪問RAM，並反過來為韌體提供輸入。缺乏對DMA的支持是P2IM的一個限制。

### Architectures beyond ARM:
* 分析了3個使用非ARM架構的物聯網設備
* 分析表明，P2IM的設計和定義的模型並不是針對ARM架構的。它們可以被擴展以支持結構，如AVR、MIPS和RISC-V。
* 與ARM類似的特定記憶體映射也遵守P2IM確定的暫存器分類（CR、SR、DR和C&SR）。

### Firmware Analysis beyond Fuzzing:
* 並不是專門為了支持模糊測試而設計的
* 不需要韌體完全準確輸出的動態韌體分析類型可以使用P2IM來實現硬體獨立性和可擴展性。如污點分析和某些調試任務

## 8 結論
* P2IM是一種新技術，用於對處理器-外設接口的I/O行為進行建模。

* 是第一個能夠對MCU設備進行外設無關性仿真的技術。
* 允許MCU以高代碼覆蓋率、規模和不依賴硬體的方式進行動態測試。

* 使用70個樣本韌體和10個真實設備韌體評估該框架。完全啟動並測試了79%的韌體。

* 發現了7個新的錯誤。結果表明具有很大的價值和實際使用潛力。
