課程:《密碼與安全新技術專題》編程
班級: 92
姓名: 馮乾
學號: 20182918
上課教師:謝四江
上課日期:2019年5月25日
必修/選修: 選修緩存
論文題目:Spectre Attacks: Exploiting Speculative Execution
論文來源:39th IEEE Symposium on Security and Privacy(Oakland)
做者信息:安全
- Paul Kocher
- Independent
- Daniel Genkin
- University of Pennsylvania and University of Maryland
- Daniel Gruss
- Graz University of Technology
- Werner Haas
- Cyberus Technology
- Mike Hamburg
- Rambus, Cryptography Research Division
- Moritz Lipp
- Graz University of Technology
- Stefan Mangard
- Graz University of Technology
- Thomas Prescher
- Cyberus Technology
- Michael Schwarz
- Graz University of Technology
- Yuval Yarom
- University of Adelaide and Data
本文發表時間不到一年半,引用次數已經達到了416次。ide
現代處理器使用分支預測和推測執行來最大化性能。 例如,若是分支的目標取決於正在讀取的內存值,則CPU將嘗試獲取目標並嘗試提早執行。 當內存值最終到達時,CPU丟棄或提交推測計算。 推測邏輯在執行方式上是不忠實的,能夠訪問受害者的內存和寄存器,而且能夠執行具備可測量反作用的操做。
幽靈攻擊涉及誘使受害者以規範的方式執行在正確的程序執行期間不會發生的操做以及泄漏受害者的操做,能夠經過側信道向外界提供的機密信息。幽靈攻擊結合了來自側信道攻擊,故障攻擊和迴歸導向編程的方法,能夠從受害者的內存中讀取任意任意位置的內容。 更普遍地說,推測性執行實施違反了支持數字軟件安全機制的安全假設,包括操做系統進程分離,靜態分析,容器化,即時(JIT)編譯以及對緩存的定時/側通道攻擊的對策。 這些攻擊對實際系統構成嚴重威脅,由於在用於數百萬臺設備的英特爾,AMD和ARM的微處理器中發現了漏洞預測執行的功能。
幽靈攻擊就像字面所說的意思同樣,來無影去無蹤,當攻擊發生時受害者在毫無察覺的狀況下就被CPU的預測執行功能「出賣」了。性能
預測執行簡單來講是一些具備預測執行能力的新型處理器,能夠估計即將執行的指令,採用預先計算的方法來加快整個處理過程。學習
預測執行的設計理念是:加速大機率事件。測試
預測執行是高速處理器使用的一種技術,經過考慮可能的將來執行路徑並提早地執行其中的指令來提升性能。例如,當程序的控制流程取決於物理內存中未緩存的值時,可能須要幾百個時鐘週期才能知道該值。除了經過空閒浪費這些週期以外,過程還會控制控制流的方向,保存其寄存器狀態的檢查點而且繼續在推測的路徑上推測性地執行該程序。當值從存儲器中偶然到達時,處理器檢查最初猜想的正確性。若是猜想錯誤,則處理器將寄存器狀態恢復爲存儲的檢查點並丟棄(不正確的)預測執行,若是猜想是正確的,則該部分代碼已被執行過,不須要再次執行,所以帶來了顯著的性能增益。操作系統
能夠發現,若是預測錯誤,即使程序真正執行到這裏時錯誤結果被丟棄,但錯誤的結果仍是短暫的出如今寄存器中,在被丟棄以前,這部分數據就很容易被泄露。設計
下面是一段可能被分支預測器錯誤預估的代碼:
3d
對於這段代碼,攻擊者首先使用有效的x調用相關代碼,訓練分支預測器判斷該if爲真。 而後,攻擊者設置x值在array1_size以外。 CPU猜想邊界檢查將是真的,推測性地使用這個惡意x讀取array2 [array1 [x] * 256]。 讀取array2使用惡意x將數據加載到依賴於array1 [x]的地址的高速緩存中。當處理器意識到這個if爲假時,重現選擇執行路徑,但緩存狀態的變化不會被恢復,而且能夠被攻擊者檢測到以找到受害者的存儲器的一個字節。 經過使用不一樣的x值重複,能夠利用該構造來讀取受害者的存儲器。
該段代碼的一般執行過程以下:
進入if判斷語句後,首先從高速緩存查詢有無array1_size的值,若是沒有則從低速存儲器查詢,按照咱們的設計,高速緩存一直被擦除因此沒有array1_size的值,總要去低速緩存查詢。
查詢到後,該判斷爲真,因而前後從高速緩存查詢array1[x]和array2[array1[x]*256]的值,通常狀況下是不會有的,因而從低速緩存加載到高速緩存。
在執行過幾回以後,if判斷連續爲真,在下一次須要從低速緩存加載array1_size時,爲了避免形成時鐘週期的浪費,CPU的預測執行開始工做,此時它有理由判斷if條件爲真,由於以前均爲真(加速大機率事件),因而直接執行下面的代碼,也就是說此時即使x的值越界了,咱們依然頗有可能在高速緩存中查詢到內存中array1[x]和array2[array1[x]*256]的值,當CPU發現預測錯誤時咱們已經獲得了須要的信息。
攻擊流程圖以下:
獲取目標內存地址的技術本論文沒有介紹,我的覺得能夠堆內存地址進行監控,選擇頻繁被修改的地址。
攻擊示例程序中的受害代碼採用上面的例子,交替輸入有效和惡意的參數:
Meltdown是一種相似的微體系結構攻擊,它利用無序執行來泄漏目標的物理內存。 Meltdown在兩個主要方面與Spectre Attacks大相徑庭。 首先,與Spectre不一樣,Meltdown不使用分支預測來實現推測執行。 相反,它依賴於觀察,當一條指令致使一個軟中斷時,正在無序執行的指令停止。第二,Meltdown利用特定於英特爾處理器的特權升級漏洞,由此 推測執行的指令能夠繞過內存保護。 結合這些問題,Meltdown從用戶空間訪問內核內存。 此訪問會致使軟中斷,但在發出軟中斷以前,訪問後面的代碼會經過緩存通道泄漏所訪問內存的內容。與Meltdown不一樣,Spectre攻擊適用於非Intel處理器,包括AMD和ARM處理器。 此外,KAISER補丁已被普遍應用於對Meltdown攻擊的緩解,但不能防止幽靈攻擊。
代碼修改:原論文附錄中提供的代碼存在些許瑕疵,對於觀察指望輸出存在必定阻礙,如圖:
正如沒有絕對安全的系統,某種方案被開發出來後一定伴隨着一些隱藏的反作用。預測執行這種技術聽起來確實是有無限可能,尤爲是在處理器性能大大受到IO限制的今天。但推測執行帶來的問題也不得不防,利用推測執行的漏洞進行攻擊的幽靈,無聲無息的盜取數據後甚至不會留下一點痕跡。