歡迎光臨
每天分享高質量文章

用程式碼切身實踐體會meltdown漏洞——初學者的體驗感受

本文基於宋寶華老師的一篇文章——《宋寶華: 用程式碼切身實踐體會meltdown漏洞》。作為初學者的小編,在看完這篇文章並實踐之後,將自己的實踐結果以及實踐的感受分享給大家。

小植同學

對 meltdown 程式碼除錯之後,發現執行speculate() 函式時,

對彙編指令進行分析:

“movzx (%[addr]), %%eax\n\t”
該指令目的是從核心地址取出資料,這是不被允許的。所以系統要報告異常錯誤,該操作是序列的。而其他指令是並行執行的,所以該指令已經執行完畢,並獲得資料。同時下邊的指令也可能已被執行。

“shl $12, %%rax\n\t”
該指令計算一個陣列偏移量。

“movzx (%[target], %%rax, 1), %%rbx\n”
該指令引起頁錯誤。
所以,程式接收到段錯誤訊號——SIGSEGV。然後執行異常操作。調整到 nop 空操作。最後跳到到 check() 函式執行。

小升同學

CPU:AMD
Linux發行版:CentOS

透過meltdown獲得核心空間資料的整體思路:
假設指定的核心虛擬地址是X,地址X儲存的資料是M,使用資料M又計算出另一個地址Y,在計算訪問地址Y處元素的時間,這就是meltdown獲取核心資料的整體思路。假如2000是儲存有要竊取資料的地址,而地址2000儲存的資料範圍是0-4。規定地址Y的計算方式為,地址2000儲存的資料加5000,那麼我們就得到了5個地址,5000,5001,5002,5003,5004 。然後計算訪問這5個地址的記憶體的時間,如果訪問地址5003的時間最短,則說明地址5003對應的資料在cache中,這樣攻擊者就得到核心虛擬地址2000儲存的資料是3。
meltdown漏洞攻擊屬於安全領域的側通道攻擊範疇,具體來說屬於cache側通道攻擊,cache側通道包含幾種攻擊手段,Evict+Time,Prime+Probe,Flush+Reload。而在meltdown論文中採用的是flush+reload的方式,攻擊者頻繁的使用clflush指令flush一個標的地址,透過計算重新載入(reload)標的地址處資料的時間,攻擊者就可以知道該地址處的資料是否在同一時間被載入的cache中。值得註意的是,一次flush+reload只針對一個cacheline,flush+reload攻擊的標的是L3cache。

小偉同學

CPU:Intel
Linux發行版:Ubuntu

小晨同學

CPU:AMD
Linux發行版:Ubuntu

小瑩同學

CPU:AMD
Linux發行版:Ubuntu

大家在檢視原文連結裡面可以閱讀宋老師的文章。

還有一篇分享的文章

贊(0)

分享創造快樂