課程:《密碼與安全新技術專題》
班級: 1892班
姓名: 李煬
學號:20189215
上課教師:謝四江
上課日期:2019年5月21日
必修/選修: 選修html
熔斷(Meltdown)和幽靈(Spectre)是CPU的兩組嚴重漏洞,Meltdown漏洞影響幾乎全部的Intel CPU和部分ARM CPU,而Spectre則影響全部的Intel CPU和AMD CPU,以及主流的ARM CPU本論文不涉及熔斷,故暫不介紹。
如今的不少處理器都使用分支預測和推測執行來最大化性能。例如,若是分支的目標取決於正在讀取的內存值,則CPU將嘗試猜想目標並嘗試提早執行。當存儲器值最終到達時,CPU丟棄或提交推測計算。推測邏輯在執行方式上是越界的,能夠訪問受害者的內存和寄存器,而且能夠執行具備明顯影響反作用的操做。
幽靈攻擊涉及誘使受害者推測性地執行在正確的程序執行期間不會發生的操做,而且經過旁路分支將受害者的機密信息泄露給攻擊者。論文中的幽靈攻擊結合了側信道攻擊,故障攻擊和麪向返回編程的方法,能夠從受害者的進程中讀取任意內存。更普遍地說,論文說明了推測性執行實施違反了許多軟件安全機制所依據的安全假設,包括操做系統進程分離,靜態分析,容器化,即時(JIT)編譯以及緩存時序/側通道的對策攻擊。因爲在數十億設備中使用的Intel,AMD和ARM微處理器中存在易受攻擊的推測執行能力,這些攻擊對實際系統構成嚴重威脅。
幽靈攻擊這個名稱乍一聽以爲有些荒唐,可是瞭解以後,會發現幽靈攻擊來無影去無蹤,就像一個幽靈同樣在不知不覺間完成攻擊,名副其實。編程
一般,處理器不知道程序的將來指令流。例如,當無序執行執行條件分支指令時,會發生這種狀況,該條件分支指令的方向取決於其執行還沒有完成的先前指令。在這種狀況下,處理器能夠保存包含其當前寄存器狀態的檢查點,對程序將遵循的路徑進行預測,並沿路徑推測性地執行指令。若是預測結果是正確的,則不須要檢查點,而且在程序執行順序中退出指令。不然,當處理器肯定它遵循錯誤的路徑時,它經過從檢查點從新加載其狀態並沿着正確的路徑繼續執行來放棄沿路徑的全部待處理指令。執行放棄指令,以便程序執行路徑外的指令所作的更改不會對程序可見。所以,推測執行維護程序的邏輯狀態,就好像執行遵循正確的路徑同樣。
推測執行簡單來講就是爲了提升系統的運行性能,許多CPU會選擇一個最有可能執行的分支來推測性地提早執行指令,若推測成功,繼續執行;若推測失敗,則返回選擇分支以前的狀態。可是返回狀態時並不會修改寄存器中的數據,所以這部分數據就有可能被攻擊者獲取,神不知鬼不覺地完成攻擊,由於表面上看起來程序並無執行錯誤。緩存
這是一段可能會被錯誤預測的代碼:
安全
for (volatile int z = 0; z < 100; z++) {} /* Delay (can also mfence) */ /* Bit twiddling to set x=training_x if j%6!=0 or malicious_x if j%6==0 */ /* Avoid jumps in case those tip off the branch predictor */ x = ((j % 6) - 1) & ~0xFFFF; /* Set x=FFF.FF0000 if j%6==0, else x=0 */ x = (x | (x >> 16)); /* Set x=-1 if j&6=0, else x=0 */ x = training_x ^ (x & (malicious_x ^ training_x));
/* Time reads. Order is lightly mixed up to prevent stride prediction */ for (i = 0; i < 256; i++) { mix_i = ((i * 167) + 13) & 255; addr = &array2[mix_i * 512]; time1 = __rdtscp(&junk); /* READ TIMER */ junk = *addr; /* MEMORY ACCESS TO TIME */ time2 = __rdtscp(&junk) - time1; /* READ TIMER & COMPUTE ELAPSED TIME */ if (time2 <= CACHE_HIT_THRESHOLD && mix_i != array1[tries % array1_size]) results[mix_i]++; /* cache hit - add +1 to score for this value */ } /* Locate highest & second-highest results results tallies in j/k */ j = k = -1; for (i = 0; i < 256; i++) { if (j < 0 || results[i] >= results[j]) { k = j; j = i; } else if (k < 0 || results[i] >= results[k]) { k = i; } } if (results[j] >= (2 * results[k] + 5) || (results[j] == 2 && results[k] == 0)) break; /* Clear success if best is > 2*runner-up + 5 or 2/0) */ }
CPU性能的提高帶來了計算機速度的飛速提高,可是提高性能的代價是一些非顯性的安全問題,熔斷和幽靈都是如此,想要徹底避免這中漏洞攻擊,能夠經過打補丁修改機制,不過會下降性能,也能夠更換硬件,從根本上解決問題,可是誰也說很差新的方案會不會有什麼問題。幽靈攻擊來無影去無蹤,踏雪無痕,可是發現了問題,總有完美解決的一天,人類的科技進步也遵循這樣發現問題-解決問題的規律。ide