學術沙龍分享 · 論文回顧 - 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可能進行的拓展研究:
- OS獨立性還不夠好,loader和agent的設計模塊程度不夠
- 利用intel pt 支持ring3的fuzzing
- 針對即時編譯代碼的fuzzing
- ... ...
推薦閱讀:
※Linus Torvalds 為什麼討厭 NVIDIA ?
※不懂彙編可以學 Linux 內核嗎?
※如何評價Arrakis?
※將驅動程序運行在ring1層上會提升系統本身的穩定性嗎?