你用了高性能CPU,我就可以窺探你的密碼
電腦運(yùn)行的時(shí)候,所有用到的數(shù)據(jù)都必須經(jīng)過(guò)內(nèi)存。這里面既有你至關(guān)重要的銀行密碼,也有你故意和非故意打開(kāi)的莫名其妙小網(wǎng)站小程序。
本文引用地址:http://butianyuan.cn/article/201801/374125.htm怎么讓這些外面來(lái)的野路子程序碰不到關(guān)鍵信息呢?
今天的電腦設(shè)計(jì)了層層防線,其中至關(guān)重要的一層發(fā)生在電腦的計(jì)算核心——CPU上。CPU會(huì)負(fù)責(zé)檢查程序有沒(méi)有在不屬于自己的地盤(pán)上探頭探腦,如果發(fā)現(xiàn)它碰了別人的數(shù)據(jù),就會(huì)啟動(dòng)槍斃流程。設(shè)計(jì)者認(rèn)為,這樣就能豎起一堵高墻,把每個(gè)程序隔離在自己的小屋里。
但是他們錯(cuò)了。這堵高墻上有一個(gè)十分隱蔽的縫隙,剛剛被公開(kāi)出來(lái)。整個(gè)行業(yè)為之震動(dòng)。
這個(gè)縫隙雖然隱蔽但是危害極大,研究者已經(jīng)成功通過(guò)它偷出來(lái)了瀏覽器保存的網(wǎng)站密碼。幸運(yùn)的是偷密碼的過(guò)程十分復(fù)雜,壞人這幾天應(yīng)該還來(lái)不及用它實(shí)際作惡;不幸的是堵上這個(gè)縫隙極度困難,而且看起來(lái)要付出電腦明顯變慢的重大代價(jià)。
誰(shuí)也沒(méi)想到,2018一開(kāi)年就迎來(lái)了這么大的一個(gè)大新聞。
事件經(jīng)過(guò)
2018年開(kāi)頭的這幾天里,linux系統(tǒng)核心的例行更新被發(fā)現(xiàn)在某些場(chǎng)合有巨大的性能衰退,這一反?,F(xiàn)象觸發(fā)了少量業(yè)內(nèi)人士的關(guān)注。linux核心被部署在大量的服務(wù)器生產(chǎn)環(huán)境中,對(duì)性能尤為注重,因此這一補(bǔ)丁的匆忙上線和微軟windows、蘋(píng)果Mac OS的曖昧反應(yīng)加在一起,引發(fā)了越來(lái)越多的討論。
著名科技新聞?wù)军c(diǎn)theregister在北京時(shí)間1月3日早上爆料稱(chēng)[1],linux的這一補(bǔ)丁是為了修復(fù)某個(gè)巨大的CPU硬件安全漏洞不得已而為之,并直指罪魁禍?zhǔn)资钱?dāng)今世界的CPU頭號(hào)霸主Intel,這一新聞張貼出來(lái)以后開(kāi)始在IT圈內(nèi)廣泛流傳,由于這篇新聞具備相當(dāng)?shù)募夹g(shù)背景并附上了實(shí)測(cè)數(shù)據(jù),具備比較高的說(shuō)服力,使得相關(guān)的議論和猜測(cè)愈演愈烈。
在北京時(shí)間1月4日早上,Intel終于按耐不住發(fā)表了一篇新聞稿[2],意指這些坊間傳聞?dòng)锌浯笃湓~之嫌,但也沒(méi)有遮掩安全漏洞確實(shí)存在。幾個(gè)小時(shí)之后,谷歌的安全小組Project Zero正式公布了這兩個(gè)極具震撼力的新型漏洞,也就是大家現(xiàn)在看到的熔毀(meltdown)和幽靈(spectre)。
這時(shí)候大家才知道,原來(lái)具體漏洞在2017年6月-7月份左右就已經(jīng)被多個(gè)團(tuán)隊(duì)獨(dú)立發(fā)現(xiàn),相關(guān)研究人員在當(dāng)時(shí)就已經(jīng)知會(huì)Intel、AMD、ARM等著名CPU設(shè)計(jì)(制造)公司和微軟、蘋(píng)果、linux kernel核心開(kāi)發(fā)組等相關(guān)機(jī)構(gòu)和團(tuán)體,并在所有知情人中間形成了默契的封口令[3],眾多參與者本來(lái)打算等到一兩周之后所有補(bǔ)丁和更新都準(zhǔn)備好了再對(duì)外公布,沒(méi)想到并不知情的theregister網(wǎng)站從linux開(kāi)源社區(qū)的郵件列表里發(fā)現(xiàn)了蛛絲馬跡,提前捅破觸發(fā)了公關(guān)危機(jī),于是1月4號(hào)早上Intel也決定提前發(fā)布消息,隨后谷歌的研究者也打破沉默,上線了那個(gè)早已準(zhǔn)備好的漏洞介紹網(wǎng)站和相關(guān)論文[4],于是一切被公諸于世。
我們正在經(jīng)歷什么
毫不夸張地說(shuō),截至目前爆出的漏洞實(shí)錘和原型演示來(lái)看,我們遇上了計(jì)算機(jī)體系結(jié)構(gòu)發(fā)展史上的最大硬件漏洞,并且很可能沒(méi)有之一。目前已經(jīng)可以確定的是,“熔毀”直接洞穿了Intel和微軟Windows、linux、蘋(píng)果Mac OS共同設(shè)下的重重安全防護(hù),使用一段并不算特別復(fù)雜的代碼,運(yùn)行在Intel處理器上,就可以做到竊取Firefox瀏覽器在內(nèi)存中保存的密碼、保存了網(wǎng)絡(luò)通信信息的HTTP報(bào)文頭等關(guān)鍵隱私,這不是聳人聽(tīng)聞的推測(cè),而是已經(jīng)被實(shí)現(xiàn)并通過(guò)視頻展示給全世界的事實(shí),連源代碼都已開(kāi)放下載[5]。而另一個(gè)漏洞“幽靈”則更加高深莫測(cè),它同樣能悄無(wú)聲息地穿透操作系統(tǒng)內(nèi)核的自我保護(hù),從用戶運(yùn)行的空間里讀取到操作系統(tǒng)內(nèi)核空間的數(shù)據(jù),并且比“熔毀”更加恐怖的是,它在Intel/AMD/ARM這三大主流公司的CPU上都能起作用,可以說(shuō)事實(shí)上所有的PC/手機(jī)/服務(wù)器都在受影響范圍內(nèi),并且難以通過(guò)軟件補(bǔ)丁修復(fù)也無(wú)法通過(guò)反病毒軟件對(duì)抗,再考慮到過(guò)去這些年中CPU數(shù)以億計(jì)的出貨量,已售出的芯片也無(wú)法通過(guò)微碼更新來(lái)完美解決問(wèn)題,因此將會(huì)名副其實(shí)地成為一個(gè)籠罩在所有人頭頂許多年時(shí)間的安全隱患,大概“幽靈”的名字也就是這樣得來(lái)的。
為什么之前沒(méi)有發(fā)現(xiàn)這個(gè)漏洞?
這兩個(gè)漏洞都具有同一個(gè)特點(diǎn),利用了現(xiàn)代高性能微處理器中的關(guān)鍵特性 - 推測(cè)執(zhí)行和亂序執(zhí)行,這兩項(xiàng)技術(shù)都是推動(dòng)微處理器性能進(jìn)步、讓大家的電腦、手機(jī)能夠高速運(yùn)行越來(lái)越復(fù)雜應(yīng)用的核心支柱。
推測(cè)執(zhí)行技術(shù)是指,處理器為了提高性能,會(huì)去提前猜測(cè)接下去需要執(zhí)行什么動(dòng)作,然后提前執(zhí)行,如果發(fā)現(xiàn)推測(cè)錯(cuò)誤,則回滾至正常狀態(tài)。通常應(yīng)用的推測(cè)執(zhí)行技術(shù)都能達(dá)到80%-90%以上的推測(cè)準(zhǔn)確率。需要指出的是,推測(cè)執(zhí)行技術(shù)是一個(gè)大類(lèi)技術(shù)的統(tǒng)稱(chēng),包括分支預(yù)測(cè),預(yù)讀取,推測(cè)性內(nèi)存訪問(wèn),緩存缺失的重疊/亂序處理(MSHR)等等,幽靈漏洞就利用了分支預(yù)測(cè)、推測(cè)性內(nèi)存訪問(wèn)和MSHR這三個(gè)特性。
亂序執(zhí)行技術(shù)是指,當(dāng)處理器遇到需要發(fā)生停頓的事件時(shí)(例如需要裝載的數(shù)據(jù)發(fā)生了緩存缺失,需要去高延遲的內(nèi)存中查找),處理器可以越過(guò)這個(gè)停頓事件,繼續(xù)超前執(zhí)行指令。同樣,如果超前執(zhí)行中發(fā)生了錯(cuò)誤,也需要回滾至正常狀態(tài)。熔毀漏洞就利用了亂序執(zhí)行特性。
亂序執(zhí)行技術(shù)最早出現(xiàn)在CDC 6600和IBM 360/91上,時(shí)間是上個(gè)世紀(jì)60年代,亂序執(zhí)行技術(shù)的兩位關(guān)鍵貢獻(xiàn)者James E. Thornton(1994)和Robert Tomasulo(1997)也因此拿到了計(jì)算機(jī)體系結(jié)構(gòu)學(xué)術(shù)界的最高榮譽(yù)Eckert–Mauchly Award,至于推測(cè)執(zhí)行的第一個(gè)范本,由于變種技術(shù)太多已經(jīng)無(wú)法考證,可考證最早的分支預(yù)測(cè)設(shè)計(jì)是James E. Smith于1981年公開(kāi)的,他也對(duì)亂序執(zhí)行做出了卓越貢獻(xiàn),于1999年榮獲Eckert–Mauchly Award[6]。
可以看到,這些技術(shù)都是經(jīng)過(guò)數(shù)十年發(fā)展驗(yàn)證的成熟技術(shù),此前爆出過(guò)的也只是程序運(yùn)行錯(cuò)誤的功能bug,并沒(méi)有如此嚴(yán)重的安全漏洞,而且推測(cè)執(zhí)行和亂序執(zhí)行對(duì)性能的提高都是成倍的影響力,例如在模擬器上的驗(yàn)證表明,關(guān)閉亂序執(zhí)行大約會(huì)損失一半的性能,關(guān)閉推測(cè)執(zhí)行中的分支預(yù)測(cè)則會(huì)將處理器的最大指令吞吐的理論上限打回上世紀(jì)90年代的水平,因此這兩項(xiàng)技術(shù)已經(jīng)成為當(dāng)之無(wú)愧的高性能微處理器的結(jié)構(gòu)頂梁柱。而根據(jù)推測(cè)執(zhí)行和亂序執(zhí)行的框架設(shè)計(jì),其中有一個(gè)叫做重排序緩沖(ROB)的部件會(huì)負(fù)責(zé)樹(shù)立推測(cè)狀態(tài)和正常狀態(tài)之間的分界線,有了ROB的保護(hù)之后,推測(cè)執(zhí)行(分支預(yù)測(cè))和亂序執(zhí)行的狀態(tài)信息就不會(huì)被上層感知,這是寫(xiě)在每一本計(jì)算機(jī)體系結(jié)構(gòu)教科書(shū)里的內(nèi)容,被一代又一代的工程師沿用。
現(xiàn)在,這個(gè)內(nèi)容被徹底改寫(xiě)了。
漏洞原理
雖然指令可以不按順序執(zhí)行,為了確保亂序執(zhí)行的效果不對(duì)機(jī)器狀態(tài)發(fā)生影響,在亂序執(zhí)行過(guò)程中發(fā)生的異常錯(cuò)誤和安全檢查違例,都要等到指令最后提交結(jié)果、并確認(rèn)推測(cè)狀態(tài)無(wú)誤時(shí)才發(fā)起處理,如果發(fā)生錯(cuò)誤,指令結(jié)果將被丟棄,異常處理進(jìn)行完畢后回到正常狀態(tài)。如果在亂序執(zhí)行過(guò)程中就對(duì)指令進(jìn)行異常處理,就會(huì)導(dǎo)致代碼發(fā)生異常的位置和實(shí)際執(zhí)行位置不匹配,打破了亂序執(zhí)行不得影響程序狀態(tài)的規(guī)則,從而破壞辛苦寫(xiě)代碼的碼農(nóng)們所感知到的編程模型。如果指令通過(guò)了檢查,確認(rèn)無(wú)誤,指令的操作結(jié)果才會(huì)更新到緩存與相關(guān)寄存器上,從而可以被軟件讀取。因此從指令執(zhí)行到進(jìn)行最后的提交檢查之間存在一個(gè)可以利用的時(shí)間窗口,按照目前的亂序執(zhí)行窗口和處理器執(zhí)行頻率計(jì)算,大概有十幾個(gè)納秒到幾十個(gè)納秒的時(shí)間,可供繼續(xù)超前執(zhí)行大約幾十到一百多條指令。這個(gè)時(shí)間窗口成為了“熔毀”的攻擊點(diǎn)。
在常規(guī)狀態(tài)下,訪問(wèn)被保護(hù)的敏感區(qū)域會(huì)直接被權(quán)限鑒別的過(guò)程給拒絕,但是熔毀在這個(gè)小的時(shí)間窗口中,故意插入指令訪問(wèn)了一些本該被保護(hù)的關(guān)鍵區(qū)域,這些敏感數(shù)據(jù)就會(huì)被提至處理器核心內(nèi)部的寄存器里參與運(yùn)算。直到這一步,ROB仍然在維護(hù)超前執(zhí)行狀態(tài) - 正常狀態(tài)的分界線,整個(gè)系統(tǒng)仍然在保護(hù)之下,因?yàn)殡m然敏感數(shù)據(jù)被提至處理器內(nèi)部,但是并未經(jīng)過(guò)安全檢查和異常檢查的確認(rèn),所以它的值只能用來(lái)作臨時(shí)運(yùn)算,不能用來(lái)參與正常運(yùn)算,不會(huì)被更新到架構(gòu)可見(jiàn)寄存器與緩存上,也就無(wú)法被上層軟件讀取,而等檢查進(jìn)行到它所處位置的時(shí)候,CPU就會(huì)發(fā)現(xiàn)問(wèn)題,然后及時(shí)制止,所以不會(huì)發(fā)生問(wèn)題。但是這里出現(xiàn)了整個(gè)漏洞利用中最漂亮的一步:時(shí)間差分攻擊。
既然敏感數(shù)據(jù)已經(jīng)被提取至CPU核心內(nèi)部可以參與臨時(shí)計(jì)算,那么就可以用它作為存儲(chǔ)器訪問(wèn)的路標(biāo)k,把內(nèi)存中的第k塊數(shù)據(jù)裝入緩存。這大概要花費(fèi)上百個(gè)時(shí)鐘周期也就是大約幾十納秒,這個(gè)時(shí)間處在亂序執(zhí)行允許的窗口范圍內(nèi),如果窗口范圍不夠大了,還可以用其他手段再把這個(gè)窗口拉大一些。但終歸到最后,亂序執(zhí)行的指令要走到提交檢查的一步,CPU檢查發(fā)現(xiàn)這個(gè)敏感數(shù)據(jù)被訪問(wèn)了,就會(huì)把對(duì)應(yīng)指令的結(jié)果拋掉,k的值被扔掉以后,惡意代碼就無(wú)法讀取到k的值了。而這里遺漏了關(guān)鍵的一點(diǎn),在亂序執(zhí)行中被裝入緩存的內(nèi)存第k塊數(shù)據(jù),并沒(méi)有被清理。于是后繼代碼就可以大大方方地把相關(guān)內(nèi)存地址都掃一遍,放在緩存里面的數(shù)據(jù)的訪問(wèn)延遲與放在內(nèi)存里面的數(shù)據(jù)是不同的,如果掃描到第10塊內(nèi)存的時(shí)候發(fā)現(xiàn)它的響應(yīng)速度特別快,就可以確定先前被讀取上來(lái)的k值是10。
另一個(gè)幽靈漏洞的原理與此類(lèi)似,但利用的是推測(cè)執(zhí)行(主要是分支預(yù)測(cè))的指令,從執(zhí)行到進(jìn)行安全檢查之間的時(shí)間差,在推測(cè)執(zhí)1行狀態(tài)下,利用此時(shí)觸發(fā)權(quán)限違例不會(huì)被立即掐死的特點(diǎn),執(zhí)行一些惡意代碼把敏感數(shù)據(jù)裝入CPU寄存器參與臨時(shí)計(jì)算,隨后用這個(gè)敏感數(shù)據(jù)制作一個(gè)內(nèi)存地址裝入緩存,再觸發(fā)隨后的時(shí)間差分攻擊。
效果與防護(hù)
熔毀和幽靈利用亂序執(zhí)行和推測(cè)執(zhí)行,繞過(guò)了權(quán)限檢查等安全措施,可以訪問(wèn)操作系統(tǒng)內(nèi)核乃至其他程序的內(nèi)容。其中熔毀更容易觸發(fā)利用,因此才有大家已經(jīng)看到的盜取瀏覽器密碼的實(shí)例,而幽靈漏洞需要受攻擊目標(biāo)程序的分支入口點(diǎn)結(jié)構(gòu)滿足一定條件才能觸發(fā),難度相對(duì)較大,因此網(wǎng)上還沒(méi)有發(fā)現(xiàn)基于幽靈漏洞的信息泄露實(shí)例出來(lái)。需要指出的是,幽靈和熔毀漏洞都只能讀取敏感信息,不能修改(因?yàn)閬y序執(zhí)行/推測(cè)執(zhí)行狀態(tài)下的修改在未通過(guò)檢查時(shí)一定會(huì)被拋棄),算是不幸中的萬(wàn)幸。
由于攻擊的是硬件漏洞,因此目前市面所有主流操作系統(tǒng),包括windows,linux,Mac OS都處在攻擊范圍內(nèi),隔離程度不夠高的眾多半虛擬化方案,Docker,LXC等,也在受影響范圍,因此這個(gè)漏洞將極大地影響云計(jì)算服務(wù)提供商。目前Google,Amazon,國(guó)內(nèi)的阿里,騰訊等大型云服務(wù)提供商都已宣布了補(bǔ)丁計(jì)劃。
從業(yè)界廠商的角度看,盡管Intel,AMD,ARM各有說(shuō)辭[7][8][9],但從專(zhuān)業(yè)從業(yè)人士的角度看,Intel妥妥地同時(shí)受到熔毀和幽靈兩個(gè)漏洞影響,而AMD和ARM在熔毀漏洞面前也只是暫時(shí)安全,熔毀的攻擊原理也適用于AMD和ARM,只是因?yàn)榉种ьA(yù)測(cè)器結(jié)構(gòu)不同、流水線長(zhǎng)度較短導(dǎo)致可利用的時(shí)間窗口不大等等因素,才沒(méi)有像Intel一樣被熔毀攻破。而幽靈則針對(duì)分支預(yù)測(cè)器進(jìn)行注入攻擊,目前所有廠商的分支預(yù)測(cè)器部分都沒(méi)有做比較好的安全防護(hù),因此Intel和ARM,AMD都會(huì)受到影響,而且分支預(yù)測(cè)器為了提高性能,天生就設(shè)計(jì)成部分地址哈希進(jìn)行模糊匹配的模式,使得相關(guān)防御措施很難在不傷害性能的情況下修補(bǔ)漏洞。
針對(duì)熔毀漏洞,目前已有的技術(shù)手段主要是通過(guò)軟件層次將內(nèi)核頁(yè)表與用戶頁(yè)表盡可能地隔離,這種技術(shù)的一個(gè)實(shí)現(xiàn)方案叫KAISER,其變種已經(jīng)被各大操作系統(tǒng)采用作為熔毀漏洞的臨時(shí)補(bǔ)救措施。這種技術(shù)方案會(huì)提高用戶態(tài)與內(nèi)核態(tài)的切換開(kāi)銷(xiāo),快速系統(tǒng)調(diào)用的初步測(cè)試證明,內(nèi)核系統(tǒng)調(diào)用的速度降低到了原先的42%,而利用現(xiàn)代處理器的PCID特性進(jìn)行優(yōu)化后,能夠恢復(fù)到57%的水平[9]。具體的應(yīng)用程序下降幅度取決于用戶程序與內(nèi)核交互的頻繁程度,linxu kernel開(kāi)發(fā)人員的測(cè)試結(jié)果從10%~20%+不等,PCID能夠彌補(bǔ)大約5%-7%的性能。
針對(duì)幽靈漏洞,目前沒(méi)有很好的防御方式,linux的發(fā)行版之一suse最近公開(kāi)的一個(gè)安全更新顯示[10],AMD和Intel已經(jīng)向相關(guān)OS廠商推送了一個(gè)微碼更新,這個(gè)微碼更新會(huì)關(guān)閉分支預(yù)測(cè)來(lái)暫時(shí)封堵幽靈漏洞。由于分支預(yù)測(cè)對(duì)性能影響巨大,即便分支預(yù)測(cè)只被關(guān)閉一部分也很容易造成性能衰退二代左右的幅度,如果整個(gè)分支預(yù)測(cè)器都被關(guān)閉,CPU性能將退回2000年以前的水平。對(duì)于這個(gè)更新是否將被應(yīng)用,相關(guān)從業(yè)人士正在持續(xù)跟進(jìn)關(guān)注。
下面是來(lái)自NGA用戶kprismk的一個(gè)比喻。注意這是比喻,省略了大量細(xì)節(jié):
1.kfc里賣(mài)的有薯?xiàng)l、雞塊、漢堡、可樂(lè)。
2.李小璐去kfc點(diǎn)了個(gè)漢堡,吃完走了。
3.狗仔隊(duì)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ō):我薯?xiàng)l、雞塊、漢堡、可樂(lè)各點(diǎn)一份,餓死了餓死了,哪個(gè)快先把哪個(gè)給我!
7.b狗仔先拿到了“漢堡”!
8.b狗仔知道了李小璐今天在kfc買(mǎi)了個(gè)漢堡!
評(píng)論