微軟強(qiáng)化 VBS 安全區(qū)的信任邊界
微軟近日發(fā)布了針對(duì)使用基于虛擬化的安全(VBS)安全區(qū)的開發(fā)者的全面指導(dǎo),強(qiáng)調(diào)了加強(qiáng)不同虛擬信任級(jí)別之間信任邊界的關(guān)鍵安全措施。
VBS安全區(qū)的安全挑戰(zhàn)
微軟安全團(tuán)隊(duì)的這份指導(dǎo)文件,主要探討了在實(shí)現(xiàn)VBS安全區(qū)時(shí)所面臨的基本安全挑戰(zhàn)。VBS安全區(qū)利用管理程序的虛擬信任級(jí)別,在用戶模式進(jìn)程內(nèi)隔離內(nèi)存和代碼執(zhí)行區(qū)域。
VBS安全區(qū)提供了強(qiáng)大的可信執(zhí)行環(huán)境(TEE),可以保護(hù)敏感數(shù)據(jù)(如加密密鑰)免受惡意管理員的訪問。然而,這些保護(hù)措施在VTL1安全區(qū)和VTL0主機(jī)進(jìn)程之間引入了一個(gè)獨(dú)特的信任邊界。
與傳統(tǒng)的信任邊界不同,安全區(qū)存在于其主機(jī)進(jìn)程內(nèi)部,這就要求開發(fā)者采取全新的安全視角。文件中強(qiáng)調(diào)的主要安全原則是:安全區(qū)絕不能信任VTL0。盡管主機(jī)進(jìn)程無(wú)法讀取或?qū)懭氚踩珔^(qū)的內(nèi)存區(qū)域,但安全區(qū)可以訪問其主機(jī)的內(nèi)存,如果管理不當(dāng),就會(huì)產(chǎn)生安全漏洞。
指針驗(yàn)證的重要性
微軟研究人員指出,一個(gè)關(guān)鍵建議是驗(yàn)證從主機(jī)進(jìn)程傳遞的指針是否在VTL1安全區(qū)的地址范圍之外。微軟通過代碼示例展示了這一漏洞,惡意主機(jī)可能通過操縱指針值來(lái)攻擊安全區(qū)。例如:
`LPVOID GetState(LPVOID lpParam) { State* state = (State*)lpParam; if (state == nullptr) { return (LPVOID)E_INVALIDARG; } *state = g_State; return (LPVOID)S_OK; }`
如果沒有適當(dāng)?shù)尿?yàn)證,該函數(shù)可能會(huì)無(wú)意中允許主機(jī)覆蓋敏感的安全區(qū)內(nèi)存。
檢查前在VTL1中捕獲VTL0結(jié)構(gòu)(來(lái)源:微軟)
安全實(shí)現(xiàn)模式
開發(fā)者被建議在初始化時(shí)使用EnclaveGetEnclaveInformation API來(lái)確定安全區(qū)的邊界,并驗(yàn)證所有主機(jī)提供的指針是否落在這些邊界之外。
CRITICAL_SECTION鎖(來(lái)源:微軟)
此外,為了防止“檢查時(shí)間-使用時(shí)間”(TOCTOU)攻擊,應(yīng)在驗(yàn)證之前將VTL0的結(jié)構(gòu)復(fù)制到VTL1的內(nèi)存中。指導(dǎo)文件還強(qiáng)調(diào),機(jī)密信息應(yīng)始終在安全區(qū)內(nèi)生成,并且不應(yīng)通過非安全通道暴露。
微軟警告開發(fā)者不要重新發(fā)明安全原語(yǔ),建議使用Windows實(shí)現(xiàn)庫(kù)和RAII包裝器。有趣的是,微軟甚至在文件中提到探索Rust進(jìn)行安全區(qū)開發(fā)的可能性,并提到在最近的MORSE黑客馬拉松中開發(fā)的一個(gè)概念驗(yàn)證,該驗(yàn)證利用了Rust的內(nèi)存安全特性。