操作系統(tǒng)/虛擬化安全知識域:用于內(nèi)存保護的現(xiàn)代硬件擴展
用于內(nèi)存保護的現(xiàn)代硬件擴展
此外,雖然分段大多已失效,但除了分頁之外,還有許多其他形式的硬件支持用于內(nèi)存保護。例如,許多機器都支持緩沖區(qū)邊界檢查,有些可以追溯到四分之一世紀(jì)或更長時間。但是,為了說明相應(yīng)的基元,我們將看看現(xiàn)代通用處理器中可用的內(nèi)容,主要關(guān)注英特爾x86家族。這里的重點不是我們認(rèn)為這個處理器更重要,甚至不是功能X或Y在未來會非常重要(這是有爭議的和很難預(yù)測),而是說明這仍然是當(dāng)今硬件開發(fā)的一個非?;钴S的領(lǐng)域。
作為第一個示例,考慮一下有點命運多舛的英特爾內(nèi)存保護擴展(MPX),它增強了英特爾的主力處理器,以確保陣列指針不會偏離陣列邊界(阻止緩沖區(qū)溢出等漏洞被利用)。為此,一小組新寄存器可以存儲少量數(shù)組的下限和上限,而在取消引用指針之前,新的MPX指令檢查數(shù)組指針的值是否存在邊界沖突。即使在僅在用戶空間中使用MPX的系統(tǒng)中,操作系統(tǒng)也起著作用,例如,處理硬件在遇到緩沖區(qū)邊界時引發(fā)的異常違反。MPX因這些邊界寄存器太少而受到嚴(yán)厲批評,導(dǎo)致性能開銷很大。此外,MPX不支持多線程,這可能會導(dǎo)致舊代碼中的數(shù)據(jù)競爭。有人可能會說,MPX是硬件供應(yīng)商嘗試為其CPU添加新內(nèi)存安全功能的一個很好的例子,不幸的是,這并不總是成功的。
最近,英特爾在其處理器9中添加了內(nèi)存保護密鑰(MPK)。英特爾MPK允許將PTE(圖2)中以前未使用的四個位設(shè)置為16個“鍵”值之一。此外,它還添加了一個新的32位寄存器,每個密鑰包含2位,以指示是否允許使用該密鑰標(biāo)記的頁面進行讀寫。MPK允許開發(fā)人員在少量(在本例中為16個)保護域中對內(nèi)存進行分區(qū),例如,僅允許特定的加密庫訪問加密鑰匙。雖然非特權(quán)用戶進程可能會更新寄存器的值,但只有特權(quán)操作系統(tǒng)代碼才能使用密鑰標(biāo)記內(nèi)存頁。
一些處理器設(shè)計支持更高級的內(nèi)存保護,使用ARM術(shù)語,我們將稱為內(nèi)存標(biāo)記擴展(MTE10)。這個想法簡單而強大。處理器為每個對齊的內(nèi)存塊(其中塊是16字節(jié))分配一個硬件中的所謂“標(biāo)簽”。同樣,每個指針也會獲取一個標(biāo)記。標(biāo)簽通常不是很大,比如4位,所以它們可以存儲在64位指針值的最頂端字節(jié)中,反正我們并不真正使用(事實上,ARM支持頂字節(jié)忽略功能,使硬件顯式屏蔽最上面的字節(jié))。每當(dāng)程序分配N個字節(jié)的內(nèi)存時,分配器都會將分配四舍五入為16個字節(jié)的倍數(shù),并為其分配一個隨機標(biāo)記。它還將相同的標(biāo)記分配給指向內(nèi)存的指針。從現(xiàn)在開始,僅當(dāng)指針中的標(biāo)記與其引用的內(nèi)存的標(biāo)記匹配時,才允許取消引用指針,從而有效地阻止大多數(shù)空間和時間內(nèi)存錯誤。
同時,一些處理器,尤其是低功耗設(shè)備中的處理器,甚至根本沒有成熟的MMU。相反,它們有一個更簡單的內(nèi)存保護單元(MPU),僅用于保護內(nèi)存,其方式類似于上面討論的MPK功能。在MPU設(shè)計中,操作系統(tǒng)定義了許多具有特定內(nèi)存訪問權(quán)限和內(nèi)存屬性的內(nèi)存區(qū)域。例如,ARMv8-M處理器上的MPU最多支持16個區(qū)域。同時,MPU監(jiān)控處理器的所有內(nèi)存訪問(包括指令提取和數(shù)據(jù)訪問),并在檢測到訪問沖突時觸發(fā)異常。
請注意,在上面,我們假設(shè)操作系統(tǒng)需要保護免受不受信任的用戶應(yīng)用程序的侵害。當(dāng)操作本身不受信任時,會出現(xiàn)特殊情況。也許您正在受感染的操作系統(tǒng)或云中運行安全敏感型應(yīng)用程序,您不確定是否要信任云提供商。在一般情況下,您可能希望在不信任任何其他軟件的情況下保護您的數(shù)據(jù)和應(yīng)用程序。為此,處理器可以提供硬件支持,以便在安全、隔離的環(huán)境中運行極其敏感的代碼,在ARM的“信任區(qū)”中稱為可信執(zhí)行環(huán)境,或者英特爾軟件防護擴展(SGX)中的飛地。它們提供的基元略有不同。例如,在SGX安全區(qū)中運行的代碼旨在成為正常用戶進程的一部分。它使用的內(nèi)存總是在離開處理器后立即加密。此外,SGX還提供硬件支持來執(zhí)行證明,以便(可能是遠程)方可以驗證代碼是否在安全區(qū)中運行以及它是正確的代碼。另一方面,ARMTrustZone將運行正常操作系統(tǒng)和用戶應(yīng)用程序的“正常世界”與通常運行自己的較小操作系統(tǒng)以及少量安全敏感應(yīng)用程序的“安全世界”隔離開來。正常世界中的代碼可以調(diào)用安全世界中的代碼,其方式類似于應(yīng)用程序調(diào)用操作系統(tǒng)的方式。特殊環(huán)境(如ARMTrustZone)(或英特爾的SMM模式,稍后討論)的一個有趣應(yīng)用是使用它來監(jiān)控常規(guī)操作系統(tǒng)的完整性-希望在它造成嚴(yán)重損害之前檢測到任何隱形惡意軟件或rootkit。盡管這些受信任環(huán)境的各個方面與操作系統(tǒng)安全性明顯重疊,但我們認(rèn)為它們大多超出了此知識領(lǐng)域的范圍。我們還應(yīng)該注意到,近年來,硬件可信執(zhí)行環(huán)境提供的安全性一再被各種側(cè)信道刺穿,這些側(cè)信道從所謂的安全世界泄漏信息。
再次切換齒輪,可能是操作系統(tǒng)沒問題,但硬件不是。惡意或故障硬件可能會使用系統(tǒng)的直接內(nèi)存訪問(DMA)來讀取或覆蓋內(nèi)存中它們無法訪問的敏感數(shù)據(jù)。此外,對于某些標(biāo)準(zhǔn)(例如USB-C上的Thunderbolt),計算機的PCIe鏈路可能會直接暴露在用戶插入計算機的設(shè)備中。不幸的是,對于用戶來說,很難確定看起來像顯示器電纜或電源適配器的東西不包含一些旨在破壞計算機的惡意電路。作為部分補救措施,如今大多數(shù)架構(gòu)都帶有特殊的MMU,用于與設(shè)備之間傳輸?shù)臄?shù)據(jù)。該硬件稱為IOMMU,用于將設(shè)備虛擬地址映射到物理地址,完全模仿圖2中所示的基于頁面的保護。2,但現(xiàn)在用于DMA設(shè)備。換句話說,設(shè)備可以訪問虛擬內(nèi)存地址,IOMMU將其轉(zhuǎn)換為實際物理地址,檢查權(quán)限,并在頁面未映射到設(shè)備或保護位與請求的訪問不匹配時停止。雖然這樣做提供了一些針對惡意設(shè)備(或驅(qū)動程序)的保護措施,但重要的是要認(rèn)識到IOMMU旨在促進虛擬化,實際上不應(yīng)被視為適當(dāng)?shù)陌踩鉀Q方案。有很多事情可能會出錯。例如,管理員可能想要撤銷設(shè)備對內(nèi)存頁面的訪問權(quán)限。由于更新IOMMU頁表是一個緩慢的操作,因此操作系統(tǒng)延遲此操作并將其與其他操作一起批處理的情況并不少見。結(jié)果是,可能有一小段時間窗口,在此期間設(shè)備仍然可以訪問內(nèi)存頁面,即使它看起來這些權(quán)利已被撤銷。
最后,我們可以觀察到,每個表面積的晶體管數(shù)量不斷增加,使CPU供應(yīng)商能夠在其芯片上放置越來越多的硬件擴展,而上面討論的那些絕不是現(xiàn)代處理器中唯一與安全相關(guān)的擴展。其他示例包括加密單元、內(nèi)存加密、有效切換擴展頁表的說明以及指針身份驗證(硬件檢測到指針值的修改)。毫無疑問,未來幾代將出現(xiàn)更多功能,操作系統(tǒng)將不得不進行調(diào)整才能以有意義的方式使用它們。這些問題的更廣泛觀點可以在硬件安全CyBOK知識領(lǐng)域中找到。