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