概述
Meltdown 是影響 Intel x86 微處理器和一些基於 ARM 的微處理器的硬體漏洞。 它允許流氓
進程讀取所有的內存,即使它沒有被授權這樣做。
原理
Meltdown 利用 Intel CPU 的亂序執行漏洞,通過對內存的響應時間差來建立一個側信道攻擊,以此讀取整個內核空間。
Intel CPU 採用亂序執行來提高運行效率,但亂序執行都會碰到一個問題,從原理上講它僅適用於純順序執行的指令,一旦遇到分支,即條件跳轉指令,因為不執行到條件跳轉指令本身,是沒法知道程序轉向何處執行的,也就是條件跳轉指令的下一條指令在未執行前不確定,因此無法預先取得條件跳轉指令的後續指令,這時亂序執行會失效,因為它們的前提是預先取得後續指令,為解決這個問題,Intel CPU 採用了分支預測。但分支預測不能保證一定預測成功,當失敗時,就會執行指令的回滾以回到正確的分支上,雖然將錯誤的指令撤銷,相應內存塊已經讀入到了 cache,因為存於 cache 的數據訪問速度極快,這可以被作為「側信道」利用的。
攻擊者會利用分支預測故意訪問非授權的地址a,檢測出非法訪問時,所有的數據被清除,但是 cache 中並未刪除,此時遍歷整個內存,測試訪問的速度,訪問時間極短則則判斷出該地址被 cache,從而推斷出該地址是地址a的內容。
檢測
對於Linux用戶,雖然有 KALSR 技術來參與保護緩衝區溢出問題的計算機安全,但是官方文檔仍然提到了通過 Meltdown 漏洞來破解 KALSR 的方法。不過在實際使用當中,尋找時間比較長。對於漏洞檢測,可以參見開源檢測項目 spectre-meltdown-checker
對於Windows用戶,通過使用微軟公司發布的檢測 PowersShell 腳本,能夠判斷Windows系統是否受到漏洞的影響:
首先,安裝相應的 PowerShell 模塊,打開 powershell,對應命令:
Install-Module SpeculationControl
其次,需要調用相關腳本,對應命令:
PS> PS> Get-SpeculationControlSettings
其中,開啟的保護會顯示為 True,未開啟的保護則會顯示為 False,如下圖所示:
Intel CPU漏洞修復
對於Windows10用戶:
如果你是Windows10的話,那麼這個更新的代號叫做 KB4056892
具體方法:選擇「開始」 按鈕,然後依次選擇「設置」 >「更新和安全」 >「Windows 更新」。選擇「檢查更新」。如果有可用更新,請安裝它們。
(這表明:Meltdown 補丁已經安裝成功,但是 Spectre 漏洞修復不完整。紅色的文字內容是指改名用戶還是需要額外的晶元組固件更新)
註:微軟官方給出的安全建議:Protect your Windows devices against Spectre and Meltdown
對於BIOS組件的晶元組:
對於BIOS組件的晶元組的固件升級,要去查詢主板提供商,根據自己的電腦型號,在下載界面下載對應的 .exe文件
註:List of OEM /Server device manufacturers):Protect your Windows devices against Spectre and Meltdown
對於Linux用戶:
為了修補漏洞,Linux內核團隊將內核頁表隔離(PTI)和 IBRS patch series 兩項技術加入內核之中來對抗 Meltdown 和 Specture。用戶只需要將系統升級到長期發行版本或者現在正在更新迭代周期的系統(Artful 17.10)即可獲得更新.
教訓
設計CPU追求速度快是理所當然的,但速度和安全性之間要有平衡點,微結構無論怎樣追求高速優化,屁股要擦乾淨,不要向宏觀體系結構泄漏內部信息。
1965年 Intel 創世人之一、時任仙童半導體公司電子工程師的戈登摩爾提出了摩爾定律,對人類的計算之路的快速進步做出了預言。過去二十年,人類在互聯網的帶動下,信息化發展一路狂奔。這種對速度的追求一定程度上,透支的是安全的掉隊。也許這正是一個重新定義平衡點的時刻。
不要走開,後有彩蛋。
有的小夥伴可能希望上手試用這一漏洞,詳情可參考開源周報2018年第3期
但應提出警告:
警告#1:代碼原裝提供。您有責任保護您自己,您的財產和數據以及其他人免受此代碼造成的任何風險。此代碼可能會導致您的計算機上出現意想不到的行為。此代碼可能無法檢測到您的計算機上的漏洞。
警告#2:如果您發現計算機容易出現崩潰錯誤,您需要避免將其用作多用戶系統。Meltdown 會破壞CPU的內存保護。在易受 Meltdown 漏洞攻擊的機器上,一個進程可以讀取其他進程或內核使用的所有頁面。
警告#3:此代碼僅用於測試目的。不要在任何生產系統上運行它。不要在任何可能被其他人或實體使用的系統上運行它。