CPU vulnerability - Speculative Execution

話說日前

Google Project Zero 公布了 CPU Speculative Execution 漏洞,除 Intel 確定中槍外,其他晶片廠──AMD、ARM──的 CPU 都難以倖免。

Intel:不是只有我啦

Google 表示,去年 Project Zero 便發現了這項漏洞,並在當時通知了晶片廠商這個問題可能是由「Speculative Execution(推測執行)」的功能所引起的。推測執行是一項 CPU 上的技術,不必依序等待需求出現,便透過預測演算法預測下一步的執行動作,先行載入一些指令或資料以盡量填滿執行管線來增加效率。

但 Intel 在實現這項技術時卻發生了重大的邏輯瑕疵:當使用者模式下的程式碼索取核心模式記憶體區域的資料時原該出現的 Page Fault 的安全機制竟可被繞過,使得程式獲得更高的控制權限。

即便 AMD 發表了聲明表示旗下的 CPU 並沒有這樣的漏洞,ARM、Nvidia 亦透過聲明表示自家 CPU/GPU 幾乎沒有遭到攻擊的風險,但根據 Google Project Zero 團隊的報告指出,這項漏洞會影響到所有晶片製造商,也就是說除了 Intel 受影響外,也可能包含了 AMD 與 ARM 等製造商。

Google Project Zero 指出這次漏洞可衍伸出三種變種漏洞,分別為 CVE-2017-5753、CVE-2017-5715 及 CVE-2017-5754,同時發表四種 PoC(概念性驗證)攻擊,加上由眾多安全人員協助完成的 Meltdown 與 Spectre,目前總計已有六種 PoC。

User Mode? Kernel Mode?

usermode-kernelmode

處理器有兩種不同的運作模式:用戶模式(User Mode)與核心模式(Kernel Mode),且會根據執行於處理器上的程式碼類型來在兩種模式下切換。應用程式以用戶模式執行,而作業系統組件或驅動程式則以核心模式執行。雖然許多驅動程式以核心模式執行,但某些驅動程式仍可以用戶模式執行。

當執行應用程式時,作業系統會為其建立一個程序(Process),該程序為應用程式提供私有虛擬定址空間(virtual address space)與私有分頁表(private handle table)。由於應用程式的虛擬位址空間是私有的,因此應用程式間無法相互更改其位於位址空間的資料(應用程式相互被隔離)。也因為每個應用程式都是獨立執行的,因此若應用程式崩潰,則崩潰範圍僅限於一個應用程式,其他應用程式與作業系統將不受其影響。

而在核心模式下執行的所有程式碼則共享一個虛擬位址空間,與用戶模式相反,核心模式下的驅動程式並不與其他驅動程式或作業系統相互隔離。也因此若核心模式下的驅動程式意外地寫入錯誤的虛擬位址,屬於作業系統或其他驅動程式的資料將可能受影響。若核心模式下的驅動程式崩潰,整個作業系統也將崩潰。

TLB 轉譯後備緩衝區

為加快處理速度,近代桌上型及伺服器型處理器皆設計有 TLB(Translation Lookaside Buffer,轉譯後備緩衝區)。TLB 為 CPU 的一種快取,由記憶體管理單元用於改進虛擬位址到實體位址的轉譯速度。TLB 具有固定數目的空間槽,用於存放將虛擬位址對映至實體位址的分頁表條目。為典型的 CAM(content-addressable memory,可定址內容記憶體)。其搜尋鍵碼為虛擬記憶體位址,其搜尋結果為實體位址。如果請求的虛擬位址在TLB中存在,CAM 將給出一個非常快速的符合結果,之後就可以使用得到的實體位址存取記憶體。如果請求的虛擬位址不在 TLB 中,就會使用分頁表進行虛實位址轉換,而分頁表的存取速度比 TLB 慢很多。有些系統允許分頁表被交換到次級記憶體,那麼虛實位址轉換可能要花非常長的時間。

Meltdown / Spectre

meltdown-spectre

Meltdown 可打破使用者應用程式與作業系統之間的隔離界線,允許程式存取裝置上的記憶體區域的內容,如其他程式或作業系統上的機密資訊等。Spectre 則是破壞不同應用程式之間的界線,允許存取其他程式的機密資訊。目前已知 Meltdown 僅存在於 Intel CPU 上,而 Spectre 則是存在於任何 1995 年以後的 CPU。

Meltdown 攻擊示範影片如下:

根據漏洞說明,表示使用者可能僅是瀏覽網頁,帳戶資訊、信用卡資訊甚至個人訊息等都將洩漏。且此漏洞屬於處理器上的漏洞,因此在傳統的日誌文件上也難以留下蹤跡,亦難察覺。

堵住這個漏洞!

由於漏洞屬於 CPU 設計上的瑕疵,為了防範除了更換安全的 CPU 外,只能透過修補作業系統來防範,但這將導致電腦效能下降。

目前作業系統上補強的方式是 KPTI(Kernel Page Table Isolation,內核頁表隔離),透過隔離使用者空間與內核空間的記憶體來提高安全性,緩解現代 x86 CPU 中的「熔毀」硬體安全缺陷。

KPTI 通過完全分離使用者空間與內核空間頁表來解決頁表泄露。支援處理程序上下文識別元(PCID)特性的 x86 處理器可以用它來避免 TLB 重新整理,但即便如此,它依然有很高的效能成本。據 KAISER 原作者稱,其開銷為 0.28%;一名 Linux 開發者稱大多數工作負載下測得約為 5%,但即便有 PCID 最佳化,在某些情況下開銷高達 30%。

使用 PostgreSQL 於修補前後的 Linux 系統進行測試,最好的狀況將下降 17% 的效能,最糟達 23%,資訊來源 The Register 其它測試更可達 30%。

Linux 社群在漏洞發布的第一時間內已緊急推送補丁,微軟目前亦已釋出 Windows 與 Azure 的安全更新。Windows 10 已於 2017-01-04 09:00 釋出自動更新,而 Windows 7、8.1 的用戶亦可手動下載以更新(自動更新預計於 2018-01-09 推送)。而 Azure 中受影響的 VM 也將在 2017-01-04 07:30 自動重新啟動。

值得注意的是,目前釋出的修補更新主要都是針對 Meltdown。開發人員表示相較於 Meltdown,Spectre 的執行難度較高,但亦較難以修補,因此目前仍是無解的狀態。

References