一、定義
- Enclave和不在平臺上的第三方之間的證明過程。
- 一般而言,遠(yuǎn)程認(rèn)證的目標(biāo)是讓硬件實體或硬件和軟件的組合獲得遠(yuǎn)程服務(wù)提供商的信任,以便服務(wù)提供商可以放心地向客戶端提供所請求的機密。
- 借助英特爾 SGX,遠(yuǎn)程證明軟件包括應(yīng)用程序的 enclave,以及英特爾提供的 Quoting Enclave (QE) 和 Provisioning Enclave (PvE)。證明硬件是支持 Intel SGX 的 CPU。
- 遠(yuǎn)程證明提供了對三件事的驗證:應(yīng)用程序的身份、其完整性(未被篡改)以及它是否在啟用英特爾 SGX 的平臺上的飛地內(nèi)安全運行。
二、相關(guān)概念
2.1 Sigma協(xié)議
- Sigma 是一種包括Diffie-Hellman 密鑰交換的協(xié)議,但也解決了DH的弱點——通過身份認(rèn)證防御了中間人攻擊。
- 英特爾 SGX 使用的協(xié)議與常規(guī) Sigma 協(xié)議的不同之處在于,英特爾 SGX 平臺使用英特爾 EPID進(jìn)行身份驗證,而服務(wù)提供商使用公鑰基礎(chǔ)設(shè)施(在常規(guī) Sigma 中,雙方都使用 PKI)。最后,密鑰交換庫要求服務(wù)提供商在協(xié)議的身份驗證部分使用ECDSA而不是 RSA 密鑰對,并且?guī)焓褂?ECDH 進(jìn)行實際的密鑰交換。
- 作為客戶端和服務(wù)提供商之間的這種交換的結(jié)果,在飛地和挑戰(zhàn)者之間產(chǎn)生了共享密鑰,該共享密鑰可用于加密要在飛地中提供的秘密。一旦進(jìn)入飛地,這些秘密就可以被應(yīng)用程序解密。
2.2 Intel Enhanced Privacy ID (EPID)
- 它是對現(xiàn)有直接匿名認(rèn)證(DAA)方案的擴展,增加了一些功能,例如使用SigRL(簽名撤銷列表)。
- EPID支持簽名對象,而不會留下可以唯一回溯到簽名者的跟蹤,從而使簽名過程匿名。這是通過根據(jù)簽名者的處理器類型將其劃分為組(也稱為EPID組)來完成的。通過這種方式,他們使用自己的密匙創(chuàng)建簽名,但是只能使用簽名所屬組的公鑰來驗證簽名,這樣就可以檢查簽名者是否屬于正確的組,但無法惟一地標(biāo)識簽名者。
- 撤銷列表:SGX提供了三種類型的撤銷列表(RLs)。
(1) Group-RL 包含所有已撤銷的EPID組;
(2) Priv-RL 列出同一EPID組中所有已撤銷的私有密鑰;
(3) Sig-RL 列出同一EPID組中所有已撤銷成員的基名元組及其對應(yīng)的簽名。
2.3 Quoting Enclave(QE)
- 一個特殊的enclave,它的任務(wù)完全是處理遠(yuǎn)程認(rèn)證。它從其他enclaves接收REPORTs,驗證它們并使用認(rèn)證密鑰對它們進(jìn)行簽名,然后將結(jié)果(也稱為QUOTE)返回給應(yīng)用程序。
- 由Quoting Enclave創(chuàng)建平臺認(rèn)證的簽名密鑰EPID(enhanced privacy identification),這個密鑰不僅代表平臺,還代表著底層硬件的可信度,并且綁定處理器固件的版本,當(dāng) enclave 系統(tǒng)運行時,只有Quoting Enclave才能訪問到 EPID 密鑰。
2.4 Remote Attestation Modes
- QE支持兩種具有不同鏈接能力屬性的Quote簽名模式,完全匿名和偽匿名Quotes。
- Quote的鏈接性屬性由使用平臺的唯一認(rèn)證密鑰簽名的basename參數(shù)確定
- 使用相同的認(rèn)證密鑰多次簽名相同的basename參數(shù)會產(chǎn)生容易鏈接的偽匿名Quotes。這種模式被服務(wù)提供商用來跟蹤再次訪問的用戶,并防止sybil攻擊,同時保護用戶的隱私。當(dāng)使用偽匿名Quote時,IAS首先驗證所使用的basename是否與特定的服務(wù)提供者相關(guān)聯(lián)。IAS的這個角色強制用戶在不同的服務(wù)提供者之間進(jìn)行偽匿名隔離。
- 相反,通過在不同的basenames上簽名多個簽名,在計算上無法確定Quotes是否使用相同的認(rèn)證密鑰生成,從而保持了平臺的匿名性。因此,QE使用隨機的basenames來簽名完全匿名的Quotes。
二、流程
遠(yuǎn)程認(rèn)證中既使用了對稱密鑰也使用了非對稱密鑰。
- 對稱密鑰系統(tǒng)用于本地認(rèn)證中,只有Quoting Enclave和EREPORT指令可以訪問認(rèn)證密鑰。
- 非對稱密鑰系統(tǒng)用于創(chuàng)建可以從其他平臺驗證的認(rèn)證。認(rèn)證密鑰本身是不對稱的(EPID密鑰)。
遠(yuǎn)程認(rèn)證中主要包括三方面平臺:
(1)The service provide (challenger).
(2)The application with its enclave and its QE.
(3)Intel Attestation Service (IAS) that verifies the enclave.

遠(yuǎn)程認(rèn)證
- 首先,ISV enclave(2)向遠(yuǎn)程服務(wù)提供者(1)發(fā)送一個初始請求,該請求包括平臺聲稱當(dāng)前是其成員的EPID組。
1.1 如果服務(wù)提供者(1)希望為所聲明的組的成員提供服務(wù),則可以向IAS請求更新的SigRL。
1.2 然后,服務(wù)提供者(1)構(gòu)造一個challenge message,該消息由SPID、動態(tài)隨機nonce、更新的SigRL和一個可選的basename參數(shù)(如果需要偽匿名簽名)組成。 - 應(yīng)用程序(2)將challenge傳遞給其enclave(2)。
- 如果enclave(2)支持請求的簽名模式,它將調(diào)用EREPORT指令來創(chuàng)建一個針對平臺QE的本地可驗證REPORT。為了在enclave(2)和服務(wù)提供者(1)之間建立經(jīng)過身份驗證的安全通道,可以將新生成的臨時公鑰添加到REPORT的用戶數(shù)據(jù)字段中。
- 應(yīng)用程序(2)將REPORT和SP的challenge 都傳遞給QE(2)。
-
(本地認(rèn)證發(fā)生在這里) QE調(diào)用EGETKEY來獲取REPORT KEY并驗證REPORT,判斷該enclave是否運行于同一平臺。如果成功,QE將再次調(diào)用EGETKEY來接收平臺的Provisioning Seal Key,這個key用來解密平臺的遠(yuǎn)程認(rèn)證密鑰(EPID私鑰)。
5.1 認(rèn)證密鑰先是用來根據(jù)簽名模式對challenged的basename或者一個隨機值簽名來生成一個簽名的標(biāo)識符。如果使用的是非隨機的basename,則簽名是偽匿名,否則是全匿名的。
5.2 然后使用認(rèn)證密鑰計算平臺身份簽名(MRENCLAVE)上的兩個知識簽名。第一個證明身份簽名是由英特爾認(rèn)證的密鑰簽署的。第二種是一個不可撤銷的證明,它證明用于身份簽名的密鑰沒有在challenged的SigRL中列出。
5.3 然后使用IAS的公鑰(在QE中是硬編碼的)生成并加密最終的QUOTE,并將結(jié)果發(fā)送回應(yīng)用程序。QUOTE包含認(rèn)證enclave的身份、執(zhí)行模式細(xì)節(jié)(例如SVN級別)和其他數(shù)據(jù)。 - 應(yīng)用程序?qū)UOTE轉(zhuǎn)發(fā)給SP服務(wù)提供者(1)來進(jìn)行驗證。
- 由于QUOTE是加密的,它只能由英特爾來驗證。因此,SP服務(wù)提供者(1)只是將QUOTE轉(zhuǎn)發(fā)給IAS進(jìn)行驗證。
- IAS首先根據(jù)QUOTE的身份簽名驗證其EPID證明,從而檢查QUOTE。
8.1 然后,驗證這個平臺沒有在Priv-RL這個撤銷列表中列出,通過計算撤銷列表中每個私鑰對Quote 的basename簽名,并驗證這些簽名均不等于Quote的身份簽名,從而驗證平臺未在Priv-RL組中列出。這完成了平臺的有效性檢查。
8.2 然后IAS創(chuàng)建一個新的認(rèn)證驗證報告作為對SP的響應(yīng)。認(rèn)證驗證報告包括平臺為認(rèn)證enclave生成的QUOTE結(jié)構(gòu)。
8.3 一個積極的認(rèn)證驗證報告確認(rèn)飛地作為一個真正的英特爾SGX處理器上運行一個特定的代碼片段。然后SP負(fù)責(zé)驗證ISV enclave標(biāo)識,并向平臺提供適當(dāng)?shù)捻憫?yīng)。
三、樣例源碼分析

SGX RemoteAttestation
- Intel?Software Guard Extensions (Intel?SGX)應(yīng)用程序通常首先從服務(wù)提供商(SP)請求服務(wù)(例如,媒體流),而SP將響應(yīng)一個挑戰(zhàn)。具體函數(shù)調(diào)用關(guān)系如下:

remote attestation
- 該流程從應(yīng)用程序進(jìn)入enclave開始,enclave將是KE的端點,傳入b_pse(b_pse是一個標(biāo)志,指示應(yīng)用程序/enclave是否使用平臺服務(wù))。
- 如果b_pse為true,那么isv enclave將使用sgx_create_pse_session()調(diào)用受信任的AE支持庫,以建立與PSE的會話。
- enclave中的代碼調(diào)用sgx_ra_init(),傳入SP的ECDSA公鑰、g_sp_pub_key和b_pse。g_sp_pub_ key是一個公鑰,它的完整性非常重要,因此應(yīng)該將該值構(gòu)建到isv_ enclave中。
- 如果之前建立了會話,則通過sgx_close_pse_session()關(guān)閉PSE會話。要求是,如果應(yīng)用程序enclave使用Platform Services,則必須在應(yīng)用程序enclave調(diào)用sgx_ra_init()之前建立與PSE的會話。
- sgx_ra_init()將KE context返回給應(yīng)用程序enclave,而應(yīng)用程序enclave將context返回給應(yīng)用程序。
- 應(yīng)用程序調(diào)用sgx_get_extended_epid_group_id()并將p_extended_epid_group_id返回的值發(fā)送到msg0中的服務(wù)器。
- 服務(wù)器檢查是否支持?jǐn)U展的Intel?EPID組ID。如果不支持該ID,服務(wù)器將中止遠(yuǎn)程認(rèn)證。
- 應(yīng)用程序調(diào)用sgx_ra_get_msg1(),傳入這個KE的context和sgx_ra_get_ga。
- sgx_ra_get_msg1() 構(gòu)建 S1 message= (ga || GID) 并將其返回給應(yīng)用程序。
- 應(yīng)用程序通過ra_network_send_receive() 向服務(wù)提供者(SP) 發(fā)送S1,它將調(diào)用sp_ra_proc_msg1_req() 處理S1 并生成S2。
- 應(yīng)用程序最終收到 S2 = gb||SPID||2-byte TYPE || 2-byte KDF-ID || SigSP(gb, ga) || CMACSMK(gb|| SPID || 2-byte TYPE || 2-byte KDF-ID || SigSP(gb,ga)) || SigRL。
- 應(yīng)用程序調(diào)用sgx_ra_proc_msg1()傳入S2和context。
- sgx_ra_proc_msg2()中的代碼構(gòu)建S3 = CMACSMK(M)||M
where M = ga ||PS_SECURITY_PROPERTY|| QUOTE并返回給應(yīng)用程序,其中僅當(dāng)應(yīng)用程序/enclave使用Platform Services時才包含Platform Services Security Information。 - 應(yīng)用程序通過ra_network_send_ receive()將msg3發(fā)送給SP,SP驗證msg3。
- SP將驗證結(jié)果返回給應(yīng)用程序。
- 此時,會話已經(jīng)建立并交換了密鑰。
- SP是否認(rèn)為會話是安全的并使用它,取決于平臺的安全屬性,如 S3 消息所示。 如果平臺的安全屬性滿足服務(wù)提供者的標(biāo)準(zhǔn),那么服務(wù)提供者可以使用會話密鑰安全地傳遞secret,并且應(yīng)用程序enclave可以在通過調(diào)用受信任KE庫上的sgx_ra_get_keys()檢索會話密鑰之后的任何時間使用secret。