作者 | John Leyden, Chris Williams
轉載自 | 雲技術實踐 / https://mp.weixin.qq.com/s/PiCKXMepmoq6tW-o3h4wjQ
譯者 | 雲技術實踐 / 北極熊
導讀:TPU 稱,亞馬遜、微軟和谷歌是三個受影響最深的雲端計算廠商,如果漏洞被利用,那麼在同一物理空間的虛擬使用者 A 可以任意訪問到另一個虛擬使用者B的資料,包括受保護的密碼、應用程式密匙等。
英特爾處理器晶片的一個基本設計缺陷已經迫使 Linux 和 Windows 核心進行重大重新設計,以解決晶片級安全漏洞。
核心開發者正在積極地檢查開源 Linux 內核的虛擬記憶體系統,與此同時,微軟預計在即將到來的週二補丁日,會公開釋出 Windows 作業系統的必要變更:這些變化是在 11 月份和 12 月份釋出的 Windows 內部版本的 beta 測試。
至關重要的是,對 Linux 和 Windows 的這些更新將會對英特爾產品造成衝擊。結果仍然在基準測試中,估計使用英特爾處理器的系統效能將會出現 5%- 30% 的下降,具體取決於任務和處理器型號。最近的英特爾晶片具有 PCID[1] 等功能,可以降低效能,你的計算成本可能也會改變。
類似的作業系統,如蘋果公司的 64 位 macOS,也將需要更新。這個缺陷是在 Intel x86-64架構硬體上,並且看起來更新微碼無法解決它。必須在作業系統級別的軟體中進行修複,或者購買新的沒有設計錯誤的處理器。
英特爾晶片內部的漏洞細節處於封閉狀態:對這些細節的禁令將在本月初解除,或許是微軟下週二的補丁。實際上,Linux 內核的修補程式[2]可供所有人檢視,但原始碼中的註釋已被編輯以混淆該問題。
然而,這個缺陷的一些細節已經出現,這就是我們所知道的情況。
影響範圍
據瞭解,該錯誤出現在過去十年中生產的現代英特爾處理器中。它允許普通的使用者程式(從資料庫應用程式到 Web 瀏覽器中的 JavaScript)在一定程度上辨別受保護的核心記憶體區域的佈局或內容。
解決方法是使用所謂的核心頁表隔離(KPTI)將內核的記憶體與使用者行程完全分開。這次,Linux 核心團隊仔細研究了強製取消核心中斷(FUCKWIT),你可以感受下這多麼令開發人員煩惱。
只要正在執行的程式需要執行任何有用的操作(如寫入檔案或開啟網路連線),就必須暫時將處理器的控制權交給核心來執行。為了盡可能快速高效地從使用者樣式轉換到核心樣式並回到使用者樣式,核心存在於所有行程的虛擬記憶體地址空間中,儘管這些程式是不可見的。當需要核心時,程式進行系統呼叫,處理器切換到核心樣式併進入核心。完成後,告知 CPU 切換回用戶樣式,並重新進入該過程。在使用者樣式下,內核的程式碼和資料保持不見,但出現在行程的頁表中。
把核心想象成坐在雲上的上帝,俯視地球。它在那裡,沒有正常的生物可以看到它,但他們可以祈禱。
這些 KPTI 補丁將核心移入一個完全獨立的地址空間,所以它不僅對執行的行程是不可見的,甚至根本就不存在。實際上,這應該是不需要的,但顯然英特爾晶片中存在一個缺陷,允許核心訪問保護以某種方式被繞過。
這種分離的不利之處在於,在每個系統呼叫的每個系統呼叫和每個來自硬體的中斷之間,在兩個單獨的地址空間之間切換是相對昂貴且時間明智的。這些背景關係切換不會立即發生,而是強制處理器轉儲快取資料並從記憶體中重新載入資訊。這增加了內核的開銷,並減慢了計算機的速度。
你的英特爾機器將因此執行速度較慢。
這個安全漏洞怎麼會被濫用?
最好的情況下,惡意軟體和駭客可以利用這個漏洞更容易地利用其他安全漏洞。
最糟糕的是,程式和登入使用者可能會濫用這個漏洞來讀取核心記憶體的內容。可以說,這不太好。內核的記憶體空間對使用者行程和程式是隱藏的,因為它可能包含各種各樣的秘密,比如密碼,登入金鑰,從磁碟快取的檔案等等。想象一下,在瀏覽器中執行的一段 JavaScript,或者在共享的公共雲伺服器上執行的惡意軟體,能夠嗅探受敏感內核保護的資料。
具體而言,就最好的情況而言,這個 bug 可能會被濫用來打敗 KASLR[3]:核心地址空間佈局隨機化。這是各種作業系統使用的防禦機制,將核心元件放置在隨機位置的虛擬記憶體中。這種機制可以阻止在核心中濫用其他漏洞的嘗試:通常,利用程式碼(尤其是面向傳回的程式設計漏洞[4])依賴於在儲存器中的已知位置重用計算機指令。
如果你將內核的程式碼隨機放置在記憶體中,攻擊者就無法找到他們所需的內部元件來完全破壞系統。處理器漏洞可能會被利用來找出內核定位其資料和程式碼的記憶體位置,從而對軟體隨意篡改。
但是,英特爾晶片中的漏洞可能比上述的緩解旁路更糟糕。在聖誕節的一封 Linux 核心郵件串列的郵件[5]中,AMD 表示,它不會受到影響。但是,這個資訊的措辭讓我們相當清楚地看到底層的詭計是什麼:
AMD 處理器不受核心頁表隔離功能所抵禦的攻擊型別的限制,AMD 微架構不允許記憶體取用(包括推測取用)在訪問將導致頁面錯誤時以較低特權樣式訪問較高特權的資料。
這裡的關鍵詞是“推測”。現代處理器,如英特爾,執行推測性執行。為了保持內部管道的指令符合要求,CPU 核心會儘力猜測接下來要執行的程式碼,取出並執行它。
從 AMD 軟體工程師 Tom Lendacky 在上面提出的建議看來,Intel 的 CPU 可能在沒有執行安全檢查的情況下推測性地執行程式碼。似乎有可能以處理器開始執行通常被阻塞的指令(例如從使用者樣式讀取核心儲存器)開始執行軟體,並且在特權級別檢查發生之前完成該指令。
這將允許 ring-3 級使用者程式碼讀取 ring-0 級核心資料。
那很不好。這個漏洞的細節還沒有得到證實,關於它的嚴重性的這個討論已經足夠了,但是可以這樣認為:對 Linux 和 Windows 的更改聲勢浩大,而且正在快速推出。這表明它比 KASLR 旁路更嚴重。
此外,在 Linux 上分離內核和使用者地址空間的更新是基於一組修補程式,這些修補程式是由奧地利格拉茨技術大學的 eggheads 建立的 KAISER[6] 修補程式。他們發現(PDF[7]) 可以透過在 CPU 的虛擬記憶體系統的旁路攻擊中,從核心中提取記憶體佈局資訊來擊敗 KASLR。該團隊提出了分離內核和使用者空間以防止這種資訊洩漏,他們的研究激發了這一輪的修補。
他們的工作由安德斯·福格在 7 月份撰寫了這篇有趣的部落格文章[8]所披露。那篇文章描述了他試圖透過濫用推測執行從使用者樣式讀取核心記憶體。雖然弗格無法提出任何有效的概念驗證碼,但他指出:
我的結果表明,推測執行確實繼續,儘管違反了核心樣式和使用者樣式之間的隔離。
看起來 KAISER 的工作與 Fogh 的研究有關,而且也正在開發一種透過濫用虛擬記憶體佈局來打破 KASLR 的實際手段,這個團隊可能會以某種方式證明 Fogh 是正確的 – 在 Intel x86 晶片上的推測性執行可以被利用來訪問內核的記憶體。
共享系統(雲服務)
該軟體開發人員在週一發表的一篇重磅分享和推特文章[9]中稱,這個 bug 將會影響包括 Amazon EC2、Microsoft Azure 和 Google Compute Engine 在內的大牌雲端計算環境。
目前存在一個未公佈的安全性錯誤,顯然影響到所有實現虛擬記憶體的當代 [Intel] CPU體系結構,需要硬體更改才能完全解決。軟體緩解的緊急開發正在公開進行,最近正在 Linux 核心中進行,類似的緩解在 11 月份開始出現在 NT 核心中。在最糟糕的情況下,軟體修複會導致典型工作負載的巨大減速。
這種攻擊會影響常見的虛擬化環境,包括 Amazon EC2 和 Google Compute Engine。
微軟的 Azure 雲(執行大量 Linux 和 Windows)將在 1 月 10 日進行維護和重啟,大概會推出了上述修複程式。
亞馬遜網路服務公司還透過電子郵件警告客戶,預計本週五將有重大安全更新登陸,而不會涉及細節。
有傳言說,一個嚴重的虛擬機器管理程式錯誤 —— 可能在 Xen 中 —— 在 2017 年末進行。可能是這個傳言的硬體缺陷:虛擬機器管理程式可以透過這個核心記憶體的無序訪問攻擊,因此需要修補,強制重新啟動來賓虛擬機器。
英特爾的發言人尚未對此進行評論。
更新
這個 Intel 處理器的漏洞是真實的。一個 Vrije Universiteit Amsterdam 的系統與網路安全組的博士開發了一個概念驗證程式,驗證了這個從使用者樣式讀取核心記憶體的晶片級漏洞。
經過檢視該概念驗證程式碼,少量的核心記憶體被洩露到了使用者行程。
最後,據作業系統核心專家 Alex Ionescu 稱,macOS 已經從 10.13.2 開始補上[10]了該晶片設計漏洞。似乎 64 位的 ARM Linux 核心也有了[11]一系列的 KAISER 補丁,完全分離了內核和使用者空間,以防禦 KASLR。