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