Intel SGX(4)——特性
密封
指令集
EGETKEY:enclave 使用此指令來訪問平臺提供的各種不同金鑰。每個金鑰啟用不同的操作(密封、證明)。
說明
當一個 enclave 被例項化時,它的程式碼和資料被保護免被外部訪問。但是當它停止時,它的所有資料都將丟失。密封是一種將資料安全地儲存在 enclave 之外的方法,例如在硬碟驅動器上。enclave 必須使用 EGETKEY 指令檢索其密封金鑰,它使用此金鑰來加密並確保其資料完整性,使用的演算法由 enclave 作者選擇。
- 使用 Enclave 識別符號
密封可以使用 enclave 標識來完成。此時基於 MRENCLAVE 的值進行金鑰派生,兩個不同的 enclave 具有不同的金鑰,同一個 enclave 的兩個版本也將有不同的金鑰,這會阻止資料的本地遷移。
- 使用簽名者識別符號
也可以使用簽名者身份識別符號進行密封。這個金鑰派生是基於 MRSIGNER 的值,兩個不同的 enclave 仍然具有不同的金鑰,但是一個 enclave 的兩個版本共享同一個金鑰並且可以讀取密封資料。如果多個 enclave 使用相同的金鑰進行簽名,則它們都可以讀取彼此的資料。
- 安全版本號 (SVN)
不允許舊版本的 enclave 讀取新版本的 enclave 密封的資料。為了防止它,使用了安全版本號 (SVN)。這是一個計數器,在每次更新影響 enclave 安全性後遞增。使用 SVN 派生金鑰的方式是,enclave 可以檢索與當前或較舊的安全級別相對應的金鑰,但不能檢索較新的金鑰。
證明
資料結構
- Key Request (KEYREQUEST):KEYREQUEST 結構用作 EGETKEY 指令的輸入。它選擇要獲取哪一個金鑰,以及派生金鑰可能需要的其他引數。
- Report Target Info (TARGETINFO):TARGETINFO 結構用作 EREPORT 指令的輸入。它用來標識哪一個 enclave(雜湊和屬性)能夠驗證 CPU 生成的 REPORT。
- Report (REPORT):REPORT 結構是 EREPORT 指令的輸出。它包含 enclave 的屬性、度量、簽名者身份和一些在源和目標 enclave 之間共享的使用者資料。處理器使用 Report Key 對該結構執行 MAC 操作。
指令集
EREPORT:enclave 使用此指令生成包含與它有關的多個資訊的 REPORT 結構,並使用目標 enclave 的 Report Key 進行身份驗證。
說明
enclave 程式碼和資料在初始化之前是純文字的。雖然在技術上 ELF 檔案中的 sections 是可以加密的,但不能預先安裝解密金鑰(或者它不會提供任何額外的安全性)。祕密必須來自外部,可能是金鑰和敏感資料。enclave 必須能夠向第三方證明它是可信的(未被篡改)並在合法平臺上執行。
存在兩種型別的Attestation:
local attestation:同一平臺的兩個 enclave 之間的證明過程
- enclave A 和 enclave B 之間必須已經建立了通訊通道,enclave A 使用它來獲取 enclave B 的 MRENCLAVE
- enclave A 使用 B 的 MRENCLAVE 呼叫 EREPORT 為後者生成已簽名的 report 資訊
- enclave B 呼叫 EGETKEY 來檢索其 Report Key 並驗證 EREPORT 結構的 MAC。如果有效,則 enclave 是預期內的,並執行在合法的平臺上
remote attestation:enclave 和不在平臺上的第三方之間的證明過程
remote attestation 需要一個稱為 Quoting Enclave (QE) 的架構 enclave,該 enclave 對 REPORT(本地可驗證)進行驗證,並使用一個特殊金鑰 Provisioning Key對其簽名將其轉換為 QUOTE(遠端可驗證)。
- 一開始,enclave 通知應用程式它需要位於平臺外部的祕密。該應用程式與伺服器建立安全通訊。伺服器以挑戰作為響應,用來證明執行的 enclave 未被篡改,並且它執行的平臺是合法的。
- 應用程式給出 Quoting Enclave 識別符號,和伺服器發出的對其 enclave 的挑戰
- enclave 生成一個清單,其中包括挑戰應答和一個臨時公鑰,稍後將使用該公鑰來保護伺服器和 enclave 之間的通訊。它生成包含在 EREPORT 指令的使用者資料部分中的清單的雜湊。EREPORT指令為 Quoting Enclave 生成 REPORT結構,將清單與 enclave 聯絡起來。 enclave 將 REPORT 傳遞給應用程式。
- 應用程式將 REPORT 傳輸到 Quoting Enclave 進行驗證和簽名
- Quoting Enclave使用 EGETKEY 指令檢索其 Report Key 並驗證 REPORT,它建立 QUOTE 結構並在將其返回給應用程式之前使用其Provisioning Key 對其進行簽名
- 應用程式將 QUOTE 和關聯的清單傳送到伺服器進行驗證
- 伺服器使用英特爾提供的 attestation 服務來驗證 QUOTE 簽名。然後它使用來自 QUOTE 使用者資料的雜湊檢查清單完整性;最後,它確保清單包含對挑戰的預期答案。