提升龍蜥核心測試能力!探究持續性模糊測試最佳化實踐
編者按:高校是開源社群參與的重要力量。在 2023 龍蜥作業系統大會全面繁榮開發者生態分論壇上, 清華大學軟體工程博士沈煜恆從模糊測試的角度解釋瞭如何將作業系統核心質量提升一個新高度,也分享了面向龍蜥作業系統的核心所提出的模糊測試。以下為分享原文:
(圖/清華大學軟體工程博士沈煜恆)
核心模糊測試
什麼是模糊測試?模糊測試是一種常用的 漏洞性方法,使用隨機生成 input 來測試程式中的異常行為,常見 Linux、Windows 等部署了模糊測試,並且將模糊測試集中在 CI 流程中。
對於 Linux 作業系統,使用 kcov 工具來對 Linux 做覆蓋率插裝,使用系統呼叫描述 Syscall SPEC 作為系統呼叫描述的輸入。在執行測試過程中,將 SPEC 例項化為待測的程式。根據反饋情況,如覆蓋率和崩潰率對 SPEC 做編譯操作,進一步測試核心,相對應的核心會在測試過程中不斷的執行生成的程式,對覆蓋率和崩潰情況進行收集。
基於任務的OS模糊測試
傳統的核心模糊測試在測龍蜥作業系統時會遇到很多問題,現在廣泛採用的系統呼叫描述的方法不足以充分表達業務系統的邏輯,且無法傳達執行時的狀態資訊。同時,目前的執行方式也存在一些問題,如目前的模糊測試器每次只能啟動一個執行器,每次只能執行一個測試用例,無法充分傳達執行時的邏輯,導致一些深層漏洞難以暴露。
針對以上問題,清華大學軟體學院做了相關工作,提出了 相關業務程式碼的感知、以任務作為測試輸入,同時做到程序間的任務狀態感知和維護,最後提出了 使用多執行緒的執行方式。
首先在測試時,使用任務格式輸入,定義一個任務,任務中包括多個待執行的程式,程式中包括對應的優先順序。我們提出任務間的狀態感知和修復,透過字典查詢的方式去維護每個任務的狀態。其次構造一個字典,在執行時遍歷每個任務中程式的系統呼叫來維護每個任務的執行狀態,保證在測試中不會出現掛起等情況。同時,對可能導致掛起行為的程式做提前修復,保證在執行時的穩定情況。最後引入一個並行的 fuzz,儘可能多觸發實時操作、相關業務邏輯等,對業務邏輯進行多併發的執行,在執行時會啟動多個執行器,根據任務中定義的優先順序,為每個執行器分配一個優先順序,將任務分配執行器。在執行後非同步收集執行的資料,同步到本地的模糊測試器中。
測試結果表示在 6 個版本的 Linux 上取得了 大約 20% 覆蓋率的提升,說明可以測到 Linux 內部更深的程式碼邏輯。同時,修復策略可以極大降低任務掛起的數量,也在 6 個版本的 Linux 上發現了 50 個 bug,其中 25 個為 prevision unknown 的 bug 被開發者所確認。
基於靶向的OS模糊測試
我們發現,雖然核心主線 Linux 經過了大量測試,但由於龍蜥作業系統自己維護的版本可能會對業務邏輯做經常修改,這些程式碼通常缺乏與上游核心相同級別的測試。同時在工業環境中,測試會受到嚴格的時間和計算資源限制。因此我們提出,可以使用靶向模糊測試方法(定向模糊測試方法)將測試工作引向修改的程式碼,即特定的目的碼段,進而提高對業務程式碼的測試能力。
上述工作基於兩方面展開: 第一靜態呼叫圖的抽取, 第二基於呼叫圖的模糊測試。呼叫圖的抽取透過 Clang 抽取出整個核心的呼叫流圖,基於呼叫流圖生成加權的呼叫流圖,進一步將生成的呼叫流圖傳給 Syzkaller 核心模糊測試器,透過距離計算、函式抽取等方式來增強 Syzkaller 的靶向模糊測試能力。該工作目前已經整合到阿里雲的 ABACI 機器人中,能夠實現業務模組的持續性模糊測試。對應的該工具目前在 Linux 核心發現了 11 個未知的漏洞,龍蜥社群也已經對其進行了修復,覆蓋率對比於 Syzkaller,實現了 24.7% 左右的提升。
2023 龍蜥作業系統大會直播回放及技術 PPT上線啦,歡迎點選下方連結或文末”閱讀原文“觀看~
回放連結: https://openanolis.cn/openanolisconference
—— 完 ——
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70004278/viewspace-3011396/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux 核心的持續整合測試Linux
- 在持續測試中使用哪種測試?談談DevOps在測試策略中的實踐!dev
- 聊聊持續測試
- 功能測試怎麼提升測試開發能力?
- 介面效能測試 —— Jmeter併發與持續性壓測JMeter
- .netcore持續整合測試篇之測試方法改造NetCore
- 聊聊持續測試與安全
- 持續測試效能的方法
- 聊聊持續測試的進階
- .net持續整合測試篇之Nunit引數化測試
- 模糊測試 FUZZING test
- 持續交付會如何影響測試
- 使用 Xcode Server 持續整合 & 打包測試XCodeServer
- 簡單聊聊,如何構建測試工程師的能力模型 (持續更新)工程師模型
- 研效最佳化實踐:WeTest提效測試
- 簡單談一下我對持續測試下的測試左移、迭代測試和測試右移的理解吧
- 介面測試框架接入效能測試實踐分享框架
- Docker與自動化測試及其測試實踐Docker
- ChaosBlade混沌測試實踐
- Locust效能測試實踐
- 精準測試實踐
- Vodafone A/B測試實踐
- 持續測試跟自動化測試的這些區別你知道嗎?
- .net持續整合測試篇之Nunit that斷言
- 提升軟體測試效率與靈活性:探索Mock測試的重要性Mock
- 官方教程:Go fuzzing模糊測試Go
- Parasoft軟體測試實踐:什麼是左移測試?
- 【12】進大廠必須掌握的面試題-持續測試面試面試題
- 故障測試 Byteman 上手實踐
- 測試用例最佳實踐
- Go 單元測試實踐Go
- DevOps 中的測試實踐dev
- DevOps中的測試實踐dev
- Android 單元測試實踐Android
- HTTP介面測試實踐(一)HTTP
- 解鎖測試管理的核心問題,提升你的管理實力!
- 明天直播:如何測試硬體裝置與龍蜥作業系統的相容性?作業系統
- Java中的單元測試與整合測試最佳實踐Java