Ben Thomposn:「幽靈」與「熔毀」漏洞映射出了科技行業的現狀

編者按:Ben Thomposn最近在博客上發表文章,對幽靈與熔毀背後的機制進行了詳細的解釋。並指出幽靈與熔毀的出現並不是偶然,而是當前科技行業的體制下必然會出現的一種現象。文章由36氪編譯。

你應該聽過這樣一句格言:「一切都是1和0」,但這不是一個比喻:晶體管是計算機的基本組成部分,它只是一個開關,要麼打開(「1」),要麼關閉(「0」)。然而,事實證明,正如克里斯·迪克森(Chris Dixon )在一篇題為《亞里士多德如何創造計算機》的精彩文章中所寫的,通過數學邏輯和晶體管的組合,1和0是你所需要的全部:

計算機的歷史通常被認為是一個實物的歷史,從算盤到巴貝奇差分機,再到二戰時的密碼分析機。實際上,把它理解為思想史會更好,那些思想主要誕生自數理邏輯——一門形成於19世紀,晦澀難懂、像邪教一樣的學科。

迪克森的文章——我之前提到過——很值得一讀,但這篇文章的相關觀點也許是令人驚訝的:

計算機真的很愚蠢,它們之所以有用,是因為它們非常愚蠢。

處理器漏洞的問題

上周,科技行業因為現代處理器中的兩個漏洞被披露而震驚了:熔毀(Meltdown)和幽靈(Spectre)。由於人們對這個漏洞性質的普遍猜測(可能是由Linux內核的更新引起的),以及熔毀和幽靈在某些方面是相似的,但在其他方面卻有所不同。所以披露日期提前了一個星期。

從相似點開始:兩個漏洞的結果都是一樣的——非特權用戶可以訪問他們不應該訪問的計算機上的信息,比如密鑰、密碼或其他用戶擁有的任何其他類型的數據。對於AWS這樣的雲服務來說,這是一個特別大的問題。在AWS上,多個「租戶」使用的是相同的物理硬件:

這種多租戶架構是通過使用虛擬機實現的:在一台物理計算機上運行的專用軟件,可以讓每一個用戶都像擁有自己的計算機一樣操作,而實際上它們是共享的。這是一種雙贏的做法:在絕大多數情況下,單個用戶的計算機都處於閑置狀態(它們很快就會變得愚蠢),如果多個用戶使用一台計算機,那麼硬件的使用效率將會大大提高。而且,在雲服務領域,同樣的概念可以擴展到數百萬台物理計算機,共享更多的基礎設施,比如冷卻、網絡、管理等。

不過,整個體系的建立基於一個基本假設:一台虛擬機的用戶不能訪問另一台虛擬機的數據。這一假設的擴展依賴於對虛擬機軟件的完整性的信任,這種信任依賴於對底層操作系統完整性的信任,最終依賴於對服務器核心處理器的信任。來自熔毀的白皮書(強調是作者加的):

為了將數據從主存儲器加載到寄存器中,主存儲器中的數據就要通過虛擬地址來引用。在將虛擬地址轉換為物理地址的同時,CPU還會檢查虛擬地址的權限位,也就是說,這個虛擬地址用戶是否能夠訪問,或者只能由內核訪問。正如在第2.2節中已經討論過的,這種通過權限位的基於硬件的隔離被認為是安全的,並且是由硬件供應商推薦的。因此,現代操作系統總是將整個內核映射到每個用戶進程的虛擬地址空間。因此,所有內核地址在翻譯它們時都會產生一個有效的物理地址,並且CPU可以訪問這些地址的內容。訪問用戶空間地址的唯一不同之處在於,CPU會引發異常,因為當前權限級別不允許訪問這樣的地址。因此,用戶空間不能簡單地讀取這樣一個地址的內容。

內核是操作系統的核心部分,正常用戶應該無法訪問,它有自己的內存,不僅存儲核心系統數據,還存儲來自所有用戶的數據(例如,必須將其寫入或從永久存儲中讀取)。不過,即使在這裡,系統也依賴於虛擬化——內存是用戶在應用程序中使用的物理內存,這取決於CPU,以便跟蹤內存的哪些部分屬於誰,而這正是漏洞所在之處。

SPECULATIVE_EXECUTION

我剛剛只是提到了電腦的三個關鍵部分:處理器、內存和永久存儲。事實上,存儲數據的架構比這更複雜:

  • 寄存器是最快的內存形式,每個時鐘周期都可以訪問(也就是說,2.0 GHz的處理器每秒可以訪問寄存器20億次)。它們也是最小的,通常只包含當前計算的輸入和輸出。

  • 然後有各種各樣的緩存(L1、L2等),它們的速度越來越慢,而且在另一方面,越來越大,也越來越便宜。這種緩存位於一個層次結構中:例如,立即需要的數據將會從寄存器移到L1緩存;稍微不那麼必要的數據將位於L2,然後是L3等等。

  • 內存層次結構的下一個主要部分是主存,即系統RAM。雖然緩存的數量取決於處理器模型,但內存的總量取決於整個系統生成器。這種內存比高速緩存慢得多,但它也比緩存大得多,而且便宜得多。

  • 內存層次結構的最後一部分,至少在一台計算機上是永久存儲——硬盤驅動器。固態硬盤(SSD硬盤)在這裡的速度有很大的不同,但即便如此,永久存儲的速度也比主內存慢得多,但也存在同樣的問題:你可以以更低的價格獲得更多的存儲空間。

  • 雖然不屬於傳統的內存層次結構的一部分,但云應用程序通常在同一網絡上的獨立物理服務器上擁有永久的內存,通常的折衷方案是——非常緩慢的訪問以換取其他好處,在這種情況下,將數據與應用程序分開。

可以肯定的是,「非常慢」是相對的——我們在這裡討論的是納秒。

傑夫·阿特伍德(Jeff Atwood)的這篇文章用人類的語言來描述就是:

在我們人類的感覺中,無限空間是計算機花費所有時間的地方。這是一個完全不同的時間跨度。系統性能:企業和雲計算有一個很好的表格,說明了這些時間差異有多麼巨大。只要把計算機時間轉換成任意的秒鐘即可:

已故的吉姆·格雷(Jim Gray)也有一種有趣的解釋方式。如果CPU寄存器是你從你的大腦獲取數據需要的時間,那麼進入磁盤就相當於從冥王星獲取數據。

格雷在微軟的演講中展示了這張幻燈片,給出了「華盛頓,奧林匹亞」的背景信息。讓我把他的類比擴展一下:

假設你是一名大學生,在微軟實習,當時你在奧林匹亞的家裡收拾衣服。現在,西雅圖的夏天可能非常挑剔——可能是狂風大作、下雨的天氣,或者是炎熱和陽光的天氣。要想知道明天早上的天氣會是什麼樣子,通常是很難的。為了實現這一目標,謹慎的做法不是只打包一套衣服,而是為了兩種可能而打包衣服。畢竟,每次天氣變化,從行李箱里換衣服要比開車回家要快得多。

這就是這個類比開始瓦解的地方:現代處理器為了減少獲取數據所需要的時間,不僅獲取了超出需要的數據,而且還會提前對這些數據進行計算。這就是所謂的Speculative_execution,也是這些漏洞的核心所在。用算法的形式來類比:

  • 檢查天氣(執行多個觸發傳感器、中繼數據等的多個子進程)。

如果天氣晴朗,穿短袖和T恤

其他的天氣,穿牛仔褲和運動衫

記住,電腦是愚蠢的,但速度很快:執行「穿短袖和T恤」或「穿牛仔和運動衫」需要納秒——需要時間就是等待天氣觀察的結果。所以為了節省時間,處理器會在它了解天氣之前幫你穿衣,這通常是基於歷史的——過去幾天的天氣是怎樣的?這意味着你可以在等待天氣觀察結果的同時,決定鞋子、配飾等。這是處理器的另一個特點:它們可以同時做很多事情。為了實現這一目標,最快的完成任務的方法就是猜測最終的結果是什麼,如果有必要,還會進行回溯。

熔毀

現在,想象一下這個算法被修改成以下的內容:

  • 檢查經理的日程表,看看他們是否在辦公室

如果他們在辦公室,穿寬鬆的褲子和襯衫

如果他們不在辦公室,穿短褲和T恤

只有一個問題:你不應該接觸到你經理的日程表。請記住,計算機是愚蠢的:處理器不知道這一點,它必須檢查你是否有訪問權限。所以在實踐中,這個算法更像這樣:

  • 檢查經理的日程表,看看他們是否在辦公室

檢查一下這個實習生是否能訪問他們經理的日程表

  • 如果實習生有權限,可以訪問日程表

            如果經理在辦公室,穿寬鬆的褲子和襯衫

            如果他們不在辦公室,穿短褲和T恤

  • 如果實習生沒有權限,就不要穿衣服了

不過請記住,計算機雖然很擅長同時處理大量的事情以及在查詢數據上並不是很擅長,在這種情況下,處理器會在特定條件下查看經理的日程表,並在它知道對方是否有權限查看日程表之前,決定應該穿什麼。如果它後來意識到對方不應該有訪問日程表的權限,它會毀掉一切,但是衣服可能會被弄得有點凌亂,這意味着你可以得到你不應該知道的答案。

我已經說過,這個類比已經瓦解了,它現在已經徹底崩潰了。但這在廣義的描述中:處理器會在它知道它是否有權限的情況下,投機性地獲取和執行特權數據,這個過程在緩存中留下了痕迹,那些痕迹可以被非特權用戶捕捉到。

解釋幽靈

幽靈更加狡猾,但更難實現:記住,很多用戶都在使用相同的處理器——他們都是你的「室友」,如果你願意的話。假設我像你一樣打包行李箱,然後我「訓練」處理器,讓它一直期待晴天(也許我可以運行一個模擬程序,讓每一天都充滿陽光)。處理器將會提前選擇短褲和T恤。然後,當你醒來的時候,處理器已經選擇了短褲和T恤,如果真的是雨天,它會把短褲和T恤放回去,但會顯得有點凌亂。

這個類比在這裡真的行不通。你的數據並不是簡單地從主存儲器中提取出來的,它會暫時保存在緩存中,而處理器會在錯誤的分支上運行,一旦處理器修復了錯誤,它就會被迅速刪除,但我仍然能弄清楚數據是什麼——這意味着我現在已經竊取了你的數據。

熔毀更容易解釋——英特爾的聲明恰恰與之相反(熔毀也會影響蘋果的處理器)——這是由於設計缺陷造成的。處理器負責檢查是否可以被訪問數據,並且檢查速度過慢,這樣數據就會被竊取,這是一個錯誤。這也解釋了為什麼熔毀可以在軟件中運行(基本上,在使用數據之前會有一個額外的步驟檢查權限,這就是為什麼補丁會導致性能下降)。

幽靈完全是另外一回事:這是處理器的設計。計算機的基本運算速度快得令人難以理解,但是需要花費很長時間才能得到這些數據來進行這些計算:因此,在不等待瓶頸的情況下進行計算,基於最佳猜測,是利用這種基本不平衡的最佳方式。大多數情況下,你會更快地得到結果,如果你猜錯了,你的速度也不會比你按順序完成所有事情的情況慢。

這也解釋了為什麼幽靈會影響所有的處理器:利用現代處理器的并行度和執行速度帶來的快速增長是如此巨大,以至於Speculative_execution是一個顯而易見的選擇。分支預測器可能會被另一個用戶訓練,這樣緩存變化就可以被跟蹤,直到去年才被我們知道。

此外,幽靈黨不能通過軟件來修復:具體的實現可以被阻止,但漏洞是內置的,想要徹底解決,需要重新設計新的處理器,但這對已經在使用的數十億處理器不會有任何作用。我們將不得不勉強度日。

幽靈與科技現狀

面對一個根本性的不平衡(相對於執行數據來說,數據獲取非常緩慢),處理器工程師設計了一個專門針對性能進行優化的系統,但由於未能預見到不良行為者濫用系統的可能性,所以,每個人都變得脆弱不堪。

有個類比是顯而易見的:面對一個根本性的不平衡(相對於快速迭代與優化程序來說,獲取和保留用戶的難度非常大),互聯網公司設計出了加強用戶留存的巧妙系統,但未能預見到壞人濫用系統的可能性,每個人都很容易受到攻擊。

  • 不過,幽靈有助於解釋這些問題為何如此令人煩惱:

  • 我不相信有人會故意製造這種漏洞

  • 這個漏洞可能是值得的——更快的處理器會帶來更大的好處

  • 無論如何,過去的決定都是過去的:我們能做的最好的事情就是得過且過

因此,對Facebook、谷歌/Youtube等網站,以及互聯網帶來的廣泛負面影響的處理也會如此。權力來自於給予人們他們想要的東西——這個動機並不是壞的!而它帶來的好處,可能超過了其負面影響。無論如何,我們唯一的選擇就是繼續往前走。

原文鏈接:https://stratechery.com/2018/meltdown-spectre-and-the-state-of-technology/

編譯組出品。編輯:郝鵬程


想在手機閱讀更多Google資訊?下載【香港矽谷】Android應用
分享到Facebook
技術平台: Nasthon Systems