你用了高性能CPU,我就可以窺探你的密碼
電腦運行的時(shí)候,所有用到的數據都必須經(jīng)過(guò)內存。這里面既有你至關(guān)重要的銀行密碼,也有你故意和非故意打開(kāi)的莫名其妙小網(wǎng)站小程序。
本文引用地址:http://dyxdggzs.com/article/201801/374125.htm怎么讓這些外面來(lái)的野路子程序碰不到關(guān)鍵信息呢?
今天的電腦設計了層層防線(xiàn),其中至關(guān)重要的一層發(fā)生在電腦的計算核心——CPU上。CPU會(huì )負責檢查程序有沒(méi)有在不屬于自己的地盤(pán)上探頭探腦,如果發(fā)現它碰了別人的數據,就會(huì )啟動(dòng)槍斃流程。設計者認為,這樣就能豎起一堵高墻,把每個(gè)程序隔離在自己的小屋里。
但是他們錯了。這堵高墻上有一個(gè)十分隱蔽的縫隙,剛剛被公開(kāi)出來(lái)。整個(gè)行業(yè)為之震動(dòng)。
這個(gè)縫隙雖然隱蔽但是危害極大,研究者已經(jīng)成功通過(guò)它偷出來(lái)了瀏覽器保存的網(wǎng)站密碼。幸運的是偷密碼的過(guò)程十分復雜,壞人這幾天應該還來(lái)不及用它實(shí)際作惡;不幸的是堵上這個(gè)縫隙極度困難,而且看起來(lái)要付出電腦明顯變慢的重大代價(jià)。
誰(shuí)也沒(méi)想到,2018一開(kāi)年就迎來(lái)了這么大的一個(gè)大新聞。
事件經(jīng)過(guò)
2018年開(kāi)頭的這幾天里,linux系統核心的例行更新被發(fā)現在某些場(chǎng)合有巨大的性能衰退,這一反?,F象觸發(fā)了少量業(yè)內人士的關(guān)注。linux核心被部署在大量的服務(wù)器生產(chǎn)環(huán)境中,對性能尤為注重,因此這一補丁的匆忙上線(xiàn)和微軟windows、蘋(píng)果Mac OS的曖昧反應加在一起,引發(fā)了越來(lái)越多的討論。
著(zhù)名科技新聞?wù)军c(diǎn)theregister在北京時(shí)間1月3日早上爆料稱(chēng)[1],linux的這一補丁是為了修復某個(gè)巨大的CPU硬件安全漏洞不得已而為之,并直指罪魁禍首是當今世界的CPU頭號霸主Intel,這一新聞張貼出來(lái)以后開(kāi)始在IT圈內廣泛流傳,由于這篇新聞具備相當的技術(shù)背景并附上了實(shí)測數據,具備比較高的說(shuō)服力,使得相關(guān)的議論和猜測愈演愈烈。
在北京時(shí)間1月4日早上,Intel終于按耐不住發(fā)表了一篇新聞稿[2],意指這些坊間傳聞?dòng)锌浯笃湓~之嫌,但也沒(méi)有遮掩安全漏洞確實(shí)存在。幾個(gè)小時(shí)之后,谷歌的安全小組Project Zero正式公布了這兩個(gè)極具震撼力的新型漏洞,也就是大家現在看到的熔毀(meltdown)和幽靈(spectre)。

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

我們正在經(jīng)歷什么
毫不夸張地說(shuō),截至目前爆出的漏洞實(shí)錘和原型演示來(lái)看,我們遇上了計算機體系結構發(fā)展史上的最大硬件漏洞,并且很可能沒(méi)有之一。目前已經(jīng)可以確定的是,“熔毀”直接洞穿了Intel和微軟Windows、linux、蘋(píng)果Mac OS共同設下的重重安全防護,使用一段并不算特別復雜的代碼,運行在Intel處理器上,就可以做到竊取Firefox瀏覽器在內存中保存的密碼、保存了網(wǎng)絡(luò )通信信息的HTTP報文頭等關(guān)鍵隱私,這不是聳人聽(tīng)聞的推測,而是已經(jīng)被實(shí)現并通過(guò)視頻展示給全世界的事實(shí),連源代碼都已開(kāi)放下載[5]。而另一個(gè)漏洞“幽靈”則更加高深莫測,它同樣能悄無(wú)聲息地穿透操作系統內核的自我保護,從用戶(hù)運行的空間里讀取到操作系統內核空間的數據,并且比“熔毀”更加恐怖的是,它在Intel/AMD/ARM這三大主流公司的CPU上都能起作用,可以說(shuō)事實(shí)上所有的PC/手機/服務(wù)器都在受影響范圍內,并且難以通過(guò)軟件補丁修復也無(wú)法通過(guò)反病毒軟件對抗,再考慮到過(guò)去這些年中CPU數以?xún)|計的出貨量,已售出的芯片也無(wú)法通過(guò)微碼更新來(lái)完美解決問(wèn)題,因此將會(huì )名副其實(shí)地成為一個(gè)籠罩在所有人頭頂許多年時(shí)間的安全隱患,大概“幽靈”的名字也就是這樣得來(lái)的。
為什么之前沒(méi)有發(fā)現這個(gè)漏洞?
這兩個(gè)漏洞都具有同一個(gè)特點(diǎn),利用了現代高性能微處理器中的關(guān)鍵特性 - 推測執行和亂序執行,這兩項技術(shù)都是推動(dòng)微處理器性能進(jìn)步、讓大家的電腦、手機能夠高速運行越來(lái)越復雜應用的核心支柱。
推測執行技術(shù)是指,處理器為了提高性能,會(huì )去提前猜測接下去需要執行什么動(dòng)作,然后提前執行,如果發(fā)現推測錯誤,則回滾至正常狀態(tài)。通常應用的推測執行技術(shù)都能達到80%-90%以上的推測準確率。需要指出的是,推測執行技術(shù)是一個(gè)大類(lèi)技術(shù)的統稱(chēng),包括分支預測,預讀取,推測性?xún)却嬖L(fǎng)問(wèn),緩存缺失的重疊/亂序處理(MSHR)等等,幽靈漏洞就利用了分支預測、推測性?xún)却嬖L(fǎng)問(wèn)和MSHR這三個(gè)特性。
亂序執行技術(shù)是指,當處理器遇到需要發(fā)生停頓的事件時(shí)(例如需要裝載的數據發(fā)生了緩存缺失,需要去高延遲的內存中查找),處理器可以越過(guò)這個(gè)停頓事件,繼續超前執行指令。同樣,如果超前執行中發(fā)生了錯誤,也需要回滾至正常狀態(tài)。熔毀漏洞就利用了亂序執行特性。

亂序執行技術(shù)最早出現在CDC 6600和IBM 360/91上,時(shí)間是上個(gè)世紀60年代,亂序執行技術(shù)的兩位關(guān)鍵貢獻者James E. Thornton(1994)和Robert Tomasulo(1997)也因此拿到了計算機體系結構學(xué)術(shù)界的最高榮譽(yù)Eckert–Mauchly Award,至于推測執行的第一個(gè)范本,由于變種技術(shù)太多已經(jīng)無(wú)法考證,可考證最早的分支預測設計是James E. Smith于1981年公開(kāi)的,他也對亂序執行做出了卓越貢獻,于1999年榮獲Eckert–Mauchly Award[6]。
可以看到,這些技術(shù)都是經(jīng)過(guò)數十年發(fā)展驗證的成熟技術(shù),此前爆出過(guò)的也只是程序運行錯誤的功能bug,并沒(méi)有如此嚴重的安全漏洞,而且推測執行和亂序執行對性能的提高都是成倍的影響力,例如在模擬器上的驗證表明,關(guān)閉亂序執行大約會(huì )損失一半的性能,關(guān)閉推測執行中的分支預測則會(huì )將處理器的最大指令吞吐的理論上限打回上世紀90年代的水平,因此這兩項技術(shù)已經(jīng)成為當之無(wú)愧的高性能微處理器的結構頂梁柱。而根據推測執行和亂序執行的框架設計,其中有一個(gè)叫做重排序緩沖(ROB)的部件會(huì )負責樹(shù)立推測狀態(tài)和正常狀態(tài)之間的分界線(xiàn),有了ROB的保護之后,推測執行(分支預測)和亂序執行的狀態(tài)信息就不會(huì )被上層感知,這是寫(xiě)在每一本計算機體系結構教科書(shū)里的內容,被一代又一代的工程師沿用。
現在,這個(gè)內容被徹底改寫(xiě)了。
漏洞原理
雖然指令可以不按順序執行,為了確保亂序執行的效果不對機器狀態(tài)發(fā)生影響,在亂序執行過(guò)程中發(fā)生的異常錯誤和安全檢查違例,都要等到指令最后提交結果、并確認推測狀態(tài)無(wú)誤時(shí)才發(fā)起處理,如果發(fā)生錯誤,指令結果將被丟棄,異常處理進(jìn)行完畢后回到正常狀態(tài)。如果在亂序執行過(guò)程中就對指令進(jìn)行異常處理,就會(huì )導致代碼發(fā)生異常的位置和實(shí)際執行位置不匹配,打破了亂序執行不得影響程序狀態(tài)的規則,從而破壞辛苦寫(xiě)代碼的碼農們所感知到的編程模型。如果指令通過(guò)了檢查,確認無(wú)誤,指令的操作結果才會(huì )更新到緩存與相關(guān)寄存器上,從而可以被軟件讀取。因此從指令執行到進(jìn)行最后的提交檢查之間存在一個(gè)可以利用的時(shí)間窗口,按照目前的亂序執行窗口和處理器執行頻率計算,大概有十幾個(gè)納秒到幾十個(gè)納秒的時(shí)間,可供繼續超前執行大約幾十到一百多條指令。這個(gè)時(shí)間窗口成為了“熔毀”的攻擊點(diǎn)。

在常規狀態(tài)下,訪(fǎng)問(wèn)被保護的敏感區域會(huì )直接被權限鑒別的過(guò)程給拒絕,但是熔毀在這個(gè)小的時(shí)間窗口中,故意插入指令訪(fǎng)問(wèn)了一些本該被保護的關(guān)鍵區域,這些敏感數據就會(huì )被提至處理器核心內部的寄存器里參與運算。直到這一步,ROB仍然在維護超前執行狀態(tài) - 正常狀態(tài)的分界線(xiàn),整個(gè)系統仍然在保護之下,因為雖然敏感數據被提至處理器內部,但是并未經(jīng)過(guò)安全檢查和異常檢查的確認,所以它的值只能用來(lái)作臨時(shí)運算,不能用來(lái)參與正常運算,不會(huì )被更新到架構可見(jiàn)寄存器與緩存上,也就無(wú)法被上層軟件讀取,而等檢查進(jìn)行到它所處位置的時(shí)候,CPU就會(huì )發(fā)現問(wèn)題,然后及時(shí)制止,所以不會(huì )發(fā)生問(wèn)題。但是這里出現了整個(gè)漏洞利用中最漂亮的一步:時(shí)間差分攻擊。
既然敏感數據已經(jīng)被提取至CPU核心內部可以參與臨時(shí)計算,那么就可以用它作為存儲器訪(fǎng)問(wèn)的路標k,把內存中的第k塊數據裝入緩存。這大概要花費上百個(gè)時(shí)鐘周期也就是大約幾十納秒,這個(gè)時(shí)間處在亂序執行允許的窗口范圍內,如果窗口范圍不夠大了,還可以用其他手段再把這個(gè)窗口拉大一些。但終歸到最后,亂序執行的指令要走到提交檢查的一步,CPU檢查發(fā)現這個(gè)敏感數據被訪(fǎng)問(wèn)了,就會(huì )把對應指令的結果拋掉,k的值被扔掉以后,惡意代碼就無(wú)法讀取到k的值了。而這里遺漏了關(guān)鍵的一點(diǎn),在亂序執行中被裝入緩存的內存第k塊數據,并沒(méi)有被清理。于是后繼代碼就可以大大方方地把相關(guān)內存地址都掃一遍,放在緩存里面的數據的訪(fǎng)問(wèn)延遲與放在內存里面的數據是不同的,如果掃描到第10塊內存的時(shí)候發(fā)現它的響應速度特別快,就可以確定先前被讀取上來(lái)的k值是10。
另一個(gè)幽靈漏洞的原理與此類(lèi)似,但利用的是推測執行(主要是分支預測)的指令,從執行到進(jìn)行安全檢查之間的時(shí)間差,在推測執1行狀態(tài)下,利用此時(shí)觸發(fā)權限違例不會(huì )被立即掐死的特點(diǎn),執行一些惡意代碼把敏感數據裝入CPU寄存器參與臨時(shí)計算,隨后用這個(gè)敏感數據制作一個(gè)內存地址裝入緩存,再觸發(fā)隨后的時(shí)間差分攻擊。
效果與防護
熔毀和幽靈利用亂序執行和推測執行,繞過(guò)了權限檢查等安全措施,可以訪(fǎng)問(wèn)操作系統內核乃至其他程序的內容。其中熔毀更容易觸發(fā)利用,因此才有大家已經(jīng)看到的盜取瀏覽器密碼的實(shí)例,而幽靈漏洞需要受攻擊目標程序的分支入口點(diǎn)結構滿(mǎn)足一定條件才能觸發(fā),難度相對較大,因此網(wǎng)上還沒(méi)有發(fā)現基于幽靈漏洞的信息泄露實(shí)例出來(lái)。需要指出的是,幽靈和熔毀漏洞都只能讀取敏感信息,不能修改(因為亂序執行/推測執行狀態(tài)下的修改在未通過(guò)檢查時(shí)一定會(huì )被拋棄),算是不幸中的萬(wàn)幸。
由于攻擊的是硬件漏洞,因此目前市面所有主流操作系統,包括windows,linux,Mac OS都處在攻擊范圍內,隔離程度不夠高的眾多半虛擬化方案,Docker,LXC等,也在受影響范圍,因此這個(gè)漏洞將極大地影響云計算服務(wù)提供商。目前Google,Amazon,國內的阿里,騰訊等大型云服務(wù)提供商都已宣布了補丁計劃。
從業(yè)界廠(chǎng)商的角度看,盡管Intel,AMD,ARM各有說(shuō)辭[7][8][9],但從專(zhuān)業(yè)從業(yè)人士的角度看,Intel妥妥地同時(shí)受到熔毀和幽靈兩個(gè)漏洞影響,而AMD和ARM在熔毀漏洞面前也只是暫時(shí)安全,熔毀的攻擊原理也適用于A(yíng)MD和ARM,只是因為分支預測器結構不同、流水線(xiàn)長(cháng)度較短導致可利用的時(shí)間窗口不大等等因素,才沒(méi)有像Intel一樣被熔毀攻破。而幽靈則針對分支預測器進(jìn)行注入攻擊,目前所有廠(chǎng)商的分支預測器部分都沒(méi)有做比較好的安全防護,因此Intel和ARM,AMD都會(huì )受到影響,而且分支預測器為了提高性能,天生就設計成部分地址哈希進(jìn)行模糊匹配的模式,使得相關(guān)防御措施很難在不傷害性能的情況下修補漏洞。
針對熔毀漏洞,目前已有的技術(shù)手段主要是通過(guò)軟件層次將內核頁(yè)表與用戶(hù)頁(yè)表盡可能地隔離,這種技術(shù)的一個(gè)實(shí)現方案叫KAISER,其變種已經(jīng)被各大操作系統采用作為熔毀漏洞的臨時(shí)補救措施。這種技術(shù)方案會(huì )提高用戶(hù)態(tài)與內核態(tài)的切換開(kāi)銷(xiāo),快速系統調用的初步測試證明,內核系統調用的速度降低到了原先的42%,而利用現代處理器的PCID特性進(jìn)行優(yōu)化后,能夠恢復到57%的水平[9]。具體的應用程序下降幅度取決于用戶(hù)程序與內核交互的頻繁程度,linxu kernel開(kāi)發(fā)人員的測試結果從10%~20%+不等,PCID能夠彌補大約5%-7%的性能。
針對幽靈漏洞,目前沒(méi)有很好的防御方式,linux的發(fā)行版之一suse最近公開(kāi)的一個(gè)安全更新顯示[10],AMD和Intel已經(jīng)向相關(guān)OS廠(chǎng)商推送了一個(gè)微碼更新,這個(gè)微碼更新會(huì )關(guān)閉分支預測來(lái)暫時(shí)封堵幽靈漏洞。由于分支預測對性能影響巨大,即便分支預測只被關(guān)閉一部分也很容易造成性能衰退二代左右的幅度,如果整個(gè)分支預測器都被關(guān)閉,CPU性能將退回2000年以前的水平。對于這個(gè)更新是否將被應用,相關(guān)從業(yè)人士正在持續跟進(jìn)關(guān)注。
下面是來(lái)自NGA用戶(hù)kprismk的一個(gè)比喻。注意這是比喻,省略了大量細節:
1.kfc里賣(mài)的有薯條、雞塊、漢堡、可樂(lè )。
2.李小璐去kfc點(diǎn)了個(gè)漢堡,吃完走了。
3.狗仔隊a狗仔排在李小璐后面的后面,和點(diǎn)餐小姐姐說(shuō):我要點(diǎn)和李小璐一樣的。
4.點(diǎn)餐小姐姐說(shuō),不好意思您前面還有一位,稍等下,但是后廚聽(tīng)到了,麻溜的做了個(gè)漢堡。
5.輪到a狗仔點(diǎn)餐了,點(diǎn)餐小姐姐說(shuō)。不能這樣點(diǎn)哦,侵犯人家隱私了,保安把這個(gè)狗仔ccq!
6.b狗仔排在a狗仔后面,給小姐姐說(shuō):我薯條、雞塊、漢堡、可樂(lè )各點(diǎn)一份,餓死了餓死了,哪個(gè)快先把哪個(gè)給我!
7.b狗仔先拿到了“漢堡”!
8.b狗仔知道了李小璐今天在kfc買(mǎi)了個(gè)漢堡!
評論