證實(attestation)
/ at-ess-TAY-shun /
機密運算讓程式碼在一台你不掌控的機器上、於飛地內受保護地執行。但這立刻引出一個問題:在你把祕密送往那個遠端飛地之前,你怎麼知道它真的是一個正版飛地、正執行著你所預期的那段程式碼,而不是一個假扮成飛地、要來竊取你資料的冒牌貨?證實就是答案——一種有硬體背書的方式,讓遠端對象在任何祕密被託付之前,證明受保護環境內實際執行的是哪段程式碼。
具體而言,證實是透過一份植根於 CPU 硬體的簽署報告運作的。處理器度量(measure)飛地——它對載入受保護區域的初始程式碼與組態計算一個密碼學雜湊——並產出一份含有該度量值的報告,以一把最終可追溯回硬體供應商、且軟體無法偽造的金鑰簽署。遠端驗證者收到這份報告,檢查簽章以確認它來自正版硬體,並把度量值與它所預期那段程式碼的雜湊相比對。唯有當一切吻合,驗證者才繼續進行——例如,把一把祕密金鑰釋放進飛地。流程是:我這個倚賴方對飛地提出挑戰;硬體回傳一個簽署的度量值;我驗證簽章與度量值;唯有到此時,我才把資料託付給它。
它之所以重要,是因為證實把一個飛地從「一個聲稱自己安全的盒子」變成「一個我能驗證它正執行著我審查過之程式碼的盒子」——沒有它,機密運算就會是無法證偽的信任。但要老實談它確立了什麼。證實證明的是所載入程式碼的身分,以及是正版硬體在執行它;它「不」證明那段程式碼毫無臭蟲、行為端正或無漏洞——你是在信任那段被度量的特定程式碼值得信任,而這你必須另行透過審查來確立。而整條鏈都建立在信任硬體供應商的簽署金鑰與證實服務之上;若那個根被攻陷,這份證明就一文不值。證實驗證的是「正在執行什麼」,而非「正在執行的東西是安全的」。
1. 驗證者 -> 飛地:證明你正執行的是什麼 2. CPU 對飛地的程式碼雜湊(度量),並以硬體金鑰簽署 3. 飛地 -> 驗證者:簽署報告 { 度量值 = hash(程式碼),簽章 } 4. 驗證者檢查簽章來自正版硬體「且」雜湊 == 我審查過的程式碼 -> 唯有此時才釋放祕密。(證明「哪段」程式碼在跑,「不」證明它毫無臭蟲。)
證實:硬體簽署飛地程式碼的一個度量值;驗證者在把祕密託付給它之前,檢查簽章與雜湊兩者。
證實證明的是所載入程式碼的身分,以及是正版硬體在執行它——而非那段程式碼正確、安全或無漏洞;那你必須藉由審查被度量的程式碼來確立。整條鏈也建立在信任硬體供應商的金鑰之上,所以一個被攻陷的根會使這份證明變得毫無意義。