enclave 創建
度量
- enclave 度量:每個 enclave 都由其屬性及其頁面的位置、內容和保護信息的散列表示。具有相同散列的兩個 enclave 是相同的。該度量稱為 MRENCLAVE,用於檢查 enclave 的完整性。
- 簽名度量:每個 enclave 由其作者進行簽名。 MRSIGNER 包含作者公鑰的哈希值。 MRENCLAVE 和 MRSIGNER 是使用 SHA-256 哈希函數生成的。
數據結構
- EINIT Token Structure (EINITTOKEN):EINIT 指令使用 EINITTOKEN 數據結構來確認是否允許運行 enclave。它包含 enclave 的屬性、哈希值和簽名者身份,使用通過 Launch Key 執行的 HMAC 進行身份驗證。
- Enclave Signature Structure (SIGSTRUCT):每個 enclave 都關聯一個 SIGSTRUCT 結構,該結構由其作者簽名並包含 enclave 度量、簽名者公鑰、版本號(ISV,反映安全級別)和產品標識符(ISVPRODID,以區分來自同一作者的 enclave)。它允許確保 enclave 未被修改,然后使用不同的密鑰重新簽名。
指令集
- ECREATE:該指令實例化一個新的 enclave,定義其地址空間和信任根,這些信息存儲在新分配的SECS 中。
- EADD:該指令允許向 enclave 添加一個新的頁面。操作系統全權負責選擇頁面及其內容,EPCM 條目的初始化信息表示頁面類型及其保護。
- EEXTEND:該指令允許以 256 字節的塊將頁面內容添加到 enclave 度量中,必須調用 16 次才能將完整的頁面添加到度量中。
- EINIT:該指令在初始化 enclave 之前檢查其是否對應於它的 EINITTOKEN(相同的度量和屬性)。它還檢查 token 是否使用 launch key 簽名。
- EREMOVE:該指令從 enclave 中永久刪除一個頁面。
說明
- 應用程序請求將其 enclave 加載到內存中
- ECREATE 指令創建並填充 SECS 結構
- 使用 EADD 指令將每個頁面加載到受保護的內存中
- 使用 EEXTEND 指令將每個頁面添加到 enclave 度量中
- EINIT 指令完成 enclave 創建
enclave 進入和退出
指令集
- EENTER:該指令將控制權從應用程序轉移到 enclave 內的預定位置。它檢查 TCS 是否空閑並清除 TLB 條目,然后將處理器置於 enclave 模式並保存 RSP/RBP 和 XCR0 寄存器。最后,它禁用 Precise Event Based Sampling (PEBS) 以使 enclave 執行看起來像一個巨大的指令。
- EEXIT:該指令將進程放回其原始模式並清除位於 enclave 內的地址的 TLB 條目。處理器控制權被轉移到位於應用程序內 RBX 寄存器指定的地址,並且釋放 TCS 結構。enclave 需要在退出之前清除其寄存器以防止數據泄漏。
說明
- EENTRY 指令被執行
- 保存應用程序上下文
- 將處理器切換到 enclave 模式
- EEXIT 指令被執行
- 將處理器切換到 normal 模式