摘 要
研究表明驅動中的漏洞是 Linux 內核安全的一個主要威脅,它包含多種類型的漏洞,如整數錯誤、內存錯誤和 API 誤用等,可能引發提權、拒絕服務等高危情況。然而,一般的程序分析技術無法直接應用于 Linux 設備驅動的分析和漏洞檢測,對檢測方法也要求較高。因此,研究 Linux 設備驅動中的漏洞,尤其是內存錯誤和整數錯誤等類型的漏洞,具有重要意義。
本文首先對 Linux 驅動中的主要錯誤類型進行分析,并對靜態分析、動態分析、符號執行等技術進行了研究,提出了基于符號執行技術并融合動態分析和靜態分析技術對 Linux 驅動進行漏洞檢測的基本思路。論文主要工作如下:
1. 針對采用靜態分析技術進行 Linux 內核漏洞檢測誤報率高的問題,本文采用了動態分析技術對靜態分析結果進行二次驗證,并構建了相應的檢測系統;進一步提出融合符號化硬件技術,實現了方便地模擬硬件設備進而對驅動進行模擬運行。
2. 設計并實現了符號化設備驅動環境(SDDE),SDDE 采用模擬內核提供給驅動程序的服務接口的思想,使驅動程序可以在應用層進行符號執行進而可對其進行漏洞檢測,這樣無需真實硬件的支持,并且具備覆蓋率高、執行速度快、易于擴展等特點,并提升了檢測系統的執行效率和擴展能力。
3. 將 SDDE 作用于六個不同的 Linux 設備驅動,檢測出了 6 個真實的漏洞,其中 3 個漏洞已向驅動維護者提交補丁并被接收。實驗結果證明了符號化驅動環境具備一定的漏洞檢測能力,并且擁有資源消耗低、檢測速度快和不依賴于硬件設備的特點。
關鍵詞:Linux;設備驅動;漏洞檢測;符號執行
Abstract
Studies have shown that driver vulnerabilities is one of the major threats to the security of Linux kernel. It contains many type of vulnerabilities, such as integer errors, memory errors, and API misuse, which might lead to privilege escalation, denial of service and other high-risk situations. However, general program analysis techniques can’t be applied directly to the Linux device driver’s analysis and vulnerability detection, detection method is also demanding. Therefore, study on vulnerabilities in Linux drivers, especially the memory errors, integer errors and other types of vulnerabilities, is important.
First, the major error types in Linux drivers are analyzed, and second, static analysis, dynamic analysis and symbolic execution techniques are studied. Finally, the Linux driver bug detection idea which based on symbolic execution and combines static analysis and dynamic analysis technology are proposed. The main work is as follows:
1. Aiming at the problem of high false positive rate in static analysis, we proposed the idea to use dynamic analysis to verify the static analysis results, and implements the corresponding detection system. Moreover, through the integration of symbolic hardware technology, it can conveniently be used to simulate hardware devices and dynamically run Linux drivers.
2. Designed and implemented symbolic device driver environment (SDDE). SDDE provides symbolic kernel services and symbolic devices, making symbolic execution of Linux driver and runtime driver vulnerability detection possible. SDDE works without real hardware, and it has many advantages such as high coverage, high performance and good scalability.
3. In applying SDDE to 6 Linux drivers, 6 real bugs were found, 3 of which were confirmed by Linux developers. Experimental results show that SDDE can detect vulnerability, and has the characteristics of low resource consumption, fast detection speed and does not depend on the hardware device.
Keywords: Linux, Device Driver, Bug Detection, Symbolic Execution
信息技術的快速發展和廣泛應用在給人類的生活帶來便利和快捷的同時,也帶來了很多不可忽視的負面影響,例如網絡技術的興起給企業和用戶帶來了許多不可控的安全因素,表現在電子化資產的安全性和個人隱私的保密性等方面。目前信息技術的特點是將用戶需求連接到后端服務,然而無論是用戶終端還是后端服務中均存在許多不可控的安全風險。從技術角度上看,這些風險一般是軟件安全漏洞帶來的。軟件安全漏洞的存在給用戶帶來直接的損失和隱藏的風險,例如,美國國家標準技術研究院(NIST)在 2002 年的研究報告中指出,軟件缺陷給美國造成了 595 億美元的經濟損失(占當年美國 GDP 的 0.6%);到 2007 年,這一數字已經增長至 1800 億美元[1]。更為嚴重的是,軟件漏洞所導致的蠕蟲、木馬(driven-by downloads)、僵尸網絡(Botnet)等各種網絡攻擊事件給互聯網甚至給國家信息安全帶來嚴重危害。
通常,軟件可分為操作系統和用戶程序兩類,操作系統作為硬件資源和用戶程序的管理者,其重要性十分突出。近年來,隨著 Linux 操作系統得到越來越廣泛的應用,其安全性也面臨著越來越多的挑戰。常見的軟件漏洞包括整數溢出、緩沖區溢出、并行錯誤、格式化字符串漏洞等。其中,內存錯誤和整數錯誤被認為是系統安全的重要威脅,因為它可能導致系統崩潰或者權限提升等危險情況[2]。2007 年的一份關于 CVE(Common Vulnerabilities and Exposures)漏洞庫[3]的研究表明整數錯誤在操作系統的軟件錯誤中排名第二(第一名是緩沖區溢出)。最近的一份研究[4]針對 2010 年到 2011 年的 Linux Kernel 在 CVE 中的漏洞進行數據統計,發現在可以造成內核錯誤和獲取權限提升的錯誤中,整數錯誤已經占了1/3 以上的數量。
此外,Linux 驅動程序漏洞在 Linux 內核漏洞中的比例非常之高。曾有研究表明 drivers 目錄下的漏洞是其他目錄的三到七倍之多[5]。雖然之后經過學術界和工業界不斷的努力,Linux 代碼的質量得以不斷提高,內存相關的錯誤在逐漸減少,同時驅動程序漏洞的占比也得以降低,但是 Linux 設備驅動程序的漏洞占比依然非常之高。2011 年 Palix 等人的研究表明驅動依然是 Linux 內核錯誤的主要來源[6],同年,Chen Haogang 等人的研究表明 Linux 中約 2/3 的錯誤來源于驅動程序,2013 年 Lin Tan 等人針對 Linux 已知漏洞的抽樣研究表明 52.9%的漏洞來自于驅動程序[7]。以上研究均表明了驅動程序依然是影響 Linux 系統安全和穩定的重要因素,對驅動安全進行研究仍然是緊要的任務。然而驅動程序不同于一般的應用程序,針對 Linux 驅動程序的代碼分析和漏洞檢測,其難度更高。一方面,由于設備驅動運行在內核態,而現存的許多代碼分析和漏洞檢測工具只能用于用戶態程序;另一方面,設備驅動程序的運行時檢測需要具備真實的硬件設備,由于硬件環境的限制,甚至驅動開發者本人也只是進行了“編譯檢查”。甚至,有些漏洞只有在硬件自身發生錯誤的情況下才能觸發,所以即使擁有了硬件設備,也很難對驅動程序進行全面的檢測。
綜上所述,Linux 內核漏洞的種類和數量較多,其中以內存錯誤和整數錯誤較為突出,并且在 Linux 內核漏洞中,驅動程序的漏洞占比最高、危害性較大,同時對檢測方法也要求較高。因此,檢測 Linux 設備驅動中的漏洞,尤其是內存錯誤和整數錯誤等類型的漏洞,具有重要意義。
從軟件安全問題進入到人們的視野至今,漏洞檢測相關的研究工作持續進行,各種軟件測試方法和工具也不斷得到廣泛使用,這給軟件安全領域帶來了很大的進步:平均每行代碼所包含的 bug 數量在不斷減少,例如 Linux 內核 2.6.28 的每行平均 bug 數量比 2.6.0 降低了 50%左右[7]。針對 Linux 內核,由于其代碼量巨大,且屬于系統層面,因此無法使用針對小型軟件或用戶程序的檢測方法對其進行漏洞探測和安全分析。雖然一些通用性極好的靜態分析工具能夠對 Linux 內核進行檢測,但其一般會帶來非常高的誤報率,進而對人工篩選提出過高的要求。
近年來,在已有的漏洞檢測技術基礎上,不斷拓展思路并加以綜合利用已經成為漏洞檢測技術的有效研究思路,多種技術相結合的漏洞檢測方法逐漸出現并取得一定成功。從已有的漏洞分析和檢測的技術來看,現有的技術主要分為靜態分析、動態分析和符號執行技術。靜態分析是指在不對代碼進行動態執行的條件下,通過詞法、語法以及控制流等各個方面的分析來對程序代碼進行掃描,具有不實際運行程序、執行速度快、誤報率較高的特點;動態分析是指在運行時監控程序行為進行檢測,具有精度高、難以定位漏洞位置、對測試輸入依賴大的特點;符號執行技術則可用于靜態分析也可用于動態分析,其優點是具備高覆蓋率,另外動態符號執行的誤報率也較低,但是符號執行技術中存在的路徑爆炸問題一直是限制其發展的難點。
下面分別針對靜態分析、動態分析和符號執行,對相關的技術研究和檢測工具進行概述。靜態分析是指在不運行程序的情況下,對二進制程序或程序源碼進行分析的方法,其一般針對程序的控制流或者數據流進行檢驗和分析,常見的實現技術有數據流分析、類型推導、符號執行、模型檢驗、定理證明等[8]。許多靜態分析工具使用一種中間語言(IR)來描述程序,例如 CodeSurfer[9]依賴于 IDAPro 的 IR、Jakstab[10]依賴于 Boomerang[11]的前端表示、BitBlaze[12]的靜態分析組件 Vine也使用了中間表示。
靜態源代碼分析可以分析出所有可能的路徑,但是源碼中間接跳轉的分析,通常需要難度較高的指針分析,并沒有十分有效的精確手段。此外,盡管靜態源碼分析有很高的代碼覆蓋率和路徑覆蓋率,但是在處理比較復雜的語言結構時它可能帶來非常多的誤報[13]。為了減少誤報,許多靜態分析工具需要開發者添加注釋。靜態分析也難以檢測出語義漏洞,比如程序某處缺少權限檢查(missingpermission check)。盡管靜態分析有誤報率高等缺點,但是使用靜態分析的結果作為疑似 bug,然后進行人工篩選或者動態驗證依然是發現漏洞的有效手段。
KINT[14]由麻省理工學院 WANG Xi 等人開發,用于檢測 C 語言源碼中的整數溢出漏洞。其基于 LLVM[15]的中間表示語言,在使用 LLVM 編譯器對目標代碼編譯的時候進行檢測。KINT 可以根據源代碼和用戶注釋生成約束,然后使用約束求解器來判定搜集到的約束條件是否滿足整數溢出發生的可能性。由于其對每個編譯單元單獨檢測,最后才匯總檢測結果,所以 KINT 可應用于 Linux 驅動甚至整個 Linux 內核的分析。然而 KINT 在編譯單元內部搜集的約束并不準確,帶來了非常高的誤報率,據本文統計,其誤報率高于 99.9%。從實際效果來看,將其用于檢測 Linux 內核、lighttpd web 服務器、OpenSSH 等開源軟件,加上后期的人工分析和篩選,KINT 已經發現了超過 100 個整數錯誤。
Linux內核驅動中漏洞檢測方法:
SDDE 系統設計
獲取驅動的編譯依賴
整數錯誤檢測框架
目 錄
摘 要
Abstract
第 1 章 緒論
1.1 課題背景和意義
1.2 國內外研究現狀
1.2.1 靜態分析
1.2.2 動態分析
1.2.3 符號執行
1.2.4 多種技術的融合
1.3 論文研究內容
1.4 論文組織結構
第 2 章 錯誤類型分析及相關技術研究
2.1 驅動常見錯誤分析
2.1.1 內存錯誤
2.1.2 整數錯誤
2.1.3 API 誤用
2.2 C 語言整數溢出檢測工具 KINT
2.3 選擇性符號執行平臺 S2E
2.4 符號執行引擎 KLEE
2.5 本章小結
第 3 章 符號執行檢測 Linux 驅動中內存錯誤和整數錯誤
3.1 概述
3.2 系統設計與實現
3.2.1 測試程序的制作
3.2.2 檢測內存分配的安全性
3.2.3 檢測內存使用的安全性
3.2.4 改進 KINT
3.2.5 疑似錯誤點插樁
3.2.6 檢測整數錯誤
3.3 實驗結果與分析
3.3.1 測試環境
3.3.2 測試結果
3.4 本章小結
第 4 章 符號化硬件檢測 Linux 驅動中內存錯誤和整數錯誤
4.1 概述
4.2 SymDrive 分析與優化
4.2.1 符號化設備
4.2.2 測試框架
4.2.3 SymGen
4.2.4 錯誤檢測
4.2.5 路徑優化
4.3 基于 SymDrive 的整數錯誤檢測
4.3.1 創建虛擬設備
4.3.2 設備交互符號化
4.3.3 符號值注入
4.3.4 測試流程
4.4 實驗結果與分析
4.4.1 實驗環境
4.4.2 實驗結果
4.5 本章小結
第 5 章 符號化設備驅動環境 SDDE
5.1 概述
5.1.1 設備驅動環境
5.1.2 符號化設備驅動環境
5.2 驅動驗證規則
5.3 SDDE 的設計與實現
5.3.1 符號化設備驅動環境的構建
5.3.2 驅動程序的語義合法性檢測
5.3.3 整數錯誤的檢測
5.3.4 基于符號執行的驅動程序的運行
5.4 系統的優化
5.5 實驗結果與分析
5.6 本章小結
結 論
參 考 文 獻
攻讀碩士學位期間所發表的學術論文
致 謝
(如您需要查看本篇畢業設計全文,請您聯系客服索。