系統程式設計的前沿

信任執行環境(trusted execution environment, TEE)

/ TEE = tee /

假設你想讓一段程式碼在一台機器上執行並守住一個祕密——一把金鑰、一個密碼、一段私密運算——即使那台機器上的作業系統可能已被攻陷。你把它放哪裡?信任執行環境(常被稱為飛地,enclave)就是 CPU 內部一個受硬體保護的區域,其中的程式碼與資料與機器上其他一切隔離,包括一個惡意的作業系統或監督程式。它是機密運算所倚賴的那個具體保險庫。

具體而言,CPU 劃出一塊受保護區域,其記憶體被加密、其存取由硬體監管。在飛地內執行的程式碼能以明文對它的祕密進行運算,但外部的任何東西——核心、其他行程、監督程式、一個對機器有完整存取權的管理員——若窺視飛地的記憶體,看到的只是密文,且無法在不被察覺下竄改它。想像一個焊進處理器裡的密封手套箱:程式伸進去工作,但外面沒人能看見或伸進裡頭。真實的實作在粒度上各異:Intel SGX 隔離的是小型的使用者空間飛地;AMD SEV 加密的是整台虛擬機的記憶體;ARM CCA 定義的是受保護的「領域」(realm)。在信任一個飛地之前,遠端對象會用證實來驗證它實際含有哪段程式碼。

它之所以重要,是因為它正是讓「即使要防範主機也要保護資料」不只是口號的機制,使敏感工作負載能在不受信任的基礎設施上執行。但誠實是不可或缺的。這份隔離的好壞,取決於你必須完全信任的 CPU 供應商的硬體與韌體——它就是信任根,而它曾被攻破:像 SGX 這樣的飛地敗給了旁路通道與推測執行攻擊,那些攻擊間接讀取祕密,從未以顯而易見的方式碰過受保護記憶體。飛地不會使其中的程式碼變得正確——一個塞滿臭蟲程式碼的飛地仍是有臭蟲的,只是被隔離了——而且它一般不防範一個透過時序或快取行為得知祕密的攻擊者。TEE 大幅縮小了受信任的基礎;它並不消除信任,也不保證安全。

飛地內部: 祕密金鑰 + 運算以明文執行 外部(作業系統、監督程式、管理員):窺視飛地記憶體只看到密文 但是:旁路通道(快取/時序/推測)仍可能間接洩漏祕密, 而飛地內有臭蟲的程式碼仍是有臭蟲的——只是被隔離了

TEE 把程式碼與資料隔離到連作業系統與監督程式都防——但它完全倚賴對 CPU 的信任,而旁路通道一再攻破真實的飛地。

TEE 隔離程式碼;它不會使那段程式碼變得正確,且完全建立在信任 CPU 供應商的硬體之上(信任根)。像 Intel SGX 這樣的真實飛地,敗給了不直接碰受保護記憶體就讀取祕密的旁路通道與推測執行攻擊——所以 TEE 縮小了信任,並不消除它。

又稱
TEEenclavesecure enclave飛地安全飛地