在2017年年底的一個周末,來自奧地利格拉茨技術(shù)大學(xué)的一名研究員寫出了一個程序,成功的從操作系統(tǒng)中最受保護的地方獲取了自己網(wǎng)頁瀏覽和私人郵件信息。由于這個漏洞源于芯片設(shè)計本身,他和他的同事們次日便將這個消息郵件告知了英特爾公司。一個星期后他們收到了英特爾公司的回復(fù)。原來他們已經(jīng)不是第一個找到這個漏洞的人,而英特爾公司也已經(jīng)在著手修復(fù)。為了不給黑客攻擊的機會,雙方答應(yīng)了延緩這個發(fā)現(xiàn)的發(fā)表,直到新年伊始。 2018年1月2日,論文發(fā)表,英特爾、AMD和ARM的芯片同時被爆出安全問題。總結(jié)來說,這個芯片設(shè)計漏洞能夠引起兩種網(wǎng)絡(luò)黑客攻擊,分別是“崩潰(meltdown)”和“幽靈(spectre)”。 ○ 英特爾芯片設(shè)計漏洞可能引起兩種網(wǎng)絡(luò)黑客攻擊,分別是“崩潰”和“幽靈”。 “崩潰”是一種打破應(yīng)用程序與操作系統(tǒng)之間隔離的攻擊。在崩潰攻擊下,軟件就可以直接訪問權(quán)限外的內(nèi)存,從而調(diào)取其他應(yīng)用程序和系統(tǒng)資源;“幽靈”則是一種打破不同應(yīng)用程序之間隔離的攻擊。它可以讓黑客進行偽裝,騙過系統(tǒng)的檢測,最終達到調(diào)取資源的目的。 這意味著什么呢?這意味著只要用電腦,理論上都可能受到安全攻擊。而且這個安全問題是根植在芯片的架構(gòu)里,除非重新設(shè)計操作系統(tǒng)或者芯片,否則這個問題無法從根本上得到解決。而一切的原因,都源自于我們幾十年來過于追求CPU的性能。 計算機架構(gòu) 自從馮諾依曼在1945年提出了計算機架構(gòu)至今的70多年的時間里,計算機的發(fā)展一直都基于這種架構(gòu)。除了在晶體管層面上的發(fā)展,計算機架構(gòu)師們也一直想方設(shè)法在架構(gòu)上做文章,使程序運行更快。其中被沿用至今的包括多級儲存(memory hierarchy)、亂序執(zhí)行(out-of-order execution)和推測執(zhí)行(speculative execution)。 多級儲存: 首先來說說多級儲存。如上圖所示,簡單來說儲存從離CPU由遠到近可分為硬盤(Disk)、內(nèi)存(RAM)、緩存(cache)和寄存器(register)。儲存大小和讀取時間都是硬盤最大,然后依次遞減?,F(xiàn)在的計算機一般有512GB或者1TB容量的硬盤,16G或者8G的內(nèi)存,以及幾到十幾MB左右的緩存。在這三級的儲存中只有硬盤是非易失性記憶(non-volatile memory)。也就是說只有硬盤在計算機斷電之后仍能儲存數(shù)據(jù)。因此,我們平常需要的所有東西(啟動程序除外)都儲存在硬盤里。開機之后由啟動程序開啟操作系統(tǒng),由操作系統(tǒng)將需要的數(shù)據(jù)從硬盤移到內(nèi)存。而緩存的設(shè)計則是為了CPU能夠更快的讀取平時所需要的數(shù)據(jù)。 試想一下,假如你正在寫一篇論文,需要在圖書館查找資料。你會把所需要的各種書從不同的書架上取下來放在桌上,然后再從中選一兩本寫當下章節(jié)需要??吹臅旁谑诌呉员汶S時翻閱。計算機架構(gòu)的設(shè)計也遵從了這樣一個原則。如果你是一個CPU,那么圖書館就是硬盤,放書所用的桌子就是內(nèi)存,而你手邊觸手能即的地方就是緩存。而當你離開圖書館的時候,桌上和你手邊的書也會被管理員清空并放回原本的書架上。由此可見,多級儲存的設(shè)計目的就在于能讓CPU能夠盡量頻繁的 “在觸手可及的地方拿到需要的書”。 亂序執(zhí)行: 再來說說亂序執(zhí)行。所有程序最終都會被拆分成一條條的指令,由CPU逐個執(zhí)行。然而每條指令所花的時間并不相同,比如你去圖書館書架上取書花的時間肯定比從手邊拿書要長。最初的架構(gòu)設(shè)計是讓CPU按程序順序依次逐個執(zhí)行指令。然而這就出現(xiàn)了一個新的問題,如果一個指令需要花很長時間來執(zhí)行(通常因為該指令沒有獲得足夠多的執(zhí)行資源),那么后面指令(無論再簡單,需要花的時間再少)也必須等這條指令執(zhí)行完之后才能開始執(zhí)行。這就像在一條很窄的路上行車,如果前面有一輛車出了故障走不了,在這輛故障車等拖車來的這段時間里,后面的車也只好堵著。當然現(xiàn)實生活中我們基本不會遇到這樣的情景。如果一輛車出了問題,它通常會靠邊停車,在打雙閃等拖車的同時,讓后面的車能夠順利通過。而后來計算機架構(gòu)的設(shè)計也遵從了這一理念。如果一條指令需要花很長時間才能完成執(zhí)行,那么這條指令會被放到一個特殊的地方(reservation station),以便讓CPU能夠執(zhí)行之后的指令。只有當放在reservation station的指令獲得足夠多資源執(zhí)行的時候,該指令才會重新被執(zhí)行。這就是被用在如今幾乎所有芯片里的技術(shù)—亂序執(zhí)行。 推測執(zhí)行: 最后再來看看推測執(zhí)行。假設(shè)你每晚放學(xué)必須要和你的朋友一起去吃個宵夜。你們通常都會去城東的燒烤店吃燒烤。當然,如果燒烤店人滿為患,你們也會選擇城北邊的炸雞店。那么問題來了,放學(xué)的時候你怎么知道燒烤店是否還有位子呢?當然你可以打電話去問,但是老板通常很忙,打個電話得等個20分鐘才有回復(fù)。那么放學(xué)后的你現(xiàn)在應(yīng)該何去何從呢?現(xiàn)在你之前的經(jīng)驗起了作用。如果你之前百分之八十的時候去燒烤店都是有座位的,那么你在放學(xué)打電話的這20分鐘時間里,你完全可以在接到答復(fù)之前先往燒烤店走著,反正有百分之八十的機會你不用折返去城北。而整套機制放在計算機里就是推測執(zhí)行。在CPU執(zhí)行指令的時候通常都會遇到判定,如果判定為真則執(zhí)行一部分代碼,如果判定為偽,則執(zhí)行另一段代碼。而通常判定是需要等待很長時間。而現(xiàn)在的CPU都會根據(jù)之前的控制流預(yù)測判定的結(jié)果,在結(jié)果確定之前,CPU會執(zhí)行預(yù)測結(jié)果指向的指令。如果預(yù)測對了,那么CPU則節(jié)省了等待判定結(jié)果的時間。如果預(yù)測錯了,則CPU會從開始判定的位置重新接受新的,正確的指令。雖然倒回原點重新執(zhí)行新的指令會比較耗時,但是如果之前預(yù)測的準確性很高,比如90%,那么這個結(jié)果還是可以接受的,畢竟總體上來說CPU執(zhí)行指令還是省了不少時間。 上述三個架構(gòu)上的技巧大大提高了CPU執(zhí)行指令的效率。究其原理,主要就是使CPU能一直有事可做,不至于在那里空轉(zhuǎn)浪費時間。然而,正是這三個幾乎現(xiàn)在所有CPU都有的特性,導(dǎo)致了這次芯片安全性能的滑鐵盧。在了解具體情況之前,我們還要了解一個操作系統(tǒng)的重要特性。 操作系統(tǒng)的特性 無論是什么操作系統(tǒng)都會在兩個級別下運行,一個是用戶級別(user mode),一個是系統(tǒng)級別(kernel mode)。而用戶級別的優(yōu)先級會低于系統(tǒng)級別。也就是說系統(tǒng)級別的資源在用戶級別下是不能使用讀取的。這樣設(shè)置的原因是防止用戶讀取他不應(yīng)該讀取的信息,比如其他用戶的密碼。例如在程序的某個地方用戶試圖讀取其權(quán)限外的數(shù)據(jù),系統(tǒng)會自動從用戶級別跳到系統(tǒng)級別,然后阻止用戶讀取該數(shù)據(jù)。這就像你要進別人家的門,但是密碼輸入錯誤,門是會自動鎖住,不讓你進。 然而亂序執(zhí)行和推測執(zhí)行改變了這一切。從根本上說,亂序執(zhí)行可以暫時跳過一些指令直接執(zhí)行后面的指令。而推測執(zhí)行時,錯誤的推測可能讓CPU直接執(zhí)行一些權(quán)限外的指令。這就像你能在輸入的門禁密碼得到判定前先進別人家逛一圈,等密碼判定為錯,再請你出去,然后鎖門。 從計算機架構(gòu)上來看,如之前所述,計算機需要的數(shù)據(jù)都會提前存儲在內(nèi)存中以供讀取。如果我們故意制造一個非法的數(shù)據(jù)訪問,因為該操作訪問了超過權(quán)限的內(nèi)存,操作理應(yīng)會被拒絕。然而因為亂序執(zhí)行和推測執(zhí)行的存在,這些非法操作可以在還沒有被拒絕前執(zhí)行。雖然最后這些非法操作最終會被系統(tǒng)拒絕并忽略(不對系統(tǒng)狀態(tài)造成影響),但這些已執(zhí)行過的非法訪問的數(shù)據(jù)會因為多級儲存的架構(gòu)而留在緩存上面。通過簡單的技術(shù)手段就可以反復(fù)推出真實的敏感數(shù)據(jù)。也就是說你輸入的密碼因為芯片的內(nèi)部設(shè)計,可以被其他用戶級別的程序直接獲取。這就好比在圖書館有一列書架上的書是不允許學(xué)生借閱的,但因為圖書管理員允許在身份確認前進入借閱,作為學(xué)生的你可以先進去把需要的書拿出來放到你的桌上。即使管理員最后確認了你的學(xué)生身份,禁止了你的權(quán)限,但這個時候你需要的書已經(jīng)被拿了出來放在了你的桌上。即便你不主動去讀,我們也不能阻止其他人偷偷去翻閱這本書。 所幸的是各大芯片公司對此早就在內(nèi)部有了未公開的研究,爆出該問題的論文也是在各大公司有了更新和應(yīng)對措施之后才被公之于眾。各個公司都發(fā)布了自己的系統(tǒng)更新用于緩解該問題的嚴重性。但是值得注意的是,目前的補救辦法只能通過操作系統(tǒng)的補丁來修復(fù)。而這些補丁會對芯片的性能帶來從5%到30%不等的下降。而操作系統(tǒng)級別的修復(fù)只能緩解卻不能被徹底解決這個安全問題,除非重新設(shè)計芯片結(jié)構(gòu)或者操作系統(tǒng)。 從馮諾依曼架構(gòu)確定至今的幾十年時間里,我們似乎因為太在意芯片的性能而開發(fā)出了很多諸如上述的提高芯片運行效率的技術(shù)。然而被我們忽略的硬件級別的安全性卻是隱藏在這下面更重要的特性。正所謂企者不立,跨者不行, 一味注重芯片性能的開發(fā)方式似乎走到了盡頭。而更加根本的馮諾依曼架構(gòu)是否還能按照之前的腳步繼續(xù)發(fā)展,似乎也值得芯片架構(gòu)師們深思。
|
|