使用 2018 年 1 月 2 日揭露的「Spectre」漏洞利用的範例(CVE-2017-5753 和 CVE-2017-5715)
Spectre 打破了不同應用程式之間的隔離。它允許攻擊者欺騙遵循最佳實踐的無錯誤程序來洩露其秘密。事實上,上述最佳實踐的安全檢查實際上增加了攻擊面,並可能使應用程式更容易受到 Spectre 的影響。
C,使用函式庫:
我們正在輸入文字“The Magic Words are Squeamish Ossifrage”。在記憶體中,然後我們嘗試使用漏洞來讀取它。如果系統容易受到攻擊,您將在輸出中看到從記憶體中讀取的相同文字。
在此程式碼中,如果按嚴格的程式順序執行victim_function()
中的編譯指令,則該函數將僅從array1[0..15]
讀取,因為array1大小= 16。讀取是可能的。 readMemoryByte()
函數對victim_function()
進行多次訓練調用,以使分支預測器期望 x 的有效值,然後使用越界 x 進行調用。條件分支預測錯誤,隨後的推測執行使用越界 x 讀取秘密位元組。然後,推測程式碼從array2[array1[x] * 512]
讀取,將array1[x]
的值洩漏到快取狀態中。為了完成攻擊,使用簡單的刷新+探測來識別array2
中的哪個快取行被加載,從而揭示記憶體內容。攻擊會重複多次,因此即使目標位元組最初未緩存,第一次迭代也會將其帶入快取。
未最佳化的程式碼在 i7 Surface Pro 3 上的讀取速度約為 10KB/秒。
gcc -std=c99 Source.c -o spectre.out
或make
建立新的空項目並新增 Source.c,然後按一下「建置」。
.spectre.out
沒有參數。
.spectre.out {address} {length}
參數: