Apple電腦Intel晶元組製造模式未關閉導致Ring3任意代碼執行漏洞分析
概述
「隱匿式安全」(Security Through Obscurity)是指通過隱藏特定內容、讓外部人員無法知曉系統的設計原理,這種方式的缺點是顯而易見的。然而,一些硬體製造商卻以「保護知識產權」為前提,要求必須是簽署過保密協議(NDA)的人員才能閱讀技術文檔。這樣的策略,對於普通用戶和硬體製造商來說,無疑是雙輸的。
其中的一個例子是Intel Management Engine(Intel ME),包括其伺服器(Intel SPS)和移動(Intel TXE)版本。
如果想要了解更多Intel ME的背景知識,請點擊參考(https://github.com/ptresearch/me-disablement/blob/master/How%20to%20become%20the%20sole%20owner%20of%20your%20PC.pdf%20%20http://blog.ptsecurity.com/2017/08/disabling-intel-me.html)。
在本文中,我們將詳細說明一個未記錄的(Undocumented)命令是如何做到覆蓋SPI快閃記憶體從而實現ME漏洞本地利用的(INTEL-SA-00086)。這一漏洞的根源就在於未記錄的Intel ME模式,特別是製造模式(Manufacturing Mode)。
關於製造模式
Intel ME製造模式是用於在生產期間對終端平台進行配置和測試,因此,這一模式本應在銷售給用戶之前禁用(關閉)。但是,這一模式及其潛在風險並沒有在Intel的公共文檔中進行任何描述。由於相關實用程序(Intel ME系統工具的一部分)無法正式使用,所以普通用戶無法禁用此模式。一旦由於某種原因啟用了此模式,那麼此時沒有方法能夠通知用戶或保護用戶。甚至,作為專門用於識別UEFI固件級別晶元組和CPU中配置錯誤(例如SPI快閃記憶體區域訪問許可權的錯誤配置)的實用程序Chipsec,都對Intel的製造模式一無所知。
製造模式允許對存儲在一次性可編程存儲器(FUSE)的關鍵平台設置進行配置。其中包括BootGuard的設置(ACM和UEFI模塊中數字簽名密鑰的模式、策略和哈希值)。其中還有一些被稱為FPF(Field Programmable Fuses,現場可編程熔斷器)。要查看可以寫入FUSE的FPF列表,我們可以使用Intel ME System Tools中的FPT(Flash Programming Tool,快閃記憶體編程工具)實用程序。
FPF僅佔FUSE陣列的一部分,大多數FPF都用於存儲平台的參數。其中一部分被稱為IP FUSE,用於存儲IP(Intelligent Property,硬體邏輯塊)單元的設置。因此,DFx Aggregator在
除了FPF外,在製造模式下,硬體製造商可以對Intel ME的設置進行調整,這些設置存儲在SPI快閃記憶體上Intel ME內部文件系統(MFS)中。可以通過重新編程SPI快閃記憶體,來實現對這些參數的更改。這些參數被稱為CVAR(可配置的NVAR,命名變數)。
Intel ME中的mca_server模塊用於對CVAR進行設置。MCA是「生產線配置架構(Manufacture-Line Configuration Architecture)」的縮寫,是生產過程中配置平台過程的通用名稱。與FPF一樣,CVAR可以通過FPT進行設置和讀取。
CVAR列表具體取決於Intel ME的平台和版本。對於支持Intel AMT的晶元組,其中一個CVAR是進入MEBx(ME BIOS Extension)的密碼。
如果要對FPF或CVAR進行設置,Intel ME必須要處於製造模式。分配FPF的過程包括兩個步驟:設置FPF的值(保存到臨時存儲中),以及將FPF值提交給FUSE。第一步只能在製造模式下實現。但如果在該模式下,製造商設置了FPF值,並且此前從沒有內容寫入到FUSE數組的響應範圍,那麼實際的「燒錄」(Burn)將會在製造模式關閉後自動發生。這也就是說,如果系統處於製造模式,就意味著FPF可能從未被初始化。
製造模式關閉的標誌存儲在MFS上的文件/home/mca/eom中。當SPI快閃記憶體被基本文件系統的固件覆蓋時,平台可以再次在製造模式下運行,儘管這時已經無法覆蓋FUSE。
OEM公鑰
基於上述原因,配置Intel平台的過程非常複雜,其中包括了多個步驟。一旦硬體製造商在此過程中出現任何失誤,都會使整個平檯面臨嚴重風險。就算是製造模式已經關閉,也可能會發生製造商沒有設置FPF的情況,從而導致攻擊者可以用自己編寫的值來替代用於簽署BootGuard(ACM)和UEFI模塊啟動代碼的密鑰。在這種情況下,平台就僅會載入攻擊者的惡意代碼,並且會持續載入。由於攻擊者的密鑰被寫入持久性內存,永遠不會被刪除,所以這將導致產生不可修復的硬體漏洞。有關此攻擊的詳細信息,建議參閱Alexander Ermolov的文章(https://2016.zeronights.ru/wp-content/uploads/2017/03/Intel-BootGuard.pdf) 。
在較新的系統(Apollo Lake、Gemini Lake、Cannon Point)上,FPF不僅存儲BootGuard的密鑰,還會存儲OEM的公鑰(嚴格意義來說,是RSA加密方式的OEM公鑰的SHA256哈希值),而後者支持多種ME安全機制。例如,SPI快閃記憶體中的SMIP(Signed Master Image Profile)負責存儲製造商指定的PCH硬體配置(PCH Straps)。這一部分需要使用密鑰進行簽名,而該密鑰的SHA256哈希值存儲在SPI快閃記憶體上的特殊文件(分區)中。其文件名是FTPR分區中的oem.key(針對Cannon Point PCH,是在OEMP分區中的OEMP.man),其中包含各種OEM提供的用於對各種數據進行簽名的公鑰。在下圖中,我們可以看到經過製造商簽名的數據集的完整列表,每個數據集都有一個Cannon Point平台的唯一密鑰:
oem.key文件本身使用OEM根密鑰簽名,其公鑰的哈希值寫在FPF中。
因此,一旦攻擊者破壞了OEM根密鑰,那麼他可能會破壞上述所提到的所有數據,這比舊平台上攻陷Boot Guard的情況要更為嚴重。
在寫入ME區域時繞過塊
在近期以前(Intel Apollo Lake版本之前),Intel ME都位於一個獨立的SPI區域,該區域具有CPU、GBE和ME的獨立訪問許可權。因此,只要正確配置了訪問屬性,就無法從CPU(主系統)端讀取或寫入到ME。但是,在當前版本中,用於Intel晶元組的SPI控制器具有一個稱為Master Grant的特殊機制。這一機制會為每個SPI主控制器分配一個嚴格定義的SPI快閃記憶體區域。無論SPI描述符中記錄的訪問許可權是什麼樣的,主控制器都能夠控制其特定的區域。每個主設備都可以定義任何其他主設備訪問(讀取或寫入)其特定區域的許可權(但僅能定義分配給自己的這部分區域)。
這意味著,即使SPI描述符禁止了主機訪問ME的SPI區域,ME也仍然可以提供訪問的許可權。我們認為,這一更改可能會產生繞過標準流程更新Intel ME的風險。
主ME區域快閃記憶體保護覆蓋
Intel ME中實現了一個特殊的HECI命令,允許在CPU端打開對ME SPI區域的寫訪問。該命令稱為HMR FPO(主ME區域快閃記憶體保護覆蓋)。在之前,我們詳細說明了這個命令。
收到HMR FPO命令後,Intel ME僅在重置後才會啟用對該區域的訪問許可權。Intel ME自身還具有安全措施:只有當UEFI BIOS是平台啟動過程的所有者時,才會在EOP之前接受該命令。EOP是一種不同的HECI命令,它在將控制權交給操作系統(ExitBootServices)之前,將UEFI發送給ME。有時,BIOS Setup包含在EOP之前發送HMRFPO命令的選項。
收到EOP後,Intel ME會忽略HMR FPO,並返回相應的錯誤狀態。但這隻會在製造模式關閉後才會發生。在製造模式下,無論是否存在EOP,Intel ME都會隨時接受HMR FPO。所以,如果製造商沒有關閉製造模式,攻擊者就隨時可以更改Intel ME。當然,要更改Intel ME,還需要管理員許可權,但即使是OS內核在最初也無法重新刷新Intel ME。在這一階段,攻擊者可以重新刷新ME映像,利用例如INTEL-SA-00086的漏洞。然後,通過重啟來運行修改後的固件。這一過程在除Apple MacBook之外的絕大多數平台上都能夠成功實現。而Apple的計算機上包含UEFI中的額外檢查,將在UEFI啟動時運行,如果已經使用HMRFPO打開了ME區域,那麼該機制將會阻止系統的啟動。但是,正如我們所展示的那樣,如果Intel ME處於製造模式,就能夠輕鬆繞過這一機制。
在不重置主CPU的前提下重置ME
如今的計算機,可以通過幾種不同的方式重新啟動。根據文檔上的記載,有全局複位和僅重置主CPU(不重置ME)這兩種方法。但是,如果有一種方法可以在不重置主CPU(通過預先運行HMRFPO命令)的情況下重置ME,那麼就可以成功訪問該區域,並且保證主系統的繼續運行。
在經過對內部ME模塊的仔細研究後,我們發現有一個HECI命令「80 06 00 07 00 00 0b 00 00 00 03 00」(關於更多命令,請點擊參考
)能夠僅對Intel ME進行複位。在製造模式下,即使是在EOP之後,也可以隨時發送此命令:
因此,攻擊者在發送這兩個HECI命令之後,就可以打開ME區域,並在其中寫入任何數據。這一過程不再需要對平台整體進行重置。並且,此時SPI描述符中的內容已經被忽略,因為如果系統在製造模式下運行,SPI區域的正確設置保護屬性將無法再保護ME不被修改。
漏洞利用案例:CVE-2018-4251
我們分析了多個製造商的平台,包括聯想和Apple的筆記本電腦,發現在Yoga和ThinkPad計算機中沒有出現任何與製造模式相關的問題。但是,我們發現使用了Intel晶元組的Apple筆記本電腦正在製造模式下運行。在向Apple報告了這一問題之後,該漏洞(CVE-2018-4251)在macOS High Sierra的10.13.5更新中實現了修復。
INTEL-SA-00086的本地利用
通過對CVE-2018-4251進行漏洞利用,攻擊者可以將舊版本的Intel ME(例如包含INTEL-SA-00086的版本)寫入內存,而無需SPI編程器,也無需訪問HAD_SDO網橋。簡而言之,這一過程不需要再物理訪問到電腦。因此,就可以利用本地的攻擊向量來實現漏洞利用,從而使得能夠在ME中運行任意代碼。
值得注意的是,在INTEL-SA-00086安全公告中,Intel沒有提到啟用製造模式進行本地利用的這種漏洞利用方式。相反,該公司錯誤的生成,只有在SPI區域的訪問設置配置錯誤時才可能進行本地利用。因此,為了保護用戶的安全,我們決定公開檢查製造模式狀態的方法,並公布禁用製造模式的方法。
防護方法
Intel系統工具中包括一個MEInfo(以及分別用於移動和伺服器平台的TXEInfo和SPSInfo),通過這一工具可以獲得有關ME當前狀態和整體平台狀態的全面診斷信息。我們在之前的研究中,證明了這個實用程序能夠檢查未記錄的HAP模式(High Assurance Platform),同時能夠禁用ME。當使用-FWSTS標誌對其進行調用時,該實用程序會顯示HECI寄存器的詳細描述和製造模式的當前狀態。當FWSTS狀態寄存器中的第四位為1時,證明製造模式啟用。
此外,我們還開發了一個程序,用於檢查製造模式的狀態,以便提供給無法使用Intel ME系統工具的用戶。以下是該腳本在開啟了製造模式的系統上運行後的顯示結果:
接下來的一個問題就是,如果製造商沒有關閉製造模式,那麼用戶如何自行關閉呢?
要禁用製造模式,可以使用FPT中的一個特殊選項(-CLOSEMNF)。此外,這一選項還允許為描述符中的SPI快閃記憶體區域設置推薦的訪問許可權。
下圖為輸入-CLOSEMNF後的顯示內容:
在這裡,我們使用-CLOSEMN的NO參數來避免平台的重啟,否則在關閉製造模式後,平台將會立即重啟。
總結
我們的研究表明,Intel ME存在製造模式未關閉的漏洞,即使是像Apple這樣的大型廠商也沒能避免受到Intel平台錯誤配置漏洞的影響。更糟糕的是,由於沒有關於這一模式的官方文檔記錄,直接導致最終用戶不知道自身可能遭受數據被盜、永久性Rootkit,甚至是設備變磚的風險。
我們還懷疑,由於BIOS/UEFI和ME的狀態沒有及時同步,在不重置主CPU的情況下對ME進行重置,還可能會導致其他的安全問題。
參考文章
[1] https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00086.html
[2] https://github.com/chipsec/chipsec
[3] https://www.coreboot.org/
[4] https://github.com/ptresearch/me-disablement/blob/master/How%20to%20become%20the%20sole%20owner%20of%20your%20PC.pdf
[5] http://blog.ptsecurity.com/2017/08/disabling-intel-me.html
[6] https://github.com/ptresearch/mmdetect
[7] https://2016.zeronights.ru/wp-content/uploads/2017/03/Intel-BootGuard.pdf%22
[8] https://www.blackhat.com/docs/eu-17/materials/eu-17-Sklyarov-Intel-ME-Flash-File-System-Explained.pdf


※CVE-2018-8373在野利用被發現
※Powershell入門必備(四)
TAG:嘶吼RoarTalk |