您的位置: 旅游网 > 网红

你用了高性能CPU我就可以窺探你的密碼

发布时间:2019-04-02 04:52:48
原標題:你用了高性能CPU,我就可以窺探你的密碼作者:破布編輯:Ent,錦衣Reload太長不看版你用了高性能CPU,我就可以窺探

原標題:你用了高性能CPU,我就可以窺探你的密碼

作者:破布

編輯:Ent,錦衣Reload

太長不看版

你用了高性能CPU,我就可以窺探你的密碼?這是怎么個道理?下面是來自NGA用戶kprismk的一個比喻。注意這是比喻,省略了大量細節:

1.kfc里賣薯條、雞塊、漢堡、可樂。

2.李x璐去kfc點了個漢堡,吃完走了。

3.狗仔隊a狗仔排在李x璐后面的后面,和點餐小姐姐說:我要點和李x璐一樣的。

4.點餐小姐姐說,不好意思您前面還有一位,稍等下。但是后廚聽到了,麻溜地做了個漢堡。

5.輪到a狗仔點餐了,點餐小姐姐說:不能這樣點哦,侵犯人家隱私了,保安把這個狗仔ccq!

6.b狗仔排在a狗仔后面,給小姐姐說:薯條、雞塊、漢堡、可樂各點一份,餓死了餓死了,哪個快先把哪個給我。

7.b狗仔先拿到了漢堡!

8.b狗仔知道了李x璐今天在kfc買了個漢堡!

電腦運行的時候,所有用到的數據都必須經過內存。這里面既有你至關重要的銀行密碼,也有你故意和非故意打開的莫名其妙小網站小程序。

怎么讓這些外面來的野路子程序碰不到關鍵信息呢?

今天的電腦設計了層層防線,其中至關重要的一層發生在電腦的計算核心 CPU上。CPU會負責檢查程序有沒有在不屬于自己的地盤上探頭探腦,如果發現它碰了別人的數據,就會啟動槍斃流程。設計者認為,這樣就能豎起一堵高墻,把每個程序隔離在自己的小屋里。

但是他們錯了。這堵高墻上有一個十分隱蔽的縫隙,剛剛被公開出來。整個行業為之震動。

這個縫隙雖然隱蔽但是危害極大,研究者已經成功通過它偷出來了瀏覽器保存的網站密碼。幸運的是偷密碼的過程十分復雜,壞人這幾天應該還來不及用它實際作惡;不幸的是堵上這個縫隙極度困難,而且看起來要付出電腦明顯變慢的重大代價。

誰也沒想到,2018一開年就迎來了這么大的一個大新聞。

事件經過

2018年開頭的這幾天里,linux系統核心的例行更新被發現在某些場合有巨大的性能衰退,這一反常現象觸發了少量業內人士的關注。linux核心被部署在大量的服務器生產環境中,對性能尤為注重,因此這一補丁的匆忙上線和微軟windows、蘋果Mac OS的曖昧反應加在一起,引發了越來越多的討論。

著名科技新聞站點theregister在北京時間1月3日早上爆料稱[1],linux的這一補丁是為了修復某個巨大的CPU硬件安全漏洞不得已而為之,并直指罪魁禍首是當今世界的CPU頭號霸主Intel,這一新聞張貼出來以后開始在IT圈內廣泛流傳,由于這篇新聞具備相當的技術背景并附上了實測數據,具備比較高的說服力,使得相關的議論和猜測愈演愈烈。

在北京時間1月4日早上,Intel終于按耐不住發表了一篇新聞稿[2],意指這些坊間傳聞有夸大其詞之嫌,但也沒有遮掩安全漏洞確實存在。幾個小時之后,谷歌的安全小組Project Zero正式公布了這兩個極具震撼力的新型漏洞,也就是大家現在看到的熔毀(meltdown)和幽靈(spectre)。

熔毀和幽靈的官方logo

這時候大家才知道,原來具體漏洞在2017年6月-7月份左右就已經被多個團隊獨立發現,相關研究人員在當時就已經知會Intel、AMD、ARM等著名CPU設計(制造)公司和微軟、蘋果、linux kernel核心開發組等相關機構和團體,并在所有知情人中間形成了默契的封口令[3],眾多參與者本來打算等到一兩周之后所有補丁和更新都準備好了再對外公布,沒想到并不知情的theregister網站從linux開源社區的郵件列表里發現了蛛絲馬跡,提前捅破觸發了公關危機,于是1月4號早上Intel也決定提前發布消息,隨后谷歌的研究者也打破沉默,上線了那個早已準備好的漏洞介紹網站和相關論文[4],于是一切被公諸于世。

我們正在經歷什么

毫不夸張地說,截至目前爆出的漏洞實錘和原型演示來看,我們遇上了計算機體系結構發展史上的最大硬件漏洞,并且很可能沒有之一。

目前已經可以確定的是,熔毀直接洞穿了Intel和微軟Windows、linux、蘋果Mac OS共同設下的重重安全防護,使用一段并不算特別復雜的代碼,運行在Intel處理器上,就可以做到竊取Firefox瀏覽器在內存中保存的密碼、保存了網絡通信信息的HTTP報文頭等關鍵隱私,這不是聳人聽聞的推測,而是已經被實現并通過視頻展示給全世界的事實,連源代碼都已開放下載[5]。

而另一個漏洞幽靈則更加高深莫測,它同樣能悄無聲息地穿透操作系統內核的自我保護,從用戶運行的空間里讀取到操作系統內核空間的數據,并且比熔毀更加恐怖的是,它在Intel/AMD/ARM這三大主流公司的CPU上都能起作用,可以說事實上所有的PC/手機/服務器都在受影響范圍內,并且難以通過軟件補丁修復也無法通過反病毒軟件對抗,再考慮到過去這些年中CPU數以億計的出貨量,已售出的芯片也無法通過微碼更新來完美解決問題,因此將會名副其實地成為一個籠罩在所有人頭頂許多年時間的安全隱患,大概幽靈的名字也就是這樣得來的。

為什么之前沒有發現漏洞?

這兩個漏洞都具有同一個特點,利用了現代高性能微處理器中的關鍵特性 推測執行和亂序執行,這兩項技術都是推動微處理器性能進步、讓大家的電腦、手機能夠高速運行越來越復雜應用的核心支柱。

推測執行技術是指,處理器為了提高性能,會去提前猜測接下去需要執行什么動作,然后提前執行,如果發現推測錯誤,則回滾至正常狀態。通常應用的推測執行技術都能達到80%-90%以上的推測準確率。需要指出的是,推測執行技術是一個大類技術的統稱,包括分支預測,預讀取,推測性內存訪問,緩存缺失的重疊/亂序處理(MSHR)等等,幽靈漏洞就利用了分支預測、推測性內存訪問和MSHR這三個特性。

亂序執行技術是指,當處理器遇到需要發生停頓的事件時(例如需要裝載的數據發生了緩存缺失,需要去高延遲的內存中查找),處理器可以越過這個停頓事件,繼續超前執行指令。同樣,如果超前執行中發生了錯誤,也需要回滾至正常狀態。熔毀漏洞就利用了亂序執行特性。

亂序執行的微結構框圖。熔毀利用了圖中execution engine的部分,幽靈利用了圖中branch predictor的部分。

亂序執行技術最早出現在CDC 6600和IBM 360/91上,時間是上個世紀60年代,亂序執行技術的兩位關鍵貢獻者James E. Thornton(1994)和Robert Tomasulo(1997)也因此拿到了計算機體系結構學術界的最高榮譽Eckert Mauchly Award,至于推測執行的第一個范本,由于變種技術太多已經無法考證,可考證最早的分支預測設計是James E. Smith于1981年公開的,他也對亂序執行做出了卓越貢獻,于1999年榮獲Eckert Mauchly Award[6]。

可以看到,這些技術都是經過數十年發展驗證的成熟技術,此前爆出過的也只是程序運行錯誤的功能bug,并沒有如此嚴重的安全漏洞,而且推測執行和亂序執行對性能的提高都是成倍的影響力,例如在模擬器上的驗證表明,關閉亂序執行大約會損失一半的性能,關閉推測執行中的分支預測則會將處理器的最大指令吞吐的理論上限打回上世紀90年代的水平,因此這兩項技術已經成為當之無愧的高性能微處理器的結構頂梁柱。而根據推測執行和亂序執行的框架設計,其中有一個叫做重排序緩沖(ROB)的部件會負責樹立推測狀態和正常狀態之間的分界線,有了ROB的保護之后,推測執行(分支預測)和亂序執行的狀態信息就不會被上層感知,這是寫在每一本計算機體系結構教科書里的內容,被一代又一代的工程師沿用。

現在,這個內容被徹底改寫了。

漏洞原理

雖然指令可以不按順序執行,為了確保亂序執行的效果不對機器狀態發生影響,在亂序執行過程中發生的異常錯誤和安全檢查違例,都要等到指令最后提交結果、并確認推測狀態無誤時才發起處理,如果發生錯誤,指令結果將被丟棄,異常處理進行完畢后回到正常狀態。如果在亂序執行過程中就對指令進行異常處理,就會導致代碼發生異常的位置和實際執行位置不匹配,打破了亂序執行不得影響程序狀態的規則,從而破壞辛苦寫代碼的碼農們所感知到的編程模型。如果指令通過了檢查,確認無誤,指令的操作結果才會更新到緩存與相關寄存器上,從而可以被軟件讀取。因此從指令執行到進行最后的提交檢查之間存在一個可以利用的時間窗口,按照目前的亂序執行窗口和處理器執行頻率計算,大概有十幾個納秒到幾十個納秒的時間,可供繼續超前執行大約幾十到一百多條指令。這個時間窗口成為了熔毀的攻擊點。

CPU執行代碼并非順序執行,而是會把排在后面的代碼提前執行。

在常規狀態下,訪問被保護的敏感區域會直接被權限鑒別的過程給拒絕,但是熔毀在這個小的時間窗口中,故意插入指令訪問了一些本該被保護的關鍵區域,這些敏感數據就會被提至處理器核心內部的寄存器里參與運算。直到這一步,ROB仍然在維護超前執行狀態- 正常狀態的分界線,整個系統仍然在保護之下,因為雖然敏感數據被提至處理器內部,但是并未經過安全檢查和異常檢查的確認,所以它的值只能用來作臨時運算,不能用來參與正常運算,不會被更新到架構可見寄存器與緩存上,也就無法被上層軟件讀取,而等檢查進行到它所處位置的時候,CPU就會發現問題,然后及時制止,所以不會發生問題。但是這里出現了整個漏洞利用中最漂亮的一步:時間差分攻擊。

既然敏感數據已經被提取至CPU核心內部可以參與臨時計算,那么就可以用它作為存儲器訪問的路標k,把內存中的第k塊數據裝入緩存。這大概要花費上百個時鐘周期也就是大約幾十納秒,這個時間處在亂序執行允許的窗口范圍內,如果窗口范圍不夠大了,還可以用其他手段再把這個窗口拉大一些。但終歸到最后,亂序執行的指令要走到提交檢查的一步,CPU檢查發現這個敏感數據被訪問了,就會把對應指令的結果拋掉,k的值被扔掉以后,惡意代碼就無法讀取到k的值了。而這里遺漏了關鍵的一點,在亂序執行中被裝入緩存的內存第k塊數據,并沒有被清理。于是后繼代碼就可以大大方方地把相關內存地址都掃一遍,放在緩存里面的數據的訪問延遲與放在內存里面的數據是不同的,如果掃描到第10塊內存的時候發現它的響應速度特別快,就可以確定先前被讀取上來的k值是10。

另一個幽靈漏洞的原理與此類似,但利用的是推測執行(主要是分支預測)的指令,從執行到進行安全檢查之間的時間差,在推測執1行狀態下,利用此時觸發權限違例不會被立即掐死的特點,執行一些惡意代碼把敏感數據裝入CPU寄存器參與臨時計算,隨后用這個敏感數據制作一個內存地址裝入緩存,再觸發隨后的時間差分攻擊。

效果與防護

熔毀和幽靈利用亂序執行和推測執行,繞過了權限檢查等安全措施,可以訪問操作系統內核乃至其他程序的內容。其中熔毀更容易觸發利用,因此才有大家已經看到的盜取瀏覽器密碼的實例,而幽靈漏洞需要受攻擊目標程序的分支入口點結構滿足一定條件才能觸發,難度相對較大,因此網上還沒有發現基于幽靈漏洞的信息泄露實例出來。需要指出的是,幽靈和熔毀漏洞都只能讀取敏感信息,不能修改(因為亂序執行/推測執行狀態下的修改在未通過檢查時一定會被拋棄),算是不幸中的萬幸。

由于攻擊的是硬件漏洞,因此目前市面所有主流操作系統,包括windows,linux,Mac OS都處在攻擊范圍內,隔離程度不夠高的眾多半虛擬化方案,Docker,LXC等,也在受影響范圍,因此這個漏洞將極大地影響云計算服務提供商。目前Google,Amazon,國內的阿里,騰訊等大型云服務提供商都已宣布了補丁計劃。

從業界廠商的角度看,盡管Intel,AMD,ARM各有說辭[7][8][9],但從專業從業人士的角度看,Intel妥妥地同時受到熔毀和幽靈兩個漏洞影響,而AMD和ARM在熔毀漏洞面前也只是暫時安全,熔毀的攻擊原理也適用于AMD和ARM,只是因為分支預測器結構不同、流水線長度較短導致可利用的時間窗口不大等等因素,才沒有像Intel一樣被熔毀攻破。而幽靈則針對分支預測器進行注入攻擊,目前所有廠商的分支預測器部分都沒有做比較好的安全防護,因此Intel和ARM,AMD都會受到影響,而且分支預測器為了提高性能,天生就設計成部分地址哈希進行模糊匹配的模式,使得相關防御措施很難在不傷害性能的情況下修補漏洞。

針對熔毀漏洞,目前已有的技術手段主要是通過軟件層次將內核頁表與用戶頁表盡可能地隔離,這種技術的一個實現方案叫KAISER,其變種已經被各大操作系統采用作為熔毀漏洞的臨時補救措施。這種技術方案會提高用戶態與內核態的切換開銷,快速系統調用的初步測試證明,內核系統調用的速度降低到了原先的42%,而利用現代處理器的PCID特性進行優化后,能夠恢復到57%的水平[9]。具體的應用程序下降幅度取決于用戶程序與內核交互的頻繁程度,linxu kernel開發人員的測試結果從10%~20%+不等,PCID能夠彌補大約5%-7%的性能。

針對幽靈漏洞,目前沒有很好的防御方式,linux的發行版之一suse最近公開的一個安全更新顯示[10],AMD和Intel已經向相關OS廠商推送了一個微碼更新,這個微碼更新會關閉分支預測來暫時封堵幽靈漏洞。由于分支預測對性能影響巨大,即便分支預測只被關閉一部分也很容易造成性能衰退二代左右的幅度,如果整個分支預測器都被關閉,CPU性能將退回2000年以前的水平。對于這個更新是否將被應用,相關從業人士正在持續跟進關注。

相關Tags:

连花清瘟一般吃多久外阴瘙痒是什么病新生儿便秘怎么办
猜你会喜欢的
猜你会喜欢的