Intel SGX: воспроизвести измерение анклава из двоичного файла enclave

#sgx #trusted-computing

#sgx #доверенные вычисления

Вопрос:

У меня вопрос об измерении анклава в Intel SGX. Судя по исходному коду SignTool (и высокоуровневому описанию в руководстве), похоже, что измерение включает загрузку файла enclave (ELF или PE). Но результат загрузки варьируется на разных платформах, верно? Интересно, смогу ли я воспроизвести согласованное измерение анклава из двоичного файла enclave.

В частности, я рассматриваю следующие сценарии: Предположим, я хочу распространить enclave.signed.so среди своих пользователей, и я хочу обслуживать запросы только из этого конкретного анклава. Я думаю, я не могу просто сравнить локальное измерение на моей платформе с пользовательским (может быть включено в их аттестации). Что я должен сделать вместо этого?

По сути, вопрос сводится к тому, как связать двоичный файл и измерение криптографически? Похоже, возникает парадокс: предположим, у меня есть двоичный файл enclave, единственный способ получить его измерение — загрузить его. Однако процесс загрузки не является надежным (выполняется ОС)! Как я могу убедиться, что полученное мной измерение действительно относится к этому конкретному двоичному файлу? Должно быть, я что-то неправильно понял, потому что это кажется критичным для всей достоверности SGX. Пожалуйста, поправьте меня.

Спасибо!

Ответ №1:

Вы правы, для установления «реального» измерения анклава вам нужна надежная система.

Измерение анклава выполняется процессором. Он изменяет значение измерения с каждым шагом / инструкцией по созданию enclave. В спецификации эти перестановки объясняются довольно подробно. Например, псевдокод ECREATE содержит это утверждение о поле измерения:

 (* Initialize hash updates etc*)
Initialize enclave’s MRENCLAVE update counter;
(* Add “ECREATE” string and SECS fields to MRENCLAVE *)
TMPUPDATEFIELD[63:0] = 0045544145524345H; // “ECREATE”
TMPUPDATEFIELD[95:64] = DS:TMP_SECS.SSAFRAMESIZE;
TMPUPDATEFIELD[159:96] = DS:TMP_SECS.SIZE;
TMPUPDATEFIELD[511:160] = 0;
SHA256UPDATE(DS:TMP_SECS.MRENCLAVE, TMPUPDATEFIELD)
INC enclave’s MRENCLAVE update counter;
  

Предполагая, что эти описания являются исчерпывающими и известен порядок, в котором шаги создания выполняются драйвером, можно будет вычислить измерение анклава без его загрузки. Таким образом, вы могли бы вычислить значение в анклаве. Но как бы вычислить измерение этого анклава?