Exploring Branch Predictors for Constructing Transient Execution Trojans

Exploring Branch Predictors for Constructing Transient Execution Trojans(木馬)

1. 摘要:
  • 針對於幽靈攻擊,工業界迅速採取了一系列軟件和硬件上的緩解措施,其中微碼補丁最爲流行和受信任(microcode patch)
  • 問題:現有的防護策略仍舊存在被攻擊的漏洞
  • 論文工作:
    • 提出了暫態木馬(transient trojans),即一種軟件模塊會在暫態執行模式中隱藏自身的惡意活動。這些木馬看起來完全正常,能夠通過靜態/動態的分析檢查,但是在被觸發後能夠獲取隱私數據
    • 論文根據推薦的緩解技術對當今系統中存在的攻擊面進行了詳細的分析,以構建這些暫態木馬
    • 論文對一些最新的x86-64處理器中的轉移預測器進行了逆向工程,以發現以前未知的可能的攻擊方法。根據這些發現,論文構造了三種類型的暫態木馬,並證明了他們的隱身性和使用性
2. 介紹:
  • 暫態執行攻擊,包括meltdown和spectre,能夠利用處理器中的一些性能優化策略,例如轉移預測,迫使受害者程序通過在一些微體系結構中留下可被檢測的蹤跡來泄露隱私數據。這些攻擊能夠違反內存安全的最基本原則,包括用戶-內核隔離。

  • 已有的抵禦暫態執行攻擊的策略:

    • 串行化指令
    • 避免危險代碼序列
    • 刷新硬件數據結構
    • 限制推測執行(safespec,invisiSpec)
    • 禁止微體系結構的隱蔽信道
    • 硬件製造商Intel&AMD使用一系列的微碼更新來應對攻擊,但是會產生明顯的性能下降
  • 論文工作:提出暫態木馬,能夠隱藏在暫態執行模式下的惡意功能的軟件模塊

    • 對處理器中的轉移預測器進行逆向工程,發現了一些新的分支衝突觸發技術(branch collision triggering technologies)(間接轉移預測)。這些技術是的輕便(portable,可移指)的,獨立的木馬能夠包含在敏感的軟件中,例如惡意的開源代碼中
    • 構建軟件模塊,將所有攻擊組件封裝在一個進程中
  • 暫態木馬中的在暫態執行模式下的惡意功能並不會在軟件代碼中引起注意,並且能夠通過嚴格的安全檢查,例如:

    • 符號執行

    • 污點分析,taint analysis( Dytan: a generic dynamic taint analysis framework )

    • 模型檢查

    • 傳統的檢查軟件後門的策略:

      • Backdoor detection system using artificial neural network and genetic algorithm
      • Towards reducing the attack surface of software backdoors.
      • Firmalice-Automatic Detection of Authentication Bypass Vulnerabilities in Binary Firmware
      • HumIDIFy: a tool for hidden functionality detection in frmware.
      • Static detection of application backdoors
    • 已有的幽靈檢測工具:

      • oo7: Low-overhead Defense against Spectre attacks via Program Analysis
      • SPECTECTOR: Principled Detection of Speculative Information Flows.
      • Detecting Spectre vulnerability exploits with static analysis
      • LWN.net: Finding Spectre vulnerabilities with smatch
  • 論文認爲,當今幾乎所有CPU中普遍存在的暫態執行很自然的適合隱藏惡意代碼,因爲它提供的執行模式對於現有的二進制和源碼分析技術來說是完全不可見的

  • 論文貢獻:

    • 論文對BPU進行了逆向工程研究,發現了負責間接轉移預測的機制和操縱方式。基於這些發現,論文依賴於不同的BPU異常,構造了三種類型的木馬
    • 論文提出了一種基於前期BPU訪問的新的分支指令衝突機制。該機制允許攻擊者構建木馬,並且可以避免被檢測到。其次該機制允許創建小型,便攜的木馬
    • 論文提出了一種分散暫態小工具技術,可以提高隱蔽性和有效性
    • 論文分析了靜態轉移預測機制,發現它可以導致跳過那些論文用於繞過檢測並構建木馬的間接分支
    • 論文對當前二進制文件進行了分析。結果表明,在大型二進制文件中,潛在的發生危險衝突的發生了高達數十萬。論文認爲,這種自然發生的衝突可以用於隱藏惡意木馬以及從現有代碼中構造木馬
    • 論文分析了防衛技術,並提出了從不受控制的暫態執行中消除威脅的方法。
3. Spectre v2:利用BTB進行推測執行攻擊,允許攻擊者可以選擇哪些代碼被推測執行,並且攻擊者可以強制暫態執行以面向返回編程的方式運行,從而可以執行原始二進制文件中不存在的代碼序列。
  • Spectre v2需要使用間接跳轉或者call指令來創造一個暫態執行窗口

  • 目前Google提出了一種簡單的編譯解決方法:將所有的間接跳轉指令替換爲特殊的指令序列,retpolines

    • 使用一條壓棧指令和ret指令來替換間接跳轉指令
    • 當CPU執行ret指令時,將會使用RSB對指令進行預測,而不是BTB
    • 問題:已經出現了利用RSB的暫態指令攻擊;當RSB下溢時,Intel的處理器會使用BTB對指令進行預測
  • 系統範圍內的微碼保護,Intel

    • IBRS(indirect branch restricted speculation):限制在特權模式下的推測執行。阻止在特權代碼中執行的間接分支被更低級別的代碼影響,即當處理器進入IBRS模式後,外界無法對間接分支進行操作
    • IBPB(indirect branch barrier):阻止跨進程的BTB污染。在進程切換時刷新BTB。
    • STIBP(single thread indirect branch predictors):單線程單間接轉移預測器,阻止跨超線程的BTB污染。控制轉移預測器之間的共享
  • 微碼保護的問題:爲了減少性能下降,有選擇性的使用不同的方案。IBRS只在特權模式使用,內核,內核模塊,SGX的enclaves中。IBPB和STIBP只會在將上下文切換到敏感進程後纔會選擇性的強制使用。

  • 目前保護模型仍舊存在的問題:當BTB的污染來源於同一個地址空間時,IBPB和STIBP將不在能夠抵禦(1)。IBRS指揮保護在特權態運行的代碼不受非特權態代碼的影響,因此當污染來源於特權態所示,攻擊仍舊可能出現(2)

在這裏插入圖片描述

4. 威脅模型
  • 假定攻擊者是惡意開發人員,能夠在被觸發條件激活之前提供看似安全的軟件
  • 用戶可以運行靜態/動態分析和信息流控制工具,包括目前已有的spectre小工具檢測工具
  • 惡意代碼可以以預編譯的二進制代碼,源代碼,共享庫或者對開源項目的提交的形式分發
  • 假設攻擊者對受害者的機器配置有一定的瞭解,包括微體系結構,操作系統,共享庫版本等信息
5. 轉移目標地址預測機制
  • 直接轉移指令:跳轉的目標地址固定,直接的call,jump指令和條件跳轉指令。預測目標地址時直接採用緩存在BTB中的上一次跳轉的結果

  • 間接轉移指令:跳轉目標不固定,取決於程序處理的數據。爲了提高準確率,通常需要進一步考慮指令的上下文。目前的BPU會將間接轉移指令之前執行的轉移指令模式(BHB,轉移指令)關聯在一起。即將BHB和指令地址哈希在一起,然後利用壓縮後的BHB的值作爲BTB的索引。(同一條間接轉移指令會有多個BTB表項)

  • 爲了最大化存儲利用率,直接轉移指令和間接轉移指令會共用一個BTB,只是兩種指令的索引方式不同:

    • IP-based:直接轉移,使用指令地址的一部分作爲索引
    • BHB-based:間接轉移,使用hash後的BHB作爲索引
    • 在實際預測的時候,兩者會同時訪問BTB,最後使用一個選擇器進行選擇
  • offset和index的選擇問題:index選擇中間的部分應該是爲了使得一塊區域內的指令都在同一路中,集中,好處?減少區域之間的在替換時的干擾

  • BTB中直接轉移指令的IP-based索引模式

    • 在Skylake處理器中,只有轉移指令地址的低30位被用於查找BTB

    • BTB的相聯度:地址中的低30位中的高位會被用作tag,因此論文選擇n條高若干位不同,但是其餘位均相同的轉移指令序列執行兩遍,通過性能計數器來判斷BTB在第二遍執行時發生的失效次數,從而判斷出BTB中每一組最多能夠存儲的指令數量,即爲路數。結果是包含8路,即8路組相聯

    • 哪些地址位被用於作爲索引:首先執行8條處於同一組的轉移指令,然後執行一條翻轉30位地址位中的一位作爲指令地址的轉移指令。如果翻轉的哪一位是index位,那麼最開始的8條指令仍舊會存儲在BTB中,否則將表明翻轉的位是tag位。結果:[13:5]爲索引位,[29:14]爲tag位域。tag位在一些處理器中會進行8位的摺疊處理,即每8位之間進行一次亦或運算

    • offset位域:[4:0]。作用尚不清楚。一般情況下,偏移被視爲第二個標籤,需要完全匹配才能發生BTB命中
      在這裏插入圖片描述

  • 間接轉移預測的索引模式(switch-case)

    • switch-case的情況中,指令實現時通常是先計算跳轉目標地址,然後利用間接跳轉指令進行跳轉。在這種情況下,switch語句之前的代碼執行情況將會很可能影響跳轉的目標地址,因此爲了預測間接跳轉通常會聯繫上下文。但是對於default語句的情況,很多不同的上下文都跳轉到同一個目標地址,此時選擇簡單的IP-based的方法將會更準確。因此論文假設BPU會併發的採用這兩種方式訪問BTB

    • 對於一條間接轉移指令,論文對其假設有多種上下文,使用A,B,R(1…k)進行表示,每一種上下文的情況下,指令都有一個目標地址,使用a,b,r表示,兩者的對應關係如下:A->a, B->b, R(1…k)->r。通過多次執行不同上下文情況下的間接轉移指令,觀察BTB會發生的失效或者命中事件的情況,將可以判斷出BPU採用的BTB索引模式。

    • 結果:模式1中表明,對於R(1…k)->r的情況,除了第一次失效,之後都可以正確預測;A-a的情況,在發生第二次的時候也可以預測,即預測器能夠使用兩種獨立的模式預測同一個指令。

    • 結果:模式2表明,預測器會同時使用任意一種方案檢查轉移指令是否可以被預測。
      在這裏插入圖片描述

  • 兩種不同的間接轉移指令會存在的衝突

    • 當BHB狀態和精簡之後的指令地址都匹配,並且BPU採用BHB-based的索引方式的時候(之前的工作採用的污染BTB的方式)
    • 當精簡後的指令地址相同,BHB不同,但是BPU採用IP-based的索引方式的時候
  • 選擇用於污染BTB的轉移指令類型

    • 之前的利用BTB的攻擊通常採用第一種類型的衝突,通過重複先前轉移指令的行爲來保證BHB的狀態一致,同時執行具有匹配的指令地址的間接分支。不太適合在真實世界中使用,因爲要求執行污染的分支(writer branch, WB)和被污染的分支(reader branch, RB)必須位於同一地址空間內.

    • 利用衝突1構建木馬的難點:WB和RB需要處於會發生地址衝突的位置,還需要具有完全相同的BHB狀態。但是映射函數中,f3和f2都是未知的,或者是部分已知的。同時就算f3和f2都是已知的,爲了保證BHB的狀態,訓練過程就需要高度不規則的代碼序列,這就很容易被檢測工具檢測出來。

    • 利用第二種衝突:需要RB和WB在每次執行時都需要處於一個新的BHB上下文中。解決,在執行WB和RB之前執行一段結果隨機的條件分支序列。但是這樣仍舊會導致BHB的狀態最終開始重複,促使BPU使用的BHB-based尋址模式。並且這樣的指令序列也是同樣高度不規則。

    • 期望的設計:(1)當RB和WB位於同樣的地址空間時,會產生可靠的衝突;(2)代碼很容易被掩蓋爲正常代碼

    • 論文的設計:將直接分支作爲WB,因爲(1)它們始終使用IP-based的索引方式,能夠使得BTB的狀態更具有確定性;(2)在常規應用中很常見,容易掩蓋爲普通代碼。(每4-7條就有一條直接分支)
      在這裏插入圖片描述

  • 論文通過測試上述的代碼得到的結論:

    • 直接分支可以作爲WB指令,間接分支作爲RB,兩者共同創造衝突,從而構建木馬。另外,RB並不需要每次都有一個新的上下文?
    • 在BTB中存儲的精簡之後的數據仍舊允許在一個進程內製造衝突,並且跳轉到惡意的地址。
    • 不同種類的直接轉移指令都可以作爲WB指令,包括call和條件分支
    • 通過多執行幾次WB可以提高成功污染BTB的概率。暗示着BTB中的選擇器可能會使用競標賽策略,會選擇準確率更高的預測器
6. Distant collision trojans,遠程衝突木馬
  • 主要利用BTB的索引模式中僅存儲着部分的地址信息。當WB和RB發生衝突後,RB發生錯誤預測時,處理器將推測執行WB指向的目標地址,從而引發攻擊。

    • 示例:BTB中的標籤會使用XOR對指令地址的高位進行摺疊處理。假設在同一個進程中,在地址0x400077處有一條直接分支,在0x4077處有一條間接分支。當兩者均使用IP-based的尋址模式時,兩者就會發生衝突
  • 攻擊的一般過程:首先使用程序API,激活WB指令,將中毒的BTB表項寫入BTB中,之後攻擊者觸發RB初始化暫態執行的條件,例如發出API調用以訪問大型數組將RB的目標地址從緩存中刷新出去。然後再執行RB指令,引發錯誤預測,處理器暫態執行小工具以訪問並泄露隱私數據。

  • 該方法與之前構造衝突的方法不同點:已有的方法通常低權限實體會毒害高特權實體的分支,此方法則是使用在以下兩種情況中:

    • 高特權實體對低特權實體進行毒害污染
    • 處於同一個特權級別進行毒害污染
  • 利用系統調用的木馬示例

    • 在系統態下對BTB的修改結果在返回用戶態時不會被刪除/回退
    • 對圖中的攻擊中,對於攻擊的每次迭代,攻擊者都通過API調用與木馬進行交互。每次調用都將激活木馬內部的惡意功能,進而執行導致BTB中毒的系統調用。該函數從系統調用返回後,將執行間接跳轉,從而導致小工具的暫態執行,最後導致數據泄露
    • 論文從1000次木馬執行中收集數據,攻擊準確率94.52%(激活後成功拿到數據的概率),激活率12.79%
  • ASLR和KASLR會使得攻擊變得更加困難,但是程序可能在沒有ASLR的支持下編譯。而KASLR的可變性很小,可以通過將RB放置在所有潛在的衝突地址上進行攻擊。
    在這裏插入圖片描述

7. Early Front-end Branch Collisions (早起前端轉移指令衝突)
  • BPU在執行過程中正常情況下需要在知道轉移指令的最後一個字節之後才能開始預測,因爲很多情況下,最後一個字節會作爲預測器的索引使用。

  • 在CISC指令系統中,會增加預譯碼器來檢測取到指令緩存行中的指令邊界。論文假設:在激進的前端設計中,可能會在預譯碼完成之前僅使用基於潛在分支指令地址的部分信息進行預測並開始暫態執行。

    • 如果假設成立,那麼將會出現早期的前端分支衝突,即位置較近的分支會由於分支指令邊界的不確定性而發生衝突。(低位不匹配的分支指令之間產生衝突)Intel的一些專利中將地址的低若干位成爲偏移量,但是指明用途
  • 測試假設:將之前的代碼中,WB和RB放置在同一個64B的指令緩存行中,以保證兩者的tag和index都是匹配的。

    • WB會跳轉到一個會泄露寄存器rax中值的小工具中。RB則會跳轉到正常的代碼。但是在執行RB之前,代碼會將祕密值放入rax中。

    • 在執行之前,rax中會被加載爲非隱私數據。如果RB會被WB毒害,那麼執行之後祕密值將能夠通過小工具泄露出去

    • 通過改變WB和RB可能處於的位置,並檢測是否會發生RB被污染的事件來尋找一個穩定的會發生衝突的模式。結論:在Skylake和Kaby Lake處理器中,如果所有的偏移位匹配或者如果WB的bit_5爲1而RB中的bit_5爲0時,兩者會發生衝突。
      在這裏插入圖片描述
      在這裏插入圖片描述

  • 這種衝突機制和其它的衝突機制之間可以結合使用,而不是一定要求WB和RB之間必須是處於同一個緩存行內。例如,如果兩個分支具有匹配的tag和index,但是不匹配高位[47:30],並且遵守bit_5的衝突原則也會發生衝突

    • 在Kaby Lake上的實驗結果:將RB放在地址0x300110上,將WB放在可能發生衝突的潛在地址上(0x100300100-0x100300140),利用性能計數器判斷是否發生了衝突

    • 當WB跨越32字節邊界時,就會發生bit-5衝突
      在這裏插入圖片描述

  • 基於早期前端分支衝突的木馬的隱蔽性和可移植性更好:

    • 不依賴於將分支指令放置在相距很遠的地方,因此尺寸可以很小
    • 不依賴於固定的地址(除了要求在緩存行中的偏移量以外),因此使用ASLR功能後仍舊可以使用
    • 木馬:將所有攻擊組件,WB,RB,小工具都封裝在一小段代碼中,然後打包到一個或者幾條緩存行中。
  • 分散小工具以避免檢查:

    • 目前檢查小工具的依據:代碼序列會產生兩個動作,(1) 讀取內存地址;(2)執行另一條內存操作指令,並且該指令的地址和步驟1獲取的數據之間存在相關。

    • 應對:將小工具分散成兩個部分,保證每個部分都不會被識別爲惡意指令序列。在兩個部分之間增加一條間接跳轉指令,在該指令之間執行前兩個操作,然後再執行後兩個操作。從正常程序的角度,第二部分的指令將不會被執行,因此這兩個部分也不會被認爲是同一個小工具,也無法被正常檢測。
      在這裏插入圖片描述

8. 跳過分支木馬(skipping branch trojans):
  • 跳過間接分支:AMD Ryzen和Intel Haswell架構中的測試
    • 當BTB中沒有可用的預測時,CPU會跳過無條件的間接分支指令,繼續執行之後的指令。
    • 用途:構建木馬,混淆靜態/動態分析工具
    • 例如一個程序中使用間接調用指令來調用某個確定的函數,該指令的目標地址會在程序初始化時被設定,也不會被更改。檢測工具能夠發現這種相關性並且將程序標記爲安全的,但是由於間接分支被跳過,將會導致暫態執行的出現。
  • 基於跳過間接分支的暫態執行攻擊
    • 圖中兩個函數會使用函數指針進行調用,在編譯時會被會變爲間接的call指令。
    • 函數指針f1用於調用函數並返回一個隱私值,將最終將隱私值放入變量sec中;函數指針f2被用於將一個非隱私值放入non-sec變量中
    • 函數調用之後的代碼是一段小工具代碼,用於將nonsec的值泄露出去。由於nonsec中不包含隱私數據,因此不會認爲是不安全的
    • 在System V的ABI中要求,函數的返回值需要使用eax寄存器進行傳遞,並且在返回之後,函數調用者需要將eax的值作爲一個局部變量存儲在堆棧中。
    • 攻擊發生的情況:f1的間接跳轉沒有被跳過,而f2被跳過了。結果導致(1)eax中存儲着隱私數據,並且傳遞到了sec變量中;(2)eax的數據同樣被存儲在non-sec變量中。
    • f2在執行之前,攻擊者會提前將目標地址從緩存中刷新出去,即棧基址
  • 實驗結果:爲了泄露1B的數據需要激活易受攻擊的函數888.07次,平均的錯誤率1.74%
  • f1預測對,f2被跳過的概率很小
    在這裏插入圖片描述
9. 改善木馬的激活率
  • 激活率:數據泄露的次數和總激活嘗試次數的比值
    • 基於內核的12.79%,基於早期前端分支衝突的4.86%
  • 利用遺傳算法改進提升激活率
10. 現有二進制中的衝突
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200522230805974.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NodWlsaXVzaGVuZw==,size_16,color_FFFFFF,t_70#pic_center)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章