Automated Detection Exploitation and Elimination of Double-Fetch Bugs Using Modern CPU Features
作者: Michael Schwarz, Daniel Gruss, Moritz Lipp, Clémentine Maurice, Thomas Schuster, Anders Fogh, Stefan Mangard
出處: AsiaCCS’18
單位: Graz University of Technology, CNRS, G DATA Advanced Analytic
原文: ofollow,noindex" target="_blank">https://dl.acm.org/citation.cfm?id=3196508
Double-fetch bugs 是一種特殊的條件競爭,在高許可權執行緒的time-of-check和time-of-use之間,低許可權執行緒能夠修改共享的記憶體,導致高許可權執行緒訪問的記憶體產生不一致。
本文作者提出了一種檢測,利用並消除double-fetch bugs的技術DECAF和Dropit。總體來說,貢獻如下:
- 把cache attack與kernel fuzzing結合起來
- 首個自動化的挖掘double-fetch bugs的方法
- 利用的成功率高達97%
- 利用Hardware Transactional Memory的特性,消除double-fetch bugs
- 方法對fuzz TEE也有效
介紹
現代作業系統的安全依賴作業系統kernel提供隔離性,在對kernel的攻擊中,條件競爭是一個很難解決的問題。Double-fetch bugs 就是一種特殊的條件競爭。kernel兩次訪問同一塊記憶體,首先檢查資料的合法性,第二次就使用它,那在這兩者之間,記憶體可能被修改。 Double Fetches有個明顯的特徵是要訪問兩次記憶體。如果資料在cache中,就從cache中讀,如果不在就從主存中讀到cache中,基於cache的攻擊,比如著名的Flush+Reload攻擊,可以利用CPU的這個特性來檢測Double Fetches。
Intel TSX的hardware transactional memory特效能夠保證當資料被讀進transaction後,資料不能被任何transaction之外的操作修改。這種特性被用來實現安全加固,比如在這個場景中就可以天然的防禦Double Fetch bugs。
組成
- 通過Flush+Reload邊通道檢測double fetches
- 判斷double fetches是否能夠被利用
- 通過hardware transactional memory消除double fetch bugs
檢測
主要思想是監控cache訪問syscall的引數(比如指標,結構體中的指標),篩選出這些指標後,另起一個Flush+Reload執行緒對這些指標進行監控。
效果如下所示,可以明顯的看到兩次cache的訪問。
多次cache hit的分類
影響cache acess pattern的因素
- size of data type
- parameter reuse
檢測的概率
檢測成功的概率取決於兩次訪問時間的間隔。因為本身Flush+Reload需要把資料從cache中清掉,這要消耗大概200多個CPU週期,這就要保證double fetch的兩次訪問間隔至少要是Flush+Reload兩倍的的時間才行。
TrinityDECAF
作者基於trinity這個kernel syscall fuzz框架,實現了 TrinityDECAF,架構如圖,基於trinity,為每個syscall的引數實現了一個監控的程序。
利用
Flush-Reload or Flush+Flush
fuzz策略
- 引數值改成0
- 翻轉最低有效位元
- 增加值
- 引數值改為隨機值
消除
作者實現了Dropit的庫,這個是基於硬體的特性,hardware transactional memory保證了兩次記憶體訪問之間不能再對該記憶體修改。實現起來也很簡單,使用Intel TSX的XBEGIN和XEND指令講存在bug的程式碼包起來即可。
評估
DECAF
已知漏洞CVE-2016-6516 可行性 有效性 利用的成功率 在TEE上fuzz 使用dropit和不使用的比較