在過(guò)去幾年中,影響計(jì)算機(jī)啟動(dòng)方式的攻擊越來(lái)越多。大多數(shù)現(xiàn)代計(jì)算機(jī)使用統(tǒng)一可擴(kuò)展固件接口(UEFI)——該規(guī)范定義了操作系統(tǒng)(例如Windows)與平臺(tái)固件(例如磁盤(pán)驅(qū)動(dòng)器、顯卡)之間的軟件接口。UEFI內(nèi)置安全機(jī)制,確保平臺(tái)固件可以加密驗(yàn)證,并通過(guò)啟動(dòng)加載程序安全啟動(dòng)。此固件存儲(chǔ)在主板上的非易失性SPI閃存中,因此,即使重裝操作系統(tǒng)和更換驅(qū)動(dòng)器,它也依然在系統(tǒng)中。
這創(chuàng)建了一個(gè)“信任錨”,用于驗(yàn)證啟動(dòng)過(guò)程的每個(gè)階段,但糟糕的是,這個(gè)信任錨也是一個(gè)攻擊目標(biāo)。在此類UEFI攻擊中,惡意操作會(huì)在啟動(dòng)過(guò)程的早期加載到目標(biāo)設(shè)備上。這意味著,惡意軟件可以改變配置數(shù)據(jù),通過(guò)將自身“植入”而持久存在,并可以繞過(guò)只在操作系統(tǒng)階段加載的安全措施。因此,雖然UEFI錨定的安全啟動(dòng)可保護(hù)啟動(dòng)加載程序,使其免受啟動(dòng)加載程序攻擊,但它并不能保護(hù)UEFI固件本身。
由于此類攻擊呈增長(zhǎng)趨勢(shì),我們開(kāi)始對(duì)我們的UEFI固件進(jìn)行加密簽名,作為緩解步驟。我們現(xiàn)有的解決方案僅針對(duì)我們的x86 AMD服務(wù)器設(shè)備平臺(tái),沒(méi)有針對(duì)Arm的類似的UEFI固件簽名解決方案。為了確定缺少哪些內(nèi)容,我們不得不深入研究Arm的安全啟動(dòng)過(guò)程。
繼續(xù)閱讀,了解Arm可信固件安全啟動(dòng)。
Arm可信固件安全啟動(dòng)
Arm通過(guò)一個(gè)名為可信開(kāi)發(fā)板啟動(dòng)要求(TBBR)(即Arm可信固件(ATF)安全啟動(dòng))的架構(gòu)定義了一個(gè)可信啟動(dòng)過(guò)程。TBBR的工作原理是,驗(yàn)證一系列加密簽名的二進(jìn)制鏡像,每個(gè)鏡像都包含系統(tǒng)啟動(dòng)過(guò)程中需加載和執(zhí)行的不同階段或元素。每個(gè)啟動(dòng)加載程序(BL)階段都會(huì)完成初始化過(guò)程中的不同階段:
BL1
BL1定義了啟動(dòng)路徑(冷啟動(dòng)還是熱啟動(dòng)),將架構(gòu)初始化(異常向量、CPU初始化和控制寄存器設(shè)置),并將平臺(tái)初始化(啟用watchdog流程、MMU和DDR初始化)。
BL2
BL2為Arm可信固件(ATF)的初始化做準(zhǔn)備,ATF是負(fù)責(zé)設(shè)置安全啟動(dòng)過(guò)程的棧。ATF設(shè)置之后,控制臺(tái)初始化,內(nèi)存映射為MMU,并為下一個(gè)啟動(dòng)加載程序設(shè)置消息緩沖區(qū)。
BL3
BL3階段包括多個(gè)環(huán)節(jié),首先是運(yùn)行時(shí)服務(wù)初始化,用于檢測(cè)系統(tǒng)拓?fù)?。初始化之后,在ATF“安全世界”啟動(dòng)階段和“正常世界”啟動(dòng)階段之間切換,包括UEFI固件的設(shè)置。上下文的設(shè)置是為了確保安全狀態(tài)的信息無(wú)法進(jìn)入正常世界執(zhí)行狀態(tài)。
每個(gè)鏡像都經(jīng)公鑰驗(yàn)證,公鑰存儲(chǔ)在已簽名的證書(shū)中,并可追溯到存儲(chǔ)在SoC上的一次性可編程(OTP)存儲(chǔ)器中或ROM中的根密鑰。
TBBR最初是為手機(jī)設(shè)計(jì)的。這建立了關(guān)于如何構(gòu)建“信任鏈”的參考架構(gòu),從第一步ROM執(zhí)行(BL1)到“正常世界”固件交接(BL3)。雖然這創(chuàng)建了一個(gè)經(jīng)過(guò)驗(yàn)證的固件簽名鏈,但需要注意的是:
SoC制造商大力參與安全啟動(dòng)鏈,而客戶幾乎沒(méi)有參與。
每位客戶都需要一個(gè)唯一的SoC SKU。如果只有一位客戶,那就很簡(jiǎn)單,但大多數(shù)制造商有成千上萬(wàn)個(gè)SKU
SoC制造商主要負(fù)責(zé)PKI鏈的端到端簽名和維護(hù)。這增加了流程的復(fù)雜性,需要USB密鑰存儲(chǔ)器簽名。
除制造商外,不能擴(kuò)展。
這告訴我們,為手機(jī)構(gòu)建的架構(gòu)不能為服務(wù)器擴(kuò)展。
如果我們100%參與制造流程,這就不是什么大問(wèn)題,但我們是客戶和消費(fèi)者。作為客戶,我們對(duì)服務(wù)器和區(qū)塊設(shè)計(jì)有很大的控制權(quán),所以我們希望設(shè)計(jì)合作伙伴會(huì)采用我們能夠在AMD平臺(tái)安全啟動(dòng)中實(shí)現(xiàn)的一些概念,并對(duì)其進(jìn)行改進(jìn),以適應(yīng)Arm CPU。
擴(kuò)容
我們與Ampere展開(kāi)合作,測(cè)試了他們的Altra Max單插槽機(jī)架式服務(wù)器CPU(代號(hào)Mystique),它性能極好,每個(gè)核心都能效極高,這正是我們?yōu)榻档凸亩嗫鄬ふ业臇|西。這只是其中一小部分規(guī)格,Ampere在Altra Max中引入了各種功能,特別是投機(jī)性攻擊緩解措施,包括來(lái)自Armv8.5指令集架構(gòu)的Meltdown和Spectre(變體1和變體2),因此,Altra的ISA獲得了“+”稱號(hào)。
Ampere確實(shí)實(shí)現(xiàn)了一個(gè)與上述ATF簽名過(guò)程相似的簽名啟動(dòng)過(guò)程,但略有不同。我們將簡(jiǎn)單解釋一下,為我們所做的修改設(shè)定上下文。
Ampere安全啟動(dòng)
Ampere實(shí)現(xiàn)的Arm處理器啟動(dòng)順序如上圖所示。系統(tǒng)控制處理器(SCP)由系統(tǒng)管理處理器(SMpro)和電源管理處理器(PMpro)組成。SMpro負(fù)責(zé)安全啟動(dòng)和BMC通信等功能,而PMpro負(fù)責(zé)動(dòng)態(tài)頻率縮放和片上熱監(jiān)控等電源功能。
上電復(fù)位時(shí),SCP從ROM中運(yùn)行系統(tǒng)管理啟動(dòng)加載程序,并加載SMpro固件。初始化后,SMpro在PMpro和ATF線程上生成電源管理?xiàng)?。ATF BL2和BL31調(diào)出處理器資源,例如DRAM和PCIe。此后,控制權(quán)移交BL33 BIOS。
身份驗(yàn)證流程
開(kāi)機(jī)時(shí),SMpro固件從SCP EEPROM中的SMpro密鑰證書(shū)讀取Ampere的公鑰(ROTPK),計(jì)算哈希值,并將其與存儲(chǔ)在eFuse中的Ampere公鑰哈希值進(jìn)行比較。通過(guò)驗(yàn)證后,使用Ampere的公鑰依次將SMpro、PMpro和ATF固件的密鑰和內(nèi)容證書(shū)解密。
SMpro公鑰將用于驗(yàn)證SMpro和PMpro鏡像和ATF密鑰,ATF密鑰又將驗(yàn)證ATF鏡像。這套級(jí)聯(lián)驗(yàn)證始于Ampere根密鑰,并存儲(chǔ)在俗稱電子保險(xiǎn)絲(即eFuse)的芯片中。eFuse只能進(jìn)行一次編程,內(nèi)容設(shè)為只讀,無(wú)法篡改或修改。
這是用于簽名系統(tǒng)、安全世界固件的原始硬件信任根。參考了我們與AMD PSB的簽名過(guò)程,且知道SoC內(nèi)有一個(gè)足夠大的一次性可編程(OTP)區(qū)域后,看到這里我們不禁會(huì)想:我們?yōu)槭裁床荒茉谶@里插入密鑰哈希值?
單域安全啟動(dòng)
單域安全啟動(dòng)采用相同的身份驗(yàn)證流程,并將客戶公鑰(本例中為Cloudflare固件簽名密鑰)的哈希值添加到eFuse域。因此可以通過(guò)一個(gè)硬件信任根來(lái)驗(yàn)證UEFI固件。此過(guò)程由BL2在經(jīng)過(guò)驗(yàn)證的ATF固件中執(zhí)行。我們的公鑰(dbb)從UEFI安全變量存儲(chǔ)中讀取,計(jì)算出哈希值并與存儲(chǔ)在eFuse中的公鑰哈希值進(jìn)行比較。如果相符,則使用經(jīng)過(guò)驗(yàn)證的公鑰將BL33內(nèi)容證書(shū)解密,驗(yàn)證并啟動(dòng)BIOS和剩下的啟動(dòng)項(xiàng)。這是SDSB增加的關(guān)鍵功能。它通過(guò)處理器上的一個(gè)eFuse信任根來(lái)驗(yàn)證整個(gè)軟件啟動(dòng)鏈。
構(gòu)建基塊
在對(duì)單域安全啟動(dòng)的工作原理有了基本了解后,下一個(gè)合乎邏輯的問(wèn)題是“如何實(shí)現(xiàn)?”。我們確保所有UEFI固件都在構(gòu)建時(shí)簽名,但如果把這個(gè)過(guò)程分成幾步,則更有助于理解。
Ampere是我們的原始設(shè)備制造商(ODM),我們?cè)趫?zhí)行SDSB方面發(fā)揮了重要作用。首先,我們使用我們內(nèi)部的安全PKI為公-私密鑰對(duì)生成證書(shū)。以UEFI安全變量格式的dbb.auth和dbb.auth向ODM提供公鑰端。Ampere向ODM提供參考軟件發(fā)布包(SRP),包括底板管理控制器、系統(tǒng)控制處理器、UEFI和復(fù)雜可編程邏輯器件(CPLD)固件,ODM為其平臺(tái)自定義SRP。ODM生成一個(gè)描述硬件配置的開(kāi)發(fā)板文件,并且還自定義UEFI,旨在第一次啟動(dòng)時(shí)注冊(cè)dbb和dbu,確保變量存儲(chǔ)安全。
完成這一步后,我們使用ODM的UEFI ROM鏡像、Arm可信固件(ATF)和開(kāi)發(fā)板文件生成一個(gè)UEFI.slim文件。(注意:這與AMD PSB不同,因?yàn)檎麄€(gè)鏡像和ATF文件均已簽名;在AMD PSB中,只有啟動(dòng)代碼的第一個(gè)代碼塊已簽名。)整個(gè).SLIM文件使用我們的私鑰簽名,在文件中產(chǎn)生一個(gè)簽名哈希值。這只能通過(guò)正確的公鑰進(jìn)行驗(yàn)證。最后,ODM將UEFI打包成與其平臺(tái)BMC兼容的.HPM格式。
同時(shí),我們提供調(diào)試保險(xiǎn)絲選擇和我們DER格式的公鑰的哈希值。Ampere使用這些信息創(chuàng)建一個(gè)特殊版本的SCP固件,即安全供應(yīng)(SECPROV).slim格式。該固件只運(yùn)行一次,用于將調(diào)試設(shè)置和公鑰哈希值編入SoC eFuse。Ampere將SECPROV.slim文件提交給ODM,ODM將其打包成一個(gè)與BMC固件更新工具兼容的.hpm文件。
融合密鑰
在系統(tǒng)制造過(guò)程中,固件在置入主板之前,已預(yù)先編程到存儲(chǔ)IC中。請(qǐng)注意,SCP EEPROM包含SECPROV鏡像,不是標(biāo)準(zhǔn)SCP固件。在系統(tǒng)首次開(kāi)機(jī)后,向BMC發(fā)送一條IPMI命令,將Ampere處理器解除復(fù)位。這將允許SECPROV固件運(yùn)行,使用我們的公鑰哈希值和調(diào)試設(shè)置來(lái)刻錄SoC eFuse。
最終制造流程
配置我們的公鑰后,就會(huì)通過(guò)使用常規(guī)固件重新編程SCP EEPROM繼續(xù)制造流程。系統(tǒng)開(kāi)機(jī)后,ATF檢測(cè)到安全變量存儲(chǔ)中沒(méi)有密鑰,并允許UEFI固件啟動(dòng),無(wú)論有無(wú)簽名。由于是第一次UEFI啟動(dòng),所以會(huì)將我們的公鑰編入安全變量存儲(chǔ)并重新啟動(dòng)。和平常一樣,通過(guò)Ampere的公鑰哈希值驗(yàn)證ATF。由于我們的公鑰存在于dbb中,因此對(duì)照eFuse中的公鑰哈希值進(jìn)行驗(yàn)證,并允許UEFI啟動(dòng)。
驗(yàn)證
第一部分驗(yàn)證要求觀察到eFuse成功銷毀。這將我們的公鑰哈希值刻入一個(gè)不可改變的專用內(nèi)存區(qū)域,不允許覆蓋哈希值。自動(dòng)或手動(dòng)向BMC發(fā)出IPMI OEM命令后,BMC觀察到來(lái)自SECPROV固件的信號(hào),表示eFuse編程結(jié)束。這可以通過(guò)BMC命令探測(cè)到。
eFuse銷毀之后,通過(guò)觀察其他固件的啟動(dòng)鏈來(lái)繼續(xù)驗(yàn)證。SCP、ATF或UEFI固件的損壞會(huì)阻礙啟動(dòng)流程和啟動(dòng)身份驗(yàn)證,導(dǎo)致機(jī)器無(wú)法進(jìn)入操作系統(tǒng)。固件就位后,就會(huì)從啟動(dòng)機(jī)器開(kāi)始繼續(xù)完成路徑驗(yàn)證。
第一次啟動(dòng)后,固件按以下順序啟動(dòng):BMC、SCP、ATF和UEFI。可以通過(guò)各自的串行控制臺(tái)觀察BMC、SCP和ATF固件。UEFI會(huì)自動(dòng)將dbb和dbb文件注冊(cè)到安全變量存儲(chǔ)中,并觸發(fā)系統(tǒng)復(fù)位。
觀察復(fù)位后,如果正確執(zhí)行了功能,機(jī)器應(yīng)該會(huì)成功進(jìn)入操作系統(tǒng)。為了進(jìn)一步驗(yàn)證,我們可以使用UEFI Shell環(huán)境來(lái)提取dbb文件,并將哈希值與提交給Ampere的哈希值進(jìn)行比較。成功驗(yàn)證密鑰后,會(huì)閃存一個(gè)未簽名的UEFI鏡像。未簽名的UEFI鏡像導(dǎo)致啟動(dòng)加載程序BL3-2階段身份驗(yàn)證失敗。因此,ATF固件經(jīng)歷了一個(gè)啟動(dòng)循環(huán)。使用不正確的密鑰簽名的UEFI鏡像也會(huì)出現(xiàn)類似結(jié)果。
更新身份驗(yàn)證流程
在隨后的所有啟動(dòng)循環(huán)中,ATF將讀取安全變量dbb(我們的公鑰),計(jì)算密鑰的哈希值,并將其與eFuse中的只讀Cloudflare公鑰哈希值進(jìn)行比較。如果計(jì)算出的哈希值和eFuse的哈希值相符,就可以信任我們的公鑰變量,并用來(lái)驗(yàn)證已簽名的UEFI。此后,系統(tǒng)將進(jìn)入操作系統(tǒng)。
啟動(dòng)
如果機(jī)器沒(méi)有啟用該功能,就無(wú)法演示該功能的設(shè)置,因?yàn)槲覀冊(cè)跇?gòu)建時(shí)設(shè)置了eFuse,但我們可以演示從未簽名BIOS到簽名BIOS的過(guò)程。對(duì)于該功能的設(shè)置,我們將觀察到一個(gè)自定義BMC命令,指示SCP將ROTPK刻錄到SOC的OTP保險(xiǎn)絲。我們將在那里觀察到對(duì)BMC的反饋,詳細(xì)說(shuō)明保險(xiǎn)絲刻錄是否成功。第一次啟動(dòng)UEFI鏡像時(shí),UEFI將把dbb和dbb寫(xiě)入安全存儲(chǔ)。
您會(huì)發(fā)現(xiàn),未簽名的BIOS閃存之后,機(jī)器將無(wú)法啟動(dòng)。
盡管還不了解啟動(dòng)失敗的原因,但后臺(tái)仍在進(jìn)行一些工作。SCP(系統(tǒng)控制處理器)仍會(huì)啟動(dòng)。
1.SCP鏡像持有一個(gè)包含Ampere生成的ROTPK和SCP密鑰哈希值的密鑰證書(shū)。SCP將計(jì)算ROTPK哈希值,并與刻錄的OTP保險(xiǎn)絲進(jìn)行比較。如果失敗,即哈希值不匹配,那么和前面一樣,您將觀察到失敗。如果成功,SCP固件將繼續(xù)啟動(dòng)PMpro和SMpro。PMpro和SMpro固件都將通過(guò)驗(yàn)證,并繼續(xù)ATF身份驗(yàn)證流程。
2.SCP身份驗(yàn)證的結(jié)論是通過(guò)SCP HOB(交接塊)將BL1密鑰遞交給第一階段啟動(dòng)加載程序,繼續(xù)前述標(biāo)準(zhǔn)的三階段啟動(dòng)加載程序ATF身份驗(yàn)證。
3.在BL2階段,從安全變量存儲(chǔ)中讀取dbb用于驗(yàn)證BL33證書(shū),并通過(guò)啟動(dòng)BL33 UEFI鏡像完成啟動(dòng)流程。
任重道遠(yuǎn)
近年來(lái),服務(wù)器管理界面(例如BMC)已經(jīng)成為各種網(wǎng)絡(luò)攻擊的目標(biāo),包括勒索軟件、植入工具和破壞性活動(dòng)。訪問(wèn)BMC時(shí),本地或遠(yuǎn)程訪問(wèn)均可。隨著遠(yuǎn)程訪問(wèn)模式的開(kāi)放,有可能通過(guò)網(wǎng)絡(luò)接口在BMC上安裝惡意軟件。在BMC上的軟件受到感染的情況下,惡意軟件或間諜軟件能在服務(wù)器上持久存在。攻擊者可能會(huì)直接使用閃存工具(例如flashrom或socflash)來(lái)更新BMC,而不需要在UEFI層面構(gòu)建相同級(jí)別的固件恢復(fù)能力。
未來(lái)的狀態(tài)涉及到使用與主機(jī)CPU無(wú)關(guān)的基礎(chǔ)設(shè)施,在啟動(dòng)時(shí)間之前啟用加密安全的主機(jī)。我們將尋求納入開(kāi)放計(jì)算項(xiàng)目數(shù)據(jù)中心安全控制模塊規(guī)范(DC-SCM)2.0提出的模塊化方法規(guī)范。然后,我們便能將我們的信任根標(biāo)準(zhǔn)化,簽署我們的BMC,并將基于物理不可克隆函數(shù)(PUF)的身份密鑰分配給組件和外圍設(shè)備,以限制OTP保險(xiǎn)絲的使用。OTP保險(xiǎn)絲在試圖“電子循環(huán)使用”或重復(fù)使用機(jī)器時(shí)出現(xiàn)故障,因?yàn)槟鸁o(wú)法真正刪除一臺(tái)機(jī)器的身份。