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