學術沙龍分享 · 論文回顧 - Week 8

kAFL: Hardware-Assisted Feedback Fuzzing for OS Kernels

幾周前的組會, @劉一噸 學長 在分享中帶來了有關Digtool的介紹,引入在內核中進行模糊測試這一主題。Digtool在內核的模糊測試可謂高產,但是全虛擬化的結構限制了模糊測試發現新的分支的效能,而現在基於硬體加速的模糊測試逐漸成為了主要研究方向。而什麼又是基於硬體的模糊測試呢,在 Usenix 26th 的論文列表中,Digtool的後一篇便是 kAFL: Hardware-Assisted Feedback Fuzzing for OS Kernels。kAFL同時利用了Intel cpu的兩種extension: Intel VT-X 以及 Intel Process Trace ,通過改造以後的 Qemu 和 KVM 實現內核態的路徑反饋Fuzzing(AFL-American Fuzzing Lop)。

理解kAFL需要相應的內核以及虛擬化技術的知識基礎,可以參考內核、虛擬化以及Intel CPU特性初涉

眾所周知,內核層模糊測試面臨實施流程複雜,效率低的難題。而現有的先進內核模糊測試解決方案依賴全虛擬化技術,局限在過高的額外開銷(overhead)。

而這項研究綜合運用Intel PT和Intel VT-X兩種cpu feature,可以高效地handle crash,快速發現分支,並且有一定的平台無關性。作者團隊設計了硬體加速的內核fuzzing程序雛形,在論文中套路他們遇到的問題並且評估測試結果。

需要Intel pt 記錄的僅僅是目標vCPU的內核態進程產生的運行時信息,如果沒有篩選機制,cpu會記錄過多的無用信息;並且當數據保存在cpu subsystem buffer中的時候會面臨buffer overflow的問題,進而造成trace data缺失。作者團隊通過合理設計filter參數,調用intel vt中autoload msr的特點避免了冗餘數據的記錄,通過相鄰大小buffer調用中斷服務處理的方式解決buffer overflow造成的數據丟失問題。

Intel pt 的典型trace data decoder - libipt 的效率不足以處理fuzzing產生的data,所以他們刪去了libipt會記錄的多餘項目,並給解析器增加了便於後續處理的反彙編功能。

  • 實現難點及解決方案
    • 追蹤指定目標的trace data(要求不多不漏)
      • filter選項、autoload msr
      • specific buffer for overflow
    • trace data decoder 效率
      • only control flow
      • cache 反彙編

在實驗測試中,他們首先評估了kAFL在不同平台上fuzz mount虛擬磁碟這一過程的效果,發現了8個新的漏洞,另外又測試kAFL能不能發現已知CVE。最後他們編寫了一個簡單的json解析驅動程序,設置一定條件下的 kernel panic(內核錯誤),用另外一款基於qemu的內核模糊測試工具(TriforceAFL)橫向比較二者性能和效果。由於kvm經過了聯合pt運行的改裝,作者們還評估了改造帶來的額外開銷,驗證他們的設計帶來的負載影響很小。

以下簡單點出測試反饋的重點:

    • 三種主流OS虛擬磁碟掛載BUG挖掘
      • windows 沒有找到bug
      • linux 執行速度快,效果好,找到多個unique panic
      • macOS 發現本地拒絕服務漏洞、可以hijack rip的uaf
    • keyctl 驅動cve 驗證
      • 準確探測到cve
    • 編寫json parser驅動,利用triforceafl和kafl在不同操作系統和不同cpu核心的條件下測試發現分支的速度、各種性能
      • kAFL在效率和分支發現總量上完勝triforceafl
    • overhead評估
      • PT extention給KVM帶來的overhead在百分之四以內
      • qemu-pt的decoder速度遠勝libipt

文章最後的Discussion部分提到了kAFL尚且存在的諸多不足以及利用intel pt可能進行的拓展研究:

  1. OS獨立性還不夠好,loader和agent的設計模塊程度不夠
  2. 利用intel pt 支持ring3的fuzzing
  3. 針對即時編譯代碼的fuzzing
  4. ... ...

推薦閱讀:

Linus Torvalds 為什麼討厭 NVIDIA ?
不懂彙編可以學 Linux 內核嗎?
如何評價Arrakis?
將驅動程序運行在ring1層上會提升系統本身的穩定性嗎?

TAG:操作系统内核 | 模糊测试 | 网络安全 |