論文閱讀:KOOBE: Towards Facilitating Exploit Generation of Kernel Out-Of-Bounds Write Vulnerabilities

Usenix Security 2020 的一篇關於內核OOB漏洞自動化利用的文章,感覺寫的不錯。

簡介

這篇文章的主要目的是爲了評估堆溢出漏洞的可利用性,從而方便開發人員判斷漏洞修補的價值。文章提出了KOOBE,一個基於漏洞能力來實現內核堆溢出漏洞的自動化利用的工具。KOOBE的實現主要基於符號執行和基於能力的模糊測試這兩種技術。實驗在17個內核堆溢出漏洞(公共的exploit只有5個)中生成了11種利用策略。最後,作者認爲其他的漏洞利用過程也有機會可以自動化。

研究背景

微軟2019年的一篇報告指出在2006-2018年大約70%的漏洞都是內存安全漏洞。因此研究人員需要夜以繼日的修補漏洞,這個過程還需要區分漏洞是否可以利用,從而優先修補重要的漏洞。對於難以利用的漏洞,研究人員通常會選擇延緩修補的節奏。而內核漏洞的驗證是很困難的工作,主要在於這兩點:

  • 任何內核利用都是精心設計的多體的交互過程,涉及到一系列攻擊者選擇的輸入(比如系統調用和其參數),而這些都是相互依賴的。

  • OS內核的內部狀態數很多,很難窮盡搜索空間去尋找可利用的狀態。

因此,自動化評估內核漏洞是否修復就成了一個很重要的問題。這篇文章的目的就是要自動化評估內核漏洞的可利用性,進而幫助研究人員判斷漏洞的重要性。

研究方法

研究假設

給定一個PoC觸發一個或多個OOB訪問,系統生成1個或多個利用原語來實現指令指針的劫持(Instruction Pointer Hijacking)。也就是說,沒有到任意代碼執行這步,所以也就不是端到端的漏洞自動化利用。但是有互補的技術來補充,比如KEPLER可以自動化將指令指針劫持轉換爲任意代碼執行。

另外,文章假設的內核的防禦機制有以下三個,但實際上真正需要繞過的機制只有SMAP,因爲作者只做到指令指針的劫持部分:

  • KASLR(Kernel Address Space Layout Randomization)
  • SMEP(Supervisor Mode Execution Prevention)
  • SMAP(Supervisor Mode Access Prevention)

核心思想

在背景部分,作者給出了內核堆溢出的利用過程圖解。首先分析漏洞的能力,瞭解漏洞能覆蓋寫多少字節,能寫多遠,以及能寫的值。接着,利用heap feng shui技術構造堆的佈局,消耗cache當其重填一個新的頁的時候,後續的分配就會返回一個連續的地址。以便讓分配的漏洞對象和目標對象挨在一起。然後,選擇一個目標對象。讓其分配到一起。最後,調整PoC用理想值覆蓋重要數據,實現指令指針的劫持。

基於以上的漏洞利用過程,KOOBE的設計分爲五個部分:

  • 漏洞分析:試圖發現所有的漏洞點,並標識對應的漏洞對象
  • 能力歸納:根據PoC來爲OOB漏洞生成一個能力
  • 能力探索:探索這個漏洞其他潛在的能力
  • 可利用性評估:選擇一個合適的目標對象,產生一個方案(具體的系統調用)
  • 利用原語綜合:根據上面的系統調用,結合Heap Feng Shui技術來產生exp

漏洞分析這個部分的工作有點像KASAN,但是KASAN不能提供完整的漏洞點及準確的與漏洞點對應的漏洞對象。作者在這個工作的基礎上增加了符號追蹤技術。具體點就是在每個對象創建的時候,爲其分配一個唯一的符號值,然後用符號追蹤技術追蹤每個對象。所以對於每次內存訪問,如果其包含一個符號表達式,我們就可以直接提取想要的對象。而且,通過查詢指針的符號表達式的可能範圍,可以發現給的PoC沒有觸發的潛在溢出。

能力歸納這部分,作者對漏洞能力給出了具體的定義,簡單來說,一條PoC路徑的能力包括漏洞對象的大小,執行p路徑的條件限制集合,以及OOB寫漏洞的三個特徵。OOB寫漏洞的三個特徵,可概括爲如下三點:

  • 寫的距離有多遠(how far the write can reach)
  • 能寫多少字節(how many bytes can be written)
  • 可以寫什麼值(what value can be written)

另外,作者還定義了兩個PoC能力的比較,也爲後面的能力導向的模糊測試的實現奠定了理論基礎。

能力探索,存在的意義是給定的PoC通常只有一條路徑,會限制我們發現漏洞完整的能力。因此,需要去探索新的PoC,來發掘漏洞完整的能力。能力探索的流程可以分爲三步:

  • 去搜尋新的PoC,來擴展現有的能力或者發現一個新的能力

  • 接着重複能力歸納和可利用性評估步驟

  • 直到成功或者時間超過了我們預設的值

具體的實現方法,作者提出了能力導向的模糊測試,也是我認爲本文的亮點所在。實際上就是將現有的覆蓋率導向的模糊測試修改爲能力導向的模糊測試。原本覆蓋率導向的模糊測試,是基於覆蓋率這一指標,來決定生成測試樣例。這裏就是基於發現的新能力是否大於舊能力來決定如何生成測試樣例。覆蓋率導向的模糊測試可以增加發現crash路徑的概率,能力導向的模糊測試偏重於發現新的PoC的概率。

到可利用性評估這部分,系統會試圖搜索一個或多個合適的目標對象。整個過程實際上就是根據目標對象的條件約束來與能力進行匹配。比如,一個合法的指針的約束就是,其必須指向一個合法的用戶空間或者內核空間。然後,KOOBE將目標約束堆疊在前面獲得的功能之上,並將它們提供給求解程序以獲得解決方案。如果沒有產生結果,那就去匹配下一個。在這個步驟,還提到了能力合成的概念。當一個能力單獨使用時,不一定能夠滿足給定目標對象的要求。這不意味着這個能力沒有用了,還有可能我們重複使用這個能力,來多次觸發OOB寫,來達到我們的目的。另外有時候有些利用需要結合多種不同能力來實現,文章用了一個貪心算法來實現能力的合成。

最後利用原語綜合這部分,就是用Heap Feng Shui技術來構造內存佈局。同時,使用physmap 噴射技術來繞過內核的SMAP防禦機制。

實現

KOOBE主要是基於三個現有的工作來實現的:

  • Syzkaller(內核的模糊測試工具)
  • S2E(符號執行框架)
  • Angr(二進制分析引擎)

在實現過程中,作者提到了幾個實現上的挑戰:

  • 內核crash需要重啓
  • 符號執行引擎對符號化長度的支持很差
  • 符號執行不好處理循環
  • 符號索引和循環邊界導致的路徑衝突問題
  • 目標對象收集問題

內核產生crash需要重啓,這樣每次模糊測試產生crash就重啓一下的話,會有很大的時間開銷,作者採取的方式是,在內核中插樁,來跳過導致OOB訪問的指令,但同時有新的指令,會保存下來,但也導致了系統狀態的不一致性,也就是存在假陽性的情況。

對於符號執行引擎對符號化長度的支持很差這個問題,作者實際上採用了一種相對高效的枚舉方法,用最小的OOB長度去試,從而避免破壞系統數據。

對於符號執行處理循環上,作者借鑑了SAGE的思路,利用循環守衛模式匹配規則來自動推斷index。不過不是使用原始論文中的動態分析方法,而是用angr來靜態分析。

至於符號索引和循環邊界導致的路徑衝突問題,作者去除了不相關的條件限制,比如printk()函數引起的。

在目標對象收集問題上,作者用LLVM pass構建內核的調用圖來處理。同時,作者也補充說明,也可以使用SLAKE這篇文章的來解決。

測試評估

評估使用的漏洞是從CVE數據庫和syzbot平臺上獲取的,分別從這兩個平臺取7和10個內核堆溢出漏洞。關於syzbot漏洞的選擇,作者做了一個說明。平臺上有28個堆溢出漏洞,其中8個是不提供c代碼測試,8個是由同一個漏洞引起,1個需要錯誤注入來觸發,1個需要root權限來觸發,1個已經和CVE關聯了。所以,只選擇這個平臺的10個漏洞。

最後的結果是,7個CVE漏洞中的公開利用策略有4個,產生了11個利用策略,潛在的策略有503個。10個syzbot中的漏洞的公開利用策略有1個,產生了8個利用策略,但其中有一半的漏洞仍然沒有產生利用策略。作者對這些沒有exp的策略進行驗證,發現以他們的知識水平,確實是沒有利用策略。

另外,作者驗證了去除條件限制的優化方法,發現這種優化確實減少了使用時的時間開銷。

總結

這篇文章和FUZE那篇文章很像。不過那篇是提出內核UAF漏洞的自動化利用。這篇是針對內核堆溢出漏洞的自動化利用。這篇文章的亮點在於漏洞能力的提出,並且對堆溢出漏洞能力做了定義,因此衍生出了基於能力導向的模糊測試。雖然這篇文章沒有實現端到端的漏洞自動化利用,但是有很多補充的技術,比如KEPLER,可以將指令指針的劫持自動轉化爲任意代碼執行。二者相結合就可以實現完整的內核漏洞自動化利用。

文章使用了Heap Feng Shui策略,實際上簡化了很多情況。如果遇到系統有細粒度的隨機化機制(Diehard),Heap Feng Shui可能就不好用了,這也意味着這個自動化工具在應用上的一些侷限性。

KOOBE中的Fuzzing在種子選擇策略上還可再做優化。文中的種子選擇策略,只是隨機在能力和覆蓋率這兩個指標挑選,作爲模糊測試的導向。下一步的研究也許可以針對這裏再作優化,比如在什麼情況下,選擇以覆蓋率導向的模糊測試更優,在另外一種情況下,選擇能力導向的模糊測試更優。

這篇文章對我也產生了一些啓發。文中提到了對漏洞能力的定義,那麼這個能力能不能作爲一些機器學習應用在漏洞檢測的一個特徵呢?另外,文章的結果裏列出了很多潛在的利用策略。如何自動化驗證這些潛在的利用策略,應該也是一個很有意義的工作。這篇文章是起源於FUZE(內核的UAF漏洞利用),那麼還有什麼其他漏洞可以自動化利用?

除了idea給的啓發,文章的寫作風格看得也比較舒服,第三章的漏洞實例貫穿了全文,看文章的時候,結合例子,感覺理解得更深了。或許這種寫作技巧可以借鑑到今後的學術寫作上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章