熔毁 (安全漏洞)

**熔毁**（），也译**崩溃**，编号，正式名稱爲「」，常譯作「**恶意数据缓存加载**」，是一个存在于英特爾大部分x86/x86-64微处理器、部分IBM POWER架構處理器以及部分ARM架構處理器中的關於推測執行機制的硬件设计缺陷及安全漏洞。该缺陷使得低權限的进程無論是否取得特權，均可以獲取受高權限保護的内存空間中的資料，漏洞利用是基於時間的旁路攻擊。2018年1月，该缺陷隨另一個基於推測執行機制的重量級資訊安全漏洞、硬體缺陷「Spectre」（幽靈）在通用漏洞披露中公布。

由於英特爾處理器及IBM POWER處理器均在市場上佔據極大的份額（出現缺陷的ARM處理器在缺陷被發現時尚未正式面市），這種涉及資訊安全的硬體缺陷影響範圍甚廣，包括幾乎整個x86、POWER伺服器領域、幾乎整個小型主機及大型主機市場、個人電腦市場等都無一倖免，另外該缺陷的危險程度之高（無需特權即可存取敏感資料所在的記憶體空間），曾一度令資安人員及機構懷疑缺陷的真實性，而提前公佈這些缺陷還極有可能引發全球性的資安災難，因而選擇先與處理器廠商及核心客戶聯絡協商備妥修補方案再另行公佈。目前該硬體缺陷可通過軟體實作規避，包括Linux系、Android、OS X/macOS、Windows等等都有相應的修復程式（像是Linux的内核页表隔离技術），但是軟體規避將導致處理器效能的顯著下降。而從根本上修復該缺陷的方法（包括修復「幽靈」缺陷）是重新設計處理器的微架構，為此英特爾、IBM及ARM都將新處理器微架構的推出時程大幅押後。

## 概述

熔毀缺陷是基於設計不良的數位電路設計中出現的竞争条件，再結合許多現代微處理器的非依序執行及推測執行特性而產生。

在具備非依序執行及推測執行特性的處理器上，處理器會檢測指令的相依性，對無相依性的指令會進行預先執行，或者當處理器執行某一指令出現異常而面臨停頓時，處理器會先執行與異常指令無相依性的指令以跳過停頓，這兩類指令執行方式的執行結果都會保存到CPU快取上一段時間以備使用（超過時間即拋棄結果），這些預測執行的動作包括分支预测，预读取，推测性内存访问，缓存缺失的重叠/乱序处理（MSHR）等等。

某行程的某條指令需要其指定某個記憶體位址的資料進行運算，基於CPU快取的機制，該筆資料會先載入至CPU快取上，而這個過程對於指令而言是透明的，因此其它行程是無法直接從CPU快取上得知該筆資料的內容，而又因資料未載入至CPU暫存器上，需要該資料的指令仍無法得知資料內容，在這裏，基於分级保护域機制，CPU將資料從CPU快取載入至CPU的暫存器前是需要經過資料權限檢查和記憶體位址合法性檢查，只有這些資料的存取權限被確認等於或低於該行程的權限、記憶體位址空間的存取權限符合該行程的權限時，方能被相應行程的指令存取，否則將資料丟棄並對該指令進行異常處理。但是，而從記憶體載入資料到CPU快取時，CPU是既沒有對這些資料進行權限檢查也沒有進行記憶體位址的合法性檢查的，而沒有被命中的CPU快取的資料也不會馬上被清空。如果CPU快取的資料內容無法被得知，那麼這種機制的處理邏輯並不會有問題，然而如果有方法可以從其它途徑「偷看」CPU快取的資料內容的話，那麼這種處理邏輯便存在缺陷。

要利用熔毀缺陷，在指令处理期间，用異常的指令使得CPU進入對異常指令的異常處理當中，同時令CPU的推測執行去先執行一些非法指令，内存访问和權限检查或記憶體位址合法性檢查兩種操作在這裏發生竞争冒险，因为受影响的处理器中的指令流水线意味着在推测执行期间，来自未经授权地址的数据几乎总是被临时加载到CPU的缓存中，即使原始读取指令由于特权检查而最终失败并且从不产生可读结果，這個時候再利用旁道攻击，利用存取CPU快取及存取記憶體的時間差，重建目標資料。這樣未经授权的进程就可从映射到当前进程的内存空间的任何地址读取数据。

由于许多操作系统将物理内存、内核进程和其他正在运行的用户空间进程映射到每个进程的地址空间，并依靠特权检查来防止未经授权的访问，因此，熔毁缺陷有效地允许运行在用户空间的恶意进程在不需要权限提升的情况下，读取任何物理内核或其他进程的映射的内存，不管它是否应该能够这样做。若要防范这个缺陷所造成的危害，需要避免使用内存映射方式或使用内存分页隔离（均是基于软件的解决方案，后者是将用户空间的内存地址与内核空间的内存地址相隔离，但这将增加内核态与用户态之间的上下文交换开销），或避免潜在的竞争条件（修改CPU的微代码和/或执行路径）。

惡意程式利用熔毀缺陷進行攻擊活動時也無法被偵測感知，是該資安漏洞的一大危險之處。

## 受影響硬體
最初發現熔毀缺陷主要在英特爾的微處理器產品上出現，但後來發現一些ARM架構的處理器也有該缺陷並被ARM確認，隨後IBM的POWER架構的處理器也被發現有此缺陷也得到了IBM的確認。同為x86架構的AMD處理器則沒有被發現有熔毀缺陷。而英特爾在處理器缺陷被發現公佈數天後，才發表聲明確認，除了使用依序執行的產品以外全系列的英特爾微處理器都有熔毀缺陷，並且在聲明中指所有非依序執行的x86微處理器都有該缺陷以暗示競爭對手也受熔毀缺陷影響，不過另一家主要的x86微處理器供應商AMD則表示其處理器產品沒有熔毀缺陷，並指出「我們之所以認爲AMD的處理器不受缺陷影響，是因爲我們的分頁架構有特權級保護」。

同時期的另一個硬體缺陷——幽靈，受影響的處理器產品遍及當今所有採用分支預測技術的處理器（包括英特爾、AMD、ARM、IBM POWER等等），雖然相比熔燬缺陷更難利用（視不同CPU的微架構有所不同）

更爲具體的，有缺陷的CPU型號數量非常多，Google的Project Zero報告指出，除了安騰以及2013年前的Atom系列，英特爾自1995年發表基於P6微架構的Pentium Pro開始所有具備非依序執行的CPU產品都有熔燬缺陷，P6微架構是英特爾首款具備预测执行的x86（IA-32）微架構，首發產品便是Pentium Pro，而後續的英特爾x86微架構除Netburst(Pentuim 4)外都是以P6爲藍本。

而ARM表示它們的主要處理器IP核不受影響，具體受影響的IP核型號已經公佈。ARM Cortex-A75除了有熔毀缺陷以外還受幽靈漏洞的影響，而其它型號則沒有熔毀缺陷。帶預測執行技術的Cortex-R7、Cortex-R8、Cortex-A8、Cortex-A9、Cortex-A15、Cortex-A17、Cortex-A57、Cortex-A72及Cortex-A73 IP核只受幽靈的影響。ARM是在英特爾之後第二個被發現有熔毀缺陷的產品的，但與英特爾的不同，ARM唯一有熔燬缺陷的IP核產品Cortex-A75尚未有實作商用。另外，不使用預測執行技術的ARM架構處理器，也是當前使用數量最多的ARM產品，不受任何影響，也沒有熔燬缺陷，這部分包括了大量使用在Android行動裝置上的Cortex-A53 IP核，以及即將有商用實作案的Cortex-A55。僅使用Cortex-A53、Cortex-A55的處理器產品包括高通的驍龍630、626/625、400系列等、聯發科的MT6795等、樹莓派單板電腦使用的博通SoC等等。

IBM的POWER架構是第三個被發現有熔燬缺陷、受幽靈的處理器微架構，紅帽公司在2018年1月3日公佈了受這些缺陷影響的處理器型號，涵蓋Z架構、POWER架構（包括最新的POWER8及POWER9）的產品，並發表了適用於這些指令集架構編譯版本的RHEL之修復程式；IBM也立即公佈了受影響型號清單並發佈了相關的韌體修復程式和AIX、z/OS修復程式。

甲骨文公司表示SPARC V9的系統（T5、M5、M6、S7、M7、M8、M10、M12處理器）沒有熔燬缺陷，但並未說明更老的、不再進行技術支援的處理器產品是否受這兩大硬體缺陷的衝擊。

## 漏洞修復
2018年初，微軟發佈了Windows系統的安全性修正以修補漏洞。儘管Intel多次強調安全性修正並不會大幅影響處理器的性能，然而微軟的測試顯示了在安裝漏洞安全性修正的Windows 7與Windows 8環境下，2015年（含）以前生產的Intel處理器會有性能下降，在某些測試下降幅甚至達到30%。性能下降在較舊的微架構如Haswell上尤其明顯，在使用較新的微架構如Skylake、Kaby Lake的Windows 10系統上，降幅則較微小。

對於Intel的處置方式，Linux之父林纳斯·托瓦兹強烈表達了他的不滿，稱Intel的修正方案是「全然的垃圾」並說Intel正在做瘋狂的、毫無道理的事情。以下節錄他在一則郵件中對於Intel修補方式的回應。The patches do things like add the garbage MSR writes to the kernel

entry/exit points. That's insane. That says "we're trying to protect

the kernel". We already have retpoline there, with less overhead.

So somebody isn't telling the truth here. Somebody is pushing complete

garbage for unclear reasons. Sorry for having to point that out.

If this was about flushing the BTB at actual context switches between

different users, I'd believe you. But that's not at all what the

patches do.

As it is, the patches are COMPLETE AND UTTER GARBAGE.

They do literally insane things. They do things that do not make

sense. That makes all your arguments questionable and suspicious. The

patches do things that are not sane.

WHAT THE F*CK IS GOING ON?



## 参考文献

## 外部链接
* Meltdown和Spectre漏洞的官方网站 
* Meltdown论文 
* Google Project Zero write-up 
* 网络安全实践指南—CPU熔断和幽灵漏洞防范指引 

## 参见
* 幽灵 (安全漏洞)（Spectre）
* 内核页表隔离
* 
* 奔腾浮点除法-{}-错误